Add optional check for required events before processing

This commit is contained in:
Christophe Bedard 2019-12-29 12:59:54 -05:00
parent 79f702e621
commit 2fbab32816

View file

@ -253,6 +253,10 @@ class DependencySolver():
visited.add(dep_type) visited.add(dep_type)
class RequiredEventNotFoundError(RuntimeError):
pass
class Processor(): class Processor():
"""Processor class, which dispatches events to event handlers.""" """Processor class, which dispatches events to event handlers."""
@ -268,11 +272,11 @@ class Processor():
:param kwargs: the parameters to pass on to new handlers :param kwargs: the parameters to pass on to new handlers
""" """
self._initial_handlers = list(handlers) self._initial_handlers = list(handlers)
expanded_handlers = self._expand_dependencies(*handlers, **kwargs) self._expanded_handlers = self._expand_dependencies(*handlers, **kwargs)
self._handler_multimap = self._get_handler_maps(expanded_handlers) self._handler_multimap = self._get_handler_maps(self._expanded_handlers)
self._register_with_handlers(expanded_handlers) self._register_with_handlers(self._expanded_handlers)
self._progress_display = ProcessingProgressDisplay( self._progress_display = ProcessingProgressDisplay(
[type(handler).__name__ for handler in expanded_handlers], [type(handler).__name__ for handler in self._expanded_handlers],
) )
self._processing_done = False self._processing_done = False
@ -317,17 +321,35 @@ class Processor():
for handler in handlers: for handler in handlers:
handler.register_processor(self) handler.register_processor(self)
def _check_required_events(
self,
events: List[DictEvent],
) -> None:
event_names = {get_event_name(event) for event in events}
# Check names separately so that we can know which event from which handler is missing
for handler in self._expanded_handlers:
for name in handler.required_events():
if name not in event_names:
raise RequiredEventNotFoundError(
f'missing event {name} for {handler.__class__.__name__}'
)
def process( def process(
self, self,
events: List[DictEvent], events: List[DictEvent],
erase_progress: bool = False, erase_progress: bool = False,
no_required_events_check: bool = False,
) -> None: ) -> None:
""" """
Process all events. Process all events.
:param events: the events to process :param events: the events to process
:param erase_progress: whether to erase the progress message :param erase_progress: whether to erase the progress message
:param no_required_events_check: whether to skip the check for required events
""" """
if not no_required_events_check:
self._check_required_events(events)
if not self._processing_done: if not self._processing_done:
self._progress_display.set_work_total(len(events)) self._progress_display.set_work_total(len(events))
for event in events: for event in events: