summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util.py
diff options
context:
space:
mode:
authorJason Kirtland <jek@discorporate.us>2007-11-03 20:23:26 +0000
committerJason Kirtland <jek@discorporate.us>2007-11-03 20:23:26 +0000
commit429e69db67baa8fc93ff2b55361ba2831cc26144 (patch)
treed513a330fff0a9ff6313e78f28d8f12a7d399ade /lib/sqlalchemy/util.py
parent4210a1ef236e0fbc65878dd1a1ddcc8e13d43c45 (diff)
downloadsqlalchemy-429e69db67baa8fc93ff2b55361ba2831cc26144.tar.gz
- Removed equality, truth and hash() testing of mapped instances. Mapped
classes can now implement arbitrary __eq__ and friends. [ticket:676]
Diffstat (limited to 'lib/sqlalchemy/util.py')
-rw-r--r--lib/sqlalchemy/util.py22
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py
index a4ccaac6a..9ad7e113c 100644
--- a/lib/sqlalchemy/util.py
+++ b/lib/sqlalchemy/util.py
@@ -620,6 +620,7 @@ class IdentitySet(object):
def union(self, iterable):
result = type(self)()
+ # testlib.pragma exempt:__hash__
result._members.update(
Set(self._members.iteritems()).union(_iter_id(iterable)))
return result
@@ -641,6 +642,7 @@ class IdentitySet(object):
def difference(self, iterable):
result = type(self)()
+ # testlib.pragma exempt:__hash__
result._members.update(
Set(self._members.iteritems()).difference(_iter_id(iterable)))
return result
@@ -662,6 +664,7 @@ class IdentitySet(object):
def intersection(self, iterable):
result = type(self)()
+ # testlib.pragma exempt:__hash__
result._members.update(
Set(self._members.iteritems()).intersection(_iter_id(iterable)))
return result
@@ -683,6 +686,7 @@ class IdentitySet(object):
def symmetric_difference(self, iterable):
result = type(self)()
+ # testlib.pragma exempt:__hash__
result._members.update(
Set(self._members.iteritems()).symmetric_difference(_iter_id(iterable)))
return result
@@ -725,13 +729,25 @@ def _iter_id(iterable):
yield id(item), item
+class OrderedIdentitySet(IdentitySet):
+ def __init__(self, iterable=None):
+ IdentitySet.__init__(self)
+ self._members = OrderedDict()
+ if iterable:
+ for o in iterable:
+ self.add(o)
+
+
class UniqueAppender(object):
- """appends items to a collection such that only unique items
- are added."""
+ """Only adds items to a collection once.
+
+ Additional appends() of the same object are ignored. Membership is
+ determined by identity (``is a``) not equality (``==``).
+ """
def __init__(self, data, via=None):
self.data = data
- self._unique = Set()
+ self._unique = IdentitySet()
if via:
self._data_appender = getattr(data, via)
elif hasattr(data, 'append'):