Change signal routing for increased consistency

This commit is contained in:
Adam Hopkins 2021-10-17 11:06:51 +03:00
parent 5e12edbc38
commit ac51d29085

View File

@ -123,12 +123,20 @@ class SignalRouter(BaseRouter):
if context: if context:
params.update(context) params.update(context)
signals = group.routes
if not reverse: if not reverse:
handlers = handlers[::-1] signals = signals[::-1]
try: try:
for handler in handlers: for signal in signals:
if condition is None or condition == handler.__requirements__: trigger = params.pop("__trigger__", None)
maybe_coroutine = handler(**params) kwargs = params
if signal.ctx.trigger:
kwargs[signal.ctx.trigger] = trigger
if (
condition is None
or condition == signal.handler.__requirements__
) and (signal.ctx.trigger or event == signal.ctx.definition):
maybe_coroutine = signal.handler(**params)
if isawaitable(maybe_coroutine): if isawaitable(maybe_coroutine):
retval = await maybe_coroutine retval = await maybe_coroutine
if retval: if retval:
@ -172,22 +180,33 @@ class SignalRouter(BaseRouter):
event: str, event: str,
condition: Optional[Dict[str, Any]] = None, condition: Optional[Dict[str, Any]] = None,
) -> Signal: ) -> Signal:
event_definition = event
parts = self._build_event_parts(event) parts = self._build_event_parts(event)
if parts[2].startswith("<"): if parts[2].startswith("<"):
name = ".".join([*parts[:-1], "*"]) name = ".".join([*parts[:-1], "*"])
trigger = parts[2][1:-1]
else: else:
name = event name = event
trigger = None
if not trigger:
event = ".".join([*parts[:2], "<__trigger__>"])
handler.__requirements__ = condition # type: ignore handler.__requirements__ = condition # type: ignore
handler.__trigger__ = trigger # type: ignore
return super().add( signal = super().add(
event, event,
handler, handler,
requirements=condition,
name=name, name=name,
append=True, append=True,
) # type: ignore ) # type: ignore
signal.ctx.trigger = trigger
signal.ctx.definition = event_definition
return signal
def finalize(self, do_compile: bool = True, do_optimize: bool = False): def finalize(self, do_compile: bool = True, do_optimize: bool = False):
self.add(_blank, "sanic.__signal__.__init__") self.add(_blank, "sanic.__signal__.__init__")