--- /dev/null
+.. 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.
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:
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_
)
+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.