aiogram_tool 1.2.3__tar.gz → 1.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/PKG-INFO +2 -2
  2. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/callback_data/filter.py +7 -2
  3. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/utils/stack_manager.py +1 -1
  4. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/pyproject.toml +2 -2
  5. aiogram_tool-1.2.5/tests/callback_data/test_unique_id.py +40 -0
  6. aiogram_tool-1.2.5/tests/depend/test_stack_exception.py +44 -0
  7. aiogram_tool-1.2.5/uv.lock +1244 -0
  8. aiogram_tool-1.2.3/tests/callback_data/test_unique_id.py +0 -13
  9. aiogram_tool-1.2.3/uv.lock +0 -1113
  10. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/.github/workflows/main.yml +0 -0
  11. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/.github/workflows/release.yml +0 -0
  12. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/.gitignore +0 -0
  13. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/.pre-commit-config.yaml +0 -0
  14. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/.python-version +0 -0
  15. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/CONTRIBUTING.md +0 -0
  16. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/LICENSE.md +0 -0
  17. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/README.md +0 -0
  18. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/__init__.py +0 -0
  19. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/storage/__init__.py +0 -0
  20. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/storage/base.py +0 -0
  21. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/storage/impl/__init__.py +0 -0
  22. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/storage/impl/file.py +0 -0
  23. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/storage/impl/memory.py +0 -0
  24. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/storage/impl/redis.py +0 -0
  25. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/__init__.py +0 -0
  26. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/callback_data/__init__.py +0 -0
  27. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/callback_data/answer.py +0 -0
  28. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/__init__.py +0 -0
  29. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/components/__init__.py +0 -0
  30. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/components/exit.py +0 -0
  31. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/components/filter.py +0 -0
  32. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/components/inner_middleware.py +0 -0
  33. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/components/outer_middleware.py +0 -0
  34. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/depend.py +0 -0
  35. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/storage/__init__.py +0 -0
  36. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/storage/memory.py +0 -0
  37. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/tool.py +0 -0
  38. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/types/__init__.py +0 -0
  39. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/types/enums.py +0 -0
  40. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/types/exceptions.py +0 -0
  41. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/types/schema.py +0 -0
  42. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/utils/__init__.py +0 -0
  43. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/utils/inspect.py +0 -0
  44. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/utils/registry_manager.py +0 -0
  45. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/utils/resolver.py +0 -0
  46. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/depend/utils/scope_registry.py +0 -0
  47. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/__init__.py +0 -0
  48. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/answer.py +0 -0
  49. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/filter.py +0 -0
  50. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/rate_limit/__init__.py +0 -0
  51. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/rate_limit/base.py +0 -0
  52. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/rate_limit/fixed_window.py +0 -0
  53. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/rate_limit/sliding_window.py +0 -0
  54. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/rate_limit/token_bucket.py +0 -0
  55. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/schema.py +0 -0
  56. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/limit/tool.py +0 -0
  57. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/tools/setup.py +0 -0
  58. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/aiogram_tool/types.py +0 -0
  59. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/en/callback_data.md +0 -0
  60. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/en/depend.md +0 -0
  61. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/en/limit.md +0 -0
  62. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/en/setup.md +0 -0
  63. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/en/storages.md +0 -0
  64. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/ru/callback_data.md +0 -0
  65. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/ru/depend.md +0 -0
  66. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/ru/limit.md +0 -0
  67. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/ru/setup.md +0 -0
  68. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/docs/ru/storages.md +0 -0
  69. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/callback_data/basic.py +0 -0
  70. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/callback_data/custom_expired_answer.py +0 -0
  71. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/callback_data/redis_storage.py +0 -0
  72. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/depend/classes.py +0 -0
  73. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/depend/filter_and_exit.py +0 -0
  74. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/depend/override.py +0 -0
  75. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/depend/scopes.py +0 -0
  76. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/depend/subdepends.py +0 -0
  77. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/limit/advanced.py +0 -0
  78. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/limit/basic.py +0 -0
  79. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/examples/limit/limit_algorithms.py +0 -0
  80. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/pytest.ini +0 -0
  81. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/__init__.py +0 -0
  82. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/callback_data/__init__.py +0 -0
  83. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/callback_data/conftest.py +0 -0
  84. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/callback_data/test_filter.py +0 -0
  85. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/callback_data/test_pack.py +0 -0
  86. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/callback_data/test_with_handler.py +0 -0
  87. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/conftest.py +0 -0
  88. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/__init__.py +0 -0
  89. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/conftest.py +0 -0
  90. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_classes.py +0 -0
  91. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_exit.py +0 -0
  92. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_filter.py +0 -0
  93. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_from.py +0 -0
  94. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_generator.py +0 -0
  95. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_lambda.py +0 -0
  96. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_middleware_data.py +0 -0
  97. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_override.py +0 -0
  98. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_scopes.py +0 -0
  99. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_setup.py +0 -0
  100. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_singleton_lock.py +0 -0
  101. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/depend/test_subdepend.py +0 -0
  102. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/limit/__init__.py +0 -0
  103. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/limit/conftest.py +0 -0
  104. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/limit/test_rate_limits.py +0 -0
  105. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/limit/test_setup.py +0 -0
  106. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/storage/__init__.py +0 -0
  107. {aiogram_tool-1.2.3 → aiogram_tool-1.2.5}/tests/storage/test_storages.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: aiogram-tool
3
- Version: 1.2.3
3
+ Version: 1.2.5
4
4
  Summary: Tools which doing work with aiogram simple
5
5
  Project-URL: Repository, https://github.com/shayzi3/aiogram_tool
6
6
  Project-URL: Contributing, https://github.com/shayzi3/aiogram_tool/blob/master/CONTRIBUTING.md
