anydi 0.27.0__py3-none-any.whl → 0.27.0a1__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/_container.py +32 -14
- anydi/_context.py +13 -36
- anydi/_types.py +0 -11
- anydi/_utils.py +15 -16
- anydi/ext/faststream.py +3 -18
- anydi/ext/pytest_plugin.py +30 -15
- {anydi-0.27.0.dist-info → anydi-0.27.0a1.dist-info}/METADATA +4 -3
- {anydi-0.27.0.dist-info → anydi-0.27.0a1.dist-info}/RECORD +11 -11
- {anydi-0.27.0.dist-info → anydi-0.27.0a1.dist-info}/WHEEL +1 -1
- {anydi-0.27.0.dist-info → anydi-0.27.0a1.dist-info}/LICENSE +0 -0
- {anydi-0.27.0.dist-info → anydi-0.27.0a1.dist-info}/entry_points.txt +0 -0
anydi/_container.py
CHANGED
|
@@ -11,9 +11,11 @@ from contextvars import ContextVar
|
|
|
11
11
|
from functools import wraps
|
|
12
12
|
from typing import (
|
|
13
13
|
Any,
|
|
14
|
+
AsyncContextManager,
|
|
14
15
|
AsyncIterator,
|
|
15
16
|
Awaitable,
|
|
16
17
|
Callable,
|
|
18
|
+
ContextManager,
|
|
17
19
|
Iterable,
|
|
18
20
|
Iterator,
|
|
19
21
|
Mapping,
|
|
@@ -41,7 +43,7 @@ from ._context import (
|
|
|
41
43
|
from ._logger import logger
|
|
42
44
|
from ._module import Module, ModuleRegistry
|
|
43
45
|
from ._scanner import Scanner
|
|
44
|
-
from ._types import AnyInterface,
|
|
46
|
+
from ._types import AnyInterface, Interface, Provider, Scope, is_marker
|
|
45
47
|
from ._utils import (
|
|
46
48
|
get_full_qualname,
|
|
47
49
|
get_typed_parameters,
|
|
@@ -84,7 +86,7 @@ class Container:
|
|
|
84
86
|
strict: Whether to enable strict mode. Defaults to False.
|
|
85
87
|
"""
|
|
86
88
|
self._providers: dict[type[Any], Provider] = {}
|
|
87
|
-
self.
|
|
89
|
+
self._providers_cache: dict[Scope, list[type[Any]]] = defaultdict(list)
|
|
88
90
|
self._singleton_context = SingletonContext(self)
|
|
89
91
|
self._transient_context = TransientContext(self)
|
|
90
92
|
self._request_context_var: ContextVar[RequestContext | None] = ContextVar(
|
|
@@ -170,7 +172,7 @@ class Container:
|
|
|
170
172
|
|
|
171
173
|
# Create Event type
|
|
172
174
|
if provider.is_resource and (interface is NoneType or interface is None):
|
|
173
|
-
interface = type(f"Event_{uuid.uuid4().hex}", (
|
|
175
|
+
interface = type(f"Event_{uuid.uuid4().hex}", (), {})
|
|
174
176
|
|
|
175
177
|
if interface in self._providers:
|
|
176
178
|
if override:
|
|
@@ -284,7 +286,7 @@ class Container:
|
|
|
284
286
|
"""
|
|
285
287
|
self._providers[interface] = provider
|
|
286
288
|
if provider.is_resource:
|
|
287
|
-
self.
|
|
289
|
+
self._providers_cache[provider.scope].append(interface)
|
|
288
290
|
|
|
289
291
|
def _delete_provider(self, interface: AnyInterface) -> None:
|
|
290
292
|
"""Delete a provider by interface.
|
|
@@ -294,7 +296,7 @@ class Container:
|
|
|
294
296
|
"""
|
|
295
297
|
provider = self._providers.pop(interface, None)
|
|
296
298
|
if provider is not None and provider.is_resource:
|
|
297
|
-
self.
|
|
299
|
+
self._providers_cache[provider.scope].remove(interface)
|
|
298
300
|
|
|
299
301
|
def _validate_provider_scope(self, provider: Provider) -> None:
|
|
300
302
|
"""Validate the scope of a provider.
|
|
@@ -429,9 +431,9 @@ class Container:
|
|
|
429
431
|
exc_type: type[BaseException] | None,
|
|
430
432
|
exc_val: BaseException | None,
|
|
431
433
|
exc_tb: types.TracebackType | None,
|
|
432
|
-
) ->
|
|
434
|
+
) -> None:
|
|
433
435
|
"""Exit the singleton context."""
|
|
434
|
-
|
|
436
|
+
self.close()
|
|
435
437
|
|
|
436
438
|
def start(self) -> None:
|
|
437
439
|
"""Start the singleton context."""
|
|
@@ -441,13 +443,20 @@ class Container:
|
|
|
441
443
|
"""Close the singleton context."""
|
|
442
444
|
self._singleton_context.close()
|
|
443
445
|
|
|
444
|
-
|
|
445
|
-
def request_context(self) -> Iterator[None]:
|
|
446
|
+
def request_context(self) -> ContextManager[None]:
|
|
446
447
|
"""Obtain a context manager for the request-scoped context.
|
|
447
448
|
|
|
448
449
|
Returns:
|
|
449
450
|
A context manager for the request-scoped context.
|
|
450
451
|
"""
|
|
452
|
+
return contextlib.contextmanager(self._request_context)()
|
|
453
|
+
|
|
454
|
+
def _request_context(self) -> Iterator[None]:
|
|
455
|
+
"""Internal method that manages the request-scoped context.
|
|
456
|
+
|
|
457
|
+
Yields:
|
|
458
|
+
Yield control to the code block within the request context.
|
|
459
|
+
"""
|
|
451
460
|
context = RequestContext(self)
|
|
452
461
|
token = self._request_context_var.set(context)
|
|
453
462
|
with context:
|
|
@@ -464,25 +473,34 @@ class Container:
|
|
|
464
473
|
exc_type: type[BaseException] | None,
|
|
465
474
|
exc_val: BaseException | None,
|
|
466
475
|
exc_tb: types.TracebackType | None,
|
|
467
|
-
) ->
|
|
476
|
+
) -> None:
|
|
468
477
|
"""Exit the singleton context."""
|
|
469
|
-
|
|
478
|
+
await self.aclose()
|
|
470
479
|
|
|
471
480
|
async def astart(self) -> None:
|
|
472
481
|
"""Start the singleton context asynchronously."""
|
|
473
|
-
|
|
482
|
+
for interface, provider in self._providers.items():
|
|
483
|
+
if provider.scope == "singleton":
|
|
484
|
+
await self.aresolve(interface) # noqa
|
|
474
485
|
|
|
475
486
|
async def aclose(self) -> None:
|
|
476
487
|
"""Close the singleton context asynchronously."""
|
|
477
488
|
await self._singleton_context.aclose()
|
|
478
489
|
|
|
479
|
-
|
|
480
|
-
async def arequest_context(self) -> AsyncIterator[None]:
|
|
490
|
+
def arequest_context(self) -> AsyncContextManager[None]:
|
|
481
491
|
"""Obtain an async context manager for the request-scoped context.
|
|
482
492
|
|
|
483
493
|
Returns:
|
|
484
494
|
An async context manager for the request-scoped context.
|
|
485
495
|
"""
|
|
496
|
+
return contextlib.asynccontextmanager(self._arequest_context)()
|
|
497
|
+
|
|
498
|
+
async def _arequest_context(self) -> AsyncIterator[None]:
|
|
499
|
+
"""Internal method that manages the async request-scoped context.
|
|
500
|
+
|
|
501
|
+
Yields:
|
|
502
|
+
Yield control to the code block within the request context.
|
|
503
|
+
"""
|
|
486
504
|
context = RequestContext(self)
|
|
487
505
|
token = self._request_context_var.set(context)
|
|
488
506
|
async with context:
|
anydi/_context.py
CHANGED
|
@@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Any, ClassVar, TypeVar, cast
|
|
|
7
7
|
|
|
8
8
|
from typing_extensions import Self, final
|
|
9
9
|
|
|
10
|
-
from ._types import AnyInterface, Interface, Provider, Scope
|
|
10
|
+
from ._types import AnyInterface, Interface, Provider, Scope
|
|
11
11
|
from ._utils import run_async
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
@@ -243,7 +243,7 @@ class ResourceScopedContext(ScopedContext):
|
|
|
243
243
|
exc_type: type[BaseException] | None,
|
|
244
244
|
exc_val: BaseException | None,
|
|
245
245
|
exc_tb: TracebackType | None,
|
|
246
|
-
) ->
|
|
246
|
+
) -> None:
|
|
247
247
|
"""Exit the context.
|
|
248
248
|
|
|
249
249
|
Args:
|
|
@@ -251,17 +251,17 @@ class ResourceScopedContext(ScopedContext):
|
|
|
251
251
|
exc_val: The exception instance, if any.
|
|
252
252
|
exc_tb: The traceback, if any.
|
|
253
253
|
"""
|
|
254
|
-
|
|
254
|
+
self.close()
|
|
255
|
+
return
|
|
255
256
|
|
|
256
|
-
@abc.abstractmethod
|
|
257
257
|
def start(self) -> None:
|
|
258
258
|
"""Start the scoped context."""
|
|
259
|
-
for interface in self.container.
|
|
259
|
+
for interface in self.container._providers_cache.get(self.scope, []): # noqa
|
|
260
260
|
self.container.resolve(interface)
|
|
261
261
|
|
|
262
262
|
def close(self) -> None:
|
|
263
263
|
"""Close the scoped context."""
|
|
264
|
-
self._stack.
|
|
264
|
+
self._stack.close()
|
|
265
265
|
|
|
266
266
|
async def __aenter__(self) -> Self:
|
|
267
267
|
"""Enter the context asynchronously.
|
|
@@ -277,7 +277,7 @@ class ResourceScopedContext(ScopedContext):
|
|
|
277
277
|
exc_type: type[BaseException] | None,
|
|
278
278
|
exc_val: BaseException | None,
|
|
279
279
|
exc_tb: TracebackType | None,
|
|
280
|
-
) ->
|
|
280
|
+
) -> None:
|
|
281
281
|
"""Exit the context asynchronously.
|
|
282
282
|
|
|
283
283
|
Args:
|
|
@@ -285,17 +285,18 @@ class ResourceScopedContext(ScopedContext):
|
|
|
285
285
|
exc_val: The exception instance, if any.
|
|
286
286
|
exc_tb: The traceback, if any.
|
|
287
287
|
"""
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
) or await self._async_stack.__aexit__(exc_type, exc_val, exc_tb)
|
|
288
|
+
await self.aclose()
|
|
289
|
+
return
|
|
291
290
|
|
|
292
|
-
@abc.abstractmethod
|
|
293
291
|
async def astart(self) -> None:
|
|
294
292
|
"""Start the scoped context asynchronously."""
|
|
293
|
+
for interface in self.container._providers_cache.get(self.scope, []): # noqa
|
|
294
|
+
await self.container.aresolve(interface)
|
|
295
295
|
|
|
296
296
|
async def aclose(self) -> None:
|
|
297
297
|
"""Close the scoped context asynchronously."""
|
|
298
|
-
await self.
|
|
298
|
+
await run_async(self._stack.close)
|
|
299
|
+
await self._async_stack.aclose()
|
|
299
300
|
|
|
300
301
|
|
|
301
302
|
@final
|
|
@@ -304,16 +305,6 @@ class SingletonContext(ResourceScopedContext):
|
|
|
304
305
|
|
|
305
306
|
scope = "singleton"
|
|
306
307
|
|
|
307
|
-
def start(self) -> None:
|
|
308
|
-
"""Start the scoped context."""
|
|
309
|
-
for interface in self.container._resource_cache.get(self.scope, []): # noqa
|
|
310
|
-
self.container.resolve(interface)
|
|
311
|
-
|
|
312
|
-
async def astart(self) -> None:
|
|
313
|
-
"""Start the scoped context asynchronously."""
|
|
314
|
-
for interface in self.container._resource_cache.get(self.scope, []): # noqa
|
|
315
|
-
await self.container.aresolve(interface)
|
|
316
|
-
|
|
317
308
|
|
|
318
309
|
@final
|
|
319
310
|
class RequestContext(ResourceScopedContext):
|
|
@@ -321,20 +312,6 @@ class RequestContext(ResourceScopedContext):
|
|
|
321
312
|
|
|
322
313
|
scope = "request"
|
|
323
314
|
|
|
324
|
-
def start(self) -> None:
|
|
325
|
-
"""Start the scoped context."""
|
|
326
|
-
for interface in self.container._resource_cache.get(self.scope, []): # noqa
|
|
327
|
-
if not is_event_type(interface):
|
|
328
|
-
continue
|
|
329
|
-
self.container.resolve(interface)
|
|
330
|
-
|
|
331
|
-
async def astart(self) -> None:
|
|
332
|
-
"""Start the scoped context asynchronously."""
|
|
333
|
-
for interface in self.container._resource_cache.get(self.scope, []): # noqa
|
|
334
|
-
if not is_event_type(interface):
|
|
335
|
-
continue
|
|
336
|
-
await self.container.aresolve(interface)
|
|
337
|
-
|
|
338
315
|
|
|
339
316
|
@final
|
|
340
317
|
class TransientContext(ScopedContext):
|
anydi/_types.py
CHANGED
|
@@ -30,17 +30,6 @@ def is_marker(obj: Any) -> bool:
|
|
|
30
30
|
return isinstance(obj, Marker)
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
class Event:
|
|
34
|
-
"""Represents an event object."""
|
|
35
|
-
|
|
36
|
-
__slots__ = ()
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def is_event_type(obj: Any) -> bool:
|
|
40
|
-
"""Checks if an object is an event type."""
|
|
41
|
-
return inspect.isclass(obj) and issubclass(obj, Event)
|
|
42
|
-
|
|
43
|
-
|
|
44
33
|
@dataclass(frozen=True)
|
|
45
34
|
class Provider:
|
|
46
35
|
"""Represents a provider object.
|
anydi/_utils.py
CHANGED
|
@@ -6,7 +6,7 @@ import builtins
|
|
|
6
6
|
import functools
|
|
7
7
|
import inspect
|
|
8
8
|
import sys
|
|
9
|
-
from typing import Any, AsyncIterator, Callable, ForwardRef, Iterator, TypeVar
|
|
9
|
+
from typing import Any, AsyncIterator, Callable, ForwardRef, Iterator, TypeVar, cast
|
|
10
10
|
|
|
11
11
|
from typing_extensions import ParamSpec, get_args, get_origin
|
|
12
12
|
|
|
@@ -16,18 +16,19 @@ except ImportError:
|
|
|
16
16
|
anyio = None # type: ignore[assignment]
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
P = ParamSpec("P")
|
|
19
|
+
if sys.version_info < (3, 9): # pragma: nocover
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any:
|
|
24
|
-
if sys.version_info < (3, 9):
|
|
21
|
+
def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any:
|
|
25
22
|
return type_._evaluate(globalns, localns) # noqa
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
|
|
24
|
+
else:
|
|
25
|
+
|
|
26
|
+
def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any:
|
|
27
|
+
return cast(Any, type_)._evaluate(globalns, localns, set()) # noqa
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
T = TypeVar("T")
|
|
31
|
+
P = ParamSpec("P")
|
|
31
32
|
|
|
32
33
|
|
|
33
34
|
def get_full_qualname(obj: Any) -> str:
|
|
@@ -69,12 +70,10 @@ def get_typed_annotation(
|
|
|
69
70
|
) -> Any:
|
|
70
71
|
"""Get the typed annotation of a parameter."""
|
|
71
72
|
if isinstance(annotation, str):
|
|
72
|
-
if sys.version_info
|
|
73
|
-
annotation = ForwardRef(annotation, module=module, is_class=is_class)
|
|
74
|
-
elif sys.version_info >= (3, 10, 0):
|
|
75
|
-
annotation = ForwardRef(annotation, module=module)
|
|
76
|
-
else:
|
|
73
|
+
if sys.version_info < (3, 9):
|
|
77
74
|
annotation = ForwardRef(annotation)
|
|
75
|
+
else:
|
|
76
|
+
annotation = ForwardRef(annotation, module=module, is_class=is_class)
|
|
78
77
|
annotation = evaluate_forwardref(annotation, globalns, {})
|
|
79
78
|
return annotation
|
|
80
79
|
|
anydi/ext/faststream.py
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
"""AnyDI FastStream extension."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
1
|
import logging
|
|
6
2
|
from typing import Any, cast
|
|
7
3
|
|
|
@@ -30,22 +26,12 @@ def install(broker: BrokerUsecase[Any, Any], container: Container) -> None:
|
|
|
30
26
|
"""
|
|
31
27
|
broker._container = container # type: ignore[attr-defined]
|
|
32
28
|
|
|
33
|
-
for
|
|
34
|
-
call = handler._original_call # noqa
|
|
29
|
+
for subscriber in broker._subscribers.values(): # noqa
|
|
30
|
+
call = subscriber.calls[0].handler._original_call # noqa
|
|
35
31
|
for parameter in get_typed_parameters(call):
|
|
36
32
|
patch_call_parameter(call, parameter, container)
|
|
37
33
|
|
|
38
34
|
|
|
39
|
-
def _get_broken_handlers(broker: BrokerUsecase[Any, Any]) -> list[Any]:
|
|
40
|
-
if hasattr(broker, "handlers"):
|
|
41
|
-
return [handler.calls[0][0] for handler in broker.handlers.values()]
|
|
42
|
-
# faststream > 0.5.0
|
|
43
|
-
return [
|
|
44
|
-
subscriber.calls[0].handler
|
|
45
|
-
for subscriber in broker._subscribers.values() # noqa
|
|
46
|
-
]
|
|
47
|
-
|
|
48
|
-
|
|
49
35
|
def get_container(broker: BrokerUsecase[Any, Any]) -> Container:
|
|
50
36
|
return cast(Container, getattr(broker, "_container")) # noqa
|
|
51
37
|
|
|
@@ -57,8 +43,7 @@ class Resolver(HasInterface, Depends):
|
|
|
57
43
|
super().__init__(dependency=self._dependency, use_cache=True, cast=True)
|
|
58
44
|
|
|
59
45
|
async def _dependency(self, context: ContextRepo) -> Any:
|
|
60
|
-
|
|
61
|
-
return await container.aresolve(self.interface)
|
|
46
|
+
return get_container(context.get("broker")).resolve(self.interface)
|
|
62
47
|
|
|
63
48
|
|
|
64
49
|
def Inject() -> Any: # noqa
|
anydi/ext/pytest_plugin.py
CHANGED
|
@@ -6,6 +6,7 @@ from typing import Any, Callable, Iterator, cast
|
|
|
6
6
|
import pytest
|
|
7
7
|
|
|
8
8
|
from anydi import Container
|
|
9
|
+
from anydi._types import is_marker
|
|
9
10
|
from anydi._utils import get_typed_parameters
|
|
10
11
|
|
|
11
12
|
|
|
@@ -23,6 +24,12 @@ def pytest_addoption(parser: pytest.Parser) -> None:
|
|
|
23
24
|
type="bool",
|
|
24
25
|
default=False,
|
|
25
26
|
)
|
|
27
|
+
parser.addini(
|
|
28
|
+
"anydi_inject_auto",
|
|
29
|
+
help="Automatically inject dependencies",
|
|
30
|
+
type="bool",
|
|
31
|
+
default=True,
|
|
32
|
+
)
|
|
26
33
|
|
|
27
34
|
|
|
28
35
|
CONTAINER_FIXTURE_NAME = "container"
|
|
@@ -64,15 +71,17 @@ def _anydi_injected_parameter_iterator(
|
|
|
64
71
|
_anydi_unresolved: list[str],
|
|
65
72
|
) -> Callable[[], Iterator[tuple[str, Any]]]:
|
|
66
73
|
registered_fixtures = request.session._fixturemanager._arg2fixturedefs # noqa
|
|
74
|
+
inject_auto = cast(bool, request.config.getini("anydi_inject_auto"))
|
|
67
75
|
|
|
68
76
|
def _iterator() -> Iterator[tuple[str, inspect.Parameter]]:
|
|
69
77
|
for parameter in get_typed_parameters(request.function):
|
|
70
78
|
interface = parameter.annotation
|
|
71
|
-
if
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
79
|
+
if interface is parameter.empty:
|
|
80
|
+
continue
|
|
81
|
+
if not inject_auto and is_marker(parameter.default):
|
|
82
|
+
yield parameter.name, interface
|
|
83
|
+
continue
|
|
84
|
+
if interface in _anydi_unresolved or parameter.name in registered_fixtures:
|
|
76
85
|
continue
|
|
77
86
|
yield parameter.name, interface
|
|
78
87
|
|
|
@@ -95,14 +104,17 @@ def _anydi_inject(
|
|
|
95
104
|
container = cast(Container, request.getfixturevalue("anydi_setup_container"))
|
|
96
105
|
|
|
97
106
|
for argname, interface in _anydi_injected_parameter_iterator():
|
|
98
|
-
#
|
|
99
|
-
if container.
|
|
100
|
-
|
|
107
|
+
# Release the instance if it was already resolved
|
|
108
|
+
if container.is_resolved(interface):
|
|
109
|
+
container.release(interface)
|
|
101
110
|
|
|
102
111
|
try:
|
|
103
|
-
|
|
104
|
-
|
|
112
|
+
# Resolve the instance
|
|
113
|
+
instance = container.resolve(interface)
|
|
114
|
+
except LookupError:
|
|
105
115
|
_anydi_unresolved.append(interface)
|
|
116
|
+
continue
|
|
117
|
+
request.node.funcargs[argname] = instance
|
|
106
118
|
|
|
107
119
|
|
|
108
120
|
@pytest.fixture(autouse=True)
|
|
@@ -120,11 +132,14 @@ async def _anydi_ainject(
|
|
|
120
132
|
container = cast(Container, request.getfixturevalue("anydi_setup_container"))
|
|
121
133
|
|
|
122
134
|
for argname, interface in _anydi_injected_parameter_iterator():
|
|
123
|
-
#
|
|
124
|
-
if container.
|
|
125
|
-
|
|
135
|
+
# Release the instance if it was already resolved
|
|
136
|
+
if container.is_resolved(interface):
|
|
137
|
+
container.release(interface)
|
|
126
138
|
|
|
127
139
|
try:
|
|
128
|
-
|
|
129
|
-
|
|
140
|
+
# Resolve the instance
|
|
141
|
+
instance = await container.aresolve(interface)
|
|
142
|
+
except LookupError:
|
|
130
143
|
_anydi_unresolved.append(interface)
|
|
144
|
+
continue
|
|
145
|
+
request.node.funcargs[argname] = instance
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: anydi
|
|
3
|
-
Version: 0.27.
|
|
3
|
+
Version: 0.27.0a1
|
|
4
4
|
Summary: Dependency Injection library
|
|
5
5
|
Home-page: https://github.com/antonrh/anydi
|
|
6
6
|
License: MIT
|
|
@@ -22,6 +22,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
22
22
|
Classifier: Programming Language :: Python :: 3.11
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.12
|
|
24
24
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
25
26
|
Classifier: Topic :: Internet
|
|
26
27
|
Classifier: Topic :: Software Development
|
|
27
28
|
Classifier: Topic :: Software Development :: Libraries
|
|
@@ -32,8 +33,8 @@ Provides-Extra: async
|
|
|
32
33
|
Provides-Extra: docs
|
|
33
34
|
Requires-Dist: anyio (>=3.6.2,<4.0.0) ; extra == "async"
|
|
34
35
|
Requires-Dist: mkdocs (>=1.4.2,<2.0.0) ; extra == "docs"
|
|
35
|
-
Requires-Dist: mkdocs-material (>=9.
|
|
36
|
-
Requires-Dist: typing-extensions (>=4.
|
|
36
|
+
Requires-Dist: mkdocs-material (>=9.1.13,<10.0.0) ; extra == "docs"
|
|
37
|
+
Requires-Dist: typing-extensions (>=4.8.0,<5.0.0)
|
|
37
38
|
Project-URL: Repository, https://github.com/antonrh/anydi
|
|
38
39
|
Description-Content-Type: text/markdown
|
|
39
40
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
anydi/__init__.py,sha256=aeaBp5vq09sG-e9sqqs9qpUtUIDNfOdFPrlAfE5Ku9E,584
|
|
2
|
-
anydi/_container.py,sha256
|
|
3
|
-
anydi/_context.py,sha256=
|
|
2
|
+
anydi/_container.py,sha256=iVmVlnhK3qfcSCvDZsbD23x2REBtBD26abqKJuLGyHs,29631
|
|
3
|
+
anydi/_context.py,sha256=e0VX0fiflzW_2O9w3HvUH3YRCwXHsruQjf3Lu-zXgDw,10815
|
|
4
4
|
anydi/_logger.py,sha256=UpubJUnW83kffFxkhUlObm2DmZX1Pjqoz9YFKS-JOPg,52
|
|
5
5
|
anydi/_module.py,sha256=E1TfLud_Af-MPB83PxIzHVA1jlDW2FGaRP_il1a6y3Y,3675
|
|
6
6
|
anydi/_scanner.py,sha256=cyEk-K2Q8ssZStq8GrxMeEcCuAZMw-RXrjlgWEevKCs,6667
|
|
7
|
-
anydi/_types.py,sha256=
|
|
8
|
-
anydi/_utils.py,sha256=
|
|
7
|
+
anydi/_types.py,sha256=vQTrFjsYhlMxfo1nOFem05x2QUJMQkVh4ZaC7W0XZJY,3434
|
|
8
|
+
anydi/_utils.py,sha256=zP4UvO1aVQJTB8pFNUWAcncvSiuhcg4xNdRU7CoLrqw,3871
|
|
9
9
|
anydi/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
anydi/ext/_utils.py,sha256=2kxLPTMM9Ro3s6-knbqYzONlqRB3hMcwZFFRQGHcFUg,2691
|
|
11
11
|
anydi/ext/django/__init__.py,sha256=QI1IABCVgSDTUoh7M9WMECKXwB3xvh04HfQ9TOWw1Mk,223
|
|
@@ -18,13 +18,13 @@ anydi/ext/django/ninja/__init__.py,sha256=kW3grUgWp_nkWSG_-39ADHMrZLGNcj9TsJ9OW8
|
|
|
18
18
|
anydi/ext/django/ninja/_operation.py,sha256=wSWa7D73XTVlOibmOciv2l6JHPe1ERZcXrqI8W-oO2w,2696
|
|
19
19
|
anydi/ext/django/ninja/_signature.py,sha256=2cSzKxBIxXLqtwNuH6GSlmjVJFftoGmleWfyk_NVEWw,2207
|
|
20
20
|
anydi/ext/fastapi.py,sha256=vhfSyovXuCjvSkx6AiLOTNU975i8wDg72C5fqXQiFLw,2896
|
|
21
|
-
anydi/ext/faststream.py,sha256=
|
|
22
|
-
anydi/ext/pytest_plugin.py,sha256=
|
|
21
|
+
anydi/ext/faststream.py,sha256=svMtqFVSRTpuf4H5yeozHWmrBXi_F8cevb5d2mo3m-E,1617
|
|
22
|
+
anydi/ext/pytest_plugin.py,sha256=AQVBsyEGoQdOvXpa2TlEPYMapzL7a-oKoVcvMnQ5Epk,4477
|
|
23
23
|
anydi/ext/starlette/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
24
|
anydi/ext/starlette/middleware.py,sha256=Ni0BQaPjs_Ha6zcLZYYJ3-XkslTCnL9aCSa06rnRDMI,1139
|
|
25
25
|
anydi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
-
anydi-0.27.
|
|
27
|
-
anydi-0.27.
|
|
28
|
-
anydi-0.27.
|
|
29
|
-
anydi-0.27.
|
|
30
|
-
anydi-0.27.
|
|
26
|
+
anydi-0.27.0a1.dist-info/LICENSE,sha256=V6rU8a8fv6o2jQ-7ODHs0XfDFimot8Q6Km6CylRIDTo,1069
|
|
27
|
+
anydi-0.27.0a1.dist-info/METADATA,sha256=9k_8NOREjBfp2612k6n5nwFl3NfTWVQF8V9TrcNALh8,5162
|
|
28
|
+
anydi-0.27.0a1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
29
|
+
anydi-0.27.0a1.dist-info/entry_points.txt,sha256=GmQblwzxFg42zva1HyBYJJ7TvrTIcSAGBHmyi3bvsi4,42
|
|
30
|
+
anydi-0.27.0a1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|