diff options
| author | rekcäH nitraM <spamfaenger@gmx.de> | 2017-11-28 08:28:40 +0100 |
|---|---|---|
| committer | Michael Howitz <mh@gocept.com> | 2017-11-28 08:28:40 +0100 |
| commit | d50e3d4bed1cecb8b308656ca509824fd379c6cc (patch) | |
| tree | 6fbe0315870ada80aab4d87066c3ea3c28c7682d /src/zope/interface | |
| parent | d9c5d5ea95941bb5cfc1eebd2847159cc1ccdbca (diff) | |
| download | zope-interface-d50e3d4bed1cecb8b308656ca509824fd379c6cc.tar.gz | |
Allow Registering and unregistering instance methods as listeners (#102)
* Fixes #12 - registering instance methods as listeners doesn’t allow to easily unregister them as the registry tries to find the handler with 'is' but it should use '==' to allow the python BoundMethod wrapper (which is a new instance every time instance.$methodname is accessed).
Diffstat (limited to 'src/zope/interface')
| -rw-r--r-- | src/zope/interface/adapter.py | 2 | ||||
| -rw-r--r-- | src/zope/interface/tests/test_adapter.py | 11 |
2 files changed, 12 insertions, 1 deletions
diff --git a/src/zope/interface/adapter.py b/src/zope/interface/adapter.py index d4825b2..aae3155 100644 --- a/src/zope/interface/adapter.py +++ b/src/zope/interface/adapter.py @@ -257,7 +257,7 @@ class BaseAdapterRegistry(object): if value is None: new = () else: - new = tuple([v for v in old if v is not value]) + new = tuple([v for v in old if v != value]) if new == old: return diff --git a/src/zope/interface/tests/test_adapter.py b/src/zope/interface/tests/test_adapter.py index 7420e1c..41c618c 100644 --- a/src/zope/interface/tests/test_adapter.py +++ b/src/zope/interface/tests/test_adapter.py @@ -234,6 +234,17 @@ class BaseAdapterRegistryTests(unittest.TestCase): registry.subscribe([IB1], None, orig) registry.unsubscribe([IB1], None, nomatch) #doesn't raise self.assertEqual(len(registry._subscribers), 2) + + def _instance_method_notify_target(self): + self.fail("Example method, not intended to be called.") + + def test_unsubscribe_instance_method(self): + IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() + registry = self._makeOne() + self.assertEqual(len(registry._subscribers), 0) + registry.subscribe([IB1], None, self._instance_method_notify_target) + registry.unsubscribe([IB1], None, self._instance_method_notify_target) + self.assertEqual(len(registry._subscribers), 0) class LookupBaseFallbackTests(unittest.TestCase): |
