* Migrate from Black to Ruff and reformat code with enabling additional linter checks
* Add changelog for migration to Ruff as formatter and linter
* Add type ignores for specific attributes and replace tuple with set for chat type check
* Remove file from another changes
* 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>
* Fix handler registration order in `Scene`
Previously, `Scene` handlers were registered based on the sorted output of `inspect.getmembers`, causing incorrect execution order. Now, handlers are registered in the order they are defined in the class, ensuring reliable behavior and proper sequence when handling filters with varying specificity. Added test cases to validate the correct handler ordering.
* Add dynamic dataclass and class attribute resolvers
Introduced `dataclass_kwargs` to ensure compatibility with different Python versions and modular attribute handling. Added utilities for resolving class attributes dynamically, enhancing flexibility with MRO-based resolvers. Updated tests to verify new features and ensure proper functionality across various scenarios.
* Update changelog