skip if current router does not have observer for custom event (#1147)

* skip if current router does not have observer for custom event

* Test custom event in router

* Feature changelog file

* fix style
This commit is contained in:
Andrey Tikhonov 2023-04-08 16:39:48 +02:00 committed by GitHub
parent 99cf7028ec
commit 268b7e759d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 10 deletions

1
CHANGES/1147.feature Normal file
View file

@ -0,0 +1 @@
If router does not support custom event it does not break and passes it to included routers

View file

@ -49,8 +49,9 @@ class TelegramEventObserver:
def _resolve_middlewares(self) -> List[MiddlewareType[TelegramObject]]:
middlewares: List[MiddlewareType[TelegramObject]] = []
for router in reversed(tuple(self.router.chain_head)):
observer = router.observers[self.event_name]
middlewares.extend(observer.middleware)
observer = router.observers.get(self.event_name)
if observer:
middlewares.extend(observer.middleware)
return middlewares

View file

@ -105,27 +105,31 @@ class Router:
async def propagate_event(self, update_type: str, event: TelegramObject, **kwargs: Any) -> Any:
kwargs.update(event_router=self)
observer = self.observers[update_type]
observer = self.observers.get(update_type)
async def _wrapped(telegram_event: TelegramObject, **data: Any) -> Any:
return await self._propagate_event(
observer=observer, update_type=update_type, event=telegram_event, **data
)
return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
if observer:
return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
return await _wrapped(event, **kwargs)
async def _propagate_event(
self,
observer: TelegramEventObserver,
observer: Optional[TelegramEventObserver],
update_type: str,
event: TelegramObject,
**kwargs: Any,
) -> Any:
response = await observer.trigger(event, **kwargs)
if response is REJECTED:
return UNHANDLED
if response is not UNHANDLED:
return response
response = UNHANDLED
if observer:
response = await observer.trigger(event, **kwargs)
if response is REJECTED:
return UNHANDLED
if response is not UNHANDLED:
return response
for router in self.sub_routers:
response = await router.propagate_event(update_type=update_type, event=event, **kwargs)

View file

@ -1,6 +1,7 @@
import pytest
from aiogram.dispatcher.event.bases import UNHANDLED, SkipHandler, skip
from aiogram.dispatcher.event.telegram import TelegramEventObserver
from aiogram.dispatcher.router import Router
@ -161,3 +162,20 @@ class TestRouter:
assert tuple(r2_1.chain_head) == (r2_1, r1)
assert tuple(r2_2.chain_head) == (r2_2, r1)
assert tuple(r3.chain_head) == (r3, r2_1, r1)
async def test_custom_evenv_nested_router(self):
r1 = Router()
r2 = Router()
r3 = Router()
r3.observers["custom-event"] = TelegramEventObserver(r3, event_name="custom-event")
async def handler(evt):
return evt
r1.include_router(r2)
r1.include_router(r3)
r3.observers["custom-event"].register(handler)
assert await r1.propagate_event(update_type="custom-event", event=None) is None
assert await r2.propagate_event(update_type="custom-event", event=None) is UNHANDLED
assert await r3.propagate_event(update_type="custom-event", event=None) is None