From 0573f3ad5b90b7ee4febe9608b76769530902e6a Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Wed, 20 Mar 2024 11:18:48 +0300 Subject: [PATCH] add List provider --- pyproject.toml | 2 +- tests/container.py | 1 + tests/test_di.py | 2 ++ that_depends/providers.py | 11 +++++++++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 76df4b4..f272fa2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "that-depends" -version = "1.1.0" +version = "1.2.0" description = "Simple Dependency Injection framework" authors = ["Artur Shiriev "] readme = "README.md" diff --git a/tests/container.py b/tests/container.py index 7d053ab..8668f75 100644 --- a/tests/container.py +++ b/tests/container.py @@ -41,6 +41,7 @@ class AsyncDependentFactory: class DIContainer(BaseContainer): sync_resource = providers.Resource[str](create_sync_resource) async_resource = providers.AsyncResource[str](create_async_resource) + sequence = providers.List[str](sync_resource, async_resource) independent_factory = providers.Factory(IndependentFactory, dep1="text", dep2=123) sync_dependent_factory = providers.Factory( diff --git a/tests/test_di.py b/tests/test_di.py index bd2e181..109d9b7 100644 --- a/tests/test_di.py +++ b/tests/test_di.py @@ -9,9 +9,11 @@ async def test_di() -> None: independent_factory = await DIContainer.independent_factory() sync_dependent_factory = await DIContainer.sync_dependent_factory() async_dependent_factory = await DIContainer.async_dependent_factory() + sequence = await DIContainer.sequence() assert sync_dependent_factory.independent_factory is not independent_factory assert sync_dependent_factory.sync_resource == "sync resource" assert async_dependent_factory.async_resource == "async resource" + assert sequence == ["sync resource", "async resource"] def test_wrong_providers_init() -> None: diff --git a/that_depends/providers.py b/that_depends/providers.py index 556836f..7f28ee4 100644 --- a/that_depends/providers.py +++ b/that_depends/providers.py @@ -124,3 +124,14 @@ async def resolve(self) -> T: *[await x() if isinstance(x, AbstractProvider) else x for x in self._args], **{k: await v() if isinstance(v, AbstractProvider) else v for k, v in self._kwargs.items()}, ) + + +class List(AbstractProvider[T]): + def __init__(self, *providers: AbstractProvider[typing.Any]) -> None: + self._providers = providers + + async def resolve(self) -> list[T]: # type: ignore[override] + return [await x.resolve() for x in self._providers] + + async def __call__(self) -> list[T]: # type: ignore[override] + return await self.resolve()