From df46579a0b1c628043bb68209053ed6223f4aed8 Mon Sep 17 00:00:00 2001 From: Thomas Sterren Date: Fri, 17 May 2019 21:27:56 +0200 Subject: [PATCH 1/3] 'Is' comparison not working for me, whereas '==' does! --- async_dispatch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/async_dispatch.py b/async_dispatch.py index 705bb98..988d1ee 100644 --- a/async_dispatch.py +++ b/async_dispatch.py @@ -128,7 +128,7 @@ def remove_handler(self, handler, event_name): if event_name in self._subscribers: items_to_del = [] for i, h in enumerate(self._subscribers[event_name]): - if h is handler: + if h == handler: items_to_del.append(i) for i in items_to_del: del self._subscribers[event_name][i] From 2e1b5ed769eaf7195878d4e69fc8f473112b709c Mon Sep 17 00:00:00 2001 From: Thomas Sterren Date: Sat, 18 May 2019 09:03:33 +0200 Subject: [PATCH 2/3] Added remove_subscriber() method --- async_dispatch.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/async_dispatch.py b/async_dispatch.py index 988d1ee..ece8dc8 100644 --- a/async_dispatch.py +++ b/async_dispatch.py @@ -87,7 +87,33 @@ def add_subscriber(self, subscriber): return self + def remove_subscriber(self, subscriber): + """ + Removes a subscriber and its event handlers. + + :param subscriber: SubscriberInterface + :return: self + """ + if not isinstance(subscriber, SubscriberInterface): + raise TypeError('Expects an instance of the SubscriberInterface') + events = subscriber.get_event_listeners() + t = type(events) + if t is dict: + pass + elif t is list: + events = {event_name: subscriber.consume for event_name in events} + else: + raise TypeError('Cannot determine events from {}'.format(t)) + + for event_name, handler in events.items(): + # A string could be the name of the handler + if isinstance(handler, str) and hasattr(subscriber, handler): + handler = getattr(subscriber, handler) + + self.remove_handler(handler, event_name) + + return self def add_handler( self, handler, event_name): """ From a5a592960bb9c24bdc4c5e78cd132f60c2326ee2 Mon Sep 17 00:00:00 2001 From: Thomas Sterren Date: Sat, 18 May 2019 09:13:02 +0200 Subject: [PATCH 3/3] Added _get_events() to receive dict of event handlers from a subscriber --- async_dispatch.py | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/async_dispatch.py b/async_dispatch.py index ece8dc8..28520f9 100644 --- a/async_dispatch.py +++ b/async_dispatch.py @@ -68,14 +68,7 @@ def add_subscriber(self, subscriber): if not isinstance(subscriber, SubscriberInterface): raise TypeError('Expects an instance of the SubscriberInterface') - events = subscriber.get_event_listeners() - t = type(events) - if t is dict: - pass - elif t is list: - events = {event_name: subscriber.consume for event_name in events} - else: - raise TypeError('Cannot determine events from {}'.format(t)) + events = self._get_events(subscriber) for event_name, handler in events.items(): @@ -97,14 +90,7 @@ def remove_subscriber(self, subscriber): if not isinstance(subscriber, SubscriberInterface): raise TypeError('Expects an instance of the SubscriberInterface') - events = subscriber.get_event_listeners() - t = type(events) - if t is dict: - pass - elif t is list: - events = {event_name: subscriber.consume for event_name in events} - else: - raise TypeError('Cannot determine events from {}'.format(t)) + events = self._get_events(subscriber) for event_name, handler in events.items(): # A string could be the name of the handler @@ -115,6 +101,28 @@ def remove_subscriber(self, subscriber): return self + @staticmethod + def _get_events(subscriber): + """Returns a dictionary containing the subscribers event handlers. + + :param subscriber: SubscriberInterface + :return: dict containing event handlers + :rtype: dict[str, str] + """ + if not isinstance(subscriber, SubscriberInterface): + raise TypeError('Expects an instance of the SubscriberInterface') + + events = subscriber.get_event_listeners() + t = type(events) + if t is dict: + pass + elif t is list: + events = {event_name: subscriber.consume for event_name in events} + else: + raise TypeError('Cannot determine events from {}'.format(t)) + + return events + def add_handler( self, handler, event_name): """ Add a method that will handle an event.