modern-di 0.13.0__tar.gz → 0.14.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.

Potentially problematic release.


This version of modern-di might be problematic. Click here for more details.

Files changed (25) hide show
  1. modern_di-0.14.0/PKG-INFO +43 -0
  2. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/container.py +16 -7
  3. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/__init__.py +2 -0
  4. modern_di-0.14.0/modern_di/providers/async_factory.py +34 -0
  5. modern_di-0.13.0/PKG-INFO +0 -43
  6. {modern_di-0.13.0 → modern_di-0.14.0}/.gitignore +0 -0
  7. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/__init__.py +0 -0
  8. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/graph.py +0 -0
  9. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/helpers/__init__.py +0 -0
  10. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/helpers/attr_getter_helpers.py +0 -0
  11. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/provider_state.py +0 -0
  12. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/abstract.py +0 -0
  13. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/container_provider.py +0 -0
  14. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/context_adapter.py +0 -0
  15. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/dict.py +0 -0
  16. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/factory.py +0 -0
  17. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/injected_factory.py +0 -0
  18. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/list.py +0 -0
  19. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/object.py +0 -0
  20. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/resource.py +0 -0
  21. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/selector.py +0 -0
  22. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/providers/singleton.py +0 -0
  23. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/py.typed +0 -0
  24. {modern_di-0.13.0 → modern_di-0.14.0}/modern_di/scope.py +0 -0
  25. {modern_di-0.13.0 → modern_di-0.14.0}/pyproject.toml +0 -0
