anydi 0.33.1__py3-none-any.whl → 0.34.1__py3-none-any.whl

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.
anydi/_context.py CHANGED
@@ -1,224 +1,54 @@
1
1
  from __future__ import annotations
2
2
 
3
- import abc
4
3
  import contextlib
5
- import inspect
6
4
  from types import TracebackType
7
- from typing import TYPE_CHECKING, Any, Callable, ClassVar
5
+ from typing import Any
8
6
 
9
- from typing_extensions import Self, final
7
+ from typing_extensions import Self
10
8
 
11
- from ._provider import CallableKind, Provider
12
- from ._types import AnyInterface, DependencyWrapper, Scope, is_event_type
13
- from ._utils import get_full_qualname, run_async
9
+ from ._utils import run_async
14
10
 
15
- if TYPE_CHECKING:
16
- from ._container import Container
17
11
 
12
+ class InstanceContext:
13
+ """A context to store instances."""
18
14
 
19
- class ScopedContext(abc.ABC):
20
- """ScopedContext base class."""
15
+ __slots__ = ("_instances", "_stack", "_async_stack")
21
16
 
22
- scope: ClassVar[Scope]
23
-
24
- def __init__(self, container: Container) -> None:
25
- self.container = container
26
- self._instances: dict[Any, Any] = {}
27
-
28
- def set(self, interface: AnyInterface, instance: Any) -> None:
29
- """Set an instance of a dependency in the scoped context."""
30
- self._instances[interface] = instance
31
-
32
- @abc.abstractmethod
33
- def get_or_create(self, provider: Provider) -> tuple[Any, bool]:
34
- """Get or create an instance of a dependency from the scoped context."""
35
-
36
- @abc.abstractmethod
37
- async def aget_or_create(self, provider: Provider) -> tuple[Any, bool]:
38
- """Get or create an async instance of a dependency from the scoped context."""
39
-
40
- def _create_instance(self, provider: Provider) -> Any:
41
- """Create an instance using the provider."""
42
- if provider.kind == CallableKind.COROUTINE:
43
- raise TypeError(
44
- f"The instance for the coroutine provider `{provider}` cannot be "
45
- "created in synchronous mode."
46
- )
47
- args, kwargs = self._get_provided_args(provider)
48
- return provider.call(*args, **kwargs)
49
-
50
- async def _acreate_instance(self, provider: Provider) -> Any:
51
- """Create an instance asynchronously using the provider."""
52
- args, kwargs = await self._aget_provided_args(provider)
53
- if provider.kind == CallableKind.COROUTINE:
54
- return await provider.call(*args, **kwargs)
55
- return await run_async(provider.call, *args, **kwargs)
56
-
57
- def _resolve_parameter(
58
- self, provider: Provider, parameter: inspect.Parameter
59
- ) -> Any:
60
- self._validate_resolvable_parameter(parameter, call=provider.call)
61
- return self.container.resolve(parameter.annotation)
62
-
63
- async def _aresolve_parameter(
64
- self, provider: Provider, parameter: inspect.Parameter
65
- ) -> Any:
66
- self._validate_resolvable_parameter(parameter, call=provider.call)
67
- return await self.container.aresolve(parameter.annotation)
68
-
69
- def _validate_resolvable_parameter(
70
- self, parameter: inspect.Parameter, call: Callable[..., Any]
71
- ) -> None:
72
- """Ensure that the specified interface is resolved."""
73
- if parameter.annotation in self.container._unresolved_interfaces: # noqa
74
- raise LookupError(
75
- f"You are attempting to get the parameter `{parameter.name}` with the "
76
- f"annotation `{get_full_qualname(parameter.annotation)}` as a "
77
- f"dependency into `{get_full_qualname(call)}` which is not registered "
78
- "or set in the scoped context."
79
- )
80
-
81
- def _get_provided_args(
82
- self, provider: Provider
83
- ) -> tuple[list[Any], dict[str, Any]]:
84
- """Retrieve the arguments for a provider."""
85
- args: list[Any] = []
86
- kwargs: dict[str, Any] = {}
87
-
88
- for parameter in provider.parameters:
89
- if parameter.annotation in self.container._override_instances: # noqa
90
- instance = self.container._override_instances[parameter.annotation] # noqa
91
- elif parameter.annotation in self._instances:
92
- instance = self._instances[parameter.annotation]
93
- else:
94
- try:
95
- instance = self._resolve_parameter(provider, parameter)
96
- except LookupError:
97
- if parameter.default is inspect.Parameter.empty:
98
- raise
99
- instance = parameter.default
100
- else:
101
- if self.container.testing:
102
- instance = DependencyWrapper(
103
- interface=parameter.annotation, instance=instance
104
- )
105
- if parameter.kind == parameter.POSITIONAL_ONLY:
106
- args.append(instance)
107
- else:
108
- kwargs[parameter.name] = instance
109
- return args, kwargs
110
-
111
- async def _aget_provided_args(
112
- self, provider: Provider
113
- ) -> tuple[list[Any], dict[str, Any]]:
114
- """Asynchronously retrieve the arguments for a provider."""
115
- args: list[Any] = []
116
- kwargs: dict[str, Any] = {}
117
-
118
- for parameter in provider.parameters:
119
- if parameter.annotation in self.container._override_instances: # noqa
120
- instance = self.container._override_instances[parameter.annotation] # noqa
121
- elif parameter.annotation in self._instances:
122
- instance = self._instances[parameter.annotation]
123
- else:
124
- try:
125
- instance = await self._aresolve_parameter(provider, parameter)
126
- except LookupError:
127
- if parameter.default is inspect.Parameter.empty:
128
- raise
129
- instance = parameter.default
130
- else:
131
- if self.container.testing:
132
- instance = DependencyWrapper(
133
- interface=parameter.annotation, instance=instance
134
- )
135
- if parameter.kind == parameter.POSITIONAL_ONLY:
136
- args.append(instance)
137
- else:
138
- kwargs[parameter.name] = instance
139
- return args, kwargs
140
-
141
-
142
- class ResourceScopedContext(ScopedContext):
143
- """ScopedContext with closable resources support."""
144
-
145
- def __init__(self, container: Container) -> None:
146
- """Initialize the ScopedContext."""
147
- super().__init__(container)
17
+ def __init__(self) -> None:
18
+ self._instances: dict[type[Any], Any] = {}
148
19
  self._stack = contextlib.ExitStack()
