]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug where events set to listen at the class
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 25 Feb 2014 21:55:42 +0000 (16:55 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 25 Feb 2014 21:55:42 +0000 (16:55 -0500)
level (e.g. on the :class:`.Mapper` or :class:`.ClassManager`
level, as opposed to on an individual mapped class, and also on
:class:`.Connection`) that also made use of internal argument conversion
(which is most within those categories) would fail to be removable.
fixes #2973

doc/build/changelog/changelog_09.rst
lib/sqlalchemy/event/attr.py
test/base/test_events.py

index 795fc3a0a65c7f577b17a5f3fab40ee97b837806..e6c954c75cb3d757e87430456bc953d085428e26 100644 (file)
 .. changelog::
     :version: 0.9.4
 
+    .. change::
+        :tags: bug, orm, engine
+        :tickets: 2973
+
+        Fixed bug where events set to listen at the class
+        level (e.g. on the :class:`.Mapper` or :class:`.ClassManager`
+        level, as opposed to on an individual mapped class, and also on
+        :class:`.Connection`) that also made use of internal argument conversion
+        (which is most within those categories) would fail to be removable.
+
     .. change::
         :tags: bug, orm
 
index a3a0d48dccfeecb31bd5b6585635ce377cad1fbf..8bb458330d20f0ca1024b2d737e0cb1d833e476f 100644 (file)
@@ -135,7 +135,7 @@ class _DispatchDescriptor(RefCollection):
             cls = stack.pop(0)
             stack.extend(cls.__subclasses__())
             if cls in self._clslevel:
-                self._clslevel[cls].remove(event_key.fn)
+                self._clslevel[cls].remove(event_key._listen_fn)
         registry._removed_from_collection(event_key, self)
 
     def clear(self):
index e985f8d5b08432287301ae4f9615380a1cdf8e6f..8d4728a9f4a6795154537ff4e5b8918534091cfd 100644 (file)
@@ -669,6 +669,39 @@ class ListenOverrideTest(fixtures.TestBase):
             [call(5, 7), call(10, 5)]
         )
 
+    def test_remove_clslevel(self):
+        listen_one = Mock()
+        event.listen(self.Target, "event_one", listen_one, add=True)
+        t1 = self.Target()
+        t1.dispatch.event_one(5, 7)
+        eq_(
+            listen_one.mock_calls,
+            [call(12)]
+        )
+        event.remove(self.Target, "event_one", listen_one)
+        t1.dispatch.event_one(10, 5)
+        eq_(
+            listen_one.mock_calls,
+            [call(12)]
+        )
+
+    def test_remove_instancelevel(self):
+        listen_one = Mock()
+        t1 = self.Target()
+        event.listen(t1, "event_one", listen_one, add=True)
+        t1.dispatch.event_one(5, 7)
+        eq_(
+            listen_one.mock_calls,
+            [call(12)]
+        )
+        event.remove(t1, "event_one", listen_one)
+        t1.dispatch.event_one(10, 5)
+        eq_(
+            listen_one.mock_calls,
+            [call(12)]
+        )
+
+
 class PropagateTest(fixtures.TestBase):
     def setUp(self):
         class TargetEvents(event.Events):
@@ -1087,8 +1120,3 @@ class RemovalTest(fixtures.TestBase):
         )
 
         event.remove(t1, "event_three", m1)
-
-
-
-
-