@@ -9,7 +9,7 @@ License-Expression: MIT
9
9
  License-File: LICENSE.md
10
10
  Keywords: DI,aiogram,callback,cooldown,data,delay,dependency-injection,depends,limit,long,rate,throttling
11
11
  Requires-Python: >=3.11
12
- Requires-Dist: aiogram==3.29.1
12
+ Requires-Dist: aiogram<4.0.0,>=3.29.1
13
13
  Requires-Dist: redis>=8.0.0
14
14
  Description-Content-Type: text/markdown
15
15
 
@@ -20,9 +20,14 @@ class _UniqueIDCallbackData(CallbackData, prefix=UNIQUE_PREFIX):
20
20
 
21
21
  @classmethod
22
22
  def build(cls, callback_data: type[CallbackData]) -> Self:
23
- separators_len = len(cls.__separator__) * len(cls.model_fields)
23
+ separators_len = len(cls.__separator__.encode("utf-8")) * len(cls.model_fields)
24
24
  unique_id_len = (
25
- 64 - (len(UNIQUE_PREFIX) + len(callback_data.__prefix__) + separators_len)
25
+ 64
26
+ - (
27
+ len(UNIQUE_PREFIX.encode("utf-8"))
28
+ + len(callback_data.__prefix__.encode("utf-8"))
29
+ + separators_len
30
+ )
26
31
  ) // 2
27
32
 
28
33
  if unique_id_len < 6:
@@ -13,7 +13,7 @@ class AsyncExitStackTransaction:
13
13
  return self
14
14
 
15
15
  async def __aexit__(self, *args) -> None:
16
- await self.stack.aclose()
16
+ await self.stack.__aexit__(*args)
17
17
 
18
18
  def _get_stack(self, scope: Scope) -> AsyncExitStack:
19
19
  return self.app_stack if scope == Scope.SINGLETON else self.stack
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aiogram-tool"
3
- version = "1.2.3"
3
+ version = "1.2.5"
4
4
  description = "Tools which doing work with aiogram simple"
5
5
  authors = [
6
6
  {name = "Vlad_shayzi1",email = "tecnomega@mail.ru"}
@@ -9,7 +9,7 @@ readme = "README.md"
9
9
  license = "MIT"
10
10
  requires-python = ">=3.11"
11
11
  dependencies = [
12
- "aiogram==3.29.1",
12
+ "aiogram>=3.29.1,<4.0.0",
13
13
  "redis>=8.0.0",
14
14
  ]
15
15
  keywords = [
@@ -0,0 +1,40 @@
1
+ import pytest
2
+
3
+ from aiogram_tool.storage.impl.memory import MemoryStorage
4
+ from aiogram_tool.tools.callback_data.filter import (
5
+ LongCallbackData,
6
+ LongCallbackQueryFilter,
7
+ _UniqueIDCallbackData,
8
+ )
9
+
10
+ from .conftest import CallbackQueryFactoryType
11
+
12
+
13
+ async def test_unique_id_data_error() -> None:
14
+
15
+ class Data(LongCallbackData, prefix="LONG" * 13):
16
+ attr: str
17
+
18
+ with pytest.raises(ValueError):
19
+ # Error is too long prefix
20
+ await Data(attr="important_data").pack_long()
21
+
22
+
23
+ async def test_unicode_prefix_unique_id_respects_telegram_byte_limit(
24
+ callback_query_factory: CallbackQueryFactoryType,
25
+ ) -> None:
26
+ class Data(LongCallbackData, prefix="🐍" * 10):
27
+ _storage = MemoryStorage()
28
+
29
+ attr: str
30
+
31
+ unique_id = _UniqueIDCallbackData.build(Data).pack()
32
+ assert len(unique_id.encode("utf-8")) <= 64
33
+
34
+ packed = await Data(attr="important_data" * 10).pack_long()
35
+ assert len(packed.encode("utf-8")) <= 64
36
+
37
+ result = await LongCallbackQueryFilter(callback_data=Data)(
38
+ callback_query_factory(packed)
39
+ )
40
+ assert result["callback_data"] == Data(attr="important_data" * 10)
@@ -0,0 +1,44 @@
1
+ from contextlib import AsyncExitStack, asynccontextmanager
2
+
3
+ import pytest
4
+
5
+ from aiogram_tool.tools.depend.types.enums import Scope
6
+ from aiogram_tool.tools.depend.utils.stack_manager import AsyncExitStackTransaction
7
+
8
+
9
+ @pytest.mark.parametrize("scope", [Scope.REQUEST, Scope.TRANSIENT])
10
+ async def test_dependency_receives_handler_exception(scope):
11
+ seen = []
12
+
13
+ @asynccontextmanager
14
+ async def dependency():
15
+ try:
16
+ yield
17
+ except RuntimeError as exc:
18
+ seen.append(exc)
19
+ raise
20
+ else:
21
+ seen.append("success")
22
+
23
+ error = RuntimeError("handler failed")
24
+ async with AsyncExitStack() as app_stack:
25
+ with pytest.raises(RuntimeError) as caught:
26
+ async with AsyncExitStackTransaction(app_stack) as transaction:
27
+ await transaction.enter_async_context(dependency(), scope)
28
+ raise error
29
+ assert caught.value is error
30
+ assert seen == [error]
31
+
32
+
33
+ async def test_dependency_receives_success():
34
+ seen = []
35
+
36
+ @asynccontextmanager
37
+ async def dependency():
38
+ yield
39
+ seen.append("success")
40
+
41
+ async with AsyncExitStack() as app_stack:
42
+ async with AsyncExitStackTransaction(app_stack) as transaction:
43
+ await transaction.enter_async_context(dependency(), Scope.REQUEST)
44
+ assert seen == ["success"]