149
20
  self._async_stack = contextlib.AsyncExitStack()
150
21
 
151
- def get_or_create(self, provider: Provider) -> tuple[Any, bool]:
152
- """Get an instance of a dependency from the scoped context."""
153
- instance = self._instances.get(provider.interface)
154
- if instance is None:
155
- if provider.kind == CallableKind.GENERATOR:
156
- instance = self._create_resource(provider)
157
- elif provider.kind == CallableKind.ASYNC_GENERATOR:
158
- raise TypeError(
159
- f"The provider `{provider}` cannot be started in synchronous mode "
160
- "because it is an asynchronous provider. Please start the provider "
161
- "in asynchronous mode before using it."
162
- )
163
- else:
164
- instance = self._create_instance(provider)
165
- self._instances[provider.interface] = instance
166
- return instance, True
167
- return instance, False
22
+ def get(self, interface: type[Any]) -> Any | None:
23
+ """Get an instance from the context."""
24
+ return self._instances.get(interface)
168
25
 
169
- async def aget_or_create(self, provider: Provider) -> tuple[Any, bool]:
170
- """Get an async instance of a dependency from the scoped context."""
171
- instance = self._instances.get(provider.interface)
172
- if instance is None:
173
- if provider.kind == CallableKind.GENERATOR:
174
- instance = await run_async(self._create_resource, provider)
175
- elif provider.kind == CallableKind.ASYNC_GENERATOR:
176
- instance = await self._acreate_resource(provider)
177
- else:
178
- instance = await self._acreate_instance(provider)
179
- self._instances[provider.interface] = instance
180
- return instance, True
181
- return instance, False
26
+ def set(self, interface: type[Any], value: Any) -> None:
27
+ """Set an instance in the context."""
28
+ self._instances[interface] = value
182
29
 
183
- def has(self, interface: AnyInterface) -> bool:
184
- """Check if the scoped context has an instance of the dependency."""
185
- return interface in self._instances
30
+ def enter(self, cm: contextlib.AbstractContextManager[Any]) -> Any:
31
+ """Enter the context."""
32
+ return self._stack.enter_context(cm)
186
33
 
