From 9196a4e267ff99cbe1b404385aa5027c035a0d10 Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Sun, 25 Jun 2023 03:41:10 +0100 Subject: [PATCH] subject class extended to support callbacks --- vban_cmd/subject.py | 64 +++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/vban_cmd/subject.py b/vban_cmd/subject.py index 1cac3b0..4f14071 100644 --- a/vban_cmd/subject.py +++ b/vban_cmd/subject.py @@ -1,15 +1,14 @@ import logging +logger = logging.getLogger(__name__) + class Subject: - """Adds support for observers""" - - logger = logging.getLogger("subject.subject") - def __init__(self): - """list of current observers""" + """Adds support for observers and callbacks""" self._observers = list() + self.logger = logger.getChild(self.__class__.__name__) @property def observers(self) -> list: @@ -17,38 +16,57 @@ class Subject: return self._observers - def notify(self, modifier=None): + def notify(self, event): """run callbacks on update""" - [o.on_update(modifier) for o in self._observers] + for o in self._observers: + if hasattr(o, "on_update"): + o.on_update(event) + else: + if o.__name__ == f"on_{event}": + o() def add(self, observer): - """adds an observer to _observers""" + """adds an observer to observers""" - if observer not in self._observers: - self._observers.append(observer) - self.logger.info(f"{type(observer).__name__} added to event observers") - else: - self.logger.error( - f"Failed to add {type(observer).__name__} to event observers" - ) + try: + iterator = iter(observer) + for o in iterator: + if o not in self._observers: + self._observers.append(o) + self.logger.info(f"{o} added to event observers") + else: + self.logger.error(f"Failed to add {o} to event observers") + except TypeError: + if observer not in self._observers: + self._observers.append(observer) + self.logger.info(f"{observer} added to event observers") + else: + self.logger.error(f"Failed to add {observer} to event observers") register = add def remove(self, observer): - """removes an observer from _observers""" + """removes an observer from observers""" try: - self._observers.remove(observer) - self.logger.info(f"{type(observer).__name__} removed from event observers") - except ValueError: - self.logger.error( - f"Failed to remove {type(observer).__name__} from event observers" - ) + iterator = iter(observer) + for o in iterator: + try: + self._observers.remove(o) + self.logger.info(f"{o} removed from event observers") + except ValueError: + self.logger.error(f"Failed to remove {o} from event observers") + except TypeError: + try: + self._observers.remove(observer) + self.logger.info(f"{observer} removed from event observers") + except ValueError: + self.logger.error(f"Failed to remove {observer} from event observers") deregister = remove def clear(self): - """clears the _observers list""" + """clears the observers list""" self._observers.clear()