mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-06 07:50:32 +00:00
Some checks failed
Tests / tests (macos-latest, 3.10) (push) Has been cancelled
Tests / tests (macos-latest, 3.11) (push) Has been cancelled
Tests / tests (macos-latest, 3.12) (push) Has been cancelled
Tests / tests (macos-latest, 3.13) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.10) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.11) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.12) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.13) (push) Has been cancelled
Tests / tests (windows-latest, 3.10) (push) Has been cancelled
Tests / tests (windows-latest, 3.11) (push) Has been cancelled
Tests / tests (windows-latest, 3.12) (push) Has been cancelled
Tests / tests (windows-latest, 3.13) (push) Has been cancelled
Tests / pypy-tests (macos-latest, pypy3.10) (push) Has been cancelled
Tests / pypy-tests (macos-latest, pypy3.11) (push) Has been cancelled
Tests / pypy-tests (ubuntu-latest, pypy3.10) (push) Has been cancelled
Tests / pypy-tests (ubuntu-latest, pypy3.11) (push) Has been cancelled
* Drop py3.9 and pypy3.9 Add pypy3.11 (testing) into `tests.yml` Remove py3.9 from matrix in `tests.yml` Refactor not auto-gen code to be compatible with py3.10+, droping ugly 3.9 annotation. Replace some `from typing` imports to `from collections.abc`, due to deprecation Add `from __future__ import annotations` and `if TYPE_CHECKING:` where possible Add some `noqa` to calm down Ruff in some places, if Ruff will be used as default linting+formatting tool in future Replace some relative imports to absolute Sort `__all__` tuples in `__init__.py` and some other `.py` files Sort `__slots__` tuples in classes Split raises into `msg` and `raise` (`EM101`, `EM102`) to not duplicate error message in the traceback Add `Self` from `typing_extenstion` where possible Resolve typing problem in `aiogram/filters/command.py:18` Concatenate nested `if` statements Convert `HandlerContainer` into a dataclass in `aiogram/fsm/scene.py` Bump tests docker-compose.yml `redis:6-alpine` -> `redis:8-alpine` Bump tests docker-compose.yml `mongo:7.0.6` -> `mongo:8.0.14` Bump pre-commit-config `black==24.4.2` -> `black==25.9.0` Bump pre-commit-config `ruff==0.5.1` -> `ruff==0.13.3` Update Makefile lint for ruff to show fixes Add `make outdated` into Makefile Use `pathlib` instead of `os.path` Bump `redis[hiredis]>=5.0.1,<5.3.0` -> `redis[hiredis]>=6.2.0,<7` Bump `cryptography>=43.0.0` -> `cryptography>=46.0.0` due to security reasons Bump `pytz~=2023.3` -> `pytz~=2025.2` Bump `pycryptodomex~=3.19.0` -> `pycryptodomex~=3.23.0` due to security reasons Bump linting and formatting tools * Add `1726.removal.rst` * Update aiogram/utils/dataclass.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update aiogram/filters/callback_data.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update 1726.removal.rst * Remove `outdated` from Makefile * Add `__slots__` to `HandlerContainer` * Remove unused imports * Add `@dataclass` with `slots=True` to `HandlerContainer` --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import Callable, Sequence
|
|
from functools import partial
|
|
from typing import Any, cast, overload
|
|
|
|
from aiogram.client.session.middlewares.base import (
|
|
NextRequestMiddlewareType,
|
|
RequestMiddlewareType,
|
|
)
|
|
from aiogram.methods.base import TelegramType
|
|
|
|
|
|
class RequestMiddlewareManager(Sequence[RequestMiddlewareType]):
|
|
def __init__(self) -> None:
|
|
self._middlewares: list[RequestMiddlewareType] = []
|
|
|
|
def register(
|
|
self,
|
|
middleware: RequestMiddlewareType,
|
|
) -> RequestMiddlewareType:
|
|
self._middlewares.append(middleware)
|
|
return middleware
|
|
|
|
def unregister(self, middleware: RequestMiddlewareType) -> None:
|
|
self._middlewares.remove(middleware)
|
|
|
|
def __call__(
|
|
self,
|
|
middleware: RequestMiddlewareType | None = None,
|
|
) -> Callable[[RequestMiddlewareType], RequestMiddlewareType] | RequestMiddlewareType:
|
|
if middleware is None:
|
|
return self.register
|
|
return self.register(middleware)
|
|
|
|
@overload
|
|
def __getitem__(self, item: int) -> RequestMiddlewareType:
|
|
pass
|
|
|
|
@overload
|
|
def __getitem__(self, item: slice) -> Sequence[RequestMiddlewareType]:
|
|
pass
|
|
|
|
def __getitem__(
|
|
self,
|
|
item: int | slice,
|
|
) -> RequestMiddlewareType | Sequence[RequestMiddlewareType]:
|
|
return self._middlewares[item]
|
|
|
|
def __len__(self) -> int:
|
|
return len(self._middlewares)
|
|
|
|
def wrap_middlewares(
|
|
self,
|
|
callback: NextRequestMiddlewareType[TelegramType],
|
|
**kwargs: Any,
|
|
) -> NextRequestMiddlewareType[TelegramType]:
|
|
middleware = partial(callback, **kwargs)
|
|
for m in reversed(self._middlewares):
|
|
middleware = partial(m, middleware)
|
|
return cast(NextRequestMiddlewareType[TelegramType], middleware)
|