187
- def _create_instance(self, provider: Provider) -> Any:
188
- """Create an instance using the provider."""
189
- instance = super()._create_instance(provider)
190
- # Enter the context manager if the instance is closable.
191
- if hasattr(instance, "__enter__") and hasattr(instance, "__exit__"):
192
- self._stack.enter_context(instance)
193
- return instance
34
+ async def aenter(self, cm: contextlib.AbstractAsyncContextManager[Any]) -> Any:
35
+ """Enter the context asynchronously."""
36
+ return await self._async_stack.enter_async_context(cm)
194
37
 
195
- def _create_resource(self, provider: Provider) -> Any:
196
- """Create a resource using the provider."""
197
- args, kwargs = self._get_provided_args(provider)
198
- cm = contextlib.contextmanager(provider.call)(*args, **kwargs)
199
- return self._stack.enter_context(cm)
38
+ def __setitem__(self, interface: type[Any], value: Any) -> None:
39
+ self._instances[interface] = value
200
40
 
201
- async def _acreate_instance(self, provider: Provider) -> Any:
202
- """Create an instance asynchronously using the provider."""
203
- instance = await super()._acreate_instance(provider)
204
- # Enter the context manager if the instance is closable.
205
- if hasattr(instance, "__aenter__") and hasattr(instance, "__aexit__"):
206
- await self._async_stack.enter_async_context(instance)
207
- return instance
41
+ def __getitem__(self, interface: type[Any]) -> Any:
42
+ return self._instances[interface]
208
43
 
209
- async def _acreate_resource(self, provider: Provider) -> Any:
210
- """Create a resource asynchronously using the provider."""
211
- args, kwargs = await self._aget_provided_args(provider)
212
- cm = contextlib.asynccontextmanager(provider.call)(*args, **kwargs)
213
- return await self._async_stack.enter_async_context(cm)
44
+ def __contains__(self, interface: type[Any]) -> bool:
45
+ return interface in self._instances
214
46
 
215
- def delete(self, interface: AnyInterface) -> None:
216
- """Delete a dependency instance from the scoped context."""
47
+ def __delitem__(self, interface: type[Any]) -> None:
217
48
  self._instances.pop(interface, None)
218
49
 
219
50
  def __enter__(self) -> Self:
220
51
  """Enter the context."""
221
- self.start()
222
52
  return self
223
53
 
224
54
  def __exit__(
@@ -226,15 +56,9 @@ class ResourceScopedContext(ScopedContext):
226
56
  exc_type: type[BaseException] | None,
227
57
  exc_val: BaseException | None,
228
58
  exc_tb: TracebackType | None,
229
- ) -> bool:
59
+ ) -> Any:
230
60
  """Exit the context."""
231
- return self._stack.__exit__(exc_type, exc_val, exc_tb) # type: ignore[return-value]
232
-
233
- @abc.abstractmethod
234
- def start(self) -> None:
235
- """Start the scoped context."""
236
- for interface in self.container._resource_cache.get(self.scope, []): # noqa
237
- self.container.resolve(interface)
61
+ return self._stack.__exit__(exc_type, exc_val, exc_tb)
238
62
 
239
63
  def close(self) -> None:
240
64
  """Close the scoped context."""
@@ -242,7 +66,6 @@ class ResourceScopedContext(ScopedContext):
242
66
 
243
67
  async def __aenter__(self) -> Self:
244
68
  """Enter the context asynchronously."""
245
- await self.astart()
246
69
  return self
247
70
 
248
71
  async def __aexit__(
@@ -256,65 +79,6 @@ class ResourceScopedContext(ScopedContext):
256
79
  self.__exit__, exc_type, exc_val, exc_tb
257
80
  ) or await self._async_stack.__aexit__(exc_type, exc_val, exc_tb)
258
81
 
259
- @abc.abstractmethod
260
- async def astart(self) -> None:
261
- """Start the scoped context asynchronously."""
262
-
263
82
  async def aclose(self) -> None:
264
83
  """Close the scoped context asynchronously."""
265
84
  await self.__aexit__(None, None, None)
