Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/modern-di-fastapi/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ classifiers = [
"Typing :: Typed",
"Topic :: Software Development :: Libraries",
]
dependencies = ["fastapi>=0.100", "modern-di>=1.0.0alpha"]
dependencies = ["fastapi>=0.100", "modern-di>=2.0.0alpha1"]
version = "0"

[project.urls]
Expand Down
2 changes: 1 addition & 1 deletion packages/modern-di-faststream/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ classifiers = [
"Typing :: Typed",
"Topic :: Software Development :: Libraries",
]
dependencies = ["faststream>=0.5,<1", "modern-di>=1.0.0alpha"]
dependencies = ["faststream>=0.5,<1", "modern-di>=2.0.0alpha1"]
version = "0"

[project.urls]
Expand Down
2 changes: 1 addition & 1 deletion packages/modern-di-litestar/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ classifiers = [
"Typing :: Typed",
"Topic :: Software Development :: Libraries",
]
dependencies = ["litestar", "modern-di>=1.0.0alpha1"]
dependencies = ["litestar", "modern-di>=2.0.0alpha1"]
version = "0"

[project.urls]
Expand Down
15 changes: 12 additions & 3 deletions packages/modern-di/modern_di/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@
import typing_extensions

from modern_di.group import Group
from modern_di.providers.abstract import AbstractProvider
from modern_di.registries.cache_registry import CacheRegistry
from modern_di.registries.context_registry import ContextRegistry
from modern_di.registries.providers_registry import ProvidersRegistry
from modern_di.scope import Scope


if typing.TYPE_CHECKING:
from modern_di.providers.abstract import AbstractProvider

T_co = typing.TypeVar("T_co", covariant=True)


Expand Down Expand Up @@ -44,6 +42,7 @@ def __init__(
self.providers_registry = parent_container.providers_registry
else:
self.providers_registry = ProvidersRegistry()
self.providers_registry.add_providers(di_container=ContainerProvider())
if groups:
for one_group in groups:
self.providers_registry.add_providers(**one_group.get_providers())
Expand Down Expand Up @@ -99,3 +98,13 @@ def __deepcopy__(self, *_: object, **__: object) -> "typing_extensions.Self":
def __copy__(self, *_: object, **__: object) -> "typing_extensions.Self":
"""Prevent cloning object."""
return self


class ContainerProvider(AbstractProvider[typing.Any]):
__slots__ = AbstractProvider.BASE_SLOTS

def __init__(self) -> None:
super().__init__(scope=Scope.APP, bound_type=Container)

def resolve(self, container: Container) -> Container:
return container
19 changes: 10 additions & 9 deletions packages/modern-di/tests_core/providers/test_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class SimpleCreator:
@dataclasses.dataclass(kw_only=True, slots=True)
class DependentCreator:
dep1: SimpleCreator
di_container: Container


class MyGroup(Group):
Expand All @@ -20,19 +21,16 @@ class MyGroup(Group):


def test_app_factory() -> None:
app_container = Container()
instance1 = app_container.resolve_provider(MyGroup.app_factory)
instance2 = app_container.resolve_provider(MyGroup.app_factory)
assert instance1 is not instance2


def test_app_factory_with_registry() -> None:
app_container = Container(groups=[MyGroup])
instance1 = app_container.resolve(dependency_type=SimpleCreator)
instance2: SimpleCreator = app_container.resolve(dependency_name="app_factory")
instance1 = app_container.resolve_provider(MyGroup.app_factory)
instance2 = app_container.resolve(dependency_type=SimpleCreator)
instance3: SimpleCreator = app_container.resolve(dependency_name="app_factory")
assert isinstance(instance1, SimpleCreator)
assert isinstance(instance2, SimpleCreator)
assert isinstance(instance3, SimpleCreator)
assert instance1 is not instance2
assert instance1 is not instance3
assert instance2 is not instance3


def test_request_factory() -> None:
Expand All @@ -41,6 +39,9 @@ def test_request_factory() -> None:
instance1 = request_container.resolve_provider(MyGroup.request_factory)
instance2 = request_container.resolve_provider(MyGroup.request_factory)
assert instance1 is not instance2
assert isinstance(instance1.di_container, Container)
assert instance1.di_container.scope == Scope.REQUEST
assert instance1.di_container is instance2.di_container

request_container = app_container.build_child_container(scope=Scope.REQUEST)
instance3 = request_container.resolve_provider(MyGroup.request_factory)
Expand Down