Reworked handlers in use (#682)

* Reworked handlers in use util

* Added patch-notes
This commit is contained in:
Alex Root Junior 2021-09-07 01:04:33 +03:00 committed by GitHub
parent e356ede5de
commit cfd2a9968e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 33 additions and 39 deletions

1
CHANGES/682.misc Normal file
View file

@ -0,0 +1 @@
Reworked **handlers_in_use** util. Function moved to Router as method **.resolve_used_update_types()**

View file

@ -1,7 +1,7 @@
from __future__ import annotations
import warnings
from typing import Any, Dict, Generator, List, Optional, Union
from typing import Any, Dict, Generator, List, Optional, Set, Union
from ..types import TelegramObject
from ..utils.imports import import_module
@ -11,6 +11,8 @@ from .event.event import EventObserver
from .event.telegram import TelegramEventObserver
from .filters import BUILTIN_FILTERS
INTERNAL_UPDATE_TYPES = frozenset({"update", "error"})
class Router:
"""
@ -91,6 +93,27 @@ class Router:
def __repr__(self) -> str:
return f"<{self}>"
def resolve_used_update_types(self, skip_events: Optional[Set[str]] = None) -> List[str]:
"""
Resolve registered event names
Is useful for getting updates only for registered event types.
:param skip_events: skip specified event names
:return: set of registered names
"""
handlers_in_use: Set[str] = set()
if skip_events is None:
skip_events = set()
skip_events = {*skip_events, *INTERNAL_UPDATE_TYPES}
for router in self.chain_tail:
for update_name, observer in router.observers.items():
if observer.handlers and update_name not in skip_events:
handlers_in_use.add(update_name)
return list(sorted(handlers_in_use))
async def propagate_event(self, update_type: str, event: TelegramObject, **kwargs: Any) -> Any:
kwargs.update(event_router=self)
observer = self.observers[update_type]

View file

@ -1,28 +0,0 @@
from itertools import chain
from typing import List, cast
from aiogram.dispatcher.dispatcher import Dispatcher
from aiogram.dispatcher.router import Router
INTERNAL_HANDLERS = [
"update",
"error",
]
def get_handlers_in_use(
dispatcher: Dispatcher, handlers_to_skip: List[str] = INTERNAL_HANDLERS
) -> List[str]:
handlers_in_use: List[str] = []
for router in [dispatcher.sub_routers, dispatcher]:
if isinstance(router, list):
if router:
handlers_in_use.extend(chain(*list(map(get_handlers_in_use, router))))
else:
router = cast(Router, router)
for update_name, observer in router.observers.items():
if observer.handlers and update_name not in [*handlers_to_skip, *handlers_in_use]:
handlers_in_use.append(update_name)
return handlers_in_use

View file

@ -5,7 +5,6 @@ from aiogram.dispatcher.router import Router
from aiogram.types import CallbackQuery, ChatMemberUpdated, Message
from aiogram.types.inline_keyboard_button import InlineKeyboardButton
from aiogram.types.inline_keyboard_markup import InlineKeyboardMarkup
from aiogram.utils.handlers_in_use import get_handlers_in_use
TOKEN = "6wo"
dp = Dispatcher()
@ -33,7 +32,7 @@ async def chat_member_update(chat_member: ChatMemberUpdated, bot: Bot) -> None:
await bot.send_message(
chat_member.chat.id,
"Member {chat_member.from_user.id} was changed "
+ f"from {chat_member.old_chat_member.is_chat_member} to {chat_member.new_chat_member.is_chat_member}",
+ f"from {chat_member.old_chat_member.status} to {chat_member.new_chat_member.status}",
)
@ -64,7 +63,7 @@ async def my_chat_member_change(chat_member: ChatMemberUpdated, bot: Bot) -> Non
await bot.send_message(
chat_member.chat.id,
"Member was changed from "
+ f"{chat_member.old_chat_member.is_chat_member} to {chat_member.new_chat_member.is_chat_member}",
+ f"{chat_member.old_chat_member.status} to {chat_member.new_chat_member.status}",
)
@ -77,7 +76,7 @@ def main() -> None:
dp.include_router(sub_router)
dp.include_router(sub_sub_router)
useful_updates = get_handlers_in_use(dp)
useful_updates = dp.resolve_used_update_types()
# And the run events dispatching
dp.run_polling(bot, allowed_updates=useful_updates)

View file

@ -29,7 +29,6 @@ from aiogram.types import (
Update,
User,
)
from aiogram.utils.handlers_in_use import get_handlers_in_use
from tests.mocked_bot import MockedBot
try:
@ -737,30 +736,30 @@ class TestDispatcher:
router21 = Router()
router21.edited_message.register(simple_edited_msg_handler)
useful_updates1 = get_handlers_in_use(dispatcher)
useful_updates1 = dispatcher.resolve_used_update_types()
assert sorted(useful_updates1) == sorted(["message"])
dispatcher.include_router(router1)
useful_updates2 = get_handlers_in_use(dispatcher)
useful_updates2 = dispatcher.resolve_used_update_types()
assert sorted(useful_updates2) == sorted(["message", "callback_query"])
dispatcher.include_router(router2)
useful_updates3 = get_handlers_in_use(dispatcher)
useful_updates3 = dispatcher.resolve_used_update_types()
assert sorted(useful_updates3) == sorted(["message", "callback_query", "poll"])
router2.include_router(router21)
useful_updates4 = get_handlers_in_use(dispatcher)
useful_updates4 = dispatcher.resolve_used_update_types()
assert sorted(useful_updates4) == sorted(
["message", "callback_query", "poll", "edited_message"]
)
useful_updates5 = get_handlers_in_use(router2)
useful_updates5 = router2.resolve_used_update_types()
assert sorted(useful_updates5) == sorted(["poll", "edited_message"])