266
-
267
-
268
- @final
269
- class SingletonContext(ResourceScopedContext):
270
- """A scoped context representing the "singleton" scope."""
271
-
272
- scope = "singleton"
273
-
274
- def start(self) -> None:
275
- """Start the scoped context."""
276
- for interface in self.container._resource_cache.get(self.scope, []): # noqa
277
- self.container.resolve(interface)
278
-
279
- async def astart(self) -> None:
280
- """Start the scoped context asynchronously."""
281
- for interface in self.container._resource_cache.get(self.scope, []): # noqa
282
- await self.container.aresolve(interface)
283
-
284
-
285
- @final
286
- class RequestContext(ResourceScopedContext):
287
- """A scoped context representing the "request" scope."""
288
-
289
- scope = "request"
290
-
291
- def start(self) -> None:
292
- """Start the scoped context."""
293
- for interface in self.container._resource_cache.get(self.scope, []): # noqa
294
- if not is_event_type(interface):
295
- continue
296
- self.container.resolve(interface)
297
-
298
- async def astart(self) -> None:
299
- """Start the scoped context asynchronously."""
300
- for interface in self.container._resource_cache.get(self.scope, []): # noqa
301
- if not is_event_type(interface):
302
- continue
303
- await self.container.aresolve(interface)
304
-
305
-
306
- @final
307
- class TransientContext(ScopedContext):
308
- """A scoped context representing the "transient" scope."""
309
-
310
- scope = "transient"
311
-
312
- def get_or_create(self, provider: Provider) -> tuple[Any, bool]:
313
- """Get or create an instance of a dependency from the transient context."""
314
- return self._create_instance(provider), True
315
-
316
- async def aget_or_create(self, provider: Provider) -> tuple[Any, bool]:
317
- """
318
- Get or create an async instance of a dependency from the transient context.
319
- """
320
- return await self._acreate_instance(provider), True
anydi/_provider.py CHANGED
@@ -38,6 +38,11 @@ class Provider:
38
38
  "_kind",
39
39
  "_interface",
40
40
  "_parameters",
41
+ "_is_coroutine",
42
+ "_is_generator",
43
+ "_is_async_generator",
44
+ "_is_async",
45
+ "_is_resource",
41
46
  )
42
47
 
43
48
  def __init__(
@@ -52,6 +57,12 @@ class Provider:
52
57
  # Detect the kind of callable provider
53
58
  self._detect_kind()
54
59
 
60
+ self._is_coroutine = self._kind == CallableKind.COROUTINE
61
+ self._is_generator = self._kind == CallableKind.GENERATOR
62
+ self._is_async_generator = self._kind == CallableKind.ASYNC_GENERATOR
63
+ self._is_async = self._is_coroutine or self._is_async_generator
64
+ self._is_resource = self._is_generator or self._is_async_generator
65
+
55
66
  # Validate the scope of the provider
56
67
  self._validate_scope()
57
68
 
@@ -96,13 +107,30 @@ class Provider:
96
107
  def parameters(self) -> list[inspect.Parameter]:
97
108
  return self._parameters
98
109
 
110
+ @property
111
+ def is_coroutine(self) -> bool:
112
+ """Check if the provider is a coroutine."""
113
+ return self._is_coroutine
114
+
115
+ @property
116
+ def is_generator(self) -> bool:
117
+ """Check if the provider is a generator."""
118
+ return self._is_generator
119
+
120
+ @property
121
+ def is_async_generator(self) -> bool:
122
+ """Check if the provider is an async generator."""
123
+ return self._is_async_generator
124
+
125
+ @property
126
+ def is_async(self) -> bool:
127
+ """Check if the provider is an async callable."""
128
+ return self._is_async
129
+
99
130
  @property
100
131
  def is_resource(self) -> bool:
101
132
  """Check if the provider is a resource."""
102
- return self._kind in {
103
- CallableKind.GENERATOR,
104
- CallableKind.ASYNC_GENERATOR,
105
- }
133
+ return self._is_resource
106
134
 
107
135
  def _validate_scope(self) -> None:
108
136
  """Validate the scope of the provider."""
anydi/_types.py CHANGED
@@ -1,16 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import inspect
4
+ from collections.abc import Iterable
4
5
  from dataclasses import dataclass
5
- from typing import Annotated, Any, TypeVar, Union
6
+ from types import ModuleType
7
+ from typing import Annotated, Any, NamedTuple, Union
6
8
 
7
9
  from typing_extensions import Literal, Self, TypeAlias
8
10
 
9
11
  Scope = Literal["transient", "singleton", "request"]
10
12
 
11
- T = TypeVar("T")
12
13
  AnyInterface: TypeAlias = Union[type[Any], Annotated[Any, ...]]
13
- Interface: TypeAlias = type[T]
14
14
 
15
15
 
16
16
  class Marker:
@@ -47,3 +47,19 @@ class DependencyWrapper:
47
47
  if name in {"interface", "instance"}:
48
48
  return object.__getattribute__(self, name)
49
49
  return getattr(self.instance, name)
50
+
51
+
52
+ class ProviderDecoratorArgs(NamedTuple):
53
+ scope: Scope
54
+ override: bool
55
+
56
+
57
+ @dataclass(frozen=True)
58
+ class Dependency:
59
+ member: Any
60
+ module: ModuleType
61
+
62
+
63
+ class InjectableDecoratorArgs(NamedTuple):
64
+ wrapped: bool
65
+ tags: Iterable[str] | None
anydi/_utils.py CHANGED
@@ -8,15 +8,11 @@ import importlib
8
8
  import inspect
9
9
  import re
10
10
  import sys
11
+ from types import TracebackType
11
12
  from typing import Any, Callable, ForwardRef, TypeVar
12
13
 
13
- from typing_extensions import ParamSpec, get_args, get_origin
14
-
15
- try:
16
- import anyio # noqa
17
- except ImportError:
18
- anyio = None # type: ignore[assignment]
19
-
14
+ import anyio
15
+ from typing_extensions import ParamSpec, Self, get_args, get_origin
20
16
 
21
17
  T = TypeVar("T")
22
18
  P = ParamSpec("P")
@@ -48,6 +44,16 @@ def is_builtin_type(tp: type[Any]) -> bool:
48
44
  return tp.__module__ == builtins.__name__
49
45
 
50
46
 
47
+ def is_context_manager(obj: Any) -> bool:
48
+ """Check if the given object is a context manager."""
49
+ return hasattr(obj, "__enter__") and hasattr(obj, "__exit__")
50
+
51
+
52
+ def is_async_context_manager(obj: Any) -> bool:
53
+ """Check if the given object is an async context manager."""
54
+ return hasattr(obj, "__aenter__") and hasattr(obj, "__aexit__")
55
+
56
+
51
57
  def get_typed_annotation(
52
58
  annotation: Any, globalns: dict[str, Any], module: Any = None
53
59
  ) -> Any:
@@ -82,11 +88,6 @@ async def run_async(
82
88
  **kwargs: P.kwargs,
83
89
  ) -> T:
84
90
  """Runs the given function asynchronously using the `anyio` library."""
85
- if not anyio:
86
- raise ImportError(
87
- "`anyio` library is not currently installed. Please make sure to install "
88
- "it first, or consider using `anydi[full]` instead."
89
- )
90
91
  return await anyio.to_thread.run_sync(functools.partial(func, *args, **kwargs))
91
92
 
92
93
 
@@ -103,3 +104,39 @@ def import_string(dotted_path: str) -> Any:
103
104
  return importlib.import_module(attribute_name)
104
105
  except (ImportError, AttributeError) as exc:
105
106
  raise ImportError(f"Cannot import '{dotted_path}': {exc}") from exc
107
+
108
+
109
+ class AsyncRLock:
110
+ def __init__(self) -> None:
111
+ self._lock = anyio.Lock()
112
+ self._owner: anyio.TaskInfo | None = None
113
+ self._count = 0
114
+
115
+ async def acquire(self) -> None:
116
+ current_task = anyio.get_current_task()
117
+ if self._owner == current_task:
118
+ self._count += 1
119
+ else:
120
+ await self._lock.acquire()
121
+ self._owner = current_task
122
+ self._count = 1
123
+
124
+ def release(self) -> None:
125
+ if self._owner != anyio.get_current_task():
126
+ raise RuntimeError("Lock can only be released by the owner")
127
+ self._count -= 1
128
+ if self._count == 0:
129
+ self._owner = None
130
+ self._lock.release()
131
+
132
+ async def __aenter__(self) -> Self:
133
+ await self.acquire()
134
+ return self
135
+
136
+ async def __aexit__(
137
+ self,
138
+ exc_type: type[BaseException] | None,
139
+ exc_val: BaseException | None,
140
+ exc_tb: TracebackType | None,
141
+ ) -> Any:
142
+ self.release()
@@ -14,15 +14,15 @@ def request_scoped_middleware(
14
14
  if iscoroutinefunction(get_response):
15
15
 
16
16
  async def async_middleware(request: HttpRequest) -> Any:
17
- async with container.arequest_context() as ctx:
18
- ctx.set(HttpRequest, instance=request)
17
+ async with container.arequest_context() as context:
18
+ context.set(HttpRequest, request)
19
19
  return await get_response(request)
20
20
 
21
21
  return async_middleware
22
22
 
23
23
  def middleware(request: HttpRequest) -> Any:
24
- with container.request_context() as ctx:
25
- ctx.set(HttpRequest, instance=request)
24
+ with container.request_context() as context:
25
+ context.set(HttpRequest, request)
26
26
  return get_response(request)
27
27
 
28
28
  return middleware
@@ -18,6 +18,6 @@ class RequestScopedMiddleware(BaseHTTPMiddleware):
18
18
  async def dispatch(
19
19
  self, request: Request, call_next: RequestResponseEndpoint
20
20
  ) -> Response:
21
- async with self.container.arequest_context() as ctx:
22
- ctx.set(Request, instance=request)
21
+ async with self.container.arequest_context() as context:
22
+ context.set(Request, request)
23
23
  return await call_next(request)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anydi
3
- Version: 0.33.1
3
+ Version: 0.34.1
4
4
  Summary: Dependency Injection library
5
5
  Home-page: https://github.com/antonrh/anydi
6
6
  License: MIT
@@ -28,9 +28,8 @@ Classifier: Topic :: Software Development :: Libraries
28
28
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
29
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
30
  Classifier: Typing :: Typed
31
- Provides-Extra: async
32
31
  Provides-Extra: docs
33
- Requires-Dist: anyio (>=3.6.2,<4.0.0) ; extra == "async"
32
+ Requires-Dist: anyio (>=3.7.1)
34
33
  Requires-Dist: mkdocs (>=1.4.2,<2.0.0) ; extra == "docs"
35
34
  Requires-Dist: mkdocs-material (>=9.5.29,<10.0.0) ; extra == "docs"
36
35
  Requires-Dist: typing-extensions (>=4.12.1,<5.0.0)
@@ -1,12 +1,10 @@
1
- anydi/__init__.py,sha256=EsR-HiMe8cWS9PQbY23ibc91STK1WTn02DFMPV-TNU4,509
2
- anydi/_container.py,sha256=shefN3SuhmPBzU6gxV-YRGJlz-m8Nv5RJ-T93veSxgE,21389
3
- anydi/_context.py,sha256=6Veqt15Tp4DfOzppUOIBaymosicYUWMeSa1b7ZAdtxw,12866
1
+ anydi/__init__.py,sha256=OfRg2EfXD65pHTGQKhfkABMwUhw5LvsuTQV_Tv4V4wk,501
2
+ anydi/_container.py,sha256=RyP0k8MXZfDr3mjjMo86auidKrlAGstEgY2AxpAHEAg,35346
3
+ anydi/_context.py,sha256=7LV_SL4QWkJeiG7_4D9PZ5lmU-MPzhofxC95zCgY9Gc,2651
4
4
  anydi/_logger.py,sha256=UpubJUnW83kffFxkhUlObm2DmZX1Pjqoz9YFKS-JOPg,52
5
- anydi/_module.py,sha256=cgojC7Z7oMtsUnkfSc65cRYOfZ8Q6KwjusNJzx_VSbk,2729
6
- anydi/_provider.py,sha256=w_GnRo324aqNORRJwuURexA54c1M3smj34Q8EaV0QGE,6213
7
- anydi/_scanner.py,sha256=F2sHgJvkRYXYnu4F5iSrnIPVzwnNeS7tRPXziirh4NI,4898
8
- anydi/_types.py,sha256=90xdbH2NrFXbridFf9mjOknhcXMW5L0jm92zP_LvKrg,1120
9
- anydi/_utils.py,sha256=guw4sFCvsisJmneKWlZi18YDYll_CjlO_f2cH97rDFQ,3280
5
+ anydi/_provider.py,sha256=fcfzYOlpJ1fMqbMPAd6uI9_lap8n2ljJ9e10OEQpI4s,7176
6
+ anydi/_types.py,sha256=55Wvaxcs2DPpVXrMqhHebT_ZeGDnH-H_zhND306vaoU,1397
7
+ anydi/_utils.py,sha256=INI0jNIXrJ6LS4zqJymMO2yUEobpxmBGASf4G_vR6AU,4378
10
8
  anydi/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
9
  anydi/ext/_utils.py,sha256=U6sRqWzccWUu7eMhbXX1NrwcaxitQF9cO1KxnKF37gw,2566
12
10
  anydi/ext/django/__init__.py,sha256=QI1IABCVgSDTUoh7M9WMECKXwB3xvh04HfQ9TOWw1Mk,223
@@ -14,7 +12,7 @@ anydi/ext/django/_container.py,sha256=cxVoYQG16WP0S_Yv4TnLwuaaT7NVEOhLWO-YdALJUb
14
12
  anydi/ext/django/_settings.py,sha256=Z0RlAuXoO73oahWeMkK10w8c-4uCBde-DBpeKTV5USY,853
15
13
  anydi/ext/django/_utils.py,sha256=q6X6GApBm0oBK8DnoRZhTq2m4tAdKRYL__gVgKn3idg,3977
16
14
  anydi/ext/django/apps.py,sha256=mjbf_mDCpNSriGnILzhRIr8wFHLMEK8sUerbmRku6i0,2844
17
- anydi/ext/django/middleware.py,sha256=tryIaBVmfPmilGrnKpLNlLCOPN5rw4_pXY3ojFXv3O0,856
15
+ anydi/ext/django/middleware.py,sha256=5OUdp0OWRozyW338Sq04BDhacaFlyUTTOduS_7EwCTA,854
18
16
  anydi/ext/django/ninja/__init__.py,sha256=kW3grUgWp_nkWSG_-39ADHMrZLGNcj9TsJ9OW8iWWrk,546
19
17
  anydi/ext/django/ninja/_operation.py,sha256=wSWa7D73XTVlOibmOciv2l6JHPe1ERZcXrqI8W-oO2w,2696
20
18
  anydi/ext/django/ninja/_signature.py,sha256=2cSzKxBIxXLqtwNuH6GSlmjVJFftoGmleWfyk_NVEWw,2207
@@ -23,10 +21,10 @@ anydi/ext/faststream.py,sha256=qXnNGvAqWWp9kbhbQUE6EF_OPUiYQmtOH211_O7BI_0,1898
23
21
  anydi/ext/pydantic_settings.py,sha256=8IXXLuG_OvKbvKlBkBRQUHcXgbTpgQUxeWyoMcRIUQM,1488
24
22
  anydi/ext/pytest_plugin.py,sha256=3x_ZYFcLp4ZCRrs7neoohmWz56O9ydm92jxi_LnyD7w,4298
25
23
  anydi/ext/starlette/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- anydi/ext/starlette/middleware.py,sha256=PKip_omFZDgg7h2OY-nnV2OIS1MbbmrrOJBwG7_Peuw,793
24
+ anydi/ext/starlette/middleware.py,sha256=9CQtGg5ZzUz2gFSzJr8U4BWzwNjK8XMctm3n52M77Z0,792
27
25
  anydi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- anydi-0.33.1.dist-info/LICENSE,sha256=V6rU8a8fv6o2jQ-7ODHs0XfDFimot8Q6Km6CylRIDTo,1069
29
- anydi-0.33.1.dist-info/METADATA,sha256=u-YkBHTqAbah4ytfw7CXHEUNDVyjhBFUwD2dV8z84Jc,5112
30
- anydi-0.33.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
31
- anydi-0.33.1.dist-info/entry_points.txt,sha256=GmQblwzxFg42zva1HyBYJJ7TvrTIcSAGBHmyi3bvsi4,42
32
- anydi-0.33.1.dist-info/RECORD,,
26
+ anydi-0.34.1.dist-info/LICENSE,sha256=V6rU8a8fv6o2jQ-7ODHs0XfDFimot8Q6Km6CylRIDTo,1069
27
+ anydi-0.34.1.dist-info/METADATA,sha256=aeIeJl8UmjLDk5vhQfgIJedZH7UCFUrAXtHdcJZx1gI,5064
28
+ anydi-0.34.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
29
+ anydi-0.34.1.dist-info/entry_points.txt,sha256=GmQblwzxFg42zva1HyBYJJ7TvrTIcSAGBHmyi3bvsi4,42
30
+ anydi-0.34.1.dist-info/RECORD,,