diff options
author | Jason Kirtland <jek@discorporate.us> | 2008-02-14 22:39:42 +0000 |
---|---|---|
committer | Jason Kirtland <jek@discorporate.us> | 2008-02-14 22:39:42 +0000 |
commit | 90e3532d0cf90ccfa8ba26786c74bb59fcdfb1c6 (patch) | |
tree | 0f0112ee87a62c09897ef248887137a29b15a7b5 | |
parent | bd27fb07d4369ea8a77b2954012c8b1a63bc242d (diff) | |
download | sqlalchemy-90e3532d0cf90ccfa8ba26786c74bb59fcdfb1c6.tar.gz |
- Made testlib's --unhashable and r3935's set changes play nice
- A bonus overhead reduction for IdentitySet instances
-rw-r--r-- | lib/sqlalchemy/util.py | 19 | ||||
-rw-r--r-- | test/testlib/orm.py | 4 |
2 files changed, 16 insertions, 7 deletions
diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index af1411988..54323e3f9 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -658,9 +658,10 @@ class IdentitySet(object): two 'foo' strings in one of these sets, for example. Use sparingly. """ + _working_set = Set + def __init__(self, iterable=None): self._members = _IterableUpdatableDict() - self._tempset = Set if iterable: for o in iterable: self.add(o) @@ -750,7 +751,7 @@ class IdentitySet(object): result = type(self)() # testlib.pragma exempt:__hash__ result._members.update( - self._tempset(self._members.iteritems()).union(_iter_id(iterable))) + self._working_set(self._members.iteritems()).union(_iter_id(iterable))) return result def __or__(self, other): @@ -771,7 +772,7 @@ class IdentitySet(object): result = type(self)() # testlib.pragma exempt:__hash__ result._members.update( - self._tempset(self._members.iteritems()).difference(_iter_id(iterable))) + self._working_set(self._members.iteritems()).difference(_iter_id(iterable))) return result def __sub__(self, other): @@ -792,7 +793,7 @@ class IdentitySet(object): result = type(self)() # testlib.pragma exempt:__hash__ result._members.update( - self._tempset(self._members.iteritems()).intersection(_iter_id(iterable))) + self._working_set(self._members.iteritems()).intersection(_iter_id(iterable))) return result def __and__(self, other): @@ -813,7 +814,7 @@ class IdentitySet(object): result = type(self)() # testlib.pragma exempt:__hash__ result._members.update( - self._tempset(self._members.iteritems()).symmetric_difference(_iter_id(iterable))) + self._working_set(self._members.iteritems()).symmetric_difference(_iter_id(iterable))) return result def __xor__(self, other): @@ -867,10 +868,16 @@ def _iter_id(iterable): class OrderedIdentitySet(IdentitySet): + class _working_set(OrderedSet): + # a testing pragma: exempt the OIDS working set for the test suite's + # "never call the user's__hash__" assertions. this is a big hammer, + # but it's safe here: IDS operates on (id, instance) tuples in the + # working set. + __sa_hash_exempt__ = True + def __init__(self, iterable=None): IdentitySet.__init__(self) self._members = OrderedDict() - self._tempset = OrderedSet if iterable: for o in iterable: self.add(o) diff --git a/test/testlib/orm.py b/test/testlib/orm.py index 9662a4443..85b8cf58e 100644 --- a/test/testlib/orm.py +++ b/test/testlib/orm.py @@ -70,7 +70,9 @@ def _make_blocker(method_name, fallback): exempt = ( (not module.startswith('sqlalchemy')) or (pragma and pragma_marker in pragma) or - (frame_marker in frame.f_locals)) + (frame_marker in frame.f_locals) or + ('self' in frame.f_locals and + getattr(frame.f_locals['self'], frame_marker, False))) if exempt: supermeth = getattr(super(type_, self), method_name, None) |