<commit_before>from handlers.abs_handler import AbsHandler


class EventHub(object):
    def __init__(self):
        self.handler_resolver = dict()

    def add_handler(self, handler: AbsHandler):
        # получаем список чувствительности
        sens_pattern = handler.get_sensitivity_list()

        # получаем список зарегистрированых типов событий в системе
        sources_by_type = self.handler_resolver

        # получаем список источников сообщений некоторого типа, существующий или новый
        events_by_source = sources_by_type.setdefault(sens_pattern.type, dict())

        # для каждого источника сообщений...
        for source in sens_pattern.sources:
            # получаем список событий, которые с ним могут произойти, существующий или новый
            handlers_by_event = events_by_source.setdefault(source, dict())

            # для каждого события...
            for event in sens_pattern.events:
                # получаем список его обработчиков, существующий или новый
                handlers_available = handlers_by_event.setdefault(event, set())

                # добавляем обработчик для нашего изменения
                handlers_available.add(handler)

    def remove_handler(self, handler: AbsHandler):
        # получаем список чувствительности
        sens_pattern = handler.get_sensitivity_list()

        # получаем список зарегистрированых типов событий в системе
        types_available = self.handler_resolver

        # получаем список источников сообщений некоторого типа
        sources_available = types_available.get(sens_pattern.type, dict())

        # для каждого источника сообщений...
        for source in sens_pattern.sources:
            # получаем список событий, которые с ним могут произойти
            events_available = sources_available.get(source, dict())

            # для каждого события...
            for event in sens_pattern.events:
                # получаем список его обработчиков
                handlers_available = events_available.get(event, set())

                # удаляем обработчик для нашего изменения
                handlers_available.remove(handler)

                # сохраняем новый список обработчиков
                events_available[event] = handlers_available

            # сохраняем новый словарь событий
            sources_available[source] = events_available

        # сохраняем новый словарь источников
        types_available[sens_pattern.type] = sources_available

    def accept_event(self, message):
        types_available = self.handler_resolver

        sources_available = types_available.get(message.type)
        if sources_available is None:
            return

        events_available = sources_available.get(message.source)

        if events_available is None:
            return

        handlers_available = events_available.get(message.event)

        if handlers_available is None:
            return

        for handler in handlers_available:
            handler.handle(message)<commit_msg>Improved implementation of handler addition and removal<commit_after>from enum import Enum

from handlers.abs_handler import AbsHandler


class Operation(Enum):
    remove = 0
    add = 1


class EventHub(object):
    def __init__(self):
        self.handler_resolver = dict()

    def __process_handler(self, handler: AbsHandler, operation: Operation):
        # получаем список чувствительности
        sens_pattern = handler.get_sensitivity_list()

        # получаем список зарегистрированых типов событий в системе
        sources_by_type = self.handler_resolver

        # получаем список источников сообщений некоторого типа, существующий или новый
        events_by_source = sources_by_type.setdefault(sens_pattern.type, dict())

        # для каждого источника сообщений...
        for source in sens_pattern.sources:
            # получаем список событий, которые с ним могут произойти, существующий или новый
            handlers_by_event = events_by_source.setdefault(source, dict())

            # для каждого события...
            for event in sens_pattern.events:
                # получаем список его обработчиков, существующий или новый
                handlers_available = handlers_by_event.setdefault(event, set())

                # добавляем или удаляем обработчик для нашего события
                if operation is Operation.add:
                    handlers_available.add(handler)
                else:
                    handlers_available.remove(handler)

    def add_handler(self, handler: AbsHandler):
        self.__process_handler(handler, Operation.add)

    def remove_handler(self, handler: AbsHandler):
        self.__process_handler(handler, Operation.remove)

    def accept_event(self, message):
        types_available = self.handler_resolver

        sources_available = types_available.get(message.type)

        if sources_available is None:
            return

        events_available = sources_available.get(message.source)

        if events_available is None:
            return

        handlers_available = events_available.get(message.event)

        if handlers_available is None:
            return

        for handler in handlers_available:
            handler.handle(message)
{'fraction_non_alphanumeric': 0.05743178782675062, 'fraction_numerical': 0.00038160656363289447, 'mean_word_length': 2.5347269049224543, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6683582', 'n_tokens_mistral': 1544, 'n_tokens_neox': 1564, 'n_words': 353}