aiogram_tool 1.0.1__tar.gz → 1.1.0__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 (30) hide show
  1. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/PKG-INFO +7 -8
  2. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/README.md +3 -3
  3. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/depend/__init__.py +3 -2
  4. aiogram_tool-1.1.0/aiogram_tool/depend/components/__init__.py +9 -0
  5. aiogram_tool-1.1.0/aiogram_tool/depend/components/exit.py +19 -0
  6. aiogram_tool-1.1.0/aiogram_tool/depend/components/filter.py +35 -0
  7. aiogram_tool-1.1.0/aiogram_tool/depend/components/handler.py +35 -0
  8. aiogram_tool-1.1.0/aiogram_tool/depend/components/outer_middleware.py +19 -0
  9. aiogram_tool-1.1.0/aiogram_tool/depend/setup.py +50 -0
  10. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/depend/utils/inject.py +5 -5
  11. aiogram_tool-1.1.0/aiogram_tool/limit/__init__.py +12 -0
  12. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/limit/limit.py +23 -24
  13. aiogram_tool-1.1.0/aiogram_tool/limit/setup.py +25 -0
  14. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/limit/storage/redis_storage.py +4 -6
  15. aiogram_tool-1.1.0/aiogram_tool/limit/utils/__init__.py +6 -0
  16. aiogram_tool-1.1.0/aiogram_tool/limit/utils/callback.py +40 -0
  17. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/pyproject.toml +5 -4
  18. aiogram_tool-1.0.1/aiogram_tool/depend/components/filter.py +0 -31
  19. aiogram_tool-1.0.1/aiogram_tool/depend/components/middleware.py +0 -39
  20. aiogram_tool-1.0.1/aiogram_tool/depend/setup.py +0 -34
  21. aiogram_tool-1.0.1/aiogram_tool/depend/utils/__init__.py +0 -0
  22. aiogram_tool-1.0.1/aiogram_tool/limit/__init__.py +0 -7
  23. aiogram_tool-1.0.1/aiogram_tool/limit/setup.py +0 -27
  24. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/LICENSE.md +0 -0
  25. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/__init__.py +0 -0
  26. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/depend/depend.py +0 -0
  27. {aiogram_tool-1.0.1/aiogram_tool/depend/components → aiogram_tool-1.1.0/aiogram_tool/depend/utils}/__init__.py +0 -0
  28. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/limit/storage/__init__.py +0 -0
  29. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/limit/storage/abstract_storage.py +0 -0
  30. {aiogram_tool-1.0.1 → aiogram_tool-1.1.0}/aiogram_tool/limit/storage/memory_storage.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: aiogram_tool
3
- Version: 1.0.1
3
+ Version: 1.1.0
4
4
  Summary: Tools which doing work with aiogram simple
5
5
  License: MIT
6
- Keywords: aiogram,rate,throttling,limit,dependency-injection,depends,cooldown,delay
6
+ Keywords: aiogram,rate,throttling,limit,dependency-injection,depends,cooldown,delay,DI
7
7
  Author: Vlad_shayzi1
8
8
  Author-email: tecnomega@mail.ru
9
9
  Requires-Python: >=3.10
@@ -13,8 +13,8 @@ Classifier: Programming Language :: Python :: 3.10
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
- Requires-Dist: aiogram (>=3.21.0,<4.0.0)
17
- Requires-Dist: redis (>=6.2.0,<7.0.0)
16
+ Requires-Dist: aiogram (>=3.22.0,<4.0.0)
17
+ Requires-Dist: redis (>=6.4.0,<7.0.0)
18
18
  Description-Content-Type: text/markdown
19
19
 
20
20
  ## aiogram_tool
@@ -47,7 +47,6 @@ poetry add aiogram_tool
47
47
 
48
48
  ## Features `Depend`
49
49
 
