* Bump API schema to version 9.4, add new object types, methods, and properties.
* Add tests for `ChatOwnerChanged` and `ChatOwnerLeft` message types
* Add tests for `GetUserProfileAudios`, `RemoveMyProfilePhoto`, and `SetMyProfilePhoto` methods
* Bump version
* Update Makefile variables and refactor `test_get_user_profile_audios.py`
* Document new features and updates from Bot API 9.4 in changelog
* Add `ButtonStyle` enum to represent button styles in the Telegram API
* Fix review issues from PR #1761
- Remove stray '-' artifact from GameHighScore docstring and butcher schema
- Fix Makefile reformat target scope inconsistency (ruff check --fix)
- Fix ButtonStyle enum source URL (#chat -> #inlinekeyboardbutton)
- Add User.get_profile_audios() shortcut method (parallel to get_profile_photos)
- Test ChatOwnerLeft with new_owner=None (edge case)
- Add VideoQuality type and Video.qualities nesting tests
- Add User.get_profile_audios() test
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Revert "Fix review issues from PR #1761"
This reverts commit 2184e98988.
* Update source links for `ButtonStyle` documentation to reflect accurate API references
* Fix review issues from PR #1761 (#1762)
* Fix review issues from PR #1761
- Remove stray '-' artifact from GameHighScore docstring
- Fix Makefile reformat target scope inconsistency (ruff check --fix)
- Add User.get_profile_audios() shortcut method (parallel to get_profile_photos)
- Test ChatOwnerLeft with new_owner=None (edge case)
- Add VideoQuality type and Video.qualities nesting tests
- Add User.get_profile_audios() test
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Address review comments: use fixture and variables in tests, add changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Address review follow-ups for PR #1762
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Reformat code
* Shut up, ruff
---------
Co-authored-by: latand <latand666@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Kostiantyn Kriuchkov <36363097+Latand@users.noreply.github.com>
* Fix scene handling for channel updates with missing FSM state (#1743)
* Add changelog entry for scene handling fix
* Refine scene context error handling
* 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
* Added full support of Telegram Bot API 9.3
* Fixed tests that fails
* Add tests for `GetChatGifts`, `GetUserGifts`, `RepostStory`, and `SendMessageDraft` methods
* Added changelog record
* Switch to using `uv` for dependency management and update related project workflows and scripts
* Expand contributing documentation with instructions for using `uv`, including dependency management, testing, linting, and docs workflows.
* Add changelog entry for migration to `uv` for dependency management and workflows
* 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>
* migrated mongo storage from using deprecated motor to PyMongo
* added storages to __init__.py file to improve DX
* changelog file created
* Revert "added storages to __init__.py file to improve DX"
This reverts commit 5d0f6a9dfb.
* added optional dependency to pymongo to pyproject.toml
* Revert "migrated mongo storage from using deprecated motor to PyMongo"
This reverts commit 1c0207e1d1.
* added deprecation warning to mongo storage
* created pymongo storage
* added entry for PyMongoStorage to documentation in fsm.storages
* updated changelog to have information about how to migrate from MongoStorage to PyMongoStorage
* added test for pymongo storage (copied from mongo storage test)
* fixed formatting using black and isort
* fixed bug in close method of PyMongoStorage (client close method was not awaited)
* added test for PyMongoStorage that checks if storage could be properly closed
* pymongo package changed to be lower case in PyMongoStorage
* added fixture registration for pymongo storage
* test for pymongo is now using proper test fixtures
* removed redundant call to get_data, because we have checked this condition in the previous line
* added more tests to pymongo test, to check for all possible cases of using update_data method
* fixed PyMongoStorage update_data method implementation
* added pymongo tests to test_storages
* fixed pymongo tests, update_data method should not delete document when {} was passed
* Revert "fixed PyMongoStorage update_data method implementation"
This reverts commit 86170e1cb9.
* fixed linting issues in PyMongoStorage
* changed allowed versions of pymongo, to be compatible with motor
* pinned the upper version of pymongo to <4.11
* Added full support for the Bot API 9.2
* Mark butcher tool output files as linguist-generated in .gitattributes
* Switch `send_date` type from `int` to `DateTime` in suggested post models
* Add support for Telegram Bot API 9.1 features, including checklists, gifts, and new methods like `SendChecklist`, `EditMessageChecklist`, and `GetMyStarBalance`. Update changelog and improve `True` field descriptions.
* Bump API Version
* Refactor profile photo types to use `InputProfilePhotoType` enums instead of hardcoded literals
* Refactor imports and clean up redundant code across methods, types, and webhook server classes
* Add semaphore support for limiting concurrent updates
Introduce a semaphore-based mechanism to control the number of concurrent tasks in polling mode when `handle_as_tasks=True`. Added the `tasks_concurrency_limit` parameter to `start_polling()` and `run_polling()`, preventing potential memory exhaustion during high update loads.
* fix: update variable name for clarity in semaphore creation
* Update aiogram/dispatcher/dispatcher.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update callback_data.py
Allows using a default value in the class which is equal to an empty string ("").
Example:
class MyCallbackData(CallbackData, prefix="MyCallbackData"):
input1: str
input2: str = ""
* Create 1493.bugfix.rst
* Update callback_data.py
Fixed an issue that prevented unpacking None values.
* Added tests for CallbackData
* Update tests/test_filters/test_callback_data.py
Co-authored-by: Oleg A. <t0rr@mail.ru>
* Update test_callback_data.py
* Update callback_data.py
* Update 1493.bugfix.rst
---------
Co-authored-by: Oleg A. <t0rr@mail.ru>
* Added "startapp" deep link support
* Remove link_type param, added create_startapp_link method
* Write tests for create_startapp_link method
* Refactor with black & isort
* Added CHANGELOG
* Added support of direct mini app links
* Added CHANGELOG
* Update translation files with new creation dates.
This update includes newly added and corrected translation entries for various .po files in the Ukrainian locale. It ensures consistency with updated source files and aligns with the latest Telegram bot API changes.
* Update Ukrainian documentation translation
* Added "startapp" deep link support
* Remove link_type param, added create_startapp_link method
* Write tests for create_startapp_link method
* Refactor with black & isort
* Added CHANGELOG
* Refactor: Introduce Union types for streamlined type handling
Implemented Union types across various modules to consolidate and simplify type annotations. This change replaces repetitive union declarations with reusable Union aliases, improving code readability and maintainability. Updates applied to affected classes, methods, and imports accordingly.
* Refactor unions into type aliases for better reusability
Replaced inline `Union` types with predefined aliases like `MediaUnion`, `ReplyMarkupUnion`, and `ChatIdUnion`. Simplifies type annotations, improves code readability, and reduces duplication. Added `media_union.py` for grouping related media types.
* Refactor type unions with ResultChatMemberUnion and ResultMenuButtonUnion
Replaced verbose type definitions of chat member and menu button unions with `ResultChatMemberUnion` and `ResultMenuButtonUnion` for improved readability and maintainability. Updated relevant methods, modules, and documentation to use the new type aliases consistently.
* Added changelog
* Add TypedDict support for middleware context data
Introduced `MiddlewareData` and associated TypedDicts to type-hint middleware context data. Updated documentation to include usage examples and guidelines for extending the default middleware data. Also adjusted coverage configuration to exclude the new data module.
* Added more docstrings
* Typo fixes
* 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