summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-02-25 16:55:42 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2014-02-25 16:55:42 -0500
commite60529da797491e9e88e9fcc581334ad3a09bcc2 (patch)
tree70ec4d5c0ca9037b125d15252eb9e8630096b91a
parent1122d355d15a8f6b8565df282eeb3463c31a512d (diff)
downloadsqlalchemy-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.rst10
-rw-r--r--lib/sqlalchemy/event/attr.py2
-rw-r--r--test/base/test_events.py38
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)
-
-
-
-
-