"""
:mod:`taika.events` -- Basic event managment
============================================
This module offers a simple event manager implemented in the class
:class:`taika.events.EventManager`.
"""
from collections import defaultdict
__all__ = ["events", "EventNotFound", "EventManager"]
events = set(["doc-post-read", "site-post-read"])
"""The events that the event manager can register functions to."""
[docs]class EventNotFound(Exception):
"""Exception raised when an event does not exists."""
[docs]class EventManager(object):
"""Register functions to events and passes them arguments and keyword arguments when called."""
def __init__(self):
self.funcs = defaultdict(dict)
self.next_id = 0
[docs] def register(self, event, func):
"""Register a callable `func` to an `event`.
Parameters
----------
event : str
The event to which `func` will be registered.
func : callable
A callable that will recieve arguments and keywords arguments when `event` is triggered.
Returns
-------
current_id : int
The ID assigned to the function.
Raises
------
:exc:`EventNotFound`
If the `event` that is being triggered does not exist.
"""
_event_exists(event)
current_id = self.next_id
self.next_id += 1
self.funcs[event][current_id] = func
return current_id
[docs] def call(self, event, *args, **kwargs):
r"""Call all the functions registered to `event` passing `*args` and `*kwargs`.
Parameters
----------
event : str
The event which be triggered.
Raises
------
:exc:`EventNotFound`
If the `event` that is being triggered does not exist.
"""
_event_exists(event)
results = []
for func in self.funcs[event].values():
results.append(func(*args, **kwargs))
return results
def _event_exists(event):
"""Check if `event` is inside :data:`events`.
Parameters
----------
event : str
The name of the event.
Raises
------
:exc:`EventNotFound`
When the event is not in :data:`events`.
"""
if event not in events:
raise EventNotFound(f"The event '{event}' does not exists.'")
return True