From: Benjamin Braatz Date: Mon, 11 Jan 2021 08:44:25 +0000 (+0100) Subject: Refactor to package specific directory X-Git-Url: http://git.graph-it.com/?a=commitdiff_plain;h=14032f66ff29dae39bc574ba1987f4b63123b131;p=graphit%2Fevent-py.git Refactor to package specific directory --- diff --git a/example.py b/example.py index 203d1b1..e4839c6 100755 --- a/example.py +++ b/example.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -from graphit.event import EventEmitterMixin +from graphit_event import EventEmitterMixin class ExampleEmitter(EventEmitterMixin): diff --git a/graphit/__init__.py b/graphit/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/graphit/event.py b/graphit/event.py deleted file mode 100644 index 67c677e..0000000 --- a/graphit/event.py +++ /dev/null @@ -1,91 +0,0 @@ -__all__ = ('EventEmitterInterface', 'EventEmitterMixin') - - -import abc -import uuid - -from typing import Hashable, Callable, MutableMapping, Mapping - -EvMap = MutableMapping[Hashable, Hashable] -CbMap = MutableMapping[Hashable, MutableMapping[Hashable, Callable]] - - -class EventEmitterInterface(abc.ABC): - - @abc.abstractmethod - def on(self, event: Hashable, callback: Callable) -> Hashable: - ''' - Registers the given callback for the given event. - Returns handle to unregister the given callback. - ''' - - @abc.abstractmethod - def off(self, handle: Hashable) -> bool: - ''' - Unregisters a previously registered callback by the given handle. - Returns True on success. - ''' - - @abc.abstractmethod - def _emit(self, event: Hashable, *args, **kwargs) -> None: - ''' - Emits the given event by calling all callbacks registered for this - event. - ''' - - -class EventEmitterMixin(EventEmitterInterface): - def on(self, event: Hashable, callback: Callable) -> Hashable: - events: EvMap - callbacks: CbMap - try: - events = self._eventEmitterMixinEvents - callbacks = self._eventEmitterMixinCallbacks - except AttributeError: - self._eventEmitterMixinEvents: EvMap = {} - self._eventEmitterMixinCallbacks: CbMap = {} - events = self._eventEmitterMixinEvents - callbacks = self._eventEmitterMixinCallbacks - - if event not in callbacks: - callbacks[event] = {} - - handle = uuid.uuid4() - while handle in events: - handle = uuid.uuid4() - - events[handle] = event - callbacks[event][handle] = callback - - return handle - - def off(self, handle: Hashable) -> bool: - try: - events = self._eventEmitterMixinEvents - callbacks = self._eventEmitterMixinCallbacks - except AttributeError: - return False - - if handle not in events: - return False - event = events[handle] - - del events[handle] - del callbacks[event][handle] - - if not callbacks[event]: - del callbacks[event] - - return True - - def _emit(self, event: Hashable, *args, **kwargs) -> None: - try: - callbacks = self._eventEmitterMixinCallbacks - except AttributeError: - return - - if event not in callbacks: - return - - for callback in callbacks[event].values(): - callback(*args, **kwargs) diff --git a/graphit_event/__init__.py b/graphit_event/__init__.py new file mode 100644 index 0000000..b68f1b7 --- /dev/null +++ b/graphit_event/__init__.py @@ -0,0 +1,4 @@ +__all__ = ('EventEmitterInterface', 'EventEmitterMixin') + +from .interface import EventEmitterInterface +from .mixin import EventEmitterMixin diff --git a/graphit_event/interface.py b/graphit_event/interface.py new file mode 100644 index 0000000..8b18970 --- /dev/null +++ b/graphit_event/interface.py @@ -0,0 +1,27 @@ +__all__ = ('EventEmitterInterface') + +import abc +from typing import Hashable, Callable + + +class EventEmitterInterface(abc.ABC): + @abc.abstractmethod + def on(self, event: Hashable, callback: Callable) -> Hashable: + ''' + Registers the given callback for the given event. + Returns handle to unregister the given callback. + ''' + + @abc.abstractmethod + def off(self, handle: Hashable) -> bool: + ''' + Unregisters a previously registered callback by the given handle. + Returns True on success. + ''' + + @abc.abstractmethod + def _emit(self, event: Hashable, *args, **kwargs) -> None: + ''' + Emits the given event by calling all callbacks registered for this + event. + ''' diff --git a/graphit_event/mixin.py b/graphit_event/mixin.py new file mode 100644 index 0000000..971671c --- /dev/null +++ b/graphit_event/mixin.py @@ -0,0 +1,66 @@ +__all__ = ('EventEmitterMixin') + +import uuid +from typing import Hashable, Callable, MutableMapping, Mapping + +from .interface import EventEmitterInterface + +EvMap = MutableMapping[Hashable, Hashable] +CbMap = MutableMapping[Hashable, MutableMapping[Hashable, Callable]] + + +class EventEmitterMixin(EventEmitterInterface): + def on(self, event: Hashable, callback: Callable) -> Hashable: + events: EvMap + callbacks: CbMap + try: + events = self._eventEmitterMixinEvents + callbacks = self._eventEmitterMixinCallbacks + except AttributeError: + self._eventEmitterMixinEvents: EvMap = {} + self._eventEmitterMixinCallbacks: CbMap = {} + events = self._eventEmitterMixinEvents + callbacks = self._eventEmitterMixinCallbacks + + if event not in callbacks: + callbacks[event] = {} + + handle = uuid.uuid4() + while handle in events: + handle = uuid.uuid4() + + events[handle] = event + callbacks[event][handle] = callback + + return handle + + def off(self, handle: Hashable) -> bool: + try: + events = self._eventEmitterMixinEvents + callbacks = self._eventEmitterMixinCallbacks + except AttributeError: + return False + + if handle not in events: + return False + event = events[handle] + + del events[handle] + del callbacks[event][handle] + + if not callbacks[event]: + del callbacks[event] + + return True + + def _emit(self, event: Hashable, *args, **kwargs) -> None: + try: + callbacks = self._eventEmitterMixinCallbacks + except AttributeError: + return + + if event not in callbacks: + return + + for callback in callbacks[event].values(): + callback(*args, **kwargs)