Fix provide issue (#514)

This commit is contained in:
Roman Mogylatov 2021-09-25 15:36:48 -04:00 committed by GitHub
parent d8aa70c70b
commit 4733aad44e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 9 deletions

View File

@ -10,6 +10,7 @@ follows `Semantic versioning`_
Develop
-------
- Fix a wiring bug with improper resolving of ``Provide[some_provider.provider]``.
- Fix a typo in ``Factory`` provider docs ``service.add_attributes(clent=client)``
`#499 <https://github.com/ets-labs/python-dependency-injector/issues/499>`_.
Thanks to `@rajanjha786 <https://github.com/rajanjha786>`_ for the contribution.

View File

@ -39,19 +39,29 @@ a function or method argument:
Specifying an annotation is optional.
There are two types of markers:
- ``Provide[foo]`` - call the provider ``foo`` and injects the result
- ``Provider[foo]`` - injects the provider ``foo`` itself
To inject the provider itself use ``Provide[foo.provider]``:
.. code-block:: python
from dependency_injector.providers import Factory
from dependency_injector.wiring import inject, Provide
@inject
def foo(bar_provider: Factory[Bar] = Provide[Container.bar.provider]):
bar = bar_provider(argument="baz")
...
You can also use ``Provider[foo]`` for injecting the provider itself:
.. code-block:: python
from dependency_injector.providers import Factory
from dependency_injector.wiring import inject, Provider
@inject
def foo(bar_provider: Callable[..., Bar] = Provider[Container.bar]):
bar = bar_provider()
def foo(bar_provider: Factory[Bar] = Provider[Container.bar]):
bar = bar_provider(argument="baz")
...
You can use configuration, provided instance and sub-container providers as you normally do.

View File

@ -226,7 +226,10 @@ class ProvidersMap:
self,
original: providers.Delegate,
) -> Optional[providers.Provider]:
return self._resolve_provider(original.provides)
provider = self._resolve_provider(original.provides)
if provider:
provider = provider.provider
return provider
def _resolve_config_option(
self,
@ -539,6 +542,9 @@ def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> Non
if isinstance(marker, Provide):
fn.__injections__[injection] = provider
elif isinstance(marker, Provider):
if isinstance(provider, providers.Delegate):
fn.__injections__[injection] = provider
else:
fn.__injections__[injection] = provider.provider
if injection in fn.__reference_closing__:

View File

@ -84,7 +84,13 @@ def test_config_value_required_undefined(
@inject
def test_provide_provider(service_provider: Callable[..., Service] = Provider[Container.service.provider]):
def test_provide_provider(service_provider: Callable[..., Service] = Provide[Container.service.provider]):
service = service_provider()
return service
@inject
def test_provider_provider(service_provider: Callable[..., Service] = Provider[Container.service.provider]):
service = service_provider()
return service

View File

@ -169,6 +169,10 @@ class WiringTest(unittest.TestCase):
service = module.test_provide_provider()
self.assertIsInstance(service, Service)
def test_provider_provider(self):
service = module.test_provider_provider()
self.assertIsInstance(service, Service)
def test_provided_instance(self):
class TestService:
foo = {