diff --git a/README.md b/README.md index 527e360..8bde403 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ # EventsSystem -EventsSystem module \ No newline at end of file +EventsSystem module + +!!! Запуск происходит до инициализации ядра + +luguru настроен под формат: +```python +fmt = "{elapsed} -- {time:YYYY-MM-DD HH:mm:ss.SSS} | {level:<8} | {extra[module]:^12} | {extra[prefix]:<12} | {message}" +``` + +Добавление в проект: +```bash +git submodule add ssh://git@git.anidev.ru:222/roden-soft/EventsSystem.git src/modules/EventsSystem +``` diff --git a/events.py b/events.py new file mode 100644 index 0000000..a8cbebc --- /dev/null +++ b/events.py @@ -0,0 +1,39 @@ +import builtins + +from loguru import logger + + +class EventsSystem: + def __init__(self): + self.log = logger.bind(module="EventsSystem", prefix="EVENTS") + self.__events = {} + logger.debug("Injected to builtins") + builtins.event = self + logger.debug("EventsSystem ready") + + def register(self, event_name, callback): + log = self.log.bind(prefix="register") + log.debug(f"{event_name!r}; {callback.__name__}({callback})") + if not callable(callback): + return log.error(f"Bad event '{event_name}' - cannot registered") + if event_name not in self.__events: + self.__events.update({str(event_name): [callback]}) + else: + self.__events[event_name].append(callback) + + def call(self, event_name, *args, **kwargs): + log = self.log.bind(prefix="call") + funcs_data = [] + if event_name in self.__events.keys(): + for callback in self.__events[event_name]: + log.debug(f"{event_name!r}; execute: '{callback.__name__}'; data: {args=}; {kwargs=}") + try: + event_data = {"event_name": event_name, "args": args, "kwargs": kwargs} + funcs_data.append(callback(event_data)) + except Exception as e: + log.error(f"Error in {callback.__name__}. See debug.log") + log.exception(e) + else: + log.error(f"Event '{event_name}' not found.") + + return funcs_data