diff --git a/lib/tfw/event_handler_base.py b/lib/tfw/event_handler_base.py index 47ba5c9..bc5d948 100644 --- a/lib/tfw/event_handler_base.py +++ b/lib/tfw/event_handler_base.py @@ -17,12 +17,15 @@ class EventHandlerBase(ABC): def __init__(self, key): self.server_connector = ServerConnector() self.key = key - self.subscriptions = set() - self.subscribe(self.key) - self.subscribe('reset') + self.subscribe(self.key, 'reset') self.server_connector.register_callback(self.event_handler_callback) def event_handler_callback(self, msg_parts): + """ + Callback that is invoked when receiving a message. + This is subscribed in __init__(). + """ + # TODO: fix faulty logic below message = deserialize_tfw_msg(*msg_parts) response = self.dispatch_handling(message) response['key'] = message['key'] @@ -37,31 +40,49 @@ class EventHandlerBase(ABC): @abstractmethod def handle_event(self, message): + """ + Abstract method that implements the handling of messages. + + :param message: the message received + """ raise NotImplementedError def handle_reset(self, message): # pylint: disable=unused-argument,no-self-use + """ + 'reset' events usually receive some sort of special treatment. + + :param message: the message received + """ return None - def cleanup(self): - pass - - def subscribe(self, key): - if key not in self.subscriptions: - self.subscriptions.add(key) + def subscribe(self, *keys): + """ + Subscribe this EventHandler to receive events for given keys. + Note that you can subscribe to the same key several times in which + case you will need to unsubscribe multiple times in order to stop + receiving events. + + :param keys: list of keys to subscribe to + """ + for key in keys: self.server_connector.subscribe(key) - def unsubscribe(self, key): - try: - self.subscriptions.remove(key) - self.server_connector.unsubscribe(key) - except KeyError: - pass + def unsubscribe(self, *keys): + """ + Unsubscribe this eventhandler from the given keys. - def unsubscribe_all(self): - for sub in self.subscriptions: - self.server_connector.unsubscribe(key=sub) - self.subscriptions.clear() + :param keys: list of keys to unsubscribe from + """ + for key in keys: + self.server_connector.unsubscribe(key) + + def cleanup(self): + """ + Perform cleanup actions such as releasing database + connections and stuff like that. + """ + pass class TriggeredEventHandler(EventHandlerBase, ABC):