From b36d0c4ccf7e5063ce88a2fcc3336ed32c3d198a Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Tue, 1 Sep 2020 16:35:46 -0400 Subject: [PATCH] Update callable provider docs --- docs/images/providers/callable.png | Bin 32436 -> 0 bytes docs/main/changelog.rst | 4 +- docs/providers/callable.rst | 73 +++++--------------------- examples/providers/callable.py | 18 +++++++ examples/providers/callable_args.py | 16 ------ examples/providers/callable_kwargs.py | 16 ------ 6 files changed, 32 insertions(+), 95 deletions(-) delete mode 100644 docs/images/providers/callable.png create mode 100644 examples/providers/callable.py delete mode 100644 examples/providers/callable_args.py delete mode 100644 examples/providers/callable_kwargs.py diff --git a/docs/images/providers/callable.png b/docs/images/providers/callable.png deleted file mode 100644 index f34b2a6ad1ee8f2875ada583e3d502c3522a73d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32436 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 diff --git a/docs/main/changelog.rst b/docs/main/changelog.rst index ba3196e7..60bb4e70 100644 --- a/docs/main/changelog.rst +++ b/docs/main/changelog.rst @@ -9,8 +9,8 @@ follows `Semantic versioning`_ Development version ------------------- -- Update ``Singleton`` provider documentation. -- Rework ``Singleton`` provider examples. +- Update ``Singleton`` provider documentation and rework examples. +- Update ``Callable`` provider documentation and rework examples. 3.34.0 ------ diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst index 9c82c87f..e0cb5089 100644 --- a/docs/providers/callable.rst +++ b/docs/providers/callable.rst @@ -1,69 +1,20 @@ -Callable providers ------------------- +Callable provider +----------------- + +.. meta:: + :keywords: Python,DI,Dependency injection,IoC,Inversion of Control,Function,Method,Example + :description: Callable provider helps to make dependencies injection into functions. This page + demonstrates how to use a Callable provider. .. currentmodule:: dependency_injector.providers -:py:class:`Callable` provider calls wrapped callable on every call. +:py:class:`Callable` provider calls a function, a method or another callable. -Callable providers and injections -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -:py:class:`Callable` provider takes a various number of positional and keyword -arguments that are used as wrapped callable injections. Every time, when -:py:class:`Callable` provider is called, positional and keyword argument -injections would be passed as callable arguments. - -Injections are done according to the next rules: - -+ All providers (instances of :py:class:`Provider`) are called every time - when injection needs to be done. -+ Providers could be injected "as is" (delegated), if it is defined obviously. - Check out :ref:`callable_providers_delegation`. -+ All other injectable values are provided *"as is"*. -+ Positional context arguments will be appended after :py:class:`Callable` - positional injections. -+ Keyword context arguments have priority on :py:class:`Callable` keyword - injections and will be merged over them. - -Example that shows usage of :py:class:`Callable` with positional argument -injections: - -.. literalinclude:: ../../examples/providers/callable_args.py +.. literalinclude:: ../../examples/providers/callable.py :language: python + :lines: 3- -Next one example shows usage of :py:class:`Callable` with keyword argument -injections: - -.. image:: /images/providers/callable.png - :width: 100% - :align: center - -.. literalinclude:: ../../examples/providers/callable_kwargs.py - :language: python - -.. _callable_providers_delegation: - -Callable providers delegation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -:py:class:`Callable` provider could be delegated to any other provider via -any kind of injection. - -Delegation of :py:class:`Callable` providers is the same as -:py:class:`Factory` providers delegation, please follow -:ref:`factory_providers_delegation` section for examples (with exception -of using :py:class:`DelegatedCallable` instead of -:py:class:`DelegatedFactory`). - -Abstract callable providers -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -:py:class:`AbstractCallable` provider is a :py:class:`Callable` provider that -must be explicitly overridden before calling. - -Behaviour of :py:class:`AbstractCallable` providers is the same as of -:py:class:`AbstractFactory`, please follow :ref:`abstract_factory_providers` -section for examples (with exception of using :py:class:`AbstractCallable` -provider instead of :py:class:`AbstractFactory`). +``Callable`` provider handles an injection of the dependencies the same way like a +:ref:`factory-provider`. .. disqus:: diff --git a/examples/providers/callable.py b/examples/providers/callable.py new file mode 100644 index 00000000..40e0d363 --- /dev/null +++ b/examples/providers/callable.py @@ -0,0 +1,18 @@ +"""`Callable` provider example.""" + +import passlib.hash + +from dependency_injector import providers + + +password_hasher = providers.Callable( + passlib.hash.sha256_crypt.hash, + salt_size=16, + rounds=10000, +) +password_verifier = providers.Callable(passlib.hash.sha256_crypt.verify) + + +if __name__ == '__main__': + hashed_password = password_hasher('super secret') + assert password_verifier('super secret', hashed_password) diff --git a/examples/providers/callable_args.py b/examples/providers/callable_args.py deleted file mode 100644 index a4292de4..00000000 --- a/examples/providers/callable_args.py +++ /dev/null @@ -1,16 +0,0 @@ -"""`Callable` providers with positional arguments example.""" - -import dependency_injector.providers as providers - - -# Creating even and odd filter providers: -even_filter = providers.Callable(filter, lambda x: x % 2 == 0) -odd_filter = providers.Callable(filter, lambda x: x % 2 != 0) - -# Creating even and odd ranges using range() and filter providers: -even_range = even_filter(range(1, 10)) -odd_range = odd_filter(range(1, 10)) - -# Making some asserts: -assert even_range == [2, 4, 6, 8] -assert odd_range == [1, 3, 5, 7, 9] diff --git a/examples/providers/callable_kwargs.py b/examples/providers/callable_kwargs.py deleted file mode 100644 index a6b89990..00000000 --- a/examples/providers/callable_kwargs.py +++ /dev/null @@ -1,16 +0,0 @@ -"""`Callable` providers with keyword arguments example.""" - -import passlib.hash - -import dependency_injector.providers as providers - - -# Password hasher and verifier providers: -password_hasher = providers.Callable(passlib.hash.sha256_crypt.encrypt, - salt_size=16, - rounds=10000) -password_verifier = providers.Callable(passlib.hash.sha256_crypt.verify) - -# Making some asserts: -hashed_password = password_hasher('super secret') -assert password_verifier('super secret', hashed_password)