50
- - Depend without response for Router, handler
51
- - Exit from depend before call handler
52
- - use cache
53
-
50
+ - Depend for Router
51
+ - cache
52
+ - scopes
@@ -28,6 +28,6 @@ poetry add aiogram_tool
28
28
 
29
29
  ## Features `Depend`
30
30
 
31
- - Depend without response for Router, handler
32
- - Exit from depend before call handler
33
- - use cache
31
+ - Depend for Router
32
+ - cache
33
+ - scopes
@@ -1,10 +1,11 @@
1
1
  from .depend import Depend
2
- from .components.filter import DependFilter
3
2
  from .setup import setup_depend_tool
3
+ from .components import DependExit, DependHandler
4
4
 
5
5
 
6
6
  __all__ = [
7
7
  "Depend",
8
- "DependFilter",
9
8
  "setup_depend_tool",
9
+ "DependExit",
10
+ "DependFilter"
10
11
  ]
@@ -0,0 +1,9 @@
1
+ from .exit import DependExit
2
+ from .handler import DependHandler
3
+ from .filter import DependFilter
4
+ from .outer_middleware import StackMiddleware
5
+
6
+ __all__ = [
7
+ "DependExit",
8
+ "DependHandler",
9
+ ]
@@ -0,0 +1,19 @@
1
+ from aiogram.types.base import TelegramObject
2
+
3
+
4
+
5
+ class DependExit:
6
+ def __init__(
7
+ self,
8
+ event: TelegramObject | None = None,
9
+ **event_kwargs
10
+ ) -> None:
11
+ if not hasattr(event, "answer") and event is not None:
12
+ raise ValueError("event haven't method answer")
13
+
14
+ self._event = event
15
+ self._event_kwargs = event_kwargs
16
+
17
+ async def event_answer(self) -> None:
18
+ if self._event is not None:
19
+ await self._event.answer(**self._event_kwargs)
@@ -0,0 +1,35 @@
1
+ from contextlib import AsyncExitStack
2
+
3
+ from aiogram.filters import Filter
4
+ from aiogram.types.base import TelegramObject
5
+ from aiogram import Dispatcher
6
+ from aiogram.dispatcher.event.handler import HandlerObject
7
+
8
+ from .exit import DependExit
9
+ from ..depend import Depend
10
+ from ..utils.inject import inject_parametrs
11
+
12
+
13
+
14
+ class DependFilter(Filter):
15
+
16
+ async def __call__(self, event: TelegramObject, **data):
17
+ data.update({"event": event})
18
+
19
+ dispatcher: Dispatcher = data.get("dispatcher")
20
+ handler_object: HandlerObject = data.get("handler")
21
+
22
+ dependency_override: dict[str, Depend] = dispatcher.get("dependency_override", {})
23
+ stack: AsyncExitStack = data.get("async_stack")
24
+
25
+ inject = await inject_parametrs(
26
+ callback=handler_object.callback,
27
+ dependency_override=dependency_override,
28
+ middleware_data=data,
29
+ stack=stack
30
+ )
31
+ for value in inject.values():
32
+ if isinstance(value, DependExit):
33
+ await value.event_answer()
34
+ return False
35
+ return inject
@@ -0,0 +1,35 @@
1
+ from contextlib import AsyncExitStack
2
+ from aiogram.filters import Filter
3
+ from aiogram.types.base import TelegramObject
4
+
5
+ from ..depend import Depend
6
+ from .exit import DependExit
7
+
8
+
9
+
10
+ class DependHandler(Filter):
11
+ def __init__(self, *dependencies: Depend):
12
+ for dep in dependencies:
13
+ if not isinstance(dep, Depend):
14
+ raise TypeError("Invalid type in dependency")
15
+
16
+ self._dependencies = dependencies
17
+
18
+
19
+ async def __call__(self, event: TelegramObject, **kwargs) -> bool:
20
+ kwargs.update({"event": event})
21
+
22
+ async with AsyncExitStack() as stack:
23
+ for depend in self._dependencies:
24
+ result = await depend.call(
25
+ middleware_data=kwargs,
26
+ stack=stack
27
+ )
28
+ if isinstance(result, DependExit):
29
+ await result.event_answer()
30
+ return False
31
+ return True
32
+
33
+
34
+
35
+
@@ -0,0 +1,19 @@
1
+ from typing import Any, Callable, Awaitable
2
+ from contextlib import AsyncExitStack
3
+
4
+ from aiogram.dispatcher.middlewares.base import BaseMiddleware
5
+ from aiogram.types.base import TelegramObject
6
+
7
+
8
+
9
+ class StackMiddleware(BaseMiddleware):
10
+
11
+ async def __call__(
12
+ self,
13
+ handler: Callable[[TelegramObject, dict[str, Any]], Awaitable],
14
+ event: TelegramObject,
15
+ data: dict[str, Any]
16
+ ):
17
+ async with AsyncExitStack() as stack:
18
+ data.update({"async_stack": stack})
19
+ return await handler(event, data)
@@ -0,0 +1,50 @@
1
+ from aiogram import Dispatcher
2
+ from aiogram.dispatcher.event.telegram import TelegramEventObserver
3
+ from aiogram.dispatcher.event.handler import FilterObject
4
+
5
+
6
+ from .depend import Depend
7
+ from .components import DependFilter, StackMiddleware
8
+
9
+
10
+
11
+
12
+
13
+ def setup_depend_tool(
14
+ dispatcher: Dispatcher,
15
+ dependency_override: dict[str, Depend] = {},
16
+ allowed_updates: list[str] = [],
17
+ ) -> None:
18
+ if not isinstance(dispatcher, Dispatcher):
19
+ raise TypeError("Invalid type for dispatcher")
20
+
21
+ if dependency_override:
22
+ for dep in dependency_override.values():
23
+ if not isinstance(dep, Depend):
24
+ raise TypeError("Invalid type in dependency_override")
25
+ dispatcher["dependency_override"] = dependency_override
26
+
27
+ if allowed_updates:
28
+ for allow in allowed_updates:
29
+ if allow not in dispatcher.observers:
30
+ raise TypeError(f"Invalid observer {allow}")
31
+ else:
32
+ observer: TelegramEventObserver = getattr(dispatcher, allow)
33
+
34
+ if observer.handlers:
35
+ observer.outer_middleware(StackMiddleware())
36
+ for handler in observer.handlers:
37
+ handler.filters.append(FilterObject(DependFilter()))
38
+
39
+ else:
40
+ for allow in dispatcher.resolve_used_update_types():
41
+ observer: TelegramEventObserver = getattr(dispatcher, allow)
42
+
43
+ if observer.handlers:
44
+ observer.outer_middleware(StackMiddleware())
45
+ for handler in observer.handlers:
46
+ handler.filters.append(FilterObject(DependFilter()))
47
+
48
+
49
+
50
+
@@ -13,7 +13,7 @@ from ..depend import Depend
13
13
 
14
14
  async def depend_call(
15
15
  depend: Depend,
16
- dependency_override: dict[str, Any],
16
+ dependency_override: dict[str, Depend],
17
17
  middleware_data: dict[str, Any],
18
18
  stack: AsyncExitStack
19
19
  ) -> Any:
@@ -30,7 +30,7 @@ async def inject_parametrs(
30
30
  middleware_data: dict[str, Any],
31
31
  dependency_override: dict[str, Depend] = {},
32
32
  ) -> dict[str, Any]:
33
- data = {}
33
+ injected_params = {}
34
34
  signature = inspect.signature(callback)
35
35
  for key, annotation in signature.parameters.items():
36
36
  default_value = annotation.default
@@ -39,7 +39,7 @@ async def inject_parametrs(
39
39
  types = getattr(annotation.annotation, "__metadata__")
40
40
  for dep in types:
41
41
  if isinstance(dep, Depend):
42
- data[key] = await depend_call(
42
+ injected_params[key] = await depend_call(
43
43
  depend=dep,
44
44
  dependency_override=dependency_override,
45
45
  middleware_data=middleware_data,
@@ -47,10 +47,10 @@ async def inject_parametrs(
47
47
  )
48
48
 
49
49
  elif isinstance(default_value, Depend):
50
- data[key] = await depend_call(
50
+ injected_params[key] = await depend_call(
51
51
  depend=default_value,
52
52
  dependency_override=dependency_override,
53
53
  middleware_data=middleware_data,
54
54
  stack=stack
55
55
  )
56
- return data
56
+ return injected_params
@@ -0,0 +1,12 @@
1
+ from .limit import Limit
2
+ from .setup import setup_limit_tool
3
+ from .utils import AnswerCallback
4
+ from .storage import RedisStorage, MemoryStorage
5
+
6
+ __all__ = [
7
+ "Limit",
8
+ "setup_limit_tool",
9
+ "AnswerCallback",
10
+ "RedisStorage",
11
+ "MemoryStorage",
12
+ ]
@@ -1,6 +1,5 @@
1
1
  import inspect
2
2
 
3
- from typing import Callable, Awaitable
4
3
  from datetime import datetime, timedelta
5
4
 
6
5
  from aiogram import Dispatcher
@@ -8,6 +7,7 @@ from aiogram.filters import Filter
8
7
  from aiogram.types.base import TelegramObject
9
8
  from aiogram.dispatcher.event.handler import HandlerObject
10
9
 
10
+ from .utils.callback import AnswerCallback
11
11
  from .storage.abstract_storage import AbstractStorage
12
12
  from .storage import MemoryStorage
13
13
 
@@ -24,25 +24,24 @@ class Limit(Filter):
24
24
  days: float = 0,
25
25
  all_users: bool = False,
26
26
  storage: AbstractStorage | None = None,
27
- answer_callback: Callable[[TelegramObject, timedelta, datetime], Awaitable] | None = None
27
+ answer_callback: AnswerCallback | None = None
28
28
  ) -> None:
29
29
  if not isinstance(all_users, bool):
30
- raise TypeError("all_users must be bool type")
30
+ raise TypeError("Invalid type for all_users")
31
31
 
32
32
  if storage is not None:
33
33
  if not issubclass(type(storage), AbstractStorage):
34
34
  raise TypeError(f"Invalid type for storage")
35
35
 
36
36
  if answer_callback is not None:
37
- if not inspect.iscoroutinefunction(answer_callback):
38
- raise TypeError(f"answer_callback must be croutine function")
37
+ if not isinstance(answer_callback, AnswerCallback):
38
+ raise TypeError(f"Invalid type for answer_callback")
39
39
 
40
- # checks types
41
- self.storage = storage
42
- self.answer_callback = answer_callback
43
- self.all_users = all_users
40
+ self._storage = storage
41
+ self._answer_callback = answer_callback
42
+ self._all_users = all_users
44
43
 
45
- self.time = timedelta(
44
+ self._time = timedelta(
46
45
  seconds=seconds,
47
46
  minutes=minutes,
48
47
  hours=hours,
@@ -52,36 +51,36 @@ class Limit(Filter):
52
51
 
53
52
  async def __call__(
54
53
  self,
55
- message: TelegramObject,
54
+ event: TelegramObject,
56
55
  dispatcher: Dispatcher,
57
56
  handler: HandlerObject
58
57
  ) -> bool:
59
- storage = dispatcher.workflow_data.get("storage", MemoryStorage())
60
- answer_callback = dispatcher.workflow_data.get("answer_callback")
58
+ storage: AbstractStorage = dispatcher.get("storage", MemoryStorage())
59
+ answer_callback: AnswerCallback | None = dispatcher.get("answer_callback", None)
61
60
 
62
- if self.storage is not None:
63
- storage = self.storage
61
+ if self._storage is not None:
62
+ storage = self._storage
64
63
 
65
- if self.answer_callback is not None:
66
- answer_callback = self.answer_callback
67
-
68
- query = str(message.from_user.id) + "@" + handler.callback.__name__
69
- if self.all_users is True:
64
+ if self._answer_callback is not None:
65
+ answer_callback = self._answer_callback
66
+
67
+ query = str(event.from_user.id) + "@" + handler.callback.__name__
68
+ if self._all_users is True:
70
69
  query = "users" + "@" + handler.callback.__name__
71
70
 
72
71
  user_time = await storage.get(query)
73
72
  if user_time is None:
74
- await storage.update(query, datetime.utcnow() + self.time)
73
+ await storage.update(query, datetime.utcnow() + self._time)
75
74
  return True
76
75
 
77
76
  if user_time >= datetime.utcnow():
78
77
  time_last = user_time - datetime.utcnow()
79
78
  if answer_callback is not None:
80
- await answer_callback(message, self.time, time_last)
79
+ await answer_callback.call(event, self._time, time_last)
81
80
  else:
82
- await message.answer(f"Retry after {round(time_last.total_seconds(), 0)} seconds")
81
+ await event.answer(f"Retry after {round(time_last.total_seconds(), 0)} seconds")
83
82
  return False
84
83
 
85
- await storage.update(query, datetime.utcnow() + self.time)
84
+ await storage.update(query, datetime.utcnow() + self._time)
86
85
  return True
87
86
 
@@ -0,0 +1,25 @@
1
+ from aiogram import Dispatcher
2
+
3
+ from .utils.callback import AnswerCallback
4
+ from .storage.abstract_storage import AbstractStorage
5
+ from .storage import MemoryStorage
6
+
7
+
8
+
9
+ def setup_limit_tool(
10
+ dispatcher: Dispatcher,
11
+ storage: AbstractStorage = MemoryStorage(),
12
+ answer_callback: AnswerCallback | None = None
13
+ ) -> None:
14
+ if not isinstance(dispatcher, Dispatcher):
15
+ raise TypeError("Invalid type for dispatcher")
16
+
17
+ if not issubclass(type(storage), AbstractStorage):
18
+ raise TypeError("Invalid type for storage")
19
+
20
+ if answer_callback is not None:
21
+ if not isinstance(answer_callback, AnswerCallback):
22
+ raise TypeError("Invalid type for answer_callback")
23
+
24
+ dispatcher["storage"] = storage
25
+ dispatcher["answer_callback"] = answer_callback
@@ -1,5 +1,3 @@
1
- import json
2
-
3
1
  from datetime import datetime
4
2
  from redis.asyncio import Redis as AsyncRedis
5
3
 
@@ -12,13 +10,13 @@ from .abstract_storage import AbstractStorage
12
10
  class RedisStorage(AbstractStorage):
13
11
  def __init__(self, redis: AsyncRedis):
14
12
  if not isinstance(redis, AsyncRedis):
15
- raise TypeError("Invalid type for argument redis")
13
+ raise TypeError("Invalid type for redis")
16
14
 
17
- self.redis = redis
15
+ self._redis = redis
18
16
 
19
17
 
20
18
  async def get(self, name: str) -> datetime | None:
21
- async with self.redis as session:
19
+ async with self._redis as session:
22
20
  data = await session.hget(name="limit_tool", key=name)
23
21
  if data is None:
24
22
  return None
@@ -29,7 +27,7 @@ class RedisStorage(AbstractStorage):
29
27
 
30
28
 
31
29
  async def update(self, name: str, value: datetime) -> None:
32
- async with self.redis as session:
30
+ async with self._redis as session:
33
31
  await session.hset(
34
32
  name="limit_tool",
35
33
  key=name,
@@ -0,0 +1,6 @@
1
+ from .callback import AnswerCallback
2
+
3
+
4
+ __all__ = [
5
+ "AnswerCallback",
6
+ ]
@@ -0,0 +1,40 @@
1
+ import inspect
2
+
3
+ from typing import Callable, Any
4
+
5
+ from datetime import timedelta, datetime
6
+ from aiogram.types.base import TelegramObject
7
+
8
+
9
+
10
+ class AnswerCallback:
11
+ def __init__(self, obj: Callable[[TelegramObject, timedelta, datetime], Any]):
12
+ self._isasync = False
13
+ self._obj = obj
14
+
15
+ if not callable(self._obj):
16
+ raise ValueError("obj in AnswerCallback must be callable")
17
+
18
+ self.__explore_obj()
19
+
20
+
21
+ def __explore_obj(self) -> None:
22
+ if not inspect.isfunction(self._obj):
23
+ self._obj = getattr(self._obj, "__call__", None)
24
+ if self._obj is None:
25
+ raise ValueError(f"don't find method __call__ at obj")
26
+
27
+ if inspect.iscoroutinefunction(self._obj):
28
+ self._isasync = True
29
+ else:
30
+ self._isasync = False
31
+
32
+
33
+ async def call(
34
+ self,
35
+ event: TelegramObject,
36
+ rate_time: timedelta,
37
+ time_last: datetime
38
+ ) -> Any:
39
+ calling = self._obj(event, rate_time, time_last)
40
+ return await calling if self._isasync else calling
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aiogram_tool"
3
- version = "1.0.1"
3
+ version = "1.1.0"
4
4
  description = "Tools which doing work with aiogram simple"
5
5
  authors = [
6
6
  {name = "Vlad_shayzi1",email = "tecnomega@mail.ru"}
@@ -9,8 +9,8 @@ license = "MIT"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
11
11
  dependencies = [
12
- "redis (>=6.2.0,<7.0.0)",
13
- "aiogram (>=3.21.0,<4.0.0)"
12
+ "aiogram (>=3.22.0,<4.0.0)",
13
+ "redis (>=6.4.0,<7.0.0)"
14
14
  ]
15
15
  keywords = [
16
16
  "aiogram",
@@ -20,7 +20,8 @@ keywords = [
20
20
  "dependency-injection",
21
21
  "depends",
22
22
  "cooldown",
23
- "delay"
23
+ "delay",
24
+ "DI"
24
25
  ]
25
26
 
26
27
 
@@ -1,31 +0,0 @@
1
- from typing import Any
2
- from contextlib import AsyncExitStack
3
-
4
- from aiogram.filters import Filter
5
- from aiogram import Dispatcher
6
- from aiogram.dispatcher.event.handler import HandlerObject
7
-
8
- from ..depend import Depend
9
- from ..utils.inject import inject_parametrs
10
-
11
-
12
-
13
-
14
- class DependFilter(Filter):
15
-
16
-
17
- async def __call__(self, *args: Any, **kwargs: dict[str, Any]) -> dict[str, Any]:
18
- handler_object: HandlerObject = kwargs.get("handler")
19
- dispatcher: Dispatcher = kwargs.get("dispatcher")
20
-
21
- dependency_override: dict[str, Depend] = dispatcher.workflow_data.get("dependency_override", {})
22
-
23
- kwargs.update({"event": args[0]})
24
- async with AsyncExitStack() as stack:
25
- depend_kwargs = await inject_parametrs(
26
- callback=handler_object.callback,
27
- dependency_override=dependency_override,
28
- middleware_data=kwargs,
29
- stack=stack
30
- )
31
- return depend_kwargs
@@ -1,39 +0,0 @@
1
- from typing import Any, Callable, Awaitable
2
- from contextlib import AsyncExitStack
3
-
4
- from aiogram.dispatcher.middlewares.base import BaseMiddleware
5
- from aiogram.types.base import TelegramObject
6
- from aiogram import Dispatcher
7
- from aiogram.dispatcher.event.handler import HandlerObject
8
-
9
- from ..depend import Depend
10
- from ..utils.inject import inject_parametrs
11
-
12
-
13
-
14
-
15
-
16
- class DependMiddleware(BaseMiddleware):
17
-
18
-
19
- async def __call__(
20
- self,
21
- handler: Callable[[TelegramObject, dict[str, Any]], Awaitable],
22
- event: TelegramObject,
23
- data: dict[str, Any]
24
- ):
25
- handler_object: HandlerObject = data.get("handler")
26
- dispatcher: Dispatcher = data.get("dispatcher")
27
-
28
- dependency_override: dict[str, Depend] = dispatcher.workflow_data.get("dependency_override", {})
29
-
30
- data.update({"event": event})
31
- async with AsyncExitStack() as stack:
32
- inject = await inject_parametrs(
33
- callback=handler_object.callback,
34
- dependency_override=dependency_override,
35
- middleware_data=data,
36
- stack=stack
37
- )
38
- data.update(inject)
39
- return await handler(event, data)
@@ -1,34 +0,0 @@
1
- from aiogram import Dispatcher
2
- from aiogram.dispatcher.event.telegram import TelegramEventObserver
3
-
4
- from .depend import Depend
5
- from .components.middleware import DependMiddleware
6
-
7
-
8
-
9
-
10
-
11
- def setup_depend_tool(
12
- dispatcher: Dispatcher,
13
- dependency_override: dict[str, Depend] = {},
14
- allowed_updates: list[str] = [],
15
- middleware: bool = True,
16
- ) -> None:
17
- if not isinstance(dispatcher, Dispatcher):
18
- raise TypeError("dispatcher must be Dispatcher type")
19
-
20
- if dependency_override:
21
- for dep in dependency_override.values():
22
- if not isinstance(dep, Depend):
23
- raise TypeError(f"Invalid type in dependency_override {dep}")
24
-
25
- if allowed_updates:
26
- for allow in allowed_updates:
27
- if allow not in dispatcher.observers:
28
- raise TypeError(f"observer {allow} not exists")
29
-
30
- if middleware is True:
31
- for allow in dispatcher.resolve_used_update_types() or allowed_updates:
32
- observer: TelegramEventObserver = getattr(dispatcher, allow)
33
- observer.middleware(DependMiddleware())
34
- dispatcher.__setitem__("dependency_override", dependency_override)
File without changes
@@ -1,7 +0,0 @@
1
- from .limit import Limit
2
- from .setup import setup_limit_tool
3
-
4
- __all__ = [
5
- "Limit",
6
- "setup_limit_tool"
7
- ]
@@ -1,27 +0,0 @@
1
- import inspect
2
-
3
- from typing import Callable, Awaitable
4
- from aiogram.types.base import TelegramObject
5
- from aiogram import Dispatcher
6
-
7
- from datetime import datetime, timedelta
8
-
9
- from .storage.abstract_storage import AbstractStorage
10
- from .storage import MemoryStorage
11
-
12
-
13
-
14
- def setup_limit_tool(
15
- dispatcher: Dispatcher,
16
- storage: AbstractStorage = MemoryStorage(),
17
- answer_callback: Callable[[TelegramObject, timedelta, datetime], Awaitable] | None = None
18
- ) -> None:
19
- if not issubclass(type(storage), AbstractStorage):
20
- raise TypeError(f"Invalid type for storage")
21
-
22
- if answer_callback is not None:
23
- if not inspect.iscoroutinefunction(answer_callback):
24
- raise TypeError(f"answer_callback must be croutine function")
25
-
26
- dispatcher.__setitem__("storage", storage)
27
- dispatcher.__setitem__("answer_callback", answer_callback)
File without changes