From: Sanjana Date: Sun, 24 Feb 2019 11:48:57 +0000 (+0530) Subject: Fixes: #4406 Added port comparison in __eq__() and added _ne__() method to class URL X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F4515%2Fhead;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Fixes: #4406 Added port comparison in __eq__() and added _ne__() method to class URL --- diff --git a/doc/build/changelog/unreleased_13/4406.rst b/doc/build/changelog/unreleased_13/4406.rst new file mode 100644 index 0000000000..c01179db72 --- /dev/null +++ b/doc/build/changelog/unreleased_13/4406.rst @@ -0,0 +1,11 @@ +.. change:: + :tags: bug, engine + :tickets: 4406 + + Comparing two objects of :class:`.URL` using ``__eq__()`` did not take port + number into consideration, two objects differing only by port number were + considered equal. Port comparison is now added in ``__eq__()`` method of + :class:`.URL`, objects differing by port number are now not equal. Additionally, + ``__ne__()`` was not implemented for :class:`.URL` which caused unexpected + result when ``!=`` was used in Python2, since there are no implied + relationships among the comparison operators in Python2. diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py index 536e21c386..16b7c051a9 100644 --- a/lib/sqlalchemy/engine/url.py +++ b/lib/sqlalchemy/engine/url.py @@ -120,8 +120,12 @@ class URL(object): and self.host == other.host and self.database == other.database and self.query == other.query + and self.port == other.port ) + def __ne__(self, other): + return not self == other + @property def password(self): if self.password_original is None: diff --git a/test/engine/test_parseconnect.py b/test/engine/test_parseconnect.py index be90378c93..913e9ad867 100644 --- a/test/engine/test_parseconnect.py +++ b/test/engine/test_parseconnect.py @@ -8,7 +8,7 @@ from sqlalchemy.dialects import plugins from sqlalchemy.dialects import registry from sqlalchemy.engine.default import DefaultDialect import sqlalchemy.engine.url as url -from sqlalchemy.testing import assert_raises +from sqlalchemy.testing import assert_raises, ne_ from sqlalchemy.testing import eq_ from sqlalchemy.testing import fixtures from sqlalchemy.testing import is_ @@ -146,6 +146,26 @@ class ParseConnectTest(fixtures.TestBase): ) +class UrlTest(fixtures.TestBase): + def test_comparison(self): + components = ('drivername', 'username', 'password', 'host', + 'database', 'query', 'port') + + common_url = "dbtype://username:password" \ + "@[2001:da8:2004:1000:202:116:160:90]:80/database?foo=bar" + url1 = url.make_url(common_url) + url2 = url.make_url(common_url) + + eq_(url1, url2) + assert not url1 != url2 + + for curr_component in components: + setattr(url2, curr_component, 'new_changed_value') + ne_(url1, url2) + assert not url1 == url2 + setattr(url2, curr_component, getattr(url1, curr_component)) + + class DialectImportTest(fixtures.TestBase): def test_import_base_dialects(self): # the globals() somehow makes it for the exec() + nose3.