Add optional check for required events before processing
This commit is contained in:
parent
79f702e621
commit
2fbab32816
1 changed files with 26 additions and 4 deletions
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue