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 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, Event, Interface, Provider, Scope, is_marker
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._resource_cache: dict[Scope, list[type[Any]]] = defaultdict(list)
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}", (Event,), {})
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._resource_cache[provider.scope].append(interface)
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._resource_cache[provider.scope].remove(interface)
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
- ) -> bool:
434
+ ) -> None:
433
435
  """Exit the singleton context."""
434
- return self._singleton_context.__exit__(exc_type, exc_val, exc_tb)
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
- @contextlib.contextmanager
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
- ) -> bool:
476
+ ) -> None:
468
477
  """Exit the singleton context."""
469
- return await self._singleton_context.__aexit__(exc_type, exc_val, exc_tb)
478
+ await self.aclose()
470
479
 
471
480
  async def astart(self) -> None:
472
481
  """Start the singleton context asynchronously."""
473
- await self._singleton_context.astart()
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
- @contextlib.asynccontextmanager
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, is_event_type
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
- ) -> bool:
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
- return self._stack.__exit__(exc_type, exc_val, exc_tb) # type: ignore[return-value]
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._resource_cache.get(self.scope, []): # noqa
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.__exit__(None, None, None)
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
- ) -> bool:
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
- return await run_async(
289
- self.__exit__, exc_type, exc_val, exc_tb
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.__aexit__(None, None, None)
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
- T = TypeVar("T")
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
- elif sys.version_info >= (3, 12):
27
- return type_._evaluate( # noqa
28
- globalns, localns, frozenset(), recursive_guard=frozenset()
29
- )
30
- return type_._evaluate(globalns, localns, frozenset()) # noqa
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 >= (3, 10, 2):
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 handler in _get_broken_handlers(broker):
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
- container = get_container(context.get("broker"))
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
@@ -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
- interface is parameter.empty
73
- or interface in _anydi_unresolved
74
- or parameter.name in registered_fixtures
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
- # Skip if the interface is not registered
99
- if container.strict and not container.is_registered(interface):
100
- continue
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
- request.node.funcargs[argname] = container.resolve(interface)
104
- except Exception: # noqa
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
- # Skip if the interface is not registered
124
- if container.strict and not container.is_registered(interface):
125
- continue
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
- request.node.funcargs[argname] = await container.aresolve(interface)
129
- except Exception: # noqa
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.0
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.5.21,<10.0.0) ; extra == "docs"
36
- Requires-Dist: typing-extensions (>=4.12.1,<5.0.0)
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=-vpiYl2Tx2QK9wl74DiF5qLFRudJ3e78TqEyuyOrthE,29055
3
- anydi/_context.py,sha256=_hJ1Cf2amgAr4uLvgk2KtGWMo0p7JFM_db1_YbWweHI,11895
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=i8xFxz8pmFj7SGqwOwae_P9VtiRie6DVLwfaLibLwhc,3653
8
- anydi/_utils.py,sha256=TzUZRTNaXu78Uzv9NCNLSM5s9TgEIiXtXgr1HhsfHac,4017
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=L4rkWYIO4ZZuWH-8M8NT6_J0bT0Dz_EWO3B6Oj1iFBI,2024
22
- anydi/ext/pytest_plugin.py,sha256=3OWphc4nEzla46_8KR7LXtwGns5eol_YlUWfTf4Cr2Q,3952
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.0.dist-info/LICENSE,sha256=V6rU8a8fv6o2jQ-7ODHs0XfDFimot8Q6Km6CylRIDTo,1069
27
- anydi-0.27.0.dist-info/METADATA,sha256=zazVcW9x_zEq3W2q7We5DMLMuJoNWH1I5JOzVsfTb_g,5111
28
- anydi-0.27.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
29
- anydi-0.27.0.dist-info/entry_points.txt,sha256=GmQblwzxFg42zva1HyBYJJ7TvrTIcSAGBHmyi3bvsi4,42
30
- anydi-0.27.0.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: poetry-core 1.8.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any