From 024b148c541938923159dec7dad3e9c423592102 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Sat, 25 Jul 2015 04:57:20 +0300 Subject: [PATCH] Adding docs for overriding of providers --- docs/images/internals.png | Bin 0 -> 10302 bytes docs/images/provider_override.png | Bin 0 -> 8170 bytes docs/images/providers/overriding_simple.png | Bin 0 -> 17004 bytes .../providers/overriding_users_model.png | Bin 0 -> 30677 bytes docs/providers/factory.rst | 33 ++-- docs/providers/overriding.rst | 182 ++++++++++++++++++ examples/providers/overriding_simple.py | 4 +- 7 files changed, 204 insertions(+), 15 deletions(-) create mode 100644 docs/images/internals.png create mode 100644 docs/images/provider_override.png create mode 100644 docs/images/providers/overriding_simple.png create mode 100644 docs/images/providers/overriding_users_model.png diff --git a/docs/images/internals.png b/docs/images/internals.png new file mode 100644 index 0000000000000000000000000000000000000000..9919bc42432b16ddbdcfc7171d35eed06d579a1b GIT binary patch literal 10302 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 literal 0 HcmV?d00001 diff --git a/docs/images/provider_override.png b/docs/images/provider_override.png new file mode 100644 index 0000000000000000000000000000000000000000..184345d4c9aa34488e8bc8ad045d6b3774a42ef1 GIT binary patch literal 8170 zcmbt(cTiN{vhEBSB#91^5fKn1X9fh39EKbuNzM#2-c&j2cU1jhpa42DXw(mLL=yJ>`es~n%pRzuwD z#XpI=;WIIj&)V!Y9o^lb$3N(aH^lYSHE+-fwGzxUmSpAB*He6wefCB1`Tsy zeVCqu{Y;7%9x#o}Y}39reL!hDJeEN1{! z&zNGCCStP6CWNr^5_`KBCZtZ_9v;P%nfP{plUuQK>cYsanP;OIK%Rx-n;DE1vGN+j zD*K)dOPGhBZyMfItLqbc$L5spJ;@Bj@Z_vx5NX$pDc(@!SfYG6k>PXaO1Gvt%g5Va z3=b!~=S`&5Nqr4NPWeu>zq|JKUtS^ow1zN@Cj~7CR`jJ@(-AWgy|6b0M87hBZyfR? zl|fqpg)usQ4*G;EF!$t`7Jsa`h2XsW@+hQ^(OyTc6nK}t-fSAOr(e7R!zTVIBOTSo zLMGB{`Ju+o&ErTh`OM4jJC;;|UsS!HD1bP7hfD28Qf6SSe#6z(0?xUStjezp?l~@k z*|Er%+EgxwQpC5K^PY^A8+vE8_=vz=bC#U@ea-nH?-Z#0 Td*Oi}nYUk_T(58K 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 literal 0 HcmV?d00001 diff --git a/docs/images/providers/overriding_simple.png b/docs/images/providers/overriding_simple.png new file mode 100644 index 0000000000000000000000000000000000000000..8e861f453b8f06018f11e9d01bf11099f695d328 GIT binary patch literal 17004 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 literal 0 HcmV?d00001 diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index 4d1867e9..4f8d08f7 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -6,7 +6,7 @@ Factory providers Nothing could be better than brief example: .. image:: /images/providers/factory.png - :width: 80% + :width: 75% :align: center .. code-block:: python @@ -47,15 +47,15 @@ All of those instructions are defined in ``objects.injections`` module and are subclasses of ``objects.injections.Injection``. There are several types of injections that are used by ``Factory`` provider: - - ``KwArg`` - injection is done by passing injectable value in object's - ``__init__()`` method in time of object's creation via keyword argument. - Takes keyword name of ``__init__()`` argument and injectable value. - - ``Attribute`` - injection is done by setting specified attribute with - injectable value right after object's creation. Takes attribute's name - and injectable value. - - ``Method`` - injection is done by calling of specified method with - injectable value right after object's creation and attribute injections - are done. Takes method name and injectable value. ++ ``KwArg`` - injection is done by passing injectable value in object's + ``__init__()`` method in time of object's creation via keyword argument. + Takes keyword name of ``__init__()`` argument and injectable value. ++ ``Attribute`` - injection is done by setting specified attribute with + injectable value right after object's creation. Takes attribute's name + and injectable value. ++ ``Method`` - injection is done by calling of specified method with + injectable value right after object's creation and attribute injections + are done. Takes method name and injectable value. All ``Injection``'s injectable values are provided *"as is"*, except of providers. Providers will be called every time, when injection needs to be @@ -70,6 +70,8 @@ Example below shows how to create ``Factory`` of particular class with provided by another factories: .. image:: /images/providers/factory_init_injections.png + :width: 85% + :align: center .. code-block:: python @@ -358,13 +360,18 @@ injectable value. ``Factory`` delegation is performed by wrapping delegated ``Factory`` into special provider type - ``Delegate``, that just returns ``Factory`` itself. -Another one, more *convenient*, method of creating ``Delegate`` for ``Factory`` -is just calling ``Factory.delegate()`` method that returns delegate for current -factory. +Actually, there are two ways of creating factory delegates: + ++ ``Delegate(Factory(...))`` - obviously wrapping factory into ``Delegate`` + provider. ++ ``Factory().delegate()`` - calling factory ``delegate()`` method, that + returns delegate wrapper for current factory. Example: .. image:: /images/providers/factory_delegation.png + :width: 85% + :align: center .. code-block:: python diff --git a/docs/providers/overriding.rst b/docs/providers/overriding.rst index e100fd0f..8b604017 100644 --- a/docs/providers/overriding.rst +++ b/docs/providers/overriding.rst @@ -2,3 +2,185 @@ Overriding of providers ----------------------- Every provider could be overridden by another provider. + +This gives opportunity to make system behaviour more flexible in some points. +The main feature is that while your code is using providers, it depends on +providers, but not on the objects that providers provide. As a result of this, +you can change providing by provider object to a different one, but still +compatible one, without chaning your previously written code. + +Provider overriding functionality has such interface: + +.. image:: /images/provider_override.png + :width: 45% + :align: center + ++ ``Provider.override()`` - takes another provider that will be used instead of + current provider. This method could be called several times. In such case, + last passed provider would be used as overriding one. ++ ``Provider.reset_override()`` - resets all overriding providers. Provider + starts to behave itself like usual. ++ ``Provider.is_overridden`` - bool, ``True`` if provider is overridden. + +.. note:: + + Actually, initial provider forms stack from overriding providers. There is + some, not so common, but still usefull, functionality that could be used: + + + ``Provider.last_overriding`` - always keeps reference to last overriding + provider. + + ``Provider.reset_last_overriding()`` - remove last overriding provider + from stack of overriding providers. + +Example: + +.. image:: /images/providers/overriding_simple.png + :width: 80% + :align: center + +.. code-block:: python + + """Simple providers overriding example.""" + + from objects.providers import Factory + + + class User(object): + + """Example class User.""" + + # Users factory: + users_factory = Factory(User) + + # Creating several User objects: + user1 = users_factory() + user2 = users_factory() + + # Making some asserts: + assert user1 is not user2 + assert isinstance(user1, User) and isinstance(user2, User) + + + # Extending User: + class SuperUser(User): + + """Example class SuperUser.""" + + # Overriding users factory: + users_factory.override(Factory(SuperUser)) + + # Creating some more User objects using overridden users factory: + user3 = users_factory() + user4 = users_factory() + + # Making some asserts: + assert user4 is not user3 + assert isinstance(user3, SuperUser) and isinstance(user4, SuperUser) + +Example: + +.. image:: /images/providers/overriding_users_model.png + :width: 100% + :align: center + +.. code-block:: python + + """Overriding user's model example.""" + + from objects.providers import Factory + from objects.injections import KwArg + + + class User(object): + + """Example class User.""" + + def __init__(self, id, password): + """Initializer.""" + self.id = id + self.password = password + super(User, self).__init__() + + + class UserService(object): + + """Example class UserService.""" + + def __init__(self, user_cls): + """Initializer.""" + self.user_cls = user_cls + super(UserService, self).__init__() + + def get_by_id(self, id): + """Find user by his id and return user model.""" + return self.user_cls(id=id, password='secret' + str(id)) + + # Users factory and UserService provider: + users_service = Factory(UserService, + KwArg('user_cls', User)) + + # Getting several users and making some asserts: + user1 = users_service().get_by_id(1) + user2 = users_service().get_by_id(2) + + assert isinstance(user1, User) + assert user1.id == 1 + assert user1.password == 'secret1' + + assert isinstance(user2, User) + assert user2.id == 2 + assert user2.password == 'secret2' + + assert user1 is not user2 + + # Extending user model and user service for adding custom attributes without + # making any changes to client's code. + + + class ExtendedUser(User): + + """Example class ExtendedUser.""" + + def __init__(self, id, password, first_name=None, last_name=None, + gender=None): + """Initializer.""" + self.first_name = first_name + self.last_name = last_name + self.gender = gender + super(ExtendedUser, self).__init__(id, password) + + + class ExtendedUserService(UserService): + + """Example class ExtendedUserService.""" + + def get_by_id(self, id): + """Find user by his id and return user model.""" + user = super(ExtendedUserService, self).get_by_id(id) + user.first_name = 'John' + str(id) + user.last_name = 'Smith' + str(id) + user.gender = 'male' + return user + + # Overriding users_service provider: + extended_users_service = Factory(ExtendedUserService, + KwArg('user_cls', ExtendedUser)) + users_service.override(extended_users_service) + + # Getting few other users users and making some asserts: + user3 = users_service().get_by_id(3) + user4 = users_service().get_by_id(4) + + assert isinstance(user3, ExtendedUser) + assert user3.id == 3 + assert user3.password == 'secret3' + assert user3.first_name == 'John3' + assert user3.last_name == 'Smith3' + + assert isinstance(user4, ExtendedUser) + assert user4.id == 4 + assert user4.password == 'secret4' + assert user4.first_name == 'John4' + assert user4.last_name == 'Smith4' + + assert user3 is not user4 diff --git a/examples/providers/overriding_simple.py b/examples/providers/overriding_simple.py index 68632c5a..a4573715 100644 --- a/examples/providers/overriding_simple.py +++ b/examples/providers/overriding_simple.py @@ -19,12 +19,12 @@ assert user1 is not user2 assert isinstance(user1, User) and isinstance(user2, User) -# Overriding users factory: +# Extending User: class SuperUser(User): """Example class SuperUser.""" - +# Overriding users factory: users_factory.override(Factory(SuperUser)) # Creating some more User objects using overridden users factory: