From 214600fcc037e0871146290797c91a169c6ee664 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Tue, 20 Feb 2018 17:33:12 +0000 Subject: [PATCH] Allow strings subclasses in ensure_bytes Fix #679 --- NEWS | 1 + psycopg/utils.c | 4 ++-- tests/test_connection.py | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index ef126136..2a58b9dc 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ What's new in psycopg 2.7.5 - Fixed building on Solaris 11 and derivatives such as SmartOS and illumos (:ticket:`#677`). - Maybe fixed building on MSYS2 (as reported in :ticket:`#658`). +- Allow string subclasses in connection and other places (:ticket:`#679`). What's new in psycopg 2.7.4 diff --git a/psycopg/utils.c b/psycopg/utils.c index 7073504f..9aa2d46e 100644 --- a/psycopg/utils.c +++ b/psycopg/utils.c @@ -168,11 +168,11 @@ psycopg_ensure_bytes(PyObject *obj) PyObject *rv = NULL; if (!obj) { return NULL; } - if (PyUnicode_CheckExact(obj)) { + if (PyUnicode_Check(obj)) { rv = PyUnicode_AsUTF8String(obj); Py_DECREF(obj); } - else if (Bytes_CheckExact(obj)) { + else if (Bytes_Check(obj)) { rv = obj; } else { diff --git a/tests/test_connection.py b/tests/test_connection.py index e42aa1dd..d8b86d7d 100755 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -246,6 +246,13 @@ class ConnectionTests(ConnectingTestCase): else: del os.environ['PGCLIENTENCODING'] + def test_connect_no_string(self): + class MyString(str): + pass + + conn = psycopg2.connect(MyString(dsn)) + conn.close() + def test_weakref(self): from weakref import ref import gc @@ -401,6 +408,13 @@ class ParseDsnTestCase(ConnectingTestCase): self.assertRaises(TypeError, ext.parse_dsn, None) self.assertRaises(TypeError, ext.parse_dsn, 42) + def test_str_subclass(self): + class MyString(str): + pass + + res = ext.parse_dsn(MyString("dbname=test")) + self.assertEqual(res, {'dbname': 'test'}) + class MakeDsnTestCase(ConnectingTestCase): def test_empty_arguments(self):