]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Made testlib's --unhashable and r3935's set changes play nice
authorJason Kirtland <jek@discorporate.us>
Thu, 14 Feb 2008 22:39:42 +0000 (22:39 +0000)
committerJason Kirtland <jek@discorporate.us>
Thu, 14 Feb 2008 22:39:42 +0000 (22:39 +0000)
- A bonus overhead reduction for IdentitySet instances

lib/sqlalchemy/util.py
test/testlib/orm.py

index af14119886a895df0b97086e72c163a550601413..54323e3f9bf814b32175525917fa548d6a8321cc 100644 (file)
@@ -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)
index 9662a4443f9f328141910ff68fdaf60bd0400451..85b8cf58eb6f5f537c116a838a78ceb82f627ce7 100644 (file)
@@ -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)