From 7e1ee9b66aec2709023fed9e134b7e9423faa7b9 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Wed, 8 Jun 2016 17:46:40 +0300 Subject: [PATCH] Update singleton provider docs --- docs/images/providers/singleton.png | Bin 25308 -> 11318 bytes docs/providers/factory.rst | 6 +- docs/providers/singleton.rst | 65 ++++++++------------- examples/providers/delegated_singleton.py | 18 ------ examples/providers/singleton.py | 15 +++-- examples/providers/singleton_delegation.py | 13 ----- examples/providers/singleton_reseting.py | 21 ++++--- 7 files changed, 45 insertions(+), 93 deletions(-) delete mode 100644 examples/providers/delegated_singleton.py delete mode 100644 examples/providers/singleton_delegation.py diff --git a/docs/images/providers/singleton.png b/docs/images/providers/singleton.png index 3cc3f5983e6af5e0c9dc444b37d45b75210c507e..06e8996f29b682a08c052004a3fe6279afb2662c 100644 GIT binary patch literal 11318 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 PU*rm4RZ!*YcOU-);*CA| literal 25308 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 diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index 24609098..46c61ebf 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -29,7 +29,7 @@ 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 `Factory providers delegation`_. + Check out :ref:`factory_providers_delegation`. + All other injectable values are provided *"as is"*. + Positional context arguments will be appended after :py:class:`Factory` positional injections. @@ -50,6 +50,8 @@ injectable values are also provided by another factories: :language: python :linenos: +.. _factory_providers_delegation: + Factory providers delegation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -89,6 +91,8 @@ Example: :language: python :linenos: +.. _factory_providers_specialization: + Factory providers specialization ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index bd00b79e..292ec093 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -16,6 +16,20 @@ Example: :language: python :linenos: +Singleton providers resetting +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Created and memorized by :py:class:`Singleton` instance can be reset. Reset of +:py:class:`Singleton`'s memorized instance is done by clearing reference to +it. Further lifecycle of memorized instance is out of :py:class:`Singleton` +provider's control and dependes on garbage collection strategy. + +Example: + +.. literalinclude:: ../../examples/providers/singleton_reseting.py + :language: python + :linenos: + Singleton providers and injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -42,47 +56,17 @@ provider. . It makes possible to inject providers *as is*. Please check out `Singleton providers delegation`_ section. -Singleton providers resetting -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Created and memorized by :py:class:`Singleton` instance can be reset. Reset of -:py:class:`Singleton`'s memorized instance is done by clearing reference to -it. Further lifecycle of memorized instance is out of :py:class:`Singleton` -provider's control. - -Example: - -.. literalinclude:: ../../examples/providers/singleton_reseting.py - :language: python - :linenos: - Singleton providers delegation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :py:class:`Singleton` provider could be delegated to any other provider via -any kind of injection. Delegation of :py:class:`Singleton` providers is the -same as :py:class:`Factory` providers delegation, please follow *Factory -providers delegation* section for example. +any kind of injection. -:py:class:`Singleton` delegate could be created obviously using -``Delegate(Singleton(...))`` or by calling ``Singleton(...).delegate()`` -method. - -Example: - -.. literalinclude:: ../../examples/providers/singleton_delegation.py - :language: python - :linenos: - -Alternative way of doing :py:class:`Singleton` delegation is an usage of -:py:class:`DelegatedSingleton`. :py:class:`DelegatedSingleton` is a -:py:class:`Singleton` that is always injected "as is". - -Example: - -.. literalinclude:: ../../examples/providers/delegated_singleton.py - :language: python - :linenos: +Delegation of :py:class:`Singleton` providers is the same as +:py:class:`Factory` providers delegation, please follow +:ref:`factory_providers_delegation` section for examples (with exception +about using :py:class:`DelegatedSingleton` instead of +:py:class:`DelegatedFactory`). Singleton providers specialization ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -90,9 +74,6 @@ Singleton providers specialization :py:class:`Singleton` provider could be specialized for any kind of needs via declaring its subclasses. -One of such `builtin` features is a limitation to :py:class:`Singleton` -provided type: - -.. literalinclude:: ../../examples/providers/singleton_provided_type.py - :language: python - :linenos: +Specialization of :py:class:`Singleton` providers is the same as +:py:class:`Factory` providers specialization, please follow +:ref:`factory_providers_specialization` section for examples. diff --git a/examples/providers/delegated_singleton.py b/examples/providers/delegated_singleton.py deleted file mode 100644 index f5c85ea3..00000000 --- a/examples/providers/delegated_singleton.py +++ /dev/null @@ -1,18 +0,0 @@ -"""`DelegatedSingleton` providers example.""" - -import dependency_injector.providers as providers - - -# Some delegated singleton provider: -singleton_provider = providers.DelegatedSingleton(object) -registry = providers.DelegatedSingleton(dict, - object1=singleton_provider, - object2=singleton_provider) - -# Getting several references to singleton object: -registry = registry() -singleton_object1 = registry['object1']() -singleton_object2 = registry['object2']() - -# Making some asserts: -assert singleton_object1 is singleton_object2 diff --git a/examples/providers/singleton.py b/examples/providers/singleton.py index 1e42ad9a..92fcdf9d 100644 --- a/examples/providers/singleton.py +++ b/examples/providers/singleton.py @@ -1,20 +1,19 @@ """`Singleton` providers example.""" +import collections + import dependency_injector.providers as providers -class UserService(object): - """Example class UserService.""" +UsersService = collections.namedtuple('UsersService', []) # Singleton provider creates new instance of specified class on first call and # returns same instance on every next call. -users_service_provider = providers.Singleton(UserService) +users_service_provider = providers.Singleton(UsersService) # Retrieving several UserService objects: -user_service1 = users_service_provider() -user_service2 = users_service_provider() +users_service1 = users_service_provider() +users_service2 = users_service_provider() # Making some asserts: -assert user_service1 is user_service2 -assert isinstance(user_service1, UserService) -assert isinstance(user_service2, UserService) +assert users_service1 is users_service2 diff --git a/examples/providers/singleton_delegation.py b/examples/providers/singleton_delegation.py deleted file mode 100644 index 1b7e324c..00000000 --- a/examples/providers/singleton_delegation.py +++ /dev/null @@ -1,13 +0,0 @@ -"""`Singleton` providers delegation example.""" - -import dependency_injector.providers as providers - - -# Some singleton provider and few delegates of it: -singleton_provider = providers.Singleton(object) -singleton_provider_delegate1 = singleton_provider.delegate() -singleton_provider_delegate2 = providers.Delegate(singleton_provider) - -# Making some asserts: -assert singleton_provider_delegate1() is singleton_provider -assert singleton_provider_delegate2() is singleton_provider diff --git a/examples/providers/singleton_reseting.py b/examples/providers/singleton_reseting.py index fa58bf4a..8fe2f5a7 100644 --- a/examples/providers/singleton_reseting.py +++ b/examples/providers/singleton_reseting.py @@ -1,28 +1,27 @@ """`Singleton` providers resetting example.""" +import collections + import dependency_injector.providers as providers -class UserService(object): - """Example class UserService.""" +UsersService = collections.namedtuple('UsersService', []) # Users service singleton provider: -users_service_provider = providers.Singleton(UserService) +users_service_provider = providers.Singleton(UsersService) -# Retrieving several UserService objects: -user_service1 = users_service_provider() -user_service2 = users_service_provider() +# Retrieving several UsersService objects: +users_service1 = users_service_provider() +users_service2 = users_service_provider() # Making some asserts: -assert user_service1 is user_service2 -assert isinstance(user_service1, UserService) -assert isinstance(user_service2, UserService) +assert users_service1 is users_service2 # Resetting of memorized instance: users_service_provider.reset() # Retrieving one more UserService object: -user_service3 = users_service_provider() +users_service3 = users_service_provider() # Making some asserts: -assert user_service3 is not user_service1 +assert users_service3 is not users_service1