From ee812c520fa73cf3aafb044369f6ad3c0f08bb9c Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Fri, 30 Sep 2022 23:35:03 -0500 Subject: [PATCH] reworked event system --- src/__builtins__.py | 16 +-------- src/context/controller.py | 28 +++------------ src/utils/endpoint_registry.py | 22 ++++++++++++ src/utils/event_system.py | 63 ++++++++-------------------------- src/utils/ipc_server.py | 7 +++- 5 files changed, 49 insertions(+), 87 deletions(-) create mode 100644 src/utils/endpoint_registry.py diff --git a/src/__builtins__.py b/src/__builtins__.py index ca741f7..1416b06 100644 --- a/src/__builtins__.py +++ b/src/__builtins__.py @@ -7,6 +7,7 @@ import builtins # Application imports from utils.event_system import EventSystem +from utils.endpoint_registry import EndpointRegistry @@ -24,21 +25,6 @@ def daemon_threaded_wrapper(fn): return wrapper -class EndpointRegistry(): - def __init__(self): - self._endpoints = {} - - def register(self, rule, **options): - def decorator(f): - self._endpoints[rule] = f - return f - - return decorator - - def get_endpoints(self): - return self._endpoints - - # NOTE: Just reminding myself we can add to builtins two different ways... diff --git a/src/context/controller.py b/src/context/controller.py index 8c09cf3..c869717 100644 --- a/src/context/controller.py +++ b/src/context/controller.py @@ -21,34 +21,16 @@ class Controller(DummyMixin, Controller_Data): self.window.show() self.print_hello_world() # A mixin method from the DummyMixin file + self._subscribe_to_events() + + def _subscribe_to_events(self): + event_system.subscribe("handle_file_from_ipc", self.handle_file_from_ipc) + def tear_down(self, widget=None, eve=None): time.sleep(event_sleep_time) Gtk.main_quit() - - @daemon_threaded - def gui_event_observer(self): - while True: - time.sleep(event_sleep_time) - event = event_system.consume_gui_event() - if event: - try: - sender_id, method_target, parameters = event - if sender_id: - method = getattr(self.__class__, "handle_gui_event_and_return_message") - GLib.idle_add(method, *(self, sender_id, method_target, parameters)) - else: - method = getattr(self.__class__, method_target) - GLib.idle_add(method, *(self, *parameters,)) - except Exception as e: - print(repr(e)) - - def handle_gui_event_and_return_message(self, sender, method_target, parameters): - method = getattr(self.__class__, f"{method_target}") - data = method(*(self, *parameters)) - event_system.push_module_event([sender, None, data]) - def handle_file_from_ipc(self, path: str) -> None: print(f"Path From IPC: {path}") diff --git a/src/utils/endpoint_registry.py b/src/utils/endpoint_registry.py new file mode 100644 index 0000000..15ffa9e --- /dev/null +++ b/src/utils/endpoint_registry.py @@ -0,0 +1,22 @@ +# Python imports + +# Lib imports + +# Application imports + + + + +class EndpointRegistry(): + def __init__(self): + self._endpoints = {} + + def register(self, rule, **options): + def decorator(f): + self._endpoints[rule] = f + return f + + return decorator + + def get_endpoints(self): + return self._endpoints diff --git a/src/utils/event_system.py b/src/utils/event_system.py index f3ea280..25c96fc 100644 --- a/src/utils/event_system.py +++ b/src/utils/event_system.py @@ -1,4 +1,5 @@ # Python imports +from collections import defaultdict # Lib imports @@ -7,57 +8,23 @@ -class EventSystemPushException(Exception): - ... - - class EventSystem: - """ Inheret IPCServerMixin. Create an pub/sub systems. """ + """ Create event system. """ def __init__(self): - # NOTE: The format used is list of ['who', target, (data,)] Where: - # who is the sender or target ID and is used for context and control flow, - # method_target is the method to call, - # data is the method parameters OR message data to give - # Where data may be any kind of data - self._gui_events = [] - self._module_events = [] + self.subscribers = defaultdict(list) - # Makeshift "events" system FIFO - def _pop_gui_event(self) -> None: - if len(self._gui_events) > 0: - return self._gui_events.pop(0) - return None + def subscribe(self, event_type, fn): + self.subscribers[event_type].append(fn) - def _pop_module_event(self) -> None: - if len(self._module_events) > 0: - return self._module_events.pop(0) - return None - - - def push_gui_event(self, event: list) -> None: - if len(event) == 3: - self._gui_events.append(event) - return None - - raise EventSystemPushException("Invald event format! Please do: ['sender_id': str, method_target: method, (data,): any]") - - def push_module_event(self, event: list) -> None: - if len(event) == 3: - self._module_events.append(event) - return None - - raise EventSystemPushException("Invald event format! Please do: ['target_id': str, method_target: method, (data,): any]") - - def read_gui_event(self) -> list: - return self._gui_events[0] if self._gui_events else None - - def read_module_event(self) -> list: - return self._module_events[0] if self._module_events else None - - def consume_gui_event(self) -> list: - return self._pop_gui_event() - - def consume_module_event(self) -> list: - return self._pop_module_event() + def emit(self, event_type, data = None): + if event_type in self.subscribers: + for fn in self.subscribers[event_type]: + if data: + if hasattr(data, '__iter__') and not type(data) is str: + fn(*data) + else: + fn(data) + else: + fn() diff --git a/src/utils/ipc_server.py b/src/utils/ipc_server.py index 1ddf584..f71691b 100644 --- a/src/utils/ipc_server.py +++ b/src/utils/ipc_server.py @@ -29,6 +29,11 @@ class IPCServer: elif conn_type == "local_network_unsecured": self._ipc_authkey = None + self._subscribe_to_events() + + def _subscribe_to_events(self): + event_system.subscribe("post_file_to_ipc", self.send_ipc_message) + @daemon_threaded def create_ipc_listener(self) -> None: @@ -60,7 +65,7 @@ class IPCServer: if "FILE|" in msg: file = msg.split("FILE|")[1].strip() if file: - event_system.push_gui_event([None, "handle_file_from_ipc", (file,)]) + event_system.emit("handle_file_from_ipc", file) conn.close() break