diff --git a/docs/conf.py b/docs/conf.py index a1260f49..58af81e8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -52,8 +52,8 @@ master_doc = 'index' # General information about the project. project = u'Dependency Injector' -copyright = u'2021, ETS Labs' -author = u'ETS Labs' +copyright = u'2021, Roman Mogylatov' +author = u'Roman Mogylatov' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -232,7 +232,7 @@ latex_elements = { # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'dependency_injector.tex', u'Dependency Injector Documentation', - u'ETS Labs', 'manual'), + u'Roman Mogylatov', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -303,7 +303,7 @@ html_theme_options = { 'github_button': True, 'github_banner': True, 'logo': 'logo.svg', - 'description': 'Dependency injection framework for Python', + 'description': 'Dependency injection framework for Python by Roman Mogylatov', 'code_font_size': '10pt', 'analytics_id': 'UA-67012059-1', } diff --git a/docs/examples/boto3.rst b/docs/examples/boto3.rst index 8dc4bb6b..8ca76724 100644 --- a/docs/examples/boto3.rst +++ b/docs/examples/boto3.rst @@ -8,7 +8,7 @@ Boto3 example :description: This example demonstrates a usage of Boto3 AWS client and Dependency Injector. -This example shows how to use ``Dependency Injector`` with `Boto3 `_. +This example shows how to use ``Dependency Injector`` with `Boto3 `_. The source code is available on the `Github `_. diff --git a/docs/main/changelog.rst b/docs/main/changelog.rst index f59266fc..50bc7cae 100644 --- a/docs/main/changelog.rst +++ b/docs/main/changelog.rst @@ -7,6 +7,17 @@ that were made in every particular version. From version 0.7.6 *Dependency Injector* framework strictly follows `Semantic versioning`_ + +4.36.1 +------ +- 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 `_. + Thanks to `@rajanjha786 `_ for the contribution. +- Fix a typo in ``boto3`` example + `#511 `_. + Thanks to `@whysage `_ for the contribution. + 4.36.0 ------ - Add support of non-string keys for ``FactoryAggregate`` provider. diff --git a/docs/wiring.rst b/docs/wiring.rst index ad74ad34..58deeae5 100644 --- a/docs/wiring.rst +++ b/docs/wiring.rst @@ -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. diff --git a/examples/providers/factory_attribute_injections.py b/examples/providers/factory_attribute_injections.py index e9eaf528..f2d83e4b 100644 --- a/examples/providers/factory_attribute_injections.py +++ b/examples/providers/factory_attribute_injections.py @@ -17,7 +17,7 @@ class Container(containers.DeclarativeContainer): client = providers.Factory(Client) service = providers.Factory(Service) - service.add_attributes(clent=client) + service.add_attributes(client=client) if __name__ == '__main__': diff --git a/src/dependency_injector/__init__.py b/src/dependency_injector/__init__.py index 7b9b9134..2c2b8ba3 100644 --- a/src/dependency_injector/__init__.py +++ b/src/dependency_injector/__init__.py @@ -1,6 +1,6 @@ """Top-level package.""" -__version__ = '4.36.0' +__version__ = '4.36.1' """Version number. :type: str diff --git a/src/dependency_injector/wiring.py b/src/dependency_injector/wiring.py index 4dd77c09..a98c28c3 100644 --- a/src/dependency_injector/wiring.py +++ b/src/dependency_injector/wiring.py @@ -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,7 +542,10 @@ def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> Non if isinstance(marker, Provide): fn.__injections__[injection] = provider elif isinstance(marker, Provider): - fn.__injections__[injection] = provider.provider + if isinstance(provider, providers.Delegate): + fn.__injections__[injection] = provider + else: + fn.__injections__[injection] = provider.provider if injection in fn.__reference_closing__: fn.__closing__[injection] = provider diff --git a/tests/unit/samples/wiringsamples/module.py b/tests/unit/samples/wiringsamples/module.py index 333de332..e1ccc112 100644 --- a/tests/unit/samples/wiringsamples/module.py +++ b/tests/unit/samples/wiringsamples/module.py @@ -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 diff --git a/tests/unit/wiring/test_wiring_py36.py b/tests/unit/wiring/test_wiring_py36.py index 7c503782..0d0a4a5f 100644 --- a/tests/unit/wiring/test_wiring_py36.py +++ b/tests/unit/wiring/test_wiring_py36.py @@ -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 = {