@@ -0,0 +1,43 @@
1
+ Metadata-Version: 2.4
2
+ Name: modern-di
3
+ Version: 0.14.0
4
+ Summary: Dependency Injection framework with IOC-container and scopes
5
+ Project-URL: repository, https://github.com/modern-python/modern-di
6
+ Project-URL: docs, https://modern-di.readthedocs.io
7
+ Author-email: Artur Shiriev <me@shiriev.ru>
8
+ License-Expression: MIT
9
+ Keywords: DI,dependency injector,ioc-container,mocks,python
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Topic :: Software Development :: Libraries
15
+ Classifier: Typing :: Typed
16
+ Requires-Python: <4,>=3.10
17
+ Description-Content-Type: text/markdown
18
+
19
+ "Modern-DI"
20
+ ==
21
+
22
+ | Project | Badges |
23
+ |----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
24
+ | common | [![MyPy Strict](https://img.shields.io/badge/mypy-strict-blue)](https://mypy.readthedocs.io/en/stable/getting_started.html#strict-mode-and-configuration) [![GitHub stars](https://img.shields.io/github/stars/modern-python/modern-di)](https://github.com/modern-python/modern-di/stargazers) |
25
+ | modern-di | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di.svg)](https://pypi.python.org/pypi/modern-di ) [![downloads](https://img.shields.io/pypi/dm/modern-di.svg)](https://pypistats.org/packages/modern-di) |
26
+ | modern-di-fastapi | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-fastapi.svg)](https://pypi.python.org/pypi/modern-di-fastapi) [![downloads](https://img.shields.io/pypi/dm/modern-di-fastapi.svg)](https://pypistats.org/packages/modern-di-fastapi) |
27
+ | modern-di-faststream | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-faststream.svg)](https://pypi.python.org/pypi/modern-di-faststream) [![downloads](https://img.shields.io/pypi/dm/modern-di-faststream.svg)](https://pypistats.org/packages/modern-di-faststream) |
28
+ | modern-di-litestar | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-litestar.svg)](https://pypi.python.org/pypi/modern-di-litestar) [![downloads](https://img.shields.io/pypi/dm/modern-di-litestar.svg)](https://pypistats.org/packages/modern-di-litestar) |
29
+
30
+ `modern-di` is a python dependency injection framework which, among other things,
31
+ supports the following:
32
+
33
+ - Async and sync dependency resolution
34
+ - Scopes and granular context management
35
+ - Python 3.10+ support
36
+ - Fully typed and tested
37
+ - Integrations with `FastAPI`, `FastStream` and `LiteStar`
38
+
39
+ ## 📚 [Documentation](https://modern-di.readthedocs.io)
40
+
41
+ ## 📦 [PyPi](https://pypi.org/project/modern-di)
42
+
43
+ ## 📝 [License](LICENSE)
@@ -119,16 +119,29 @@ class Container(contextlib.AbstractAsyncContextManager["Container"], contextlib.
119
119
  else:
120
120
  self._overrides.pop(provider_id, None)
121
121
 
122
- async def __aenter__(self) -> "Container":
122
+ def async_enter(self) -> "Container":
123
123
  self._is_async = True
124
124
  return self
125
125
 
126
+ def sync_enter(self) -> "Container":
127
+ self._is_async = False
128
+ return self
129
+
126
130
  async def async_close(self) -> None:
127
131
  self._check_entered()
128
132
  for provider_state in reversed(self._provider_states.values()):
129
133
  await provider_state.async_tear_down()
130
134
  self._exit()
131
135
 
136
+ def sync_close(self) -> None:
137
+ self._check_entered()
138
+ for provider_state in reversed(self._provider_states.values()):
139
+ provider_state.sync_tear_down()
140
+ self._exit()
141
+
142
+ async def __aenter__(self) -> "Container":
143
+ return self.async_enter()
144
+
132
145
  async def __aexit__(
133
146
  self,
134
147
  exc_type: type[BaseException] | None,
@@ -138,8 +151,7 @@ class Container(contextlib.AbstractAsyncContextManager["Container"], contextlib.
138
151
  await self.async_close()
139
152
 
140
153
  def __enter__(self) -> "Container":
141
- self._is_async = False
142
- return self
154
+ return self.sync_enter()
143
155
 
144
156
  def __exit__(
145
157
  self,
@@ -147,7 +159,4 @@ class Container(contextlib.AbstractAsyncContextManager["Container"], contextlib.
147
159
  exc_value: BaseException | None,
148
160
  traceback: types.TracebackType | None,
149
161
  ) -> None:
150
- self._check_entered()
151
- for provider_state in reversed(self._provider_states.values()):
152
- provider_state.sync_tear_down()
153
- self._exit()
162
+ self.sync_close()
@@ -1,4 +1,5 @@
1
1
  from modern_di.providers.abstract import AbstractProvider
2
+ from modern_di.providers.async_factory import AsyncFactory
2
3
  from modern_di.providers.container_provider import ContainerProvider
3
4
  from modern_di.providers.context_adapter import ContextAdapter
4
5
  from modern_di.providers.dict import Dict
@@ -12,6 +13,7 @@ from modern_di.providers.singleton import Singleton
12
13
 
13
14
  __all__ = [
14
15
  "AbstractProvider",
16
+ "AsyncFactory",
15
17
  "ContainerProvider",
16
18
  "ContextAdapter",
17
19
  "Dict",
@@ -0,0 +1,34 @@
1
+ import enum
2
+ import typing
3
+
4
+ from modern_di import Container
5
+ from modern_di.providers.abstract import AbstractCreatorProvider
6
+
7
+
8
+ T_co = typing.TypeVar("T_co", covariant=True)
9
+ P = typing.ParamSpec("P")
10
+
11
+
12
+ class AsyncFactory(AbstractCreatorProvider[T_co]):
13
+ __slots__ = [*AbstractCreatorProvider.BASE_SLOTS, "_creator"]
14
+
15
+ def __init__(
16
+ self,
17
+ scope: enum.IntEnum,
18
+ creator: typing.Callable[P, typing.Awaitable[T_co]],
19
+ *args: P.args,
20
+ **kwargs: P.kwargs,
21
+ ) -> None:
22
+ super().__init__(scope, creator, *args, **kwargs)
23
+
24
+ async def async_resolve(self, container: Container) -> T_co:
25
+ container = container.find_container(self.scope)
26
+ if (override := container.fetch_override(self.provider_id)) is not None:
27
+ return typing.cast(T_co, override)
28
+
29
+ coroutine: typing.Awaitable[T_co] = await self._async_build_creator(container)
30
+ return await coroutine
31
+
32
+ def sync_resolve(self, _: Container) -> typing.NoReturn:
33
+ msg = "AsyncFactory cannot be resolved synchronously"
34
+ raise RuntimeError(msg)
modern_di-0.13.0/PKG-INFO DELETED
@@ -1,43 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: modern-di
3
- Version: 0.13.0
4
- Summary: Dependency Injection framework with IOC-container and scopes
5
- Project-URL: repository, https://github.com/modern-python/modern-di
6
- Project-URL: docs, https://modern-di.readthedocs.io
7
- Author-email: Artur Shiriev <me@shiriev.ru>
8
- License-Expression: MIT
9
- Keywords: DI,dependency injector,ioc-container,mocks,python
10
- Classifier: Programming Language :: Python :: 3.10
11
- Classifier: Programming Language :: Python :: 3.11
12
- Classifier: Programming Language :: Python :: 3.12
13
- Classifier: Programming Language :: Python :: 3.13
14
- Classifier: Topic :: Software Development :: Libraries
15
- Classifier: Typing :: Typed
16
- Requires-Python: <4,>=3.10
17
- Description-Content-Type: text/markdown
18
-
19
- "Modern-DI"
20
- ==
21
-
22
- | Project | Badges |
23
- |--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
24
- | common | [![MyPy Strict](https://img.shields.io/badge/mypy-strict-blue)](https://mypy.readthedocs.io/en/stable/getting_started.html#strict-mode-and-configuration) [![GitHub stars](https://img.shields.io/github/stars/modern-python/modern-di)](https://github.com/modern-python/modern-di/stargazers) |
25
- | modern-di | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di.svg)](https://pypi.python.org/pypi/modern-di ) [![downloads](https://img.shields.io/pypi/dm/modern-di.svg)](https://pypistats.org/packages/modern-di) |
26
- | modern-di-fastapi | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-fastapi.svg)](https://pypi.python.org/pypi/modern-di-fastapi) [![downloads](https://img.shields.io/pypi/dm/modern-di-fastapi.svg)](https://pypistats.org/packages/modern-di-fastapi) |
27
- | modern-di-litestar | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-litestar.svg)](https://pypi.python.org/pypi/modern-di-litestar) [![downloads](https://img.shields.io/pypi/dm/modern-di-litestar.svg)](https://pypistats.org/packages/modern-di-litestar) |
28
-
29
- `modern-di` is a python dependency injection framework which, among other things,
30
- supports the following:
31
-
32
- - Async and sync dependency resolution
33
- - Scopes and granular context management
34
- - Python 3.10+ support
35
- - Fully typed and tested
36
- - Compatibility with popular frameworks like `FastAPI` and `LiteStar`
37
- - Thread-safe and asyncio concurrency safe providers
38
-
39
- ## 📚 [Documentation](https://modern-di.readthedocs.io)
40
-
41
- ## 📦 [PyPi](https://pypi.org/project/modern-di)
42
-
43
- ## 📝 [License](LICENSE)
File without changes
File without changes