diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-02-25 16:55:42 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-02-25 16:55:42 -0500 |
commit | e60529da797491e9e88e9fcc581334ad3a09bcc2 (patch) | |
tree | 70ec4d5c0ca9037b125d15252eb9e8630096b91a | |
parent | 1122d355d15a8f6b8565df282eeb3463c31a512d (diff) | |
download | sqlalchemy-e60529da797491e9e88e9fcc581334ad3a09bcc2.tar.gz |
- 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.
fixes #2973
-rw-r--r-- | doc/build/changelog/changelog_09.rst | 10 | ||||
-rw-r--r-- | lib/sqlalchemy/event/attr.py | 2 | ||||
-rw-r--r-- | test/base/test_events.py | 38 |
3 files changed, 44 insertions, 6 deletions
diff --git a/doc/build/changelog/changelog_09.rst b/doc/build/changelog/changelog_09.rst index 795fc3a0a..e6c954c75 100644 --- a/doc/build/changelog/changelog_09.rst +++ b/doc/build/changelog/changelog_09.rst @@ -15,6 +15,16 @@ :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 Fixed regression from 0.8 where using an option like diff --git a/lib/sqlalchemy/event/attr.py b/lib/sqlalchemy/event/attr.py index a3a0d48dc..8bb458330 100644 --- a/lib/sqlalchemy/event/attr.py +++ b/lib/sqlalchemy/event/attr.py @@ -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): diff --git a/test/base/test_events.py b/test/base/test_events.py index e985f8d5b..8d4728a9f 100644 --- a/test/base/test_events.py +++ b/test/base/test_events.py @@ -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) - - - - - |