From 8e78f937c87ab4a454552c3a6629235c7d5c5462 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 14 Apr 2015 20:14:17 +0300 Subject: [PATCH 01/73] Incrementing version to 0.7.6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8bd6ba8c..c0062185 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.7.5 +0.7.6 From 463f219307d95723fce10bae93b2e5167767ee19 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 14 Apr 2015 20:18:25 +0300 Subject: [PATCH 02/73] Changing description --- docs/index.rst | 2 +- setup.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index f472cb2f..d1f9d13f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ Objects ======= -Dependency management tool for Python projects. +Dependency injector for Python projects. +---------------------------------------+-------------------------------------------------------------------+ | *PyPi* | .. image:: https://pypip.in/version/Objects/badge.svg | diff --git a/setup.py b/setup.py index a000fa98..9bd3f607 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ from setuptools import setup from setuptools import Command -SHORT_DESCRIPTION = 'Dependency management tool for Python projects' +SHORT_DESCRIPTION = 'Dependency injector for Python projects' # Getting description. @@ -47,8 +47,6 @@ class PublishCommand(Command): self.run_command('upload') os.system('git tag -a {0} -m \'version {0}\''.format(version)) os.system('git push --tags') - - setup(name='Objects', version=version, description=SHORT_DESCRIPTION, @@ -69,9 +67,9 @@ setup(name='Objects', 'Dependency management', 'Dependency injection', 'Dependency injection container', + 'Dependency injector', 'DI', 'DIC', - 'Dependency injector', 'Inversion of Control', 'Inversion of Control container', 'IoC', From b0720cfc2caf5548c499b8ae5ef70aa92b0a6f70 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 14 Apr 2015 23:17:53 +0300 Subject: [PATCH 03/73] moving @override and @inject decorators to decorators module --- docs/index.rst | 1 + docs/providers.rst | 242 ++++++++++++++++++ examples/concept.py | 3 +- examples/override.py | 3 +- examples/readme/inject_decorator.py | 3 +- examples/readme/overriding_catalog.py | 3 +- examples/readme/providers.py | 7 +- examples/readme2/instance_providers.py | 24 ++ .../instance_providers_with_injections.py} | 4 +- .../overriding_providers.py} | 0 examples/readme2/static_providers.py | 19 ++ objects/__init__.py | 9 +- objects/catalog.py | 9 - objects/decorators.py | 34 +++ objects/injections.py | 23 -- tests/test_catalog.py | 14 - tests/test_decorators.py | 114 +++++++++ tests/test_injections.py | 77 ------ 18 files changed, 453 insertions(+), 136 deletions(-) create mode 100644 docs/providers.rst create mode 100644 examples/readme2/instance_providers.py rename examples/{readme/injections.py => readme2/instance_providers_with_injections.py} (89%) rename examples/{readme/overriding_provider.py => readme2/overriding_providers.py} (100%) create mode 100644 examples/readme2/static_providers.py create mode 100644 objects/decorators.py create mode 100644 tests/test_decorators.py diff --git a/docs/index.rst b/docs/index.rst index d1f9d13f..c58ae813 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,6 +38,7 @@ Contents introduction installation + providers entities advanced_usage examples diff --git a/docs/providers.rst b/docs/providers.rst new file mode 100644 index 00000000..94ee9066 --- /dev/null +++ b/docs/providers.rst @@ -0,0 +1,242 @@ +Providers +========= + +Providers are strategies of accessing objects. + +All providers are callable. They describe how particular objects will be +provided. + + +Instance providers & Injections +------------------------------- + +*Instance* providers are providers that deal with object's creation and +initialization. + +There are few *Instance* providers: + + - ``NewInstance`` provider creates new instance of specified class on every + call. + - ``Singleton`` provider creates new instance of specified class on first + call and returns same instance on every next call. + +.. code-block:: python + + """`NewInstance` and `Singleton` providers example.""" + + from objects.providers import NewInstance + from objects.providers import Singleton + + + # NewInstance provider creates new instance of specified class on every call. + new_object = NewInstance(object) + + object_1 = new_object() + object_2 = new_object() + + assert object_1 is not object_2 + assert isinstance(object_1, object) and isinstance(object_2, object) + + # Singleton provider creates new instance of specified class on first call + # and returns same instance on every next call. + single_object = Singleton(object) + + single_object_1 = single_object() + single_object_2 = single_object() + + assert single_object_1 is single_object_2 + assert isinstance(object_1, object) and isinstance(object_2, object) + + +Objects can take dependencies in various forms. Some objects take init +arguments, other are using attributes or methods to be initialized. It affects +how such objects need to be created and initialized, and that is the place +where **Injections** need to be used. + +In terms of computer science, **Injection** of dependency is a way how +dependency can be coupled with dependent object. + +In terms of **Objects**, **Injection** is an instruction how to provide +dependency for the particular object. + +Every Python object could be an injection's value. Special case is an **Objects** +provider as an injection's value. In such case, injection value is a result of +injectable provider call (every time injection is done). + +There are several types of injections. Below is a description of how they are +used by instance providers: + + - ``KwArg`` - is injected in object's ``__init__()`` method in time of + object's initialization via keyword argument. + - ``Attribute`` - is injected into object's attribute (not class attribute) + after object's initialization. + - ``Method`` - is injected into object method's call after objects + initialization. + +Example: + +.. code-block:: python + + """`NewInstance` and `Singleton` providers with injections example.""" + + import sqlite3 + + from objects.providers import Singleton + from objects.providers import NewInstance + + from objects.injections import KwArg + from objects.injections import Attribute + + + class ObjectA(object): + + """ObjectA has dependency on database.""" + + def __init__(self, database): + """Initializer. + + Database dependency need to be injected via init arg.""" + self.database = database + + def get_one(self): + """Select one from database and return it.""" + return self.database.execute('SELECT 1').fetchone()[0] + + + # Database and `ObjectA` providers. + database = Singleton(sqlite3.Connection, + KwArg('database', ':memory:'), + KwArg('timeout', 30), + KwArg('detect_types', True), + KwArg('isolation_level', 'EXCLUSIVE'), + Attribute('row_factory', sqlite3.Row)) + + object_a = NewInstance(ObjectA, + KwArg('database', database)) + + # Creating several `ObjectA` instances. + object_a_1 = object_a() + object_a_2 = object_a() + + # Making some asserts. + assert object_a_1 is not object_a_2 + assert object_a_1.database is object_a_2.database is database() + assert object_a_1.get_one() == object_a_2.get_one() == 1 + +Static providers +---------------- + +Static providers are family of providers that returns its values "as is". +There are four of static providers: ``Class``, ``Object``, ``Function`` and +``Value``. All of them has the same behaviour, but usage of anyone is +predicted by readability and providable object's type. + +.. code-block:: python + + """Static providers example.""" + + from objects.providers import Class + from objects.providers import Object + from objects.providers import Function + from objects.providers import Value + + + cls_provider = Class(object) + assert cls_provider() is object + + object_provider = Object(object()) + assert isinstance(object_provider(), object) + + function_provider = Function(len) + assert function_provider() is len + + value_provider = Value(123) + assert value_provider() == 123 + +Callable provider +----------------- + +External dependency provider +---------------------------- + +Config provider +--------------- + +Providers delegation +-------------------- + +Overriding of providers +----------------------- + +Any provider can be overridden by another provider. + +Example: + +.. code-block:: python + + """Provider overriding example.""" + + import sqlite3 + + from objects.providers import Singleton + from objects.providers import NewInstance + + from objects.injections import KwArg + from objects.injections import Attribute + + + class ObjectA(object): + + """ObjectA has dependency on database.""" + + def __init__(self, database): + """Initializer. + + Database dependency need to be injected via init arg.""" + self.database = database + + def get_one(self): + """Select one from database and return it.""" + return self.database.execute('SELECT 1') + + + class ObjectAMock(ObjectA): + + """Mock of ObjectA. + + Has no dependency on database. + """ + + def __init__(self): + """Initializer.""" + + def get_one(self): + """Select one from database and return it. + + Mock makes no database queries and always returns two instead of one. + """ + return 2 + + + # Database and `ObjectA` providers. + database = Singleton(sqlite3.Connection, + KwArg('database', ':memory:'), + KwArg('timeout', 30), + KwArg('detect_types', True), + KwArg('isolation_level', 'EXCLUSIVE'), + Attribute('row_factory', sqlite3.Row)) + + object_a = NewInstance(ObjectA, + KwArg('database', database)) + + + # Overriding `ObjectA` provider with `ObjectAMock` provider. + object_a.override(NewInstance(ObjectAMock)) + + # Creating several `ObjectA` instances. + object_a_1 = object_a() + object_a_2 = object_a() + + # Making some asserts. + assert object_a_1 is not object_a_2 + assert object_a_1.get_one() == object_a_2.get_one() == 2 diff --git a/examples/concept.py b/examples/concept.py index 6d934b48..75fe2c98 100644 --- a/examples/concept.py +++ b/examples/concept.py @@ -7,7 +7,8 @@ from objects.providers import NewInstance from objects.injections import KwArg from objects.injections import Attribute -from objects.injections import inject + +from objects.decorators import inject import sqlite3 diff --git a/examples/override.py b/examples/override.py index 6cffbab8..98f1c91b 100644 --- a/examples/override.py +++ b/examples/override.py @@ -1,7 +1,6 @@ """Override example.""" from objects.catalog import AbstractCatalog -from objects.catalog import override from objects.providers import Singleton from objects.providers import NewInstance @@ -9,6 +8,8 @@ from objects.providers import NewInstance from objects.injections import KwArg from objects.injections import Attribute +from objects.decorators import override + import sqlite3 diff --git a/examples/readme/inject_decorator.py b/examples/readme/inject_decorator.py index 702f2727..6bfd3c7f 100644 --- a/examples/readme/inject_decorator.py +++ b/examples/readme/inject_decorator.py @@ -1,9 +1,8 @@ """`@inject` decorator example.""" from objects.providers import NewInstance - from objects.injections import KwArg -from objects.injections import inject +from objects.decorators import inject new_object = NewInstance(object) diff --git a/examples/readme/overriding_catalog.py b/examples/readme/overriding_catalog.py index 657def1a..d05e4ac0 100644 --- a/examples/readme/overriding_catalog.py +++ b/examples/readme/overriding_catalog.py @@ -3,7 +3,6 @@ import sqlite3 from objects.catalog import AbstractCatalog -from objects.catalog import override from objects.providers import Singleton from objects.providers import NewInstance @@ -11,6 +10,8 @@ from objects.providers import NewInstance from objects.injections import KwArg from objects.injections import Attribute +from objects.decorators import override + class ObjectA(object): diff --git a/examples/readme/providers.py b/examples/readme/providers.py index ce662c38..1d0dff6f 100644 --- a/examples/readme/providers.py +++ b/examples/readme/providers.py @@ -4,8 +4,7 @@ from objects.providers import NewInstance from objects.providers import Singleton -# NewInstance provider will create new instance of specified class -# on every call. +# NewInstance provider creates new instance of specified class on every call. new_object = NewInstance(object) object_1 = new_object() @@ -13,8 +12,8 @@ object_2 = new_object() assert object_1 is not object_2 -# Singleton provider will create new instance of specified class on first call, -# and return same instance on every next call. +# Singleton provider creates new instance of specified class on first call +# and returns same instance on every next call. single_object = Singleton(object) single_object_1 = single_object() diff --git a/examples/readme2/instance_providers.py b/examples/readme2/instance_providers.py new file mode 100644 index 00000000..d18783e6 --- /dev/null +++ b/examples/readme2/instance_providers.py @@ -0,0 +1,24 @@ +"""`NewInstance` and `Singleton` providers example.""" + +from objects.providers import NewInstance +from objects.providers import Singleton + + +# NewInstance provider creates new instance of specified class on every call. +new_object = NewInstance(object) + +object_1 = new_object() +object_2 = new_object() + +assert object_1 is not object_2 +assert isinstance(object_1, object) and isinstance(object_2, object) + +# Singleton provider creates new instance of specified class on first call +# and returns same instance on every next call. +single_object = Singleton(object) + +single_object_1 = single_object() +single_object_2 = single_object() + +assert single_object_1 is single_object_2 +assert isinstance(object_1, object) and isinstance(object_2, object) diff --git a/examples/readme/injections.py b/examples/readme2/instance_providers_with_injections.py similarity index 89% rename from examples/readme/injections.py rename to examples/readme2/instance_providers_with_injections.py index 52590a7e..ba20793f 100644 --- a/examples/readme/injections.py +++ b/examples/readme2/instance_providers_with_injections.py @@ -1,4 +1,4 @@ -"""`KwArg` and `Attribute` injections example.""" +"""`NewInstance` and `Singleton` providers with injections example.""" import sqlite3 @@ -41,5 +41,5 @@ object_a_2 = object_a() # Making some asserts. assert object_a_1 is not object_a_2 -assert object_a_1.database is object_a_2.database +assert object_a_1.database is object_a_2.database is database() assert object_a_1.get_one() == object_a_2.get_one() == 1 diff --git a/examples/readme/overriding_provider.py b/examples/readme2/overriding_providers.py similarity index 100% rename from examples/readme/overriding_provider.py rename to examples/readme2/overriding_providers.py diff --git a/examples/readme2/static_providers.py b/examples/readme2/static_providers.py new file mode 100644 index 00000000..7664d59b --- /dev/null +++ b/examples/readme2/static_providers.py @@ -0,0 +1,19 @@ +"""Static providers example.""" + +from objects.providers import Class +from objects.providers import Object +from objects.providers import Function +from objects.providers import Value + + +cls_provider = Class(object) +assert cls_provider() is object + +object_provider = Object(object()) +assert isinstance(object_provider(), object) + +function_provider = Function(len) +assert function_provider() is len + +value_provider = Value(123) +assert value_provider() == 123 diff --git a/objects/__init__.py b/objects/__init__.py index b6d6d6bb..f5921f20 100644 --- a/objects/__init__.py +++ b/objects/__init__.py @@ -4,7 +4,6 @@ Dependency management tool for Python projects. """ from .catalog import AbstractCatalog -from .catalog import override from .providers import Provider from .providers import Delegate @@ -22,11 +21,13 @@ from .injections import KwArg from .injections import Attribute from .injections import Method +from .decorators import override +from .decorators import inject + from .errors import Error __all__ = ('AbstractCatalog', - 'override', # Providers 'Provider', @@ -46,5 +47,9 @@ __all__ = ('AbstractCatalog', 'Attribute', 'Method', + # Decorators + 'override', + 'inject', + # Errors 'Error') diff --git a/objects/catalog.py b/objects/catalog.py index 81d12bcf..c69346d0 100644 --- a/objects/catalog.py +++ b/objects/catalog.py @@ -47,12 +47,3 @@ class AbstractCatalog(object): for name, provider in overridden: overridden_provider = getattr(cls, name) overridden_provider.override(provider) - - -def override(catalog): - """Catalog overriding decorator.""" - def decorator(overriding_catalog): - """Overriding decorator.""" - catalog.override(overriding_catalog) - return overriding_catalog - return decorator diff --git a/objects/decorators.py b/objects/decorators.py new file mode 100644 index 00000000..0113ae05 --- /dev/null +++ b/objects/decorators.py @@ -0,0 +1,34 @@ +"""Decorators module.""" + +from six import wraps + +from .utils import ensure_is_injection + + +def override(catalog): + """Catalog overriding decorator.""" + def decorator(overriding_catalog): + """Overriding decorator.""" + catalog.override(overriding_catalog) + return overriding_catalog + return decorator + + +def inject(injection): + """Inject decorator. + + :type injection: Injection + :return: (callable) -> (callable) + """ + injection = ensure_is_injection(injection) + + def decorator(callback): + """Decorator.""" + @wraps(callback) + def decorated(*args, **kwargs): + """Decorated.""" + if injection.name not in kwargs: + kwargs[injection.name] = injection.value + return callback(*args, **kwargs) + return decorated + return decorator diff --git a/objects/injections.py b/objects/injections.py index 99245e88..c574071b 100644 --- a/objects/injections.py +++ b/objects/injections.py @@ -1,9 +1,6 @@ """Injections module.""" -from six import wraps - from .utils import is_provider -from .utils import ensure_is_injection class Injection(object): @@ -45,23 +42,3 @@ class Method(Injection): """Method injection.""" __IS_OBJECTS_METHOD_INJECTION__ = True - - -def inject(injection): - """Inject decorator. - - :type injection: Injection - :return: (callable) -> (callable) - """ - injection = ensure_is_injection(injection) - - def decorator(callback): - """Decorator.""" - @wraps(callback) - def decorated(*args, **kwargs): - """Decorated.""" - if injection.name not in kwargs: - kwargs[injection.name] = injection.value - return callback(*args, **kwargs) - return decorated - return decorator diff --git a/tests/test_catalog.py b/tests/test_catalog.py index 065e56f5..cc0baf8b 100644 --- a/tests/test_catalog.py +++ b/tests/test_catalog.py @@ -3,7 +3,6 @@ import unittest2 as unittest from objects.catalog import AbstractCatalog -from objects.catalog import override from objects.providers import Object from objects.providers import Value @@ -50,16 +49,3 @@ class CatalogTests(unittest.TestCase): """Test getting of all catalog providers of specific type.""" self.assertTrue(len(self.Catalog.all_providers(Object)) == 2) self.assertTrue(len(self.Catalog.all_providers(Value)) == 0) - - def test_overriding(self): - """Test catalog overriding with another catalog.""" - @override(self.Catalog) - class OverridingCatalog(self.Catalog): - - """Overriding catalog.""" - - obj = Value(1) - another_obj = Value(2) - - self.assertEqual(self.Catalog.obj(), 1) - self.assertEqual(self.Catalog.another_obj(), 2) diff --git a/tests/test_decorators.py b/tests/test_decorators.py new file mode 100644 index 00000000..c6ce5f42 --- /dev/null +++ b/tests/test_decorators.py @@ -0,0 +1,114 @@ +"""Objects decorators unittests.""" + +import unittest2 as unittest + +from objects.decorators import override +from objects.decorators import inject + +from objects.catalog import AbstractCatalog + +from objects.providers import NewInstance +from objects.providers import Object +from objects.providers import Value + +from objects.injections import KwArg + +from objects.errors import Error + + +class OverrideTests(unittest.TestCase): + + """Override decorator test cases.""" + + class Catalog(AbstractCatalog): + + """Test catalog.""" + + obj = Object(object()) + another_obj = Object(object()) + + def test_overriding(self): + """Test catalog overriding with another catalog.""" + @override(self.Catalog) + class OverridingCatalog(self.Catalog): + + """Overriding catalog.""" + + obj = Value(1) + another_obj = Value(2) + + self.assertEqual(self.Catalog.obj(), 1) + self.assertEqual(self.Catalog.another_obj(), 2) + +class InjectTests(unittest.TestCase): + + """Inject decorator test cases.""" + + def test_decorated(self): + """Test `inject()` decorated callback.""" + provider1 = NewInstance(object) + provider2 = NewInstance(list) + + @inject(KwArg('a', provider1)) + @inject(KwArg('b', provider2)) + def test(a, b): + return a, b + + a1, b1 = test() + a2, b2 = test() + + self.assertIsInstance(a1, object) + self.assertIsInstance(a2, object) + self.assertIsNot(a1, a2) + + self.assertIsInstance(b1, list) + self.assertIsInstance(b2, list) + self.assertIsNot(b1, b2) + + def test_decorated_kwargs_priority(self): + """Test `inject()` decorated callback kwargs priority.""" + provider1 = NewInstance(object) + provider2 = NewInstance(list) + object_a = object() + + @inject(KwArg('a', provider1)) + @inject(KwArg('b', provider2)) + def test(a, b): + return a, b + + a1, b1 = test(a=object_a) + a2, b2 = test(a=object_a) + + self.assertIsInstance(a1, object) + self.assertIsInstance(a2, object) + self.assertIs(a1, object_a) + self.assertIs(a2, object_a) + + self.assertIsInstance(b1, list) + self.assertIsInstance(b2, list) + self.assertIsNot(b1, b2) + + def test_decorated_with_args(self): + """Test `inject()` decorated callback with args.""" + provider = NewInstance(list) + object_a = object() + + @inject(KwArg('b', provider)) + def test(a, b): + return a, b + + a1, b1 = test(object_a) + a2, b2 = test(object_a) + + self.assertIsInstance(a1, object) + self.assertIsInstance(a2, object) + self.assertIs(a1, object_a) + self.assertIs(a2, object_a) + + self.assertIsInstance(b1, list) + self.assertIsInstance(b2, list) + self.assertIsNot(b1, b2) + + def test_decorate_with_not_injection(self): + """Test `inject()` decorator with not an injection instance.""" + self.assertRaises(Error, inject, object) diff --git a/tests/test_injections.py b/tests/test_injections.py index b4d5ff3c..b9612e1a 100644 --- a/tests/test_injections.py +++ b/tests/test_injections.py @@ -6,12 +6,9 @@ from objects.injections import Injection from objects.injections import KwArg from objects.injections import Attribute from objects.injections import Method -from objects.injections import inject from objects.providers import NewInstance -from objects.providers import Error - class InjectionTests(unittest.TestCase): @@ -65,77 +62,3 @@ class MethodTests(unittest.TestCase): injection = Method('some_arg_name', 'some_value') self.assertEqual(injection.name, 'some_arg_name') self.assertEqual(injection.injectable, 'some_value') - - -class InjectTests(unittest.TestCase): - - """Inject decorator test cases.""" - - def test_decorated(self): - """Test `inject()` decorated callback.""" - provider1 = NewInstance(object) - provider2 = NewInstance(list) - - @inject(KwArg('a', provider1)) - @inject(KwArg('b', provider2)) - def test(a, b): - return a, b - - a1, b1 = test() - a2, b2 = test() - - self.assertIsInstance(a1, object) - self.assertIsInstance(a2, object) - self.assertIsNot(a1, a2) - - self.assertIsInstance(b1, list) - self.assertIsInstance(b2, list) - self.assertIsNot(b1, b2) - - def test_decorated_kwargs_priority(self): - """Test `inject()` decorated callback kwargs priority.""" - provider1 = NewInstance(object) - provider2 = NewInstance(list) - object_a = object() - - @inject(KwArg('a', provider1)) - @inject(KwArg('b', provider2)) - def test(a, b): - return a, b - - a1, b1 = test(a=object_a) - a2, b2 = test(a=object_a) - - self.assertIsInstance(a1, object) - self.assertIsInstance(a2, object) - self.assertIs(a1, object_a) - self.assertIs(a2, object_a) - - self.assertIsInstance(b1, list) - self.assertIsInstance(b2, list) - self.assertIsNot(b1, b2) - - def test_decorated_with_args(self): - """Test `inject()` decorated callback with args.""" - provider = NewInstance(list) - object_a = object() - - @inject(KwArg('b', provider)) - def test(a, b): - return a, b - - a1, b1 = test(object_a) - a2, b2 = test(object_a) - - self.assertIsInstance(a1, object) - self.assertIsInstance(a2, object) - self.assertIs(a1, object_a) - self.assertIs(a2, object_a) - - self.assertIsInstance(b1, list) - self.assertIsInstance(b2, list) - self.assertIsNot(b1, b2) - - def test_decorate_with_not_injection(self): - """Test `inject()` decorator with not an injection instance.""" - self.assertRaises(Error, inject, object) From be302793e1a4a811a584c830ec8bef0b557732b6 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 14 Apr 2015 23:20:24 +0300 Subject: [PATCH 04/73] Updating version to 0.8.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c0062185..a3df0a69 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.7.6 +0.8.0 From 219932d9cc5ca7886d79476bdce085904eeab377 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 14 Apr 2015 23:56:46 +0300 Subject: [PATCH 05/73] Adding docs on callale provider --- docs/providers.rst | 35 ++++++++++++++++++++++ examples/callable_provider.py | 42 --------------------------- examples/readme2/callable_provider.py | 26 +++++++++++++++++ 3 files changed, 61 insertions(+), 42 deletions(-) delete mode 100644 examples/callable_provider.py create mode 100644 examples/readme2/callable_provider.py diff --git a/docs/providers.rst b/docs/providers.rst index 94ee9066..3f2c49c6 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -156,6 +156,41 @@ predicted by readability and providable object's type. Callable provider ----------------- +``Callable`` provider is a provider that decorates particular callable with +some injections. Every call of this provider returns result of call of initial +callable. + + Example: + + .. code-block:: python + + """`Callable` provider examples.""" + + from objects.providers import Callable + from objects.providers import Singleton + + from objects.injections import KwArg + + import sqlite3 + + + def some_function(arg, database): + """Example function that has input arg and dependency on database.""" + return database.execute('SELECT @1', [arg]).fetchone()[0] + + + # Database and `ObjectA` providers. + database = Singleton(sqlite3.Connection, + KwArg('database', ':memory:')) + + some_function = Callable(some_function, + KwArg('database', database)) + + # Some asserts. + assert some_function(1) == 1 + assert some_function(2) == 2 + assert some_function(2231) == 2231 + External dependency provider ---------------------------- diff --git a/examples/callable_provider.py b/examples/callable_provider.py deleted file mode 100644 index feef362c..00000000 --- a/examples/callable_provider.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Callable provider examples.""" - -from objects.catalog import AbstractCatalog - -from objects.providers import Singleton -from objects.providers import Callable - -from objects.injections import KwArg -from objects.injections import Attribute - -import sqlite3 - - -def consuming_function(arg, db): - """Example function that has input arg and dependency on database.""" - return arg, db - - -class Catalog(AbstractCatalog): - - """Catalog of objects providers.""" - - database = Singleton(sqlite3.Connection, - KwArg('database', ':memory:'), - Attribute('row_factory', sqlite3.Row)) - """:type: (objects.Provider) -> sqlite3.Connection""" - - consuming_function = Callable(consuming_function, - KwArg('db', database)) - """:type: (objects.Provider) -> consuming_function""" - - -# Some calls. -arg1, db1 = Catalog.consuming_function(1) -arg2, db2 = Catalog.consuming_function(2) -arg3, db3 = Catalog.consuming_function(3) - -# Some asserts. -assert db1 is db2 is db3 -assert arg1 == 1 -assert arg2 == 2 -assert arg3 == 3 diff --git a/examples/readme2/callable_provider.py b/examples/readme2/callable_provider.py new file mode 100644 index 00000000..cca90cb3 --- /dev/null +++ b/examples/readme2/callable_provider.py @@ -0,0 +1,26 @@ +"""`Callable` provider examples.""" + +from objects.providers import Callable +from objects.providers import Singleton + +from objects.injections import KwArg + +import sqlite3 + + +def some_function(arg, database): + """Example function that has input arg and dependency on database.""" + return database.execute('SELECT @1', [arg]).fetchone()[0] + + +# Database and `ObjectA` providers. +database = Singleton(sqlite3.Connection, + KwArg('database', ':memory:')) + +some_function = Callable(some_function, + KwArg('database', database)) + +# Some asserts. +assert some_function(1) == 1 +assert some_function(2) == 2 +assert some_function(2231) == 2231 From 8ee9378dda8b524749342fddf5336ab428db63bb Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Sat, 18 Apr 2015 22:45:51 +0300 Subject: [PATCH 06/73] docs update --- README.rst | 12 ++++++------ docs/advanced_usage.rst | 4 ++-- docs/entities.rst | 8 ++++---- docs/examples.rst | 2 +- docs/feedback.rst | 2 +- docs/installation.rst | 4 ++-- docs/introduction.rst | 4 ++-- docs/providers.rst | 12 +++++++----- 8 files changed, 25 insertions(+), 23 deletions(-) diff --git a/README.rst b/README.rst index 138c1834..43cd7f7a 100644 --- a/README.rst +++ b/README.rst @@ -42,21 +42,21 @@ source systems, frameworks, libraries and some turnkey functionality. When application goes bigger, its amount of objects and their dependencies also increased extremely fast and became hard to maintain. -**Objects** is designed to be developer's friendly tool for managing objects -and their dependencies in formal, pretty way. Main idea of **Objects** is to +*Objects* is designed to be developer's friendly tool for managing objects +and their dependencies in formal, pretty way. Main idea of *Objects* is to keep dependencies under control. Installation ------------ -**Objects** library is available on PyPi_:: +*Objects* library is available on PyPi_:: pip install objects Documentation ------------- -**Objects** documentation is hosted on ReadTheDocs: +*Objects* documentation is hosted on ReadTheDocs: - `Stable version`_ - `Latest version`_ @@ -137,7 +137,7 @@ Examples example() -You can get more **Objects** examples in ``/examples`` directory on +You can get more *Objects* examples in ``/examples`` directory on GitHub: https://github.com/rmk135/objects @@ -147,7 +147,7 @@ Feedback -------- Feel free to post questions, bugs, feature requests, proposals etc. on -**Objects** GitHub Issues: +*Objects* GitHub Issues: https://github.com/rmk135/objects/issues diff --git a/docs/advanced_usage.rst b/docs/advanced_usage.rst index 7161bb62..22ae9f1b 100644 --- a/docs/advanced_usage.rst +++ b/docs/advanced_usage.rst @@ -1,13 +1,13 @@ Advanced usage ============== -Below you can find some variants of advanced usage of **Objects**. +Below you can find some variants of advanced usage of *Objects*. @inject decorator ----------------- ``@inject`` decorator could be used for patching any callable with injection. -Any Python object will be injected *as is*, except **Objects** providers, +Any Python object will be injected *as is*, except *Objects* providers, that will be called to provide injectable value. .. code-block:: python diff --git a/docs/entities.rst b/docs/entities.rst index 7bb31c88..654d0b63 100644 --- a/docs/entities.rst +++ b/docs/entities.rst @@ -1,7 +1,7 @@ Entities ======== -Current section describes main **Objects** entities and their interaction. +Current section describes main *Objects* entities and their interaction. Providers --------- @@ -45,10 +45,10 @@ dependencies of objects. Objects can take dependencies in various forms. Some objects take init arguments, other are using attributes or methods to be initialized. Injection, -in terms of **Objects**, is an instruction how to provide dependency for the +in terms of *Objects*, is an instruction how to provide dependency for the particular object. -Every Python object could be an injection's value. Special case is a **Objects** +Every Python object could be an injection's value. Special case is a *Objects* provider as an injection's value. In such case, injection value is a result of injectable provider call (every time injection is done). @@ -107,7 +107,7 @@ Catalogs Catalogs are named set of providers. -**Objects** catalogs can be used for grouping of providers by some +*Objects* catalogs can be used for grouping of providers by some kind of rules. In example below, there are two catalogs: ``Resources`` and ``Models``. diff --git a/docs/examples.rst b/docs/examples.rst index 5b2b4fa2..9cd3a619 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -1,7 +1,7 @@ Examples ======== -You can get more **Objects** examples in ``/examples`` directory on +You can get more *Objects* examples in ``/examples`` directory on GitHub: https://github.com/rmk135/objects diff --git a/docs/feedback.rst b/docs/feedback.rst index df25c405..b34ebda2 100644 --- a/docs/feedback.rst +++ b/docs/feedback.rst @@ -2,7 +2,7 @@ Feedback ======== Feel free to post questions, bugs, feature requests, proposals etc. on -**Objects** GitHub Issues: +*Objects* GitHub Issues: https://github.com/rmk135/objects/issues diff --git a/docs/installation.rst b/docs/installation.rst index 046009bf..84b34c15 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,7 +1,7 @@ Installation ============ -Latest stable version of **Objects** library can be installed from PyPi_:: +Latest stable version of *Objects* library can be installed from PyPi_:: pip install objects @@ -9,7 +9,7 @@ Sources can be cloned from GitHub_:: git clone https://github.com/rmk135/objects.git -All **Objects** releases can be found on GitHub: https://github.com/rmk135/objects/releases +All *Objects* releases can be found on GitHub: https://github.com/rmk135/objects/releases .. _PyPi: https://pypi.python.org/pypi/Objects .. _GitHub: https://github.com/rmk135/objects diff --git a/docs/introduction.rst b/docs/introduction.rst index a60cd478..0197eed0 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -11,6 +11,6 @@ source systems, frameworks, libraries and some turnkey functionality. When application goes bigger, its amount of objects and their dependencies also increased extremely fast and became hard to maintain. -**Objects** is designed to be developer's friendly tool for managing objects -and their dependencies in formal, pretty way. Main idea of **Objects** is to +*Objects* is designed to be developer's friendly tool for managing objects +and their dependencies in formal, pretty way. Main idea of *Objects* is to keep dependencies under control. diff --git a/docs/providers.rst b/docs/providers.rst index 3f2c49c6..0ac2108b 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -51,15 +51,15 @@ There are few *Instance* providers: Objects can take dependencies in various forms. Some objects take init arguments, other are using attributes or methods to be initialized. It affects how such objects need to be created and initialized, and that is the place -where **Injections** need to be used. +where *Injections* need to be used. -In terms of computer science, **Injection** of dependency is a way how +In terms of computer science, *Injection* of dependency is a way how dependency can be coupled with dependent object. -In terms of **Objects**, **Injection** is an instruction how to provide +In terms of *Objects*, *Injection* is an instruction how to provide dependency for the particular object. -Every Python object could be an injection's value. Special case is an **Objects** +Every Python object could be an injection's value. Special case is an *Objects* provider as an injection's value. In such case, injection value is a result of injectable provider call (every time injection is done). @@ -126,7 +126,7 @@ Example: Static providers ---------------- -Static providers are family of providers that returns its values "as is". +Static providers are family of providers that return their values "as is". There are four of static providers: ``Class``, ``Object``, ``Function`` and ``Value``. All of them has the same behaviour, but usage of anyone is predicted by readability and providable object's type. @@ -194,6 +194,8 @@ callable. External dependency provider ---------------------------- +``ExternalDependency`` provider can be useful for + Config provider --------------- From 1d6951ed709ba25937c2d72a12730077e5bf4ae0 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Wed, 22 Apr 2015 16:51:44 +0300 Subject: [PATCH 07/73] Few words about external dependencies provider --- docs/providers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers.rst b/docs/providers.rst index 0ac2108b..53b1ef21 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -194,7 +194,7 @@ callable. External dependency provider ---------------------------- -``ExternalDependency`` provider can be useful for +``ExternalDependency`` provider can be useful for Config provider --------------- From ca4db90ce341e808407dad4dea45553867c525b8 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Wed, 22 Apr 2015 19:04:19 +0300 Subject: [PATCH 08/73] Updating version to 0.7.6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a3df0a69..c0062185 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.0 +0.7.6 From fab6a5c6104e752469fcb6a96ae3581257e644dc Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 23 Apr 2015 13:15:10 +0300 Subject: [PATCH 09/73] Adding external dependency provider description and examples renaming --- docs/providers.rst | 42 ++++++++++++++----- ...able_provider.py => callable_providers.py} | 2 +- .../external_dependency_providers.py} | 2 +- examples/readme2/overriding_providers.py | 2 +- 4 files changed, 35 insertions(+), 13 deletions(-) rename examples/readme2/{callable_provider.py => callable_providers.py} (94%) rename examples/{external_dependency.py => readme2/external_dependency_providers.py} (97%) diff --git a/docs/providers.rst b/docs/providers.rst index 53b1ef21..164ae7c4 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -20,6 +20,8 @@ There are few *Instance* providers: - ``Singleton`` provider creates new instance of specified class on first call and returns same instance on every next call. +Example: + .. code-block:: python """`NewInstance` and `Singleton` providers example.""" @@ -131,6 +133,8 @@ There are four of static providers: ``Class``, ``Object``, ``Function`` and ``Value``. All of them has the same behaviour, but usage of anyone is predicted by readability and providable object's type. +Example: + .. code-block:: python """Static providers example.""" @@ -153,18 +157,18 @@ predicted by readability and providable object's type. value_provider = Value(123) assert value_provider() == 123 -Callable provider ------------------ +Callable providers +------------------ ``Callable`` provider is a provider that decorates particular callable with some injections. Every call of this provider returns result of call of initial callable. - Example: +Example: .. code-block:: python - """`Callable` provider examples.""" + """`Callable` providers examples.""" from objects.providers import Callable from objects.providers import Singleton @@ -191,13 +195,31 @@ callable. assert some_function(2) == 2 assert some_function(2231) == 2231 -External dependency provider ----------------------------- -``ExternalDependency`` provider can be useful for +External dependency providers +----------------------------- -Config provider ---------------- +``ExternalDependency`` provider can be useful for development of self-sufficient +libraries / modules / applications, that has required external dependencies. + +For example, you have created self-sufficient library / module / application, +that has dependency on *SQLAlchemy*. Second step you want to do is to make this +software component to be easy reusable by wide amount of developers and to be +easily integrated into many applications. It may be good idea, to move all +external dependencies (like *SQLAlchemy*) to the top level and make them to be +injected on your software component's initialization. It will make third party +developers feel themselves more free about integration of yours component in +their applications because of they would be able to find right place / right +way for doing this in their application's architectures. + +Example: + +.. code-block:: python + + import this + +Config providers +---------------- Providers delegation -------------------- @@ -211,7 +233,7 @@ Example: .. code-block:: python - """Provider overriding example.""" + """Providers overriding example.""" import sqlite3 diff --git a/examples/readme2/callable_provider.py b/examples/readme2/callable_providers.py similarity index 94% rename from examples/readme2/callable_provider.py rename to examples/readme2/callable_providers.py index cca90cb3..97015bb9 100644 --- a/examples/readme2/callable_provider.py +++ b/examples/readme2/callable_providers.py @@ -1,4 +1,4 @@ -"""`Callable` provider examples.""" +"""`Callable` providers examples.""" from objects.providers import Callable from objects.providers import Singleton diff --git a/examples/external_dependency.py b/examples/readme2/external_dependency_providers.py similarity index 97% rename from examples/external_dependency.py rename to examples/readme2/external_dependency_providers.py index 5c921f0f..30ee4640 100644 --- a/examples/external_dependency.py +++ b/examples/readme2/external_dependency_providers.py @@ -1,4 +1,4 @@ -"""External dependency example.""" +"""External dependency providers example.""" from objects.catalog import AbstractCatalog diff --git a/examples/readme2/overriding_providers.py b/examples/readme2/overriding_providers.py index 41ff0fe3..8edf09f5 100644 --- a/examples/readme2/overriding_providers.py +++ b/examples/readme2/overriding_providers.py @@ -1,4 +1,4 @@ -"""Provider overriding example.""" +"""Providers overriding example.""" import sqlite3 From 227ddbd3789b45f410b39a581617ed64b200e8ee Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 24 Apr 2015 11:59:10 +0300 Subject: [PATCH 10/73] Finilizing of external dependecy provider documentation --- docs/providers.rst | 79 ++++++++++++++++--- .../readme2/external_dependency_providers.py | 69 +++++++--------- 2 files changed, 95 insertions(+), 53 deletions(-) diff --git a/docs/providers.rst b/docs/providers.rst index 164ae7c4..d987bf96 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -199,24 +199,81 @@ Example: External dependency providers ----------------------------- -``ExternalDependency`` provider can be useful for development of self-sufficient -libraries / modules / applications, that has required external dependencies. +``ExternalDependency`` provider can be useful for development of +self-sufficient libraries / modules / applications, that has required external +dependencies. For example, you have created self-sufficient library / module / application, -that has dependency on *SQLAlchemy*. Second step you want to do is to make this -software component to be easy reusable by wide amount of developers and to be -easily integrated into many applications. It may be good idea, to move all -external dependencies (like *SQLAlchemy*) to the top level and make them to be -injected on your software component's initialization. It will make third party -developers feel themselves more free about integration of yours component in -their applications because of they would be able to find right place / right -way for doing this in their application's architectures. +that has dependency on *database connection*. + +Second step you want to do is to make this software component to be easy +reusable by wide amount of developers and to be easily integrated into many +applications. + +It may be good idea, to move all external dependencies (like +*dabase connection*) to the top level and make them to be injected on your +software component's initialization. It will make third party developers feel +themselves free about integration of yours component in their applications, +because of they would be able to find right place / right way for doing this +in their application's architectures. + +On the other side, +you can be sure, that your external dependency will be satisfied by appropriate +instance. Example: .. code-block:: python - import this + """External dependency providers example.""" + + import sqlite3 + + from objects.providers import Singleton + from objects.providers import NewInstance + from objects.providers import ExternalDependency + + from objects.injections import KwArg + from objects.injections import Attribute + + + class ObjectA(object): + + """ObjectA has dependency on database.""" + + def __init__(self, database): + """Initializer. + + Database dependency need to be injected via init arg.""" + self.database = database + + def get_one(self): + """Select one from database and return it.""" + return self.database.execute('SELECT 1').fetchone()[0] + + + # Database and `ObjectA` providers. + database = ExternalDependency(instance_of=sqlite3.Connection) + + object_a = NewInstance(ObjectA, + KwArg('database', database)) + + # Satisfaction of external dependency. + database.override(Singleton(sqlite3.Connection, + KwArg('database', ':memory:'), + KwArg('timeout', 30), + KwArg('detect_types', True), + KwArg('isolation_level', 'EXCLUSIVE'), + Attribute('row_factory', sqlite3.Row))) + + # Creating several `ObjectA` instances. + object_a_1 = object_a() + object_a_2 = object_a() + + # Making some asserts. + assert object_a_1 is not object_a_2 + assert object_a_1.database is object_a_2.database is database() + Config providers ---------------- diff --git a/examples/readme2/external_dependency_providers.py b/examples/readme2/external_dependency_providers.py index 30ee4640..ad2c5533 100644 --- a/examples/readme2/external_dependency_providers.py +++ b/examples/readme2/external_dependency_providers.py @@ -1,6 +1,6 @@ """External dependency providers example.""" -from objects.catalog import AbstractCatalog +import sqlite3 from objects.providers import Singleton from objects.providers import NewInstance @@ -9,55 +9,40 @@ from objects.providers import ExternalDependency from objects.injections import KwArg from objects.injections import Attribute -import sqlite3 - class ObjectA(object): - """Example class ObjectA, that has dependency on database.""" + """ObjectA has dependency on database.""" - def __init__(self, db): - """Initializer.""" - self.db = db + def __init__(self, database): + """Initializer. + + Database dependency need to be injected via init arg.""" + self.database = database + + def get_one(self): + """Select one from database and return it.""" + return self.database.execute('SELECT 1').fetchone()[0] -class ObjectB(object): - - """Example class ObjectB, that has dependencies on ObjectA and database.""" - - def __init__(self, a, db): - """Initializer.""" - self.a = a - self.db = db - - -class Catalog(AbstractCatalog): - - """Catalog of objects providers.""" - - database = ExternalDependency(instance_of=sqlite3.Connection) - """:type: (objects.Provider) -> sqlite3.Connection""" - - object_a = NewInstance(ObjectA, - KwArg('db', database)) - """:type: (objects.Provider) -> ObjectA""" - - object_b = NewInstance(ObjectB, - KwArg('a', object_a), - KwArg('db', database)) - """:type: (objects.Provider) -> ObjectB""" +# Database and `ObjectA` providers. +database = ExternalDependency(instance_of=sqlite3.Connection) +object_a = NewInstance(ObjectA, + KwArg('database', database)) # Satisfaction of external dependency. -Catalog.database.override(Singleton(sqlite3.Connection, - KwArg('database', ':memory:'), - Attribute('row_factory', sqlite3.Row))) +database.override(Singleton(sqlite3.Connection, + KwArg('database', ':memory:'), + KwArg('timeout', 30), + KwArg('detect_types', True), + KwArg('isolation_level', 'EXCLUSIVE'), + Attribute('row_factory', sqlite3.Row))) -# Catalog static provides. -a1, a2 = Catalog.object_a(), Catalog.object_a() -b1, b2 = Catalog.object_b(), Catalog.object_b() +# Creating several `ObjectA` instances. +object_a_1 = object_a() +object_a_2 = object_a() -# Some asserts. -assert a1 is not a2 -assert b1 is not b2 -assert a1.db is a2.db is b1.db is b2.db is Catalog.database() +# Making some asserts. +assert object_a_1 is not object_a_2 +assert object_a_1.database is object_a_2.database is database() From c646e3933a0b6f7f9ce2750a6e10abd21e8de375 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 8 May 2015 18:44:44 +0300 Subject: [PATCH 11/73] adding blank sections --- docs/catalogs.rst | 2 ++ docs/decorators.rst | 8 ++++++++ docs/index.rst | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 docs/catalogs.rst create mode 100644 docs/decorators.rst diff --git a/docs/catalogs.rst b/docs/catalogs.rst new file mode 100644 index 00000000..20124eaf --- /dev/null +++ b/docs/catalogs.rst @@ -0,0 +1,2 @@ +Catalogs +======== diff --git a/docs/decorators.rst b/docs/decorators.rst new file mode 100644 index 00000000..edaf9a27 --- /dev/null +++ b/docs/decorators.rst @@ -0,0 +1,8 @@ +Decorators +========== + +@inject decorator +----------------- + +@override decorator +------------------- diff --git a/docs/index.rst b/docs/index.rst index c58ae813..83c03f87 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -39,7 +39,7 @@ Contents introduction installation providers - entities - advanced_usage + catalogs + decorators examples feedback From c6eabb726ceb970c89b737da6f6cc3d95b27ea6d Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 12 May 2015 16:18:37 +0300 Subject: [PATCH 12/73] Updating introduction section --- README.rst | 38 ++++++++++++++++++++++++++++---------- docs/index.rst | 2 +- docs/introduction.rst | 38 +++++++++++++++++++++++++++++--------- setup.py | 2 +- 4 files changed, 59 insertions(+), 21 deletions(-) diff --git a/README.rst b/README.rst index 43cd7f7a..497b8259 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Objects ======= -Dependency management tool for Python projects +Dependency injection framework for Python projects. +---------------------------------------+-------------------------------------------------------------------+ | *PyPi* | .. image:: https://pypip.in/version/Objects/badge.svg | @@ -32,19 +32,33 @@ Dependency management tool for Python projects Introduction ------------ -Python ecosystem consists of a big amount of various classes, functions and -objects that could be used for applications development. Each of them has its -own role. +Python ecosystem consists of a big amount of various libraries that contain +different classes and functions that could be used for applications +development. Each of them has its own role. Modern Python applications are mostly the composition of well-known open -source systems, frameworks, libraries and some turnkey functionality. +source systems / frameworks / libraries and some turnkey functionality. -When application goes bigger, its amount of objects and their dependencies -also increased extremely fast and became hard to maintain. +When application goes bigger, its complexity and SLOC_ are also increased. +Being driven by SOLID_ (for example), developers often start to split +application's sources into not so big classes, functions and modules. It +always helps, but there is another problem on the horizon. -*Objects* is designed to be developer's friendly tool for managing objects -and their dependencies in formal, pretty way. Main idea of *Objects* is to -keep dependencies under control. +It sounds like "I have so many classes and functions! They are great, now I can +understand each of them, but it is so hard to see the whole picture! How are +they linked with each other? What dependencies does this class have?". And +this is a key question: "What dependencies do certain class / function have?". +To resolve this issues developers have to go inside with IoC_ principles and +implementation patterns. + +One of such IoC_ implementation patterns is called `dependency injection`_. + +*Objects* is a dependency injection framework for Python projects. + +It was designed to be developer's friendly tool for managing any kind of +Python objects and their dependencies in formal, pretty way. + +Main idea of *Objects* is to keep dependencies under control. Installation ------------ @@ -157,3 +171,7 @@ Your feedback is quite important! .. _PyPi: https://pypi.python.org/pypi/Objects .. _Stable version: http://objects.readthedocs.org/en/stable/ .. _Latest version: http://objects.readthedocs.org/en/latest/ +.. _SLOC: http://en.wikipedia.org/wiki/Source_lines_of_code +.. _SOLID: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29 +.. _IoC: http://en.wikipedia.org/wiki/Inversion_of_control +.. _dependency injection: http://en.wikipedia.org/wiki/Dependency_injection diff --git a/docs/index.rst b/docs/index.rst index 83c03f87..9bed770b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ Objects ======= -Dependency injector for Python projects. +Dependency injection framework for Python projects. +---------------------------------------+-------------------------------------------------------------------+ | *PyPi* | .. image:: https://pypip.in/version/Objects/badge.svg | diff --git a/docs/introduction.rst b/docs/introduction.rst index 0197eed0..f1428465 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -1,16 +1,36 @@ Introduction ============ -Python ecosystem consists of a big amount of various classes, functions and -objects that could be used for applications development. Each of them has its -own role. +Python ecosystem consists of a big amount of various libraries that contain +different classes and functions that could be used for applications +development. Each of them has its own role. Modern Python applications are mostly the composition of well-known open -source systems, frameworks, libraries and some turnkey functionality. +source systems / frameworks / libraries and some turnkey functionality. -When application goes bigger, its amount of objects and their dependencies -also increased extremely fast and became hard to maintain. +When application goes bigger, its complexity and SLOC_ are also increased. +Being driven by SOLID_ (for example), developers often start to split +application's sources into not so big classes, functions and modules. It +always helps, but there is another problem on the horizon. -*Objects* is designed to be developer's friendly tool for managing objects -and their dependencies in formal, pretty way. Main idea of *Objects* is to -keep dependencies under control. +It sounds like "I have so many classes and functions! They are great, now I can +understand each of them, but it is so hard to see the whole picture! How are +they linked with each other? What dependencies does this class have?". And +this is a key question: "What dependencies do certain class / function have?". +To resolve this issues developers have to go inside with IoC_ principles and +implementation patterns. + +One of such IoC_ implementation patterns is called `dependency injection`_. + +*Objects* is a dependency injection framework for Python projects. + +It was designed to be developer's friendly tool for managing any kind of +Python objects and their dependencies in formal, pretty way. + +Main idea of *Objects* is to keep dependencies under control. + + +.. _SLOC: http://en.wikipedia.org/wiki/Source_lines_of_code +.. _SOLID: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29 +.. _IoC: http://en.wikipedia.org/wiki/Inversion_of_control +.. _dependency injection: http://en.wikipedia.org/wiki/Dependency_injection diff --git a/setup.py b/setup.py index 9bd3f607..ca1de764 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ from setuptools import setup from setuptools import Command -SHORT_DESCRIPTION = 'Dependency injector for Python projects' +SHORT_DESCRIPTION = 'Dependency injection framework for Python projects' # Getting description. From 446a659bc80baf3dbb951ed13a8da4fffae66b4f Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 12 May 2015 16:41:57 +0300 Subject: [PATCH 13/73] Updating installation docs --- docs/installation.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 84b34c15..008bdaf5 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,11 +1,15 @@ Installation ============ -Latest stable version of *Objects* library can be installed from PyPi_:: +Latest stable version of *Objects* framework can be installed from PyPi_: + +.. code-block:: bash pip install objects -Sources can be cloned from GitHub_:: +Sources can be cloned from GitHub_: + +.. code-block:: bash git clone https://github.com/rmk135/objects.git From 9d48044ea3f7805b2477ea5cb3d9dd87f9fdfd04 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Wed, 13 May 2015 18:46:46 +0300 Subject: [PATCH 14/73] Correcing typo in providers docs --- docs/providers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers.rst b/docs/providers.rst index d987bf96..6ad64030 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -211,7 +211,7 @@ reusable by wide amount of developers and to be easily integrated into many applications. It may be good idea, to move all external dependencies (like -*dabase connection*) to the top level and make them to be injected on your +*database connection*) to the top level and make them to be injected on your software component's initialization. It will make third party developers feel themselves free about integration of yours component in their applications, because of they would be able to find right place / right way for doing this From 405c579f7e75e86a850b88c9f93b3e02f88e2d70 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 14 May 2015 11:21:04 +0300 Subject: [PATCH 15/73] Adding some drafts of @inject decorator docs --- docs/decorators.rst | 43 ++++++++++++++++++++ docs/providers.rst | 10 ++++- examples/readme2/inject_decorator.py | 61 ++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 examples/readme2/inject_decorator.py diff --git a/docs/decorators.rst b/docs/decorators.rst index edaf9a27..5023260a 100644 --- a/docs/decorators.rst +++ b/docs/decorators.rst @@ -1,8 +1,51 @@ Decorators ========== +Current section of *Objects* documentation describes several useful decorators. + @inject decorator ----------------- +``@inject`` decorator can be used for making *inline* dependency injections. +It *patches* decorated callable in such way that dependency injection will be +done before every call of decorated callable. + +``@inject`` decorator takes only argument that is supposed to be an +``objects.injections.Injection`` instance. + +Any Python object will be injected *as is*, except *Objects* providers, +that will be called to provide injectable value. + +Below is an example of how Flask's view could be patched using ``@inject`` +decorator: + +.. code-block:: python + + """`@inject` decorator example.""" + + from objects.providers import NewInstance + + from objects.injections import KwArg + from objects.injections import inject + + + new_object = NewInstance(object) + + + @inject(KwArg('object_a', new_object)) + @inject(KwArg('some_setting', 1334)) + def example_callback(object_a, some_setting): + """This function has dependencies on object a and b. + + Dependencies are injected using `@inject` decorator. + """ + assert isinstance(object_a, object) + assert some_setting == 1334 + + + example_callback() + example_callback() + + @override decorator ------------------- diff --git a/docs/providers.rst b/docs/providers.rst index 6ad64030..01b06752 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -10,6 +10,9 @@ provided. Instance providers & Injections ------------------------------- +Providers +~~~~~~~~~ + *Instance* providers are providers that deal with object's creation and initialization. @@ -50,16 +53,19 @@ Example: assert isinstance(object_1, object) and isinstance(object_2, object) +Injections +~~~~~~~~~~ + Objects can take dependencies in various forms. Some objects take init arguments, other are using attributes or methods to be initialized. It affects how such objects need to be created and initialized, and that is the place where *Injections* need to be used. -In terms of computer science, *Injection* of dependency is a way how +In terms of computer science, *Injection of dependency* is a way how dependency can be coupled with dependent object. In terms of *Objects*, *Injection* is an instruction how to provide -dependency for the particular object. +dependency for the particular provider. Every Python object could be an injection's value. Special case is an *Objects* provider as an injection's value. In such case, injection value is a result of diff --git a/examples/readme2/inject_decorator.py b/examples/readme2/inject_decorator.py new file mode 100644 index 00000000..fe91234c --- /dev/null +++ b/examples/readme2/inject_decorator.py @@ -0,0 +1,61 @@ +"""`@inject` decorator example. + +Flask is required to make this example work. +""" + +import sqlite3 + +from flask import Flask + +from objects.providers import NewInstance +from objects.providers import Singleton +from objects.injections import KwArg +from objects.injections import Attribute +from objects.decorators import inject + + +class ObjectA(object): + + """ObjectA has dependency on database.""" + + def __init__(self, database): + """Initializer. + + Database dependency need to be injected via init arg.""" + self.database = database + + def get_one(self): + """Select one from database and return it.""" + return self.database.execute('SELECT 1').fetchone()[0] + + +# Database and `ObjectA` providers. +database = Singleton(sqlite3.Connection, + KwArg('database', ':memory:'), + KwArg('timeout', 30), + KwArg('detect_types', True), + KwArg('isolation_level', 'EXCLUSIVE'), + Attribute('row_factory', sqlite3.Row)) + +object_a = NewInstance(ObjectA, + KwArg('database', database)) + + +# Flask application. +app = Flask(__name__) + + +# Flask view with inject decorator. +@app.route('/') +@inject(KwArg('database', database)) +@inject(KwArg('object_a', object_a)) +def hello(database): + one = database.execute('SELECT 1').fetchone()[0] + return 'Query returned {0}, db connection {1}'.format(one, database) + + +if __name__ == '__main__': + app.run() + +# Example output of "GET / HTTP/1.1" is: +# Query returned 1, db connection <sqlite3.Connection object at 0x1057e4030> From c824eae5663394f454c6422000e7704f2bce571f Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 14 May 2015 11:35:41 +0300 Subject: [PATCH 16/73] Renaming NewInstance provider to Factory provider --- objects/__init__.py | 4 ++-- objects/providers.py | 29 ++++++++++++++++-------- tests/test_decorators.py | 13 ++++++----- tests/test_injections.py | 4 ++-- tests/test_providers.py | 48 ++++++++++++++++++++-------------------- 5 files changed, 55 insertions(+), 43 deletions(-) diff --git a/objects/__init__.py b/objects/__init__.py index f5921f20..4b9e34d3 100644 --- a/objects/__init__.py +++ b/objects/__init__.py @@ -7,7 +7,7 @@ from .catalog import AbstractCatalog from .providers import Provider from .providers import Delegate -from .providers import NewInstance +from .providers import Factory from .providers import Singleton from .providers import ExternalDependency from .providers import Class @@ -32,7 +32,7 @@ __all__ = ('AbstractCatalog', # Providers 'Provider', 'Delegate', - 'NewInstance', + 'Factory', 'Singleton', 'ExternalDependency', 'Class', diff --git a/objects/providers.py b/objects/providers.py index a40471a8..a69d1f05 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -69,11 +69,11 @@ class Delegate(Provider): return self.delegated -class NewInstance(Provider): +class Factory(Provider): - """New instance provider. + """Factory provider. - New instance providers will create and return new instance on every call. + Factory providers will create and return new instance on every call. """ __slots__ = ('provides', 'kwargs', 'attributes', 'methods') @@ -81,7 +81,7 @@ class NewInstance(Provider): def __init__(self, provides, *injections): """Initializer.""" if not isinstance(provides, class_types): - raise Error('NewInstance provider expects to get class, ' + + raise Error('Factory provider expects to get class, ' + 'got {0} instead'.format(str(provides))) self.provides = provides self.kwargs = tuple((injection @@ -93,7 +93,7 @@ class NewInstance(Provider): self.methods = tuple((injection for injection in injections if is_method_injection(injection))) - super(NewInstance, self).__init__() + super(Factory, self).__init__() def __call__(self, *args, **kwargs): """Return provided instance.""" @@ -114,24 +114,35 @@ class NewInstance(Provider): return instance -class Singleton(NewInstance): +class NewInstance(Factory): + + """NewInstance provider. + + It is synonym of Factory provider. NewInstance provider is considered to + be deprecated, but will be able to use for further backward + compatibility. + """ + + +class Singleton(Provider): """Singleton provider. Singleton provider will create instance once and return it on every call. """ - __slots__ = ('instance',) + __slots__ = ('instance', 'factory') def __init__(self, *args, **kwargs): """Initializer.""" self.instance = None - super(Singleton, self).__init__(*args, **kwargs) + self.factory = Factory(*args, **kwargs) + super(Singleton, self).__init__() def __call__(self, *args, **kwargs): """Return provided instance.""" if not self.instance: - self.instance = super(Singleton, self).__call__(*args, **kwargs) + self.instance = self.factory(*args, **kwargs) return self.instance def reset(self): diff --git a/tests/test_decorators.py b/tests/test_decorators.py index c6ce5f42..1f3dbbb8 100644 --- a/tests/test_decorators.py +++ b/tests/test_decorators.py @@ -7,7 +7,7 @@ from objects.decorators import inject from objects.catalog import AbstractCatalog -from objects.providers import NewInstance +from objects.providers import Factory from objects.providers import Object from objects.providers import Value @@ -40,14 +40,15 @@ class OverrideTests(unittest.TestCase): self.assertEqual(self.Catalog.obj(), 1) self.assertEqual(self.Catalog.another_obj(), 2) + class InjectTests(unittest.TestCase): """Inject decorator test cases.""" def test_decorated(self): """Test `inject()` decorated callback.""" - provider1 = NewInstance(object) - provider2 = NewInstance(list) + provider1 = Factory(object) + provider2 = Factory(list) @inject(KwArg('a', provider1)) @inject(KwArg('b', provider2)) @@ -67,8 +68,8 @@ class InjectTests(unittest.TestCase): def test_decorated_kwargs_priority(self): """Test `inject()` decorated callback kwargs priority.""" - provider1 = NewInstance(object) - provider2 = NewInstance(list) + provider1 = Factory(object) + provider2 = Factory(list) object_a = object() @inject(KwArg('a', provider1)) @@ -90,7 +91,7 @@ class InjectTests(unittest.TestCase): def test_decorated_with_args(self): """Test `inject()` decorated callback with args.""" - provider = NewInstance(list) + provider = Factory(list) object_a = object() @inject(KwArg('b', provider)) diff --git a/tests/test_injections.py b/tests/test_injections.py index b9612e1a..aa682ecd 100644 --- a/tests/test_injections.py +++ b/tests/test_injections.py @@ -7,7 +7,7 @@ from objects.injections import KwArg from objects.injections import Attribute from objects.injections import Method -from objects.providers import NewInstance +from objects.providers import Factory class InjectionTests(unittest.TestCase): @@ -27,7 +27,7 @@ class InjectionTests(unittest.TestCase): def test_value_with_provider_injectable(self): """Test Injection value property with provider.""" - injection = Injection('some_arg_name', NewInstance(object)) + injection = Injection('some_arg_name', Factory(object)) self.assertIsInstance(injection.value, object) diff --git a/tests/test_providers.py b/tests/test_providers.py index 85ac1cba..0dc37ee7 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -4,7 +4,7 @@ import unittest2 as unittest from objects.providers import Provider from objects.providers import Delegate -from objects.providers import NewInstance +from objects.providers import Factory from objects.providers import Singleton from objects.providers import ExternalDependency from objects.providers import Class @@ -130,13 +130,13 @@ class DelegateTests(unittest.TestCase): self.assertIs(delegated2, self.delegated) -class NewInstanceTests(unittest.TestCase): +class FactoryTests(unittest.TestCase): - """NewInstance test cases.""" + """Factory test cases.""" class Example(object): - """Example class for NewInstance provider tests.""" + """Example class for Factory provider tests.""" def __init__(self, init_arg1=None, init_arg2=None): """Initializer. @@ -164,15 +164,15 @@ class NewInstanceTests(unittest.TestCase): def test_is_provider(self): """Test `is_provider` check.""" - self.assertTrue(is_provider(NewInstance(self.Example))) + self.assertTrue(is_provider(Factory(self.Example))) def test_init_with_not_class(self): """Test creation of provider with not a class.""" - self.assertRaises(Error, NewInstance, 123) + self.assertRaises(Error, Factory, 123) def test_call(self): """Test creation of new instances.""" - provider = NewInstance(self.Example) + provider = Factory(self.Example) instance1 = provider() instance2 = provider() @@ -182,9 +182,9 @@ class NewInstanceTests(unittest.TestCase): def test_call_with_init_args(self): """Test creation of new instances with init args injections.""" - provider = NewInstance(self.Example, - KwArg('init_arg1', 'i1'), - KwArg('init_arg2', 'i2')) + provider = Factory(self.Example, + KwArg('init_arg1', 'i1'), + KwArg('init_arg2', 'i2')) instance1 = provider() instance2 = provider() @@ -201,9 +201,9 @@ class NewInstanceTests(unittest.TestCase): def test_call_with_attributes(self): """Test creation of new instances with attribute injections.""" - provider = NewInstance(self.Example, - Attribute('attribute1', 'a1'), - Attribute('attribute2', 'a2')) + provider = Factory(self.Example, + Attribute('attribute1', 'a1'), + Attribute('attribute2', 'a2')) instance1 = provider() instance2 = provider() @@ -220,9 +220,9 @@ class NewInstanceTests(unittest.TestCase): def test_call_with_methods(self): """Test creation of new instances with method injections.""" - provider = NewInstance(self.Example, - Method('method1', 'm1'), - Method('method2', 'm2')) + provider = Factory(self.Example, + Method('method1', 'm1'), + Method('method2', 'm2')) instance1 = provider() instance2 = provider() @@ -239,7 +239,7 @@ class NewInstanceTests(unittest.TestCase): def test_call_with_context_args(self): """Test creation of new instances with context args.""" - provider = NewInstance(self.Example) + provider = Factory(self.Example) instance = provider(11, 22) self.assertEqual(instance.init_arg1, 11) @@ -247,8 +247,8 @@ class NewInstanceTests(unittest.TestCase): def test_call_with_context_kwargs(self): """Test creation of new instances with context kwargs.""" - provider = NewInstance(self.Example, - KwArg('init_arg1', 1)) + provider = Factory(self.Example, + KwArg('init_arg1', 1)) instance1 = provider(init_arg2=22) self.assertEqual(instance1.init_arg1, 1) @@ -260,9 +260,9 @@ class NewInstanceTests(unittest.TestCase): def test_call_overridden(self): """Test creation of new instances on overridden provider.""" - provider = NewInstance(self.Example) - overriding_provider1 = NewInstance(dict) - overriding_provider2 = NewInstance(list) + provider = Factory(self.Example) + overriding_provider1 = Factory(dict) + overriding_provider2 = Factory(list) provider.override(overriding_provider1) provider.override(overriding_provider2) @@ -323,12 +323,12 @@ class ExternalDependencyTests(unittest.TestCase): def test_call_overridden(self): """Test call of overridden external dependency.""" - self.provider.override(NewInstance(list)) + self.provider.override(Factory(list)) self.assertIsInstance(self.provider(), list) def test_call_overridden_but_not_instance_of(self): """Test call of overridden external dependency, but not instance of.""" - self.provider.override(NewInstance(dict)) + self.provider.override(Factory(dict)) self.assertRaises(Error, self.provider) def test_call_not_overridden(self): From 0dd2884262298a30053b4e38c78c06c2285e7dbb Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 14 May 2015 11:38:56 +0300 Subject: [PATCH 17/73] Refactoring of examples according to NewInstance provider to Factory provider renaming --- examples/readme2/external_dependency_providers.py | 10 +++++----- examples/readme2/inject_decorator.py | 8 ++++---- examples/readme2/instance_providers.py | 8 ++++---- .../readme2/instance_providers_with_injections.py | 12 ++++++------ examples/readme2/overriding_providers.py | 12 ++++++------ 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/readme2/external_dependency_providers.py b/examples/readme2/external_dependency_providers.py index ad2c5533..f920b814 100644 --- a/examples/readme2/external_dependency_providers.py +++ b/examples/readme2/external_dependency_providers.py @@ -3,7 +3,7 @@ import sqlite3 from objects.providers import Singleton -from objects.providers import NewInstance +from objects.providers import Factory from objects.providers import ExternalDependency from objects.injections import KwArg @@ -28,8 +28,8 @@ class ObjectA(object): # Database and `ObjectA` providers. database = ExternalDependency(instance_of=sqlite3.Connection) -object_a = NewInstance(ObjectA, - KwArg('database', database)) +object_a_factory = Factory(ObjectA, + KwArg('database', database)) # Satisfaction of external dependency. database.override(Singleton(sqlite3.Connection, @@ -40,8 +40,8 @@ database.override(Singleton(sqlite3.Connection, Attribute('row_factory', sqlite3.Row))) # Creating several `ObjectA` instances. -object_a_1 = object_a() -object_a_2 = object_a() +object_a_1 = object_a_factory() +object_a_2 = object_a_factory() # Making some asserts. assert object_a_1 is not object_a_2 diff --git a/examples/readme2/inject_decorator.py b/examples/readme2/inject_decorator.py index fe91234c..fe04e639 100644 --- a/examples/readme2/inject_decorator.py +++ b/examples/readme2/inject_decorator.py @@ -7,7 +7,7 @@ import sqlite3 from flask import Flask -from objects.providers import NewInstance +from objects.providers import Factory from objects.providers import Singleton from objects.injections import KwArg from objects.injections import Attribute @@ -37,8 +37,8 @@ database = Singleton(sqlite3.Connection, KwArg('isolation_level', 'EXCLUSIVE'), Attribute('row_factory', sqlite3.Row)) -object_a = NewInstance(ObjectA, - KwArg('database', database)) +object_a_factory = Factory(ObjectA, + KwArg('database', database)) # Flask application. @@ -48,7 +48,7 @@ app = Flask(__name__) # Flask view with inject decorator. @app.route('/') @inject(KwArg('database', database)) -@inject(KwArg('object_a', object_a)) +@inject(KwArg('object_a', object_a_factory)) def hello(database): one = database.execute('SELECT 1').fetchone()[0] return 'Query returned {0}, db connection {1}'.format(one, database) diff --git a/examples/readme2/instance_providers.py b/examples/readme2/instance_providers.py index d18783e6..7e3e7734 100644 --- a/examples/readme2/instance_providers.py +++ b/examples/readme2/instance_providers.py @@ -1,11 +1,11 @@ -"""`NewInstance` and `Singleton` providers example.""" +"""`Factory` and `Singleton` providers example.""" -from objects.providers import NewInstance +from objects.providers import Factory from objects.providers import Singleton -# NewInstance provider creates new instance of specified class on every call. -new_object = NewInstance(object) +# Factory provider creates new instance of specified class on every call. +new_object = Factory(object) object_1 = new_object() object_2 = new_object() diff --git a/examples/readme2/instance_providers_with_injections.py b/examples/readme2/instance_providers_with_injections.py index ba20793f..45d25859 100644 --- a/examples/readme2/instance_providers_with_injections.py +++ b/examples/readme2/instance_providers_with_injections.py @@ -1,9 +1,9 @@ -"""`NewInstance` and `Singleton` providers with injections example.""" +"""`Factory` and `Singleton` providers with injections example.""" import sqlite3 from objects.providers import Singleton -from objects.providers import NewInstance +from objects.providers import Factory from objects.injections import KwArg from objects.injections import Attribute @@ -32,12 +32,12 @@ database = Singleton(sqlite3.Connection, KwArg('isolation_level', 'EXCLUSIVE'), Attribute('row_factory', sqlite3.Row)) -object_a = NewInstance(ObjectA, - KwArg('database', database)) +object_a_factory = Factory(ObjectA, + KwArg('database', database)) # Creating several `ObjectA` instances. -object_a_1 = object_a() -object_a_2 = object_a() +object_a_1 = object_a_factory() +object_a_2 = object_a_factory() # Making some asserts. assert object_a_1 is not object_a_2 diff --git a/examples/readme2/overriding_providers.py b/examples/readme2/overriding_providers.py index 8edf09f5..38361df7 100644 --- a/examples/readme2/overriding_providers.py +++ b/examples/readme2/overriding_providers.py @@ -2,8 +2,8 @@ import sqlite3 +from objects.providers import Factory from objects.providers import Singleton -from objects.providers import NewInstance from objects.injections import KwArg from objects.injections import Attribute @@ -50,16 +50,16 @@ database = Singleton(sqlite3.Connection, KwArg('isolation_level', 'EXCLUSIVE'), Attribute('row_factory', sqlite3.Row)) -object_a = NewInstance(ObjectA, - KwArg('database', database)) +object_a_factory = Factory(ObjectA, + KwArg('database', database)) # Overriding `ObjectA` provider with `ObjectAMock` provider. -object_a.override(NewInstance(ObjectAMock)) +object_a_factory.override(Factory(ObjectAMock)) # Creating several `ObjectA` instances. -object_a_1 = object_a() -object_a_2 = object_a() +object_a_1 = object_a_factory() +object_a_2 = object_a_factory() # Making some asserts. assert object_a_1 is not object_a_2 From a5337b2fc83c848e1ad5e4b50629451bb7a97343 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 14 May 2015 11:59:47 +0300 Subject: [PATCH 18/73] Last modifications on NewInstance to Factory provider renaming --- README.rst | 23 ++++++++++---------- docs/providers.rst | 50 ++++++++++++++++++++++++-------------------- examples/concept.py | 21 +++++++++---------- objects/providers.py | 2 +- 4 files changed, 50 insertions(+), 46 deletions(-) diff --git a/README.rst b/README.rst index 497b8259..99e33eda 100644 --- a/README.rst +++ b/README.rst @@ -84,12 +84,12 @@ Examples from objects.catalog import AbstractCatalog + from objects.providers import Factory from objects.providers import Singleton - from objects.providers import NewInstance from objects.injections import KwArg from objects.injections import Attribute - from objects.injections import inject + from objects.decorators import inject import sqlite3 @@ -122,19 +122,19 @@ Examples Attribute('row_factory', sqlite3.Row)) """:type: (objects.Provider) -> sqlite3.Connection""" - object_a = NewInstance(ObjectA, - KwArg('db', database)) + object_a_factory = Factory(ObjectA, + KwArg('db', database)) """:type: (objects.Provider) -> ObjectA""" - object_b = NewInstance(ObjectB, - KwArg('a', object_a), - KwArg('db', database)) + object_b_factory = Factory(ObjectB, + KwArg('a', object_a_factory), + KwArg('db', database)) """:type: (objects.Provider) -> ObjectB""" # Catalog static provides. - a1, a2 = Catalog.object_a(), Catalog.object_a() - b1, b2 = Catalog.object_b(), Catalog.object_b() + a1, a2 = Catalog.object_a_factory(), Catalog.object_a_factory() + b1, b2 = Catalog.object_b_factory(), Catalog.object_b_factory() assert a1 is not a2 assert b1 is not b2 @@ -142,8 +142,8 @@ Examples # Example of inline injections. - @inject(KwArg('a', Catalog.object_a)) - @inject(KwArg('b', Catalog.object_b)) + @inject(KwArg('a', Catalog.object_a_factory)) + @inject(KwArg('b', Catalog.object_b_factory)) @inject(KwArg('database', Catalog.database)) def example(a, b, database): assert a.db is b.db is database is Catalog.database() @@ -151,6 +151,7 @@ Examples example() + You can get more *Objects* examples in ``/examples`` directory on GitHub: diff --git a/docs/providers.rst b/docs/providers.rst index 01b06752..6e755c5d 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -18,7 +18,7 @@ initialization. There are few *Instance* providers: - - ``NewInstance`` provider creates new instance of specified class on every + - ``Factory`` provider creates new instance of specified class on every call. - ``Singleton`` provider creates new instance of specified class on first call and returns same instance on every next call. @@ -27,14 +27,14 @@ Example: .. code-block:: python - """`NewInstance` and `Singleton` providers example.""" + """`Factory` and `Singleton` providers example.""" - from objects.providers import NewInstance + from objects.providers import Factory from objects.providers import Singleton - # NewInstance provider creates new instance of specified class on every call. - new_object = NewInstance(object) + # Factory provider creates new instance of specified class on every call. + new_object = Factory(object) object_1 = new_object() object_2 = new_object() @@ -85,12 +85,12 @@ Example: .. code-block:: python - """`NewInstance` and `Singleton` providers with injections example.""" + """`Factory` and `Singleton` providers with injections example.""" import sqlite3 from objects.providers import Singleton - from objects.providers import NewInstance + from objects.providers import Factory from objects.injections import KwArg from objects.injections import Attribute @@ -119,18 +119,19 @@ Example: KwArg('isolation_level', 'EXCLUSIVE'), Attribute('row_factory', sqlite3.Row)) - object_a = NewInstance(ObjectA, - KwArg('database', database)) + object_a_factory = Factory(ObjectA, + KwArg('database', database)) # Creating several `ObjectA` instances. - object_a_1 = object_a() - object_a_2 = object_a() + object_a_1 = object_a_factory() + object_a_2 = object_a_factory() # Making some asserts. assert object_a_1 is not object_a_2 assert object_a_1.database is object_a_2.database is database() assert object_a_1.get_one() == object_a_2.get_one() == 1 + Static providers ---------------- @@ -163,6 +164,7 @@ Example: value_provider = Value(123) assert value_provider() == 123 + Callable providers ------------------ @@ -172,7 +174,7 @@ callable. Example: - .. code-block:: python +.. code-block:: python """`Callable` providers examples.""" @@ -236,7 +238,7 @@ Example: import sqlite3 from objects.providers import Singleton - from objects.providers import NewInstance + from objects.providers import Factory from objects.providers import ExternalDependency from objects.injections import KwArg @@ -261,8 +263,8 @@ Example: # Database and `ObjectA` providers. database = ExternalDependency(instance_of=sqlite3.Connection) - object_a = NewInstance(ObjectA, - KwArg('database', database)) + object_a_factory = Factory(ObjectA, + KwArg('database', database)) # Satisfaction of external dependency. database.override(Singleton(sqlite3.Connection, @@ -273,14 +275,15 @@ Example: Attribute('row_factory', sqlite3.Row))) # Creating several `ObjectA` instances. - object_a_1 = object_a() - object_a_2 = object_a() + object_a_1 = object_a_factory() + object_a_2 = object_a_factory() # Making some asserts. assert object_a_1 is not object_a_2 assert object_a_1.database is object_a_2.database is database() + Config providers ---------------- @@ -300,8 +303,8 @@ Example: import sqlite3 + from objects.providers import Factory from objects.providers import Singleton - from objects.providers import NewInstance from objects.injections import KwArg from objects.injections import Attribute @@ -348,17 +351,18 @@ Example: KwArg('isolation_level', 'EXCLUSIVE'), Attribute('row_factory', sqlite3.Row)) - object_a = NewInstance(ObjectA, - KwArg('database', database)) + object_a_factory = Factory(ObjectA, + KwArg('database', database)) # Overriding `ObjectA` provider with `ObjectAMock` provider. - object_a.override(NewInstance(ObjectAMock)) + object_a_factory.override(Factory(ObjectAMock)) # Creating several `ObjectA` instances. - object_a_1 = object_a() - object_a_2 = object_a() + object_a_1 = object_a_factory() + object_a_2 = object_a_factory() # Making some asserts. assert object_a_1 is not object_a_2 assert object_a_1.get_one() == object_a_2.get_one() == 2 + diff --git a/examples/concept.py b/examples/concept.py index 75fe2c98..3a7b1feb 100644 --- a/examples/concept.py +++ b/examples/concept.py @@ -2,12 +2,11 @@ from objects.catalog import AbstractCatalog +from objects.providers import Factory from objects.providers import Singleton -from objects.providers import NewInstance from objects.injections import KwArg from objects.injections import Attribute - from objects.decorators import inject import sqlite3 @@ -41,19 +40,19 @@ class Catalog(AbstractCatalog): Attribute('row_factory', sqlite3.Row)) """:type: (objects.Provider) -> sqlite3.Connection""" - object_a = NewInstance(ObjectA, - KwArg('db', database)) + object_a_factory = Factory(ObjectA, + KwArg('db', database)) """:type: (objects.Provider) -> ObjectA""" - object_b = NewInstance(ObjectB, - KwArg('a', object_a), - KwArg('db', database)) + object_b_factory = Factory(ObjectB, + KwArg('a', object_a_factory), + KwArg('db', database)) """:type: (objects.Provider) -> ObjectB""" # Catalog static provides. -a1, a2 = Catalog.object_a(), Catalog.object_a() -b1, b2 = Catalog.object_b(), Catalog.object_b() +a1, a2 = Catalog.object_a_factory(), Catalog.object_a_factory() +b1, b2 = Catalog.object_b_factory(), Catalog.object_b_factory() assert a1 is not a2 assert b1 is not b2 @@ -61,8 +60,8 @@ assert a1.db is a2.db is b1.db is b2.db is Catalog.database() # Example of inline injections. -@inject(KwArg('a', Catalog.object_a)) -@inject(KwArg('b', Catalog.object_b)) +@inject(KwArg('a', Catalog.object_a_factory)) +@inject(KwArg('b', Catalog.object_b_factory)) @inject(KwArg('database', Catalog.database)) def example(a, b, database): assert a.db is b.db is database is Catalog.database() diff --git a/objects/providers.py b/objects/providers.py index a69d1f05..71f40087 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -73,7 +73,7 @@ class Factory(Provider): """Factory provider. - Factory providers will create and return new instance on every call. + Factory provider creates new instance of specified class on every call. """ __slots__ = ('provides', 'kwargs', 'attributes', 'methods') From 05b65f432cb14fc405d43def319db4cd6c8eb2b9 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 15 May 2015 17:44:20 +0300 Subject: [PATCH 19/73] Updating instance providers example --- docs/providers.rst | 7 ++++--- examples/readme2/instance_providers.py | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/providers.rst b/docs/providers.rst index 6e755c5d..89775790 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -34,10 +34,10 @@ Example: # Factory provider creates new instance of specified class on every call. - new_object = Factory(object) + object_factory = Factory(object) - object_1 = new_object() - object_2 = new_object() + object_1 = object_factory() + object_2 = object_factory() assert object_1 is not object_2 assert isinstance(object_1, object) and isinstance(object_2, object) @@ -53,6 +53,7 @@ Example: assert isinstance(object_1, object) and isinstance(object_2, object) + Injections ~~~~~~~~~~ diff --git a/examples/readme2/instance_providers.py b/examples/readme2/instance_providers.py index 7e3e7734..1be9acb2 100644 --- a/examples/readme2/instance_providers.py +++ b/examples/readme2/instance_providers.py @@ -5,10 +5,10 @@ from objects.providers import Singleton # Factory provider creates new instance of specified class on every call. -new_object = Factory(object) +object_factory = Factory(object) -object_1 = new_object() -object_2 = new_object() +object_1 = object_factory() +object_2 = object_factory() assert object_1 is not object_2 assert isinstance(object_1, object) and isinstance(object_2, object) From f67343c45c638b9ba68720ae0c4f34b31d028ae7 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Sat, 16 May 2015 22:01:03 +0300 Subject: [PATCH 20/73] Refactoring of @inject decorator --- objects/decorators.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/objects/decorators.py b/objects/decorators.py index 0113ae05..1846b3ae 100644 --- a/objects/decorators.py +++ b/objects/decorators.py @@ -15,7 +15,7 @@ def override(catalog): def inject(injection): - """Inject decorator. + """Dependency injection decorator. :type injection: Injection :return: (callable) -> (callable) @@ -23,12 +23,19 @@ def inject(injection): injection = ensure_is_injection(injection) def decorator(callback): - """Decorator.""" + """Dependency injection decorator.""" + if hasattr(callback, '__injections__'): + callback.__injections__ += (injection,) + @wraps(callback) def decorated(*args, **kwargs): - """Decorated.""" - if injection.name not in kwargs: - kwargs[injection.name] = injection.value + """Decorated with dependency injection callback.""" + for injection in getattr(decorated, '__injections__'): + if injection.name not in kwargs: + kwargs[injection.name] = injection.value return callback(*args, **kwargs) + + setattr(decorated, '__injections__', (injection,)) + return decorated return decorator From b055a86c92c29338178854a07587d8913321f53b Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Mon, 25 May 2015 10:45:52 +0300 Subject: [PATCH 21/73] Improving of Providers extending --- objects/providers.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/objects/providers.py b/objects/providers.py index 71f40087..a8fd9ea9 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -23,6 +23,17 @@ class Provider(object): def __call__(self, *args, **kwargs): """Return provided instance.""" + if self.overridden: + return self.last_overriding(*args, **kwargs) + return self.__provide__(*args, **kwargs) + + def __provide__(self, *args, **kwargs): + """Providing strategy implementation. + + Abstract protected method that implements providing strategy of + particular provider. Current method is called every time when not + overridden provider is called. Need to be overridden in subclasses. + """ raise NotImplementedError() def delegate(self): @@ -64,7 +75,7 @@ class Delegate(Provider): self.delegated = ensure_is_provider(delegated) super(Delegate, self).__init__() - def __call__(self): + def __provide__(self, *args, **kwargs): """Return provided instance.""" return self.delegated @@ -95,11 +106,8 @@ class Factory(Provider): if is_method_injection(injection))) super(Factory, self).__init__() - def __call__(self, *args, **kwargs): + def __provide__(self, *args, **kwargs): """Return provided instance.""" - if self.overridden: - return self.last_overriding(*args, **kwargs) - init_kwargs = dict(((injection.name, injection.value) for injection in self.kwargs)) init_kwargs.update(kwargs) @@ -139,7 +147,7 @@ class Singleton(Provider): self.factory = Factory(*args, **kwargs) super(Singleton, self).__init__() - def __call__(self, *args, **kwargs): + def __provide__(self, *args, **kwargs): """Return provided instance.""" if not self.instance: self.instance = self.factory(*args, **kwargs) @@ -197,10 +205,8 @@ class _StaticProvider(Provider): self.provides = provides super(_StaticProvider, self).__init__() - def __call__(self): + def __provide__(self, *args, **kwargs): """Return provided instance.""" - if self.overridden: - return self.last_overriding() return self.provides @@ -244,11 +250,8 @@ class Callable(Provider): if is_kwarg_injection(injection))) super(Callable, self).__init__() - def __call__(self, *args, **kwargs): + def __provide__(self, *args, **kwargs): """Return provided instance.""" - if self.overridden: - return self.last_overriding() - injections = dict(((injection.name, injection.value) for injection in self.injections)) injections.update(kwargs) @@ -274,7 +277,7 @@ class Config(Provider): self.value = value super(Config, self).__init__() - def __call__(self, paths=None): + def __provide__(self, paths=None): """Return provided instance.""" value = self.value if paths: @@ -311,7 +314,7 @@ class _ChildConfig(Provider): self.root_config = root_config super(_ChildConfig, self).__init__() - def __call__(self, *args, **kwargs): + def __provide__(self, *args, **kwargs): """Return provided instance.""" return self.root_config(self.parents) From 5b76551790bf31c465b81c132807e161bc2275e6 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Wed, 27 May 2015 19:00:41 +0300 Subject: [PATCH 22/73] Working copy of docs --- docs/index.rst | 1 + docs/injections.rst | 37 +++++++++ docs/providers.rst | 75 ++++++++++++++++++- examples/readme2/factory_providers.py | 13 ++++ .../readme2/factory_providers_init_args.py | 34 +++++++++ 5 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 docs/injections.rst create mode 100644 examples/readme2/factory_providers.py create mode 100644 examples/readme2/factory_providers_init_args.py diff --git a/docs/index.rst b/docs/index.rst index 9bed770b..ad7a2c2b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -39,6 +39,7 @@ Contents introduction installation providers + injections catalogs decorators examples diff --git a/docs/injections.rst b/docs/injections.rst new file mode 100644 index 00000000..c9104855 --- /dev/null +++ b/docs/injections.rst @@ -0,0 +1,37 @@ +Injections +========== + +Injections are *Objects* entities that are used for specification of dependency +injection types. + +Different functions, classes and objects can take dependency injections in +various forms. Some of them take dependencies like keyword arguments during +call time, other require setting of attributes or calling of specialized +methods for doing dependency injections. + +So, when you are doing dependency injection you need to specify its type and +that is the place where *Injections* need to be used. + +Some key points of *Objects* injections: + + - Every *Objects* injection always takes injectable value as an + ``injectable`` param. Every Python object could be an injectable. + - Every *Objects* injection always has ``value`` property that returns + injection's injectable. ``value`` property is calculated every time it is + accessed. Every Python object, except of *Objects* providers, that was + provided as and ``injectable`` will be returned by ``value`` property + *"as is"*. *Objects* providers will be called every time during ``value`` + accessing and result of such calls will be returned. + - Every *Objects* *Injection* can have additional params that are needed + for doing particular type of injection. + +There are several types of *Injections*: + + - ``KwArg`` - is used for making keyword argument injections for any kind + of callables (functions, methods, objects instantiation and so on). Takes + keyword argument name as string and injectable. + - ``Attribute`` - is used for making injections by setting of injection's + value to a particular attribute. Takes attribute name as string and + injectable. + - ``Method`` - is used for making injections by calling of method with + injectable value. Takes method name as string and injectable. diff --git a/docs/providers.rst b/docs/providers.rst index 89775790..e6609c3c 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -3,10 +3,77 @@ Providers Providers are strategies of accessing objects. -All providers are callable. They describe how particular objects will be -provided. +All providers are callable. They describe how particular objects are provided. +Factory providers +----------------- + +``Factory`` provider creates new instance of specified class on every call. + +Nothing could be better than brief example: + +.. code-block:: python + + """`Factory` providers example.""" + + from objects.providers import Factory + + + # Factory provider creates new instance of specified class on every call. + object_factory = Factory(object) + + object_1 = object_factory() + object_2 = object_factory() + + assert object_1 is not object_2 + assert isinstance(object_1, object) and isinstance(object_2, object) + +Factory providers and injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Objects can take dependencies in different forms. Some objects take init +arguments, other are using attributes setting or method calls to be +initialized. It affects how such objects need to be created and initialized, +and that is the place where ``objects.injections`` need to be used. + +``Factory`` provider takes various number of positional arguments, that define +what kind of dependency injections need to be done. + +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 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 +done. + +Factory providers and __init__ injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + - KwArg example. + - Context args priority example. + +Factory providers and attribute injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + - Attributes example. + +Factory providers and method injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + - Method example. + Instance providers & Injections ------------------------------- @@ -367,3 +434,7 @@ Example: assert object_a_1 is not object_a_2 assert object_a_1.get_one() == object_a_2.get_one() == 2 + + + +.. _Constructor injection: http://en.wikipedia.org/wiki/Dependency_injection#Constructor_injection diff --git a/examples/readme2/factory_providers.py b/examples/readme2/factory_providers.py new file mode 100644 index 00000000..e4a87ba5 --- /dev/null +++ b/examples/readme2/factory_providers.py @@ -0,0 +1,13 @@ +"""`Factory` providers example.""" + +from objects.providers import Factory + + +# Factory provider creates new instance of specified class on every call. +object_factory = Factory(object) + +object_1 = object_factory() +object_2 = object_factory() + +assert object_1 is not object_2 +assert isinstance(object_1, object) and isinstance(object_2, object) diff --git a/examples/readme2/factory_providers_init_args.py b/examples/readme2/factory_providers_init_args.py new file mode 100644 index 00000000..3430877a --- /dev/null +++ b/examples/readme2/factory_providers_init_args.py @@ -0,0 +1,34 @@ +"""`Factory` providers with constructor injections example.""" + +from objects.providers import Factory +from objects.injections import KwArg + + +class ObjectA(object): + + """ObjectA has few dependencies that need to provided as init args.""" + + def __init__(self, object_b, object_c): + """Initializer.""" + self.object_b = object_b + self.object_c = object_c + + +# Creating of dependencies. +object_b = object() +object_c = object() + +# Creating ObjectA factory. +object_a_factory = Factory(ObjectA, + KwArg('object_b', object_b), + KwArg('object_c', object_c)) + + +object_a_1 = object_a_factory() # Same as ObjectA(object_b, object_c) +object_a_2 = object_a_factory() # Same as ObjectA(object_b, object_c) + +assert object_a_1 is not object_a_2 +assert isinstance(object_a_1, ObjectA) +assert isinstance(object_a_2, ObjectA) +assert object_a_1.object_b is object_a_2.object_b is object_b +assert object_a_1.object_c is object_a_2.object_c is object_c From d9952d5d857885c6eabe9e0619c2b0cd9a76a53f Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Wed, 3 Jun 2015 15:50:13 +0300 Subject: [PATCH 23/73] Factory docs update --- docs/providers.rst | 67 ++++++++++++++++++- examples/delegate.py | 6 +- .../readme2/factory_providers_init_args.py | 34 ---------- .../factory_providers_init_injections.py | 45 +++++++++++++ 4 files changed, 113 insertions(+), 39 deletions(-) delete mode 100644 examples/readme2/factory_providers_init_args.py create mode 100644 examples/readme2/factory_providers_init_injections.py diff --git a/docs/providers.rst b/docs/providers.rst index e6609c3c..8607a76f 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -58,11 +58,74 @@ All ``Injection``'s injectable values are provided *"as is"*, except of providers. Providers will be called every time, when injection needs to be done. + Factory providers and __init__ injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - KwArg example. - - Context args priority example. +Example below shows how to create ``Factory`` of particular class with several +``__init__`` keyword argument injections which injectable values are also +provided by another factories: + +.. code-block:: python + + """`Factory` providers with init injections example.""" + + from objects.providers import Factory + from objects.injections import KwArg + + + class A(object): + + """Example class A. + + Class A has dependencies on class B and class C objects, that have to be + provided as init arguments. + """ + + def __init__(self, object_b, object_c): + self.object_b = object_b + self.object_c = object_c + super(A, self).__init__() + + + class B(object): + + """Example class B.""" + + + class C(object): + + """Example class C.""" + + + # A, B, C factories: + c_factory = Factory(C) + b_factory = Factory(B) + a_factory = Factory(A, + KwArg('object_b', b_factory), + KwArg('object_c', c_factory)) + + # Creating several A objects: + object_a_1 = a_factory() # Same as: A(object_b=B(), object_c=C()) + object_a_2 = a_factory() # Same as: A(object_b=B(), object_c=C()) + + # Making some asserts: + assert object_a_1 is not object_a_2 + assert object_a_1.object_b is not object_a_2.object_b + assert object_a_1.object_c is not object_a_2.object_c + + +Need to make examples for: + + - Several KwArgs usage. + + - Factory depends on another factory. + + + - KwArg usage with not provider injectable value. + + - Context positional arguments usage with KwArgs. + - Context keyword arguments priority on KwArgs. + + - Context keyword arguments usage with KwArgs ??? Factory providers and attribute injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/examples/delegate.py b/examples/delegate.py index df4a9068..b54debc6 100644 --- a/examples/delegate.py +++ b/examples/delegate.py @@ -2,8 +2,8 @@ from objects.catalog import AbstractCatalog +from objects.providers import Factory from objects.providers import Singleton -from objects.providers import NewInstance from objects.injections import KwArg from objects.injections import Attribute @@ -38,8 +38,8 @@ class Catalog(AbstractCatalog): Attribute('row_factory', sqlite3.Row)) """:type: (objects.Provider) -> sqlite3.Connection""" - object_a = NewInstance(ObjectA, - KwArg('db', database)) + object_a = Factory(ObjectA, + KwArg('db', database)) """:type: (objects.Provider) -> ObjectA""" object_b = Singleton(ObjectB, diff --git a/examples/readme2/factory_providers_init_args.py b/examples/readme2/factory_providers_init_args.py deleted file mode 100644 index 3430877a..00000000 --- a/examples/readme2/factory_providers_init_args.py +++ /dev/null @@ -1,34 +0,0 @@ -"""`Factory` providers with constructor injections example.""" - -from objects.providers import Factory -from objects.injections import KwArg - - -class ObjectA(object): - - """ObjectA has few dependencies that need to provided as init args.""" - - def __init__(self, object_b, object_c): - """Initializer.""" - self.object_b = object_b - self.object_c = object_c - - -# Creating of dependencies. -object_b = object() -object_c = object() - -# Creating ObjectA factory. -object_a_factory = Factory(ObjectA, - KwArg('object_b', object_b), - KwArg('object_c', object_c)) - - -object_a_1 = object_a_factory() # Same as ObjectA(object_b, object_c) -object_a_2 = object_a_factory() # Same as ObjectA(object_b, object_c) - -assert object_a_1 is not object_a_2 -assert isinstance(object_a_1, ObjectA) -assert isinstance(object_a_2, ObjectA) -assert object_a_1.object_b is object_a_2.object_b is object_b -assert object_a_1.object_c is object_a_2.object_c is object_c diff --git a/examples/readme2/factory_providers_init_injections.py b/examples/readme2/factory_providers_init_injections.py new file mode 100644 index 00000000..1a0abadb --- /dev/null +++ b/examples/readme2/factory_providers_init_injections.py @@ -0,0 +1,45 @@ +"""`Factory` providers with init injections example.""" + +from objects.providers import Factory +from objects.injections import KwArg + + +class A(object): + + """Example class A. + + Class A has dependencies on class B and class C objects, that have to be + provided as init arguments. + """ + + def __init__(self, object_b, object_c): + self.object_b = object_b + self.object_c = object_c + super(A, self).__init__() + + +class B(object): + + """Example class B.""" + + +class C(object): + + """Example class C.""" + + +# A, B, C factories: +c_factory = Factory(C) +b_factory = Factory(B) +a_factory = Factory(A, + KwArg('object_b', b_factory), + KwArg('object_c', c_factory)) + +# Creating several A objects: +object_a_1 = a_factory() # Same as: A(object_b=B(), object_c=C()) +object_a_2 = a_factory() # Same as: A(object_b=B(), object_c=C()) + +# Making some asserts: +assert object_a_1 is not object_a_2 +assert object_a_1.object_b is not object_a_2.object_b +assert object_a_1.object_c is not object_a_2.object_c From 2e8f59115fccca747845e7be9e723a3ae0cf06cc Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 5 Jun 2015 11:29:36 +0300 Subject: [PATCH 24/73] Complete of Factory docs, new Factory examples --- docs/providers.rst | 137 +++++++++++++----- examples/providers/factory.py | 18 +++ .../factory_init_context_injections.py | 52 +++++++ examples/providers/factory_init_injections.py | 53 +++++++ examples/readme2/factory_providers.py | 13 -- .../factory_providers_init_injections.py | 45 ------ 6 files changed, 224 insertions(+), 94 deletions(-) create mode 100644 examples/providers/factory.py create mode 100644 examples/providers/factory_init_context_injections.py create mode 100644 examples/providers/factory_init_injections.py delete mode 100644 examples/readme2/factory_providers.py delete mode 100644 examples/readme2/factory_providers_init_injections.py diff --git a/docs/providers.rst b/docs/providers.rst index 8607a76f..d8b59e6d 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -20,14 +20,21 @@ Nothing could be better than brief example: from objects.providers import Factory + class User(object): + + """Example class User.""" + + # Factory provider creates new instance of specified class on every call. - object_factory = Factory(object) + users_factory = Factory(User) + + user1 = users_factory() + user2 = users_factory() + + assert user1 is not user2 + assert isinstance(user1, User) and isinstance(user2, User) - object_1 = object_factory() - object_2 = object_factory() - assert object_1 is not object_2 - assert isinstance(object_1, object) and isinstance(object_2, object) Factory providers and injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -74,58 +81,116 @@ provided by another factories: from objects.injections import KwArg - class A(object): + class User(object): - """Example class A. + """Example class User. - Class A has dependencies on class B and class C objects, that have to be - provided as init arguments. + Class User has dependencies on class Photo and class CreditCard objects, + that have to be provided as init arguments. """ - def __init__(self, object_b, object_c): - self.object_b = object_b - self.object_c = object_c - super(A, self).__init__() + def __init__(self, main_photo, credit_card): + """Initializer. + + :param main_photo: Photo + :param credit_card: CreditCard + :return: + """ + self.main_photo = main_photo + self.credit_card = credit_card + super(User, self).__init__() - class B(object): + class Photo(object): - """Example class B.""" + """Example class Photo.""" - class C(object): + class CreditCard(object): - """Example class C.""" + """Example class CreditCard.""" - # A, B, C factories: - c_factory = Factory(C) - b_factory = Factory(B) - a_factory = Factory(A, - KwArg('object_b', b_factory), - KwArg('object_c', c_factory)) + # User, Photo and CreditCard factories: + credit_cards_factory = Factory(CreditCard) + photos_factory = Factory(Photo) + users_factory = Factory(User, + KwArg('main_photo', photos_factory), + KwArg('credit_card', credit_cards_factory)) - # Creating several A objects: - object_a_1 = a_factory() # Same as: A(object_b=B(), object_c=C()) - object_a_2 = a_factory() # Same as: A(object_b=B(), object_c=C()) + # Creating several User objects: + user1 = users_factory() # Same as: User(main_photo=Photo(), + # credit_card=CreditCard()) + user2 = users_factory() # Same as: User(main_photo=Photo(), + # credit_card=CreditCard()) # Making some asserts: - assert object_a_1 is not object_a_2 - assert object_a_1.object_b is not object_a_2.object_b - assert object_a_1.object_c is not object_a_2.object_c + assert user1 is not user2 + assert user1.main_photo is not user2.main_photo + assert user1.credit_card is not user2.credit_card -Need to make examples for: +Next example shows how ``Factory`` provider deals with positional and keyword +``__init__`` context arguments. In few words, ``Factory`` provider fully +passes positional context arguments to class's ``__init__`` method, but +keyword context arguments have priority on ``KwArg`` injections (this could be +useful for testing). So, please, follow the example below: - - Several KwArgs usage. + - - Factory depends on another factory. + +.. code-block:: python - - KwArg usage with not provider injectable value. + """`Factory` providers with init injections and context arguments example.""" - - Context positional arguments usage with KwArgs. - - Context keyword arguments priority on KwArgs. + from objects.providers import Factory + from objects.injections import KwArg + + + class User(object): + + """Example class User.""" + + def __init__(self, id, main_photo): + """Initializer. + + :param id: int + :param main_photo: Photo + :return: + """ + self.id = id + self.main_photo = main_photo + super(User, self).__init__() + + + class Photo(object): + + """Example class Photo.""" + + + # User and Photo factories: + photos_factory = Factory(Photo) + users_factory = Factory(User, + KwArg('main_photo', photos_factory)) + + # Creating several User objects: + user1 = users_factory(1) # Same as: User(1, main_photo=Photo()) + user2 = users_factory(2) # Same as: User(1, main_photo=Photo()) + + # Making some asserts: + assert user1.id == 1 + assert user2.id == 2 + assert user1 is not user2 + assert isinstance(user1.main_photo, Photo) + assert isinstance(user2.main_photo, Photo) + assert user1.main_photo is not user2.main_photo + + # Context keyword arguments have priority on KwArg injections priority: + photo_mock = Photo() + + user3 = users_factory(3, main_photo=photo_mock) + + assert user3.id == 3 + assert user3 not in (user2, user1) + assert user3.main_photo is photo_mock - - Context keyword arguments usage with KwArgs ??? Factory providers and attribute injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/examples/providers/factory.py b/examples/providers/factory.py new file mode 100644 index 00000000..63dbbff8 --- /dev/null +++ b/examples/providers/factory.py @@ -0,0 +1,18 @@ +"""`Factory` providers example.""" + +from objects.providers import Factory + + +class User(object): + + """Example class User.""" + + +# Factory provider creates new instance of specified class on every call. +users_factory = Factory(User) + +user1 = users_factory() +user2 = users_factory() + +assert user1 is not user2 +assert isinstance(user1, User) and isinstance(user2, User) diff --git a/examples/providers/factory_init_context_injections.py b/examples/providers/factory_init_context_injections.py new file mode 100644 index 00000000..870ce656 --- /dev/null +++ b/examples/providers/factory_init_context_injections.py @@ -0,0 +1,52 @@ +"""`Factory` providers with init injections and context arguments example.""" + +from objects.providers import Factory +from objects.injections import KwArg + + +class User(object): + + """Example class User.""" + + def __init__(self, id, main_photo): + """Initializer. + + :param id: int + :param main_photo: Photo + :return: + """ + self.id = id + self.main_photo = main_photo + super(User, self).__init__() + + +class Photo(object): + + """Example class Photo.""" + + +# User and Photo factories: +photos_factory = Factory(Photo) +users_factory = Factory(User, + KwArg('main_photo', photos_factory)) + +# Creating several User objects: +user1 = users_factory(1) # Same as: User(1, main_photo=Photo()) +user2 = users_factory(2) # Same as: User(1, main_photo=Photo()) + +# Making some asserts: +assert user1.id == 1 +assert user2.id == 2 +assert user1 is not user2 +assert isinstance(user1.main_photo, Photo) +assert isinstance(user2.main_photo, Photo) +assert user1.main_photo is not user2.main_photo + +# Context keyword arguments have priority on KwArg injections priority: +photo_mock = Photo() + +user3 = users_factory(3, main_photo=photo_mock) + +assert user3.id == 3 +assert user3 not in (user2, user1) +assert user3.main_photo is photo_mock diff --git a/examples/providers/factory_init_injections.py b/examples/providers/factory_init_injections.py new file mode 100644 index 00000000..9bccb0ec --- /dev/null +++ b/examples/providers/factory_init_injections.py @@ -0,0 +1,53 @@ +"""`Factory` providers with init injections example.""" + +from objects.providers import Factory +from objects.injections import KwArg + + +class User(object): + + """Example class User. + + Class User has dependencies on class Photo and class CreditCard objects, + that have to be provided as init arguments. + """ + + def __init__(self, main_photo, credit_card): + """Initializer. + + :param main_photo: Photo + :param credit_card: CreditCard + :return: + """ + self.main_photo = main_photo + self.credit_card = credit_card + super(User, self).__init__() + + +class Photo(object): + + """Example class Photo.""" + + +class CreditCard(object): + + """Example class CreditCard.""" + + +# User, Photo and CreditCard factories: +credit_cards_factory = Factory(CreditCard) +photos_factory = Factory(Photo) +users_factory = Factory(User, + KwArg('main_photo', photos_factory), + KwArg('credit_card', credit_cards_factory)) + +# Creating several User objects: +user1 = users_factory() # Same as: User(main_photo=Photo(), + # credit_card=CreditCard()) +user2 = users_factory() # Same as: User(main_photo=Photo(), + # credit_card=CreditCard()) + +# Making some asserts: +assert user1 is not user2 +assert user1.main_photo is not user2.main_photo +assert user1.credit_card is not user2.credit_card diff --git a/examples/readme2/factory_providers.py b/examples/readme2/factory_providers.py deleted file mode 100644 index e4a87ba5..00000000 --- a/examples/readme2/factory_providers.py +++ /dev/null @@ -1,13 +0,0 @@ -"""`Factory` providers example.""" - -from objects.providers import Factory - - -# Factory provider creates new instance of specified class on every call. -object_factory = Factory(object) - -object_1 = object_factory() -object_2 = object_factory() - -assert object_1 is not object_2 -assert isinstance(object_1, object) and isinstance(object_2, object) diff --git a/examples/readme2/factory_providers_init_injections.py b/examples/readme2/factory_providers_init_injections.py deleted file mode 100644 index 1a0abadb..00000000 --- a/examples/readme2/factory_providers_init_injections.py +++ /dev/null @@ -1,45 +0,0 @@ -"""`Factory` providers with init injections example.""" - -from objects.providers import Factory -from objects.injections import KwArg - - -class A(object): - - """Example class A. - - Class A has dependencies on class B and class C objects, that have to be - provided as init arguments. - """ - - def __init__(self, object_b, object_c): - self.object_b = object_b - self.object_c = object_c - super(A, self).__init__() - - -class B(object): - - """Example class B.""" - - -class C(object): - - """Example class C.""" - - -# A, B, C factories: -c_factory = Factory(C) -b_factory = Factory(B) -a_factory = Factory(A, - KwArg('object_b', b_factory), - KwArg('object_c', c_factory)) - -# Creating several A objects: -object_a_1 = a_factory() # Same as: A(object_b=B(), object_c=C()) -object_a_2 = a_factory() # Same as: A(object_b=B(), object_c=C()) - -# Making some asserts: -assert object_a_1 is not object_a_2 -assert object_a_1.object_b is not object_a_2.object_b -assert object_a_1.object_c is not object_a_2.object_c From 776bbc7dde734e3097e3049035ccab0187ccdaa9 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 5 Jun 2015 11:39:01 +0300 Subject: [PATCH 25/73] small fixes for Factory docs and examples --- docs/providers.rst | 2 +- examples/providers/factory_init_context_injections.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/providers.rst b/docs/providers.rst index d8b59e6d..75e46a2d 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -172,7 +172,7 @@ useful for testing). So, please, follow the example below: # Creating several User objects: user1 = users_factory(1) # Same as: User(1, main_photo=Photo()) - user2 = users_factory(2) # Same as: User(1, main_photo=Photo()) + user2 = users_factory(2) # Same as: User(2, main_photo=Photo()) # Making some asserts: assert user1.id == 1 diff --git a/examples/providers/factory_init_context_injections.py b/examples/providers/factory_init_context_injections.py index 870ce656..8349c877 100644 --- a/examples/providers/factory_init_context_injections.py +++ b/examples/providers/factory_init_context_injections.py @@ -32,7 +32,7 @@ users_factory = Factory(User, # Creating several User objects: user1 = users_factory(1) # Same as: User(1, main_photo=Photo()) -user2 = users_factory(2) # Same as: User(1, main_photo=Photo()) +user2 = users_factory(2) # Same as: User(2, main_photo=Photo()) # Making some asserts: assert user1.id == 1 From 7c1c32db80365662dd7e5757fcf63a5eb006e691 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 5 Jun 2015 12:28:12 +0300 Subject: [PATCH 26/73] Updating Factory docs and examples --- docs/providers.rst | 152 ++++++++++-------- .../factory_init_context_injections.py | 52 ------ examples/providers/factory_init_injections.py | 34 ++-- .../factory_init_injections_and_contexts.py | 79 +++++++++ 4 files changed, 175 insertions(+), 142 deletions(-) delete mode 100644 examples/providers/factory_init_context_injections.py create mode 100644 examples/providers/factory_init_injections_and_contexts.py diff --git a/docs/providers.rst b/docs/providers.rst index 75e46a2d..84f96890 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -35,7 +35,6 @@ Nothing could be better than brief example: assert isinstance(user1, User) and isinstance(user2, User) - Factory providers and injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -69,7 +68,7 @@ done. Factory providers and __init__ injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Example below shows how to create ``Factory`` of particular class with several +Example below shows how to create ``Factory`` of particular class with ``__init__`` keyword argument injections which injectable values are also provided by another factories: @@ -83,19 +82,78 @@ provided by another factories: class User(object): - """Example class User. + """Example class User.""" - Class User has dependencies on class Photo and class CreditCard objects, - that have to be provided as init arguments. - """ - - def __init__(self, main_photo, credit_card): + def __init__(self, main_photo): """Initializer. + :param main_photo: Photo + :return: + """ + self.main_photo = main_photo + super(User, self).__init__() + + + class Photo(object): + + """Example class Photo.""" + + + # User and Photo factories: + photos_factory = Factory(Photo) + users_factory = Factory(User, + KwArg('main_photo', photos_factory)) + + # Creating several User objects: + user1 = users_factory() # Same as: User(main_photo=Photo()) + user2 = users_factory() # Same as: User(main_photo=Photo()) + + # Making some asserts: + assert isinstance(user1, User) + assert isinstance(user1.main_photo, Photo) + + assert isinstance(user2, User) + assert isinstance(user2.main_photo, Photo) + + assert user1 is not user2 + assert user1.main_photo is not user2.main_photo + + +Next example shows how ``Factory`` provider deals with positional and keyword +``__init__`` context arguments. In few words, ``Factory`` provider fully +passes positional context arguments to class's ``__init__`` method, but +keyword context arguments have priority on ``KwArg`` injections (this could be +useful for testing). So, please, follow the example below: + +.. code-block:: python + + """`Factory` providers with init injections and context arguments example.""" + + from objects.providers import Factory + from objects.injections import KwArg + + + class User(object): + + """Example class User. + + Class User has to be provided with user id. + + Also Class User has dependencies on class Photo and class CreditCard + objects. + + All of the dependencies have to be provided like __init__ arguments. + """ + + def __init__(self, id, main_photo, credit_card): + """Initializer. + + :param id: int :param main_photo: Photo :param credit_card: CreditCard :return: """ + self.id = id self.main_photo = main_photo self.credit_card = credit_card super(User, self).__init__() @@ -119,77 +177,35 @@ provided by another factories: KwArg('credit_card', credit_cards_factory)) # Creating several User objects: - user1 = users_factory() # Same as: User(main_photo=Photo(), - # credit_card=CreditCard()) - user2 = users_factory() # Same as: User(main_photo=Photo(), - # credit_card=CreditCard()) - - # Making some asserts: - assert user1 is not user2 - assert user1.main_photo is not user2.main_photo - assert user1.credit_card is not user2.credit_card - - -Next example shows how ``Factory`` provider deals with positional and keyword -``__init__`` context arguments. In few words, ``Factory`` provider fully -passes positional context arguments to class's ``__init__`` method, but -keyword context arguments have priority on ``KwArg`` injections (this could be -useful for testing). So, please, follow the example below: - -.. code-block:: python - - """`Factory` providers with init injections and context arguments example.""" - - from objects.providers import Factory - from objects.injections import KwArg - - - class User(object): - - """Example class User.""" - - def __init__(self, id, main_photo): - """Initializer. - - :param id: int - :param main_photo: Photo - :return: - """ - self.id = id - self.main_photo = main_photo - super(User, self).__init__() - - - class Photo(object): - - """Example class Photo.""" - - - # User and Photo factories: - photos_factory = Factory(Photo) - users_factory = Factory(User, - KwArg('main_photo', photos_factory)) - - # Creating several User objects: - user1 = users_factory(1) # Same as: User(1, main_photo=Photo()) - user2 = users_factory(2) # Same as: User(2, main_photo=Photo()) + user1 = users_factory(1) # Same as: User(1, + # main_photo=Photo(), + # credit_card=CreditCard()) + user2 = users_factory(2) # Same as: User(2, + # main_photo=Photo(), + # credit_card=CreditCard()) # Making some asserts: assert user1.id == 1 - assert user2.id == 2 - assert user1 is not user2 assert isinstance(user1.main_photo, Photo) + assert isinstance(user1.credit_card, CreditCard) + + assert user2.id == 2 assert isinstance(user2.main_photo, Photo) + assert isinstance(user2.credit_card, CreditCard) + assert user1.main_photo is not user2.main_photo + assert user1.credit_card is not user2.credit_card # Context keyword arguments have priority on KwArg injections priority: - photo_mock = Photo() + main_photo_mock = Photo() + credit_card_mock = CreditCard() - user3 = users_factory(3, main_photo=photo_mock) + user3 = users_factory(3, main_photo=main_photo_mock, + credit_card=credit_card_mock) assert user3.id == 3 - assert user3 not in (user2, user1) - assert user3.main_photo is photo_mock + assert user3.main_photo is main_photo_mock + assert user3.credit_card is credit_card_mock Factory providers and attribute injections diff --git a/examples/providers/factory_init_context_injections.py b/examples/providers/factory_init_context_injections.py deleted file mode 100644 index 8349c877..00000000 --- a/examples/providers/factory_init_context_injections.py +++ /dev/null @@ -1,52 +0,0 @@ -"""`Factory` providers with init injections and context arguments example.""" - -from objects.providers import Factory -from objects.injections import KwArg - - -class User(object): - - """Example class User.""" - - def __init__(self, id, main_photo): - """Initializer. - - :param id: int - :param main_photo: Photo - :return: - """ - self.id = id - self.main_photo = main_photo - super(User, self).__init__() - - -class Photo(object): - - """Example class Photo.""" - - -# User and Photo factories: -photos_factory = Factory(Photo) -users_factory = Factory(User, - KwArg('main_photo', photos_factory)) - -# Creating several User objects: -user1 = users_factory(1) # Same as: User(1, main_photo=Photo()) -user2 = users_factory(2) # Same as: User(2, main_photo=Photo()) - -# Making some asserts: -assert user1.id == 1 -assert user2.id == 2 -assert user1 is not user2 -assert isinstance(user1.main_photo, Photo) -assert isinstance(user2.main_photo, Photo) -assert user1.main_photo is not user2.main_photo - -# Context keyword arguments have priority on KwArg injections priority: -photo_mock = Photo() - -user3 = users_factory(3, main_photo=photo_mock) - -assert user3.id == 3 -assert user3 not in (user2, user1) -assert user3.main_photo is photo_mock diff --git a/examples/providers/factory_init_injections.py b/examples/providers/factory_init_injections.py index 9bccb0ec..02d79998 100644 --- a/examples/providers/factory_init_injections.py +++ b/examples/providers/factory_init_injections.py @@ -6,21 +6,15 @@ from objects.injections import KwArg class User(object): - """Example class User. + """Example class User.""" - Class User has dependencies on class Photo and class CreditCard objects, - that have to be provided as init arguments. - """ - - def __init__(self, main_photo, credit_card): + def __init__(self, main_photo): """Initializer. :param main_photo: Photo - :param credit_card: CreditCard :return: """ self.main_photo = main_photo - self.credit_card = credit_card super(User, self).__init__() @@ -29,25 +23,21 @@ class Photo(object): """Example class Photo.""" -class CreditCard(object): - - """Example class CreditCard.""" - - -# User, Photo and CreditCard factories: -credit_cards_factory = Factory(CreditCard) +# User and Photo factories: photos_factory = Factory(Photo) users_factory = Factory(User, - KwArg('main_photo', photos_factory), - KwArg('credit_card', credit_cards_factory)) + KwArg('main_photo', photos_factory)) # Creating several User objects: -user1 = users_factory() # Same as: User(main_photo=Photo(), - # credit_card=CreditCard()) -user2 = users_factory() # Same as: User(main_photo=Photo(), - # credit_card=CreditCard()) +user1 = users_factory() # Same as: User(main_photo=Photo()) +user2 = users_factory() # Same as: User(main_photo=Photo()) # Making some asserts: +assert isinstance(user1, User) +assert isinstance(user1.main_photo, Photo) + +assert isinstance(user2, User) +assert isinstance(user2.main_photo, Photo) + assert user1 is not user2 assert user1.main_photo is not user2.main_photo -assert user1.credit_card is not user2.credit_card diff --git a/examples/providers/factory_init_injections_and_contexts.py b/examples/providers/factory_init_injections_and_contexts.py new file mode 100644 index 00000000..de78273a --- /dev/null +++ b/examples/providers/factory_init_injections_and_contexts.py @@ -0,0 +1,79 @@ +"""`Factory` providers with init injections and context arguments example.""" + +from objects.providers import Factory +from objects.injections import KwArg + + +class User(object): + + """Example class User. + + Class User has to be provided with user id. + + Also Class User has dependencies on class Photo and class CreditCard + objects. + + All of the dependencies have to be provided like __init__ arguments. + """ + + def __init__(self, id, main_photo, credit_card): + """Initializer. + + :param id: int + :param main_photo: Photo + :param credit_card: CreditCard + :return: + """ + self.id = id + self.main_photo = main_photo + self.credit_card = credit_card + super(User, self).__init__() + + +class Photo(object): + + """Example class Photo.""" + + +class CreditCard(object): + + """Example class CreditCard.""" + + +# User, Photo and CreditCard factories: +credit_cards_factory = Factory(CreditCard) +photos_factory = Factory(Photo) +users_factory = Factory(User, + KwArg('main_photo', photos_factory), + KwArg('credit_card', credit_cards_factory)) + +# Creating several User objects: +user1 = users_factory(1) # Same as: User(1, + # main_photo=Photo(), + # credit_card=CreditCard()) +user2 = users_factory(2) # Same as: User(2, + # main_photo=Photo(), + # credit_card=CreditCard()) + +# Making some asserts: +assert user1.id == 1 +assert isinstance(user1.main_photo, Photo) +assert isinstance(user1.credit_card, CreditCard) + +assert user2.id == 2 +assert isinstance(user2.main_photo, Photo) +assert isinstance(user2.credit_card, CreditCard) + +assert user1.main_photo is not user2.main_photo +assert user1.credit_card is not user2.credit_card + +# Context keyword arguments have priority on KwArg injections priority: +main_photo_mock = Photo() +credit_card_mock = CreditCard() + +user3 = users_factory(3, main_photo=main_photo_mock, + credit_card=credit_card_mock) + +assert user3.id == 3 +assert user3.main_photo is main_photo_mock +assert user3.credit_card is credit_card_mock From bb7cfcc124d6d33215d8319cf05c2a59aca5adcd Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Mon, 8 Jun 2015 11:33:27 +0300 Subject: [PATCH 27/73] Finishing of Factory provider docs --- docs/images/factory_attribute_injections.png | Bin 0 -> 6366 bytes docs/images/factory_init_injections.png | Bin 0 -> 4112 bytes .../factory_init_injections_and_contexts.png | Bin 0 -> 7370 bytes docs/images/factory_method_injections.png | Bin 0 -> 8747 bytes docs/providers.rst | 158 ++++++++++++++++-- .../providers/factory_attribute_injections.py | 52 ++++++ examples/providers/factory_init_injections.py | 4 +- .../factory_init_injections_and_contexts.py | 12 +- .../providers/factory_method_injections.py | 60 +++++++ 9 files changed, 268 insertions(+), 18 deletions(-) create mode 100644 docs/images/factory_attribute_injections.png create mode 100644 docs/images/factory_init_injections.png create mode 100644 docs/images/factory_init_injections_and_contexts.png create mode 100644 docs/images/factory_method_injections.png create mode 100644 examples/providers/factory_attribute_injections.py create mode 100644 examples/providers/factory_method_injections.py diff --git a/docs/images/factory_attribute_injections.png b/docs/images/factory_attribute_injections.png new file mode 100644 index 0000000000000000000000000000000000000000..29b982510cae00ed543e0e8555e80537c7fc305e GIT binary patch literal 6366 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 bC$}d7|6E`Wq3nAsK&P+sK)dvgUHHEN|G>}r literal 0 HcmV?d00001 diff --git a/docs/images/factory_init_injections.png b/docs/images/factory_init_injections.png new file mode 100644 index 0000000000000000000000000000000000000000..31ddc5b77e14da81ff5e558ffdc24fbac2076f5f GIT binary patch literal 4112 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 Q?m0jZdM4NFbZ_4K7b&}hYybcN literal 0 HcmV?d00001 diff --git a/docs/images/factory_init_injections_and_contexts.png b/docs/images/factory_init_injections_and_contexts.png new file mode 100644 index 0000000000000000000000000000000000000000..a3328ed00ceb77c36fa18bc30df5aa26edce29d6 GIT binary patch literal 7370 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 R#Y!?DQ;<`UErGr8|2KeBw50$5 literal 0 HcmV?d00001 diff --git a/docs/images/factory_method_injections.png b/docs/images/factory_method_injections.png new file mode 100644 index 0000000000000000000000000000000000000000..95a44af706bacc859c92f6481a847537928ab125 GIT binary patch literal 8747 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 bf9YuN|33>fNVYiK2;ga|={`lMJb(Kii-q>! literal 0 HcmV?d00001 diff --git a/docs/providers.rst b/docs/providers.rst index 84f96890..55f665a9 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -72,6 +72,8 @@ Example below shows how to create ``Factory`` of particular class with ``__init__`` keyword argument injections which injectable values are also provided by another factories: +.. image:: images/factory_init_injections.png + .. code-block:: python """`Factory` providers with init injections example.""" @@ -105,8 +107,8 @@ provided by another factories: KwArg('main_photo', photos_factory)) # Creating several User objects: - user1 = users_factory() # Same as: User(main_photo=Photo()) - user2 = users_factory() # Same as: User(main_photo=Photo()) + user1 = users_factory() # Same as: user1 = User(main_photo=Photo()) + user2 = users_factory() # Same as: user2 = User(main_photo=Photo()) # Making some asserts: assert isinstance(user1, User) @@ -125,6 +127,8 @@ passes positional context arguments to class's ``__init__`` method, but keyword context arguments have priority on ``KwArg`` injections (this could be useful for testing). So, please, follow the example below: +.. image:: images/factory_init_injections_and_contexts.png + .. code-block:: python """`Factory` providers with init injections and context arguments example.""" @@ -177,12 +181,12 @@ useful for testing). So, please, follow the example below: KwArg('credit_card', credit_cards_factory)) # Creating several User objects: - user1 = users_factory(1) # Same as: User(1, - # main_photo=Photo(), - # credit_card=CreditCard()) - user2 = users_factory(2) # Same as: User(2, - # main_photo=Photo(), - # credit_card=CreditCard()) + user1 = users_factory(1) # Same as: user1 = User(1, + # main_photo=Photo(), + # credit_card=CreditCard()) + user2 = users_factory(2) # Same as: user2 = User(2, + # main_photo=Photo(), + # credit_card=CreditCard()) # Making some asserts: assert user1.id == 1 @@ -211,12 +215,146 @@ useful for testing). So, please, follow the example below: Factory providers and attribute injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Attributes example. +Example below shows how to create ``Factory`` of particular class with +attribute injections. Those injections are done by setting specified attributes +with injectable values right after object's creation. + +.. image:: images/factory_attribute_injections.png + +.. code-block:: python + + """`Factory` providers with attribute injections example.""" + + from objects.providers import Factory + from objects.injections import Attribute + + + class User(object): + + """Example class User.""" + + def __init__(self): + """Initializer.""" + self.main_photo = None + self.credit_card = None + + + class Photo(object): + + """Example class Photo.""" + + + class CreditCard(object): + + """Example class CreditCard.""" + + + # User, Photo and CreditCard factories: + credit_cards_factory = Factory(CreditCard) + photos_factory = Factory(Photo) + users_factory = Factory(User, + Attribute('main_photo', photos_factory), + Attribute('credit_card', credit_cards_factory)) + + # Creating several User objects: + user1 = users_factory() # Same as: user1 = User() + # user1.main_photo = Photo() + # user1.credit_card = CreditCard() + user2 = users_factory() # Same as: user2 = User() + # user2.main_photo = Photo() + # user2.credit_card = CreditCard() + + # Making some asserts: + assert user1 is not user2 + + assert isinstance(user1.main_photo, Photo) + assert isinstance(user1.credit_card, CreditCard) + + assert isinstance(user2.main_photo, Photo) + assert isinstance(user2.credit_card, CreditCard) + + assert user1.main_photo is not user2.main_photo + assert user1.credit_card is not user2.credit_card + Factory providers and method injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Method example. +Current example shows how to create ``Factory`` of particular class with +method injections. Those injections are done by calling of specified method +with injectable value right after object's creation and attribute injections +are done. + +Method injections are not very popular in Python due Python best practices +(usage of public attributes instead of setter methods), but it may appear in +some cases. + +.. image:: images/factory_method_injections.png + +.. code-block:: python + + """`Factory` providers with method injections example.""" + + from objects.providers import Factory + from objects.injections import Method + + + class User(object): + + """Example class User.""" + + def __init__(self): + """Initializer.""" + self.main_photo = None + self.credit_card = None + + def set_main_photo(self, photo): + """Set user's main photo.""" + self.main_photo = photo + + def set_credit_card(self, credit_card): + """Set user's credit card.""" + self.credit_card = credit_card + + + class Photo(object): + + """Example class Photo.""" + + + class CreditCard(object): + + """Example class CreditCard.""" + + + # User, Photo and CreditCard factories: + credit_cards_factory = Factory(CreditCard) + photos_factory = Factory(Photo) + users_factory = Factory(User, + Method('set_main_photo', photos_factory), + Method('set_credit_card', credit_cards_factory)) + + # Creating several User objects: + user1 = users_factory() # Same as: user1 = User() + # user1.set_main_photo(Photo()) + # user1.set_credit_card(CreditCard()) + user2 = users_factory() # Same as: user2 = User() + # user2.set_main_photo(Photo()) + # user2.set_credit_card(CreditCard()) + + # Making some asserts: + assert user1 is not user2 + + assert isinstance(user1.main_photo, Photo) + assert isinstance(user1.credit_card, CreditCard) + + assert isinstance(user2.main_photo, Photo) + assert isinstance(user2.credit_card, CreditCard) + + assert user1.main_photo is not user2.main_photo + assert user1.credit_card is not user2.credit_card + + Instance providers & Injections ------------------------------- diff --git a/examples/providers/factory_attribute_injections.py b/examples/providers/factory_attribute_injections.py new file mode 100644 index 00000000..1e5f1e79 --- /dev/null +++ b/examples/providers/factory_attribute_injections.py @@ -0,0 +1,52 @@ +"""`Factory` providers with attribute injections example.""" + +from objects.providers import Factory +from objects.injections import Attribute + + +class User(object): + + """Example class User.""" + + def __init__(self): + """Initializer.""" + self.main_photo = None + self.credit_card = None + + +class Photo(object): + + """Example class Photo.""" + + +class CreditCard(object): + + """Example class CreditCard.""" + + +# User, Photo and CreditCard factories: +credit_cards_factory = Factory(CreditCard) +photos_factory = Factory(Photo) +users_factory = Factory(User, + Attribute('main_photo', photos_factory), + Attribute('credit_card', credit_cards_factory)) + +# Creating several User objects: +user1 = users_factory() # Same as: user1 = User() + # user1.main_photo = Photo() + # user1.credit_card = CreditCard() +user2 = users_factory() # Same as: user2 = User() + # user2.main_photo = Photo() + # user2.credit_card = CreditCard() + +# Making some asserts: +assert user1 is not user2 + +assert isinstance(user1.main_photo, Photo) +assert isinstance(user1.credit_card, CreditCard) + +assert isinstance(user2.main_photo, Photo) +assert isinstance(user2.credit_card, CreditCard) + +assert user1.main_photo is not user2.main_photo +assert user1.credit_card is not user2.credit_card diff --git a/examples/providers/factory_init_injections.py b/examples/providers/factory_init_injections.py index 02d79998..9d068ed3 100644 --- a/examples/providers/factory_init_injections.py +++ b/examples/providers/factory_init_injections.py @@ -29,8 +29,8 @@ users_factory = Factory(User, KwArg('main_photo', photos_factory)) # Creating several User objects: -user1 = users_factory() # Same as: User(main_photo=Photo()) -user2 = users_factory() # Same as: User(main_photo=Photo()) +user1 = users_factory() # Same as: user1 = User(main_photo=Photo()) +user2 = users_factory() # Same as: user2 = User(main_photo=Photo()) # Making some asserts: assert isinstance(user1, User) diff --git a/examples/providers/factory_init_injections_and_contexts.py b/examples/providers/factory_init_injections_and_contexts.py index de78273a..a43e5f5a 100644 --- a/examples/providers/factory_init_injections_and_contexts.py +++ b/examples/providers/factory_init_injections_and_contexts.py @@ -48,12 +48,12 @@ users_factory = Factory(User, KwArg('credit_card', credit_cards_factory)) # Creating several User objects: -user1 = users_factory(1) # Same as: User(1, - # main_photo=Photo(), - # credit_card=CreditCard()) -user2 = users_factory(2) # Same as: User(2, - # main_photo=Photo(), - # credit_card=CreditCard()) +user1 = users_factory(1) # Same as: user1 = User(1, + # main_photo=Photo(), + # credit_card=CreditCard()) +user2 = users_factory(2) # Same as: user2 = User(2, + # main_photo=Photo(), + # credit_card=CreditCard()) # Making some asserts: assert user1.id == 1 diff --git a/examples/providers/factory_method_injections.py b/examples/providers/factory_method_injections.py new file mode 100644 index 00000000..83897a52 --- /dev/null +++ b/examples/providers/factory_method_injections.py @@ -0,0 +1,60 @@ +"""`Factory` providers with method injections example.""" + +from objects.providers import Factory +from objects.injections import Method + + +class User(object): + + """Example class User.""" + + def __init__(self): + """Initializer.""" + self.main_photo = None + self.credit_card = None + + def set_main_photo(self, photo): + """Set user's main photo.""" + self.main_photo = photo + + def set_credit_card(self, credit_card): + """Set user's credit card.""" + self.credit_card = credit_card + + +class Photo(object): + + """Example class Photo.""" + + +class CreditCard(object): + + """Example class CreditCard.""" + + +# User, Photo and CreditCard factories: +credit_cards_factory = Factory(CreditCard) +photos_factory = Factory(Photo) +users_factory = Factory(User, + Method('set_main_photo', photos_factory), + Method('set_credit_card', credit_cards_factory)) + +# Creating several User objects: +user1 = users_factory() # Same as: user1 = User() + # user1.set_main_photo(Photo()) + # user1.set_credit_card(CreditCard()) +user2 = users_factory() # Same as: user2 = User() + # user2.set_main_photo(Photo()) + # user2.set_credit_card(CreditCard()) + +# Making some asserts: +assert user1 is not user2 + +assert isinstance(user1.main_photo, Photo) +assert isinstance(user1.credit_card, CreditCard) + +assert isinstance(user2.main_photo, Photo) +assert isinstance(user2.credit_card, CreditCard) + +assert user1.main_photo is not user2.main_photo +assert user1.credit_card is not user2.credit_card From 3123574cf644e528ef6805bdef05f14d68de24bb Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Wed, 10 Jun 2015 09:53:15 +0300 Subject: [PATCH 28/73] Changing provider docs structure --- docs/{providers.rst => _providers.rst} | 13 +- docs/index.rst | 2 +- docs/providers/factory.rst | 348 +++++++++++++++++++++++++ docs/providers/index.rst | 12 + 4 files changed, 370 insertions(+), 5 deletions(-) rename docs/{providers.rst => _providers.rst} (98%) create mode 100644 docs/providers/factory.rst create mode 100644 docs/providers/index.rst diff --git a/docs/providers.rst b/docs/_providers.rst similarity index 98% rename from docs/providers.rst rename to docs/_providers.rst index 55f665a9..a316d4dd 100644 --- a/docs/providers.rst +++ b/docs/_providers.rst @@ -72,7 +72,7 @@ Example below shows how to create ``Factory`` of particular class with ``__init__`` keyword argument injections which injectable values are also provided by another factories: -.. image:: images/factory_init_injections.png +.. image:: ../images/factory_init_injections.png .. code-block:: python @@ -127,7 +127,7 @@ passes positional context arguments to class's ``__init__`` method, but keyword context arguments have priority on ``KwArg`` injections (this could be useful for testing). So, please, follow the example below: -.. image:: images/factory_init_injections_and_contexts.png +.. image:: ../images/factory_init_injections_and_contexts.png .. code-block:: python @@ -219,7 +219,7 @@ Example below shows how to create ``Factory`` of particular class with attribute injections. Those injections are done by setting specified attributes with injectable values right after object's creation. -.. image:: images/factory_attribute_injections.png +.. image:: ../images/factory_attribute_injections.png .. code-block:: python @@ -289,7 +289,7 @@ Method injections are not very popular in Python due Python best practices (usage of public attributes instead of setter methods), but it may appear in some cases. -.. image:: images/factory_method_injections.png +.. image:: ../images/factory_method_injections.png .. code-block:: python @@ -355,6 +355,11 @@ some cases. assert user1.credit_card is not user2.credit_card +Singleton providers +------------------- + +``Singleton`` provider creates new instance of specified class on first call +and returns same instance on every next call. Instance providers & Injections ------------------------------- diff --git a/docs/index.rst b/docs/index.rst index ad7a2c2b..c35ee4de 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,7 +38,7 @@ Contents introduction installation - providers + providers/index injections catalogs decorators diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst new file mode 100644 index 00000000..0388cc5b --- /dev/null +++ b/docs/providers/factory.rst @@ -0,0 +1,348 @@ +Factory providers +----------------- + +``Factory`` provider creates new instance of specified class on every call. + +Nothing could be better than brief example: + +.. code-block:: python + + """`Factory` providers example.""" + + from objects.providers import Factory + + + class User(object): + + """Example class User.""" + + + # Factory provider creates new instance of specified class on every call. + users_factory = Factory(User) + + user1 = users_factory() + user2 = users_factory() + + assert user1 is not user2 + assert isinstance(user1, User) and isinstance(user2, User) + + +Factory providers and injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Objects can take dependencies in different forms. Some objects take init +arguments, other are using attributes setting or method calls to be +initialized. It affects how such objects need to be created and initialized, +and that is the place where ``objects.injections`` need to be used. + +``Factory`` provider takes various number of positional arguments, that define +what kind of dependency injections need to be done. + +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 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 +done. + + +Factory providers and __init__ injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Example below shows how to create ``Factory`` of particular class with +``__init__`` keyword argument injections which injectable values are also +provided by another factories: + +.. image:: /images/factory_init_injections.png + +.. code-block:: python + + """`Factory` providers with init injections example.""" + + from objects.providers import Factory + from objects.injections import KwArg + + + class User(object): + + """Example class User.""" + + def __init__(self, main_photo): + """Initializer. + + :param main_photo: Photo + :return: + """ + self.main_photo = main_photo + super(User, self).__init__() + + + class Photo(object): + + """Example class Photo.""" + + + # User and Photo factories: + photos_factory = Factory(Photo) + users_factory = Factory(User, + KwArg('main_photo', photos_factory)) + + # Creating several User objects: + user1 = users_factory() # Same as: user1 = User(main_photo=Photo()) + user2 = users_factory() # Same as: user2 = User(main_photo=Photo()) + + # Making some asserts: + assert isinstance(user1, User) + assert isinstance(user1.main_photo, Photo) + + assert isinstance(user2, User) + assert isinstance(user2.main_photo, Photo) + + assert user1 is not user2 + assert user1.main_photo is not user2.main_photo + + +Next example shows how ``Factory`` provider deals with positional and keyword +``__init__`` context arguments. In few words, ``Factory`` provider fully +passes positional context arguments to class's ``__init__`` method, but +keyword context arguments have priority on ``KwArg`` injections (this could be +useful for testing). So, please, follow the example below: + +.. image:: /images/factory_init_injections_and_contexts.png + +.. code-block:: python + + """`Factory` providers with init injections and context arguments example.""" + + from objects.providers import Factory + from objects.injections import KwArg + + + class User(object): + + """Example class User. + + Class User has to be provided with user id. + + Also Class User has dependencies on class Photo and class CreditCard + objects. + + All of the dependencies have to be provided like __init__ arguments. + """ + + def __init__(self, id, main_photo, credit_card): + """Initializer. + + :param id: int + :param main_photo: Photo + :param credit_card: CreditCard + :return: + """ + self.id = id + self.main_photo = main_photo + self.credit_card = credit_card + super(User, self).__init__() + + + class Photo(object): + + """Example class Photo.""" + + + class CreditCard(object): + + """Example class CreditCard.""" + + + # User, Photo and CreditCard factories: + credit_cards_factory = Factory(CreditCard) + photos_factory = Factory(Photo) + users_factory = Factory(User, + KwArg('main_photo', photos_factory), + KwArg('credit_card', credit_cards_factory)) + + # Creating several User objects: + user1 = users_factory(1) # Same as: user1 = User(1, + # main_photo=Photo(), + # credit_card=CreditCard()) + user2 = users_factory(2) # Same as: user2 = User(2, + # main_photo=Photo(), + # credit_card=CreditCard()) + + # Making some asserts: + assert user1.id == 1 + assert isinstance(user1.main_photo, Photo) + assert isinstance(user1.credit_card, CreditCard) + + assert user2.id == 2 + assert isinstance(user2.main_photo, Photo) + assert isinstance(user2.credit_card, CreditCard) + + assert user1.main_photo is not user2.main_photo + assert user1.credit_card is not user2.credit_card + + # Context keyword arguments have priority on KwArg injections priority: + main_photo_mock = Photo() + credit_card_mock = CreditCard() + + user3 = users_factory(3, main_photo=main_photo_mock, + credit_card=credit_card_mock) + + assert user3.id == 3 + assert user3.main_photo is main_photo_mock + assert user3.credit_card is credit_card_mock + + +Factory providers and attribute injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Example below shows how to create ``Factory`` of particular class with +attribute injections. Those injections are done by setting specified attributes +with injectable values right after object's creation. + +.. image:: /images/factory_attribute_injections.png + +.. code-block:: python + + """`Factory` providers with attribute injections example.""" + + from objects.providers import Factory + from objects.injections import Attribute + + + class User(object): + + """Example class User.""" + + def __init__(self): + """Initializer.""" + self.main_photo = None + self.credit_card = None + + + class Photo(object): + + """Example class Photo.""" + + + class CreditCard(object): + + """Example class CreditCard.""" + + + # User, Photo and CreditCard factories: + credit_cards_factory = Factory(CreditCard) + photos_factory = Factory(Photo) + users_factory = Factory(User, + Attribute('main_photo', photos_factory), + Attribute('credit_card', credit_cards_factory)) + + # Creating several User objects: + user1 = users_factory() # Same as: user1 = User() + # user1.main_photo = Photo() + # user1.credit_card = CreditCard() + user2 = users_factory() # Same as: user2 = User() + # user2.main_photo = Photo() + # user2.credit_card = CreditCard() + + # Making some asserts: + assert user1 is not user2 + + assert isinstance(user1.main_photo, Photo) + assert isinstance(user1.credit_card, CreditCard) + + assert isinstance(user2.main_photo, Photo) + assert isinstance(user2.credit_card, CreditCard) + + assert user1.main_photo is not user2.main_photo + assert user1.credit_card is not user2.credit_card + + +Factory providers and method injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Current example shows how to create ``Factory`` of particular class with +method injections. Those injections are done by calling of specified method +with injectable value right after object's creation and attribute injections +are done. + +Method injections are not very popular in Python due Python best practices +(usage of public attributes instead of setter methods), but it may appear in +some cases. + +.. image:: /images/factory_method_injections.png + +.. code-block:: python + + """`Factory` providers with method injections example.""" + + from objects.providers import Factory + from objects.injections import Method + + + class User(object): + + """Example class User.""" + + def __init__(self): + """Initializer.""" + self.main_photo = None + self.credit_card = None + + def set_main_photo(self, photo): + """Set user's main photo.""" + self.main_photo = photo + + def set_credit_card(self, credit_card): + """Set user's credit card.""" + self.credit_card = credit_card + + + class Photo(object): + + """Example class Photo.""" + + + class CreditCard(object): + + """Example class CreditCard.""" + + + # User, Photo and CreditCard factories: + credit_cards_factory = Factory(CreditCard) + photos_factory = Factory(Photo) + users_factory = Factory(User, + Method('set_main_photo', photos_factory), + Method('set_credit_card', credit_cards_factory)) + + # Creating several User objects: + user1 = users_factory() # Same as: user1 = User() + # user1.set_main_photo(Photo()) + # user1.set_credit_card(CreditCard()) + user2 = users_factory() # Same as: user2 = User() + # user2.set_main_photo(Photo()) + # user2.set_credit_card(CreditCard()) + + # Making some asserts: + assert user1 is not user2 + + assert isinstance(user1.main_photo, Photo) + assert isinstance(user1.credit_card, CreditCard) + + assert isinstance(user2.main_photo, Photo) + assert isinstance(user2.credit_card, CreditCard) + + assert user1.main_photo is not user2.main_photo + assert user1.credit_card is not user2.credit_card + diff --git a/docs/providers/index.rst b/docs/providers/index.rst new file mode 100644 index 00000000..92a9a0d1 --- /dev/null +++ b/docs/providers/index.rst @@ -0,0 +1,12 @@ +Providers +========= + +Providers are strategies of accessing objects. + +All providers are callable. They describe how particular objects are provided. + +.. toctree:: + :maxdepth: 2 + :glob: + + * From d386969004db70904ccb3786906fe0e0748d216d Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Wed, 10 Jun 2015 12:00:43 +0300 Subject: [PATCH 29/73] Adding Singleton docs & making some changes for Factory docs --- docs/_providers.rst | 486 ----------------------- docs/providers/factory.rst | 2 + docs/providers/singleton.rst | 97 +++++ examples/providers/factory.py | 2 + examples/providers/singleton.py | 22 + examples/providers/singleton_reseting.py | 31 ++ 6 files changed, 154 insertions(+), 486 deletions(-) create mode 100644 docs/providers/singleton.rst create mode 100644 examples/providers/singleton.py create mode 100644 examples/providers/singleton_reseting.py diff --git a/docs/_providers.rst b/docs/_providers.rst index a316d4dd..a4aa7394 100644 --- a/docs/_providers.rst +++ b/docs/_providers.rst @@ -1,492 +1,6 @@ Providers ========= -Providers are strategies of accessing objects. - -All providers are callable. They describe how particular objects are provided. - - -Factory providers ------------------ - -``Factory`` provider creates new instance of specified class on every call. - -Nothing could be better than brief example: - -.. code-block:: python - - """`Factory` providers example.""" - - from objects.providers import Factory - - - class User(object): - - """Example class User.""" - - - # Factory provider creates new instance of specified class on every call. - users_factory = Factory(User) - - user1 = users_factory() - user2 = users_factory() - - assert user1 is not user2 - assert isinstance(user1, User) and isinstance(user2, User) - - -Factory providers and injections -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Objects can take dependencies in different forms. Some objects take init -arguments, other are using attributes setting or method calls to be -initialized. It affects how such objects need to be created and initialized, -and that is the place where ``objects.injections`` need to be used. - -``Factory`` provider takes various number of positional arguments, that define -what kind of dependency injections need to be done. - -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 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 -done. - - -Factory providers and __init__ injections -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Example below shows how to create ``Factory`` of particular class with -``__init__`` keyword argument injections which injectable values are also -provided by another factories: - -.. image:: ../images/factory_init_injections.png - -.. code-block:: python - - """`Factory` providers with init injections example.""" - - from objects.providers import Factory - from objects.injections import KwArg - - - class User(object): - - """Example class User.""" - - def __init__(self, main_photo): - """Initializer. - - :param main_photo: Photo - :return: - """ - self.main_photo = main_photo - super(User, self).__init__() - - - class Photo(object): - - """Example class Photo.""" - - - # User and Photo factories: - photos_factory = Factory(Photo) - users_factory = Factory(User, - KwArg('main_photo', photos_factory)) - - # Creating several User objects: - user1 = users_factory() # Same as: user1 = User(main_photo=Photo()) - user2 = users_factory() # Same as: user2 = User(main_photo=Photo()) - - # Making some asserts: - assert isinstance(user1, User) - assert isinstance(user1.main_photo, Photo) - - assert isinstance(user2, User) - assert isinstance(user2.main_photo, Photo) - - assert user1 is not user2 - assert user1.main_photo is not user2.main_photo - - -Next example shows how ``Factory`` provider deals with positional and keyword -``__init__`` context arguments. In few words, ``Factory`` provider fully -passes positional context arguments to class's ``__init__`` method, but -keyword context arguments have priority on ``KwArg`` injections (this could be -useful for testing). So, please, follow the example below: - -.. image:: ../images/factory_init_injections_and_contexts.png - -.. code-block:: python - - """`Factory` providers with init injections and context arguments example.""" - - from objects.providers import Factory - from objects.injections import KwArg - - - class User(object): - - """Example class User. - - Class User has to be provided with user id. - - Also Class User has dependencies on class Photo and class CreditCard - objects. - - All of the dependencies have to be provided like __init__ arguments. - """ - - def __init__(self, id, main_photo, credit_card): - """Initializer. - - :param id: int - :param main_photo: Photo - :param credit_card: CreditCard - :return: - """ - self.id = id - self.main_photo = main_photo - self.credit_card = credit_card - super(User, self).__init__() - - - class Photo(object): - - """Example class Photo.""" - - - class CreditCard(object): - - """Example class CreditCard.""" - - - # User, Photo and CreditCard factories: - credit_cards_factory = Factory(CreditCard) - photos_factory = Factory(Photo) - users_factory = Factory(User, - KwArg('main_photo', photos_factory), - KwArg('credit_card', credit_cards_factory)) - - # Creating several User objects: - user1 = users_factory(1) # Same as: user1 = User(1, - # main_photo=Photo(), - # credit_card=CreditCard()) - user2 = users_factory(2) # Same as: user2 = User(2, - # main_photo=Photo(), - # credit_card=CreditCard()) - - # Making some asserts: - assert user1.id == 1 - assert isinstance(user1.main_photo, Photo) - assert isinstance(user1.credit_card, CreditCard) - - assert user2.id == 2 - assert isinstance(user2.main_photo, Photo) - assert isinstance(user2.credit_card, CreditCard) - - assert user1.main_photo is not user2.main_photo - assert user1.credit_card is not user2.credit_card - - # Context keyword arguments have priority on KwArg injections priority: - main_photo_mock = Photo() - credit_card_mock = CreditCard() - - user3 = users_factory(3, main_photo=main_photo_mock, - credit_card=credit_card_mock) - - assert user3.id == 3 - assert user3.main_photo is main_photo_mock - assert user3.credit_card is credit_card_mock - - -Factory providers and attribute injections -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Example below shows how to create ``Factory`` of particular class with -attribute injections. Those injections are done by setting specified attributes -with injectable values right after object's creation. - -.. image:: ../images/factory_attribute_injections.png - -.. code-block:: python - - """`Factory` providers with attribute injections example.""" - - from objects.providers import Factory - from objects.injections import Attribute - - - class User(object): - - """Example class User.""" - - def __init__(self): - """Initializer.""" - self.main_photo = None - self.credit_card = None - - - class Photo(object): - - """Example class Photo.""" - - - class CreditCard(object): - - """Example class CreditCard.""" - - - # User, Photo and CreditCard factories: - credit_cards_factory = Factory(CreditCard) - photos_factory = Factory(Photo) - users_factory = Factory(User, - Attribute('main_photo', photos_factory), - Attribute('credit_card', credit_cards_factory)) - - # Creating several User objects: - user1 = users_factory() # Same as: user1 = User() - # user1.main_photo = Photo() - # user1.credit_card = CreditCard() - user2 = users_factory() # Same as: user2 = User() - # user2.main_photo = Photo() - # user2.credit_card = CreditCard() - - # Making some asserts: - assert user1 is not user2 - - assert isinstance(user1.main_photo, Photo) - assert isinstance(user1.credit_card, CreditCard) - - assert isinstance(user2.main_photo, Photo) - assert isinstance(user2.credit_card, CreditCard) - - assert user1.main_photo is not user2.main_photo - assert user1.credit_card is not user2.credit_card - - -Factory providers and method injections -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Current example shows how to create ``Factory`` of particular class with -method injections. Those injections are done by calling of specified method -with injectable value right after object's creation and attribute injections -are done. - -Method injections are not very popular in Python due Python best practices -(usage of public attributes instead of setter methods), but it may appear in -some cases. - -.. image:: ../images/factory_method_injections.png - -.. code-block:: python - - """`Factory` providers with method injections example.""" - - from objects.providers import Factory - from objects.injections import Method - - - class User(object): - - """Example class User.""" - - def __init__(self): - """Initializer.""" - self.main_photo = None - self.credit_card = None - - def set_main_photo(self, photo): - """Set user's main photo.""" - self.main_photo = photo - - def set_credit_card(self, credit_card): - """Set user's credit card.""" - self.credit_card = credit_card - - - class Photo(object): - - """Example class Photo.""" - - - class CreditCard(object): - - """Example class CreditCard.""" - - - # User, Photo and CreditCard factories: - credit_cards_factory = Factory(CreditCard) - photos_factory = Factory(Photo) - users_factory = Factory(User, - Method('set_main_photo', photos_factory), - Method('set_credit_card', credit_cards_factory)) - - # Creating several User objects: - user1 = users_factory() # Same as: user1 = User() - # user1.set_main_photo(Photo()) - # user1.set_credit_card(CreditCard()) - user2 = users_factory() # Same as: user2 = User() - # user2.set_main_photo(Photo()) - # user2.set_credit_card(CreditCard()) - - # Making some asserts: - assert user1 is not user2 - - assert isinstance(user1.main_photo, Photo) - assert isinstance(user1.credit_card, CreditCard) - - assert isinstance(user2.main_photo, Photo) - assert isinstance(user2.credit_card, CreditCard) - - assert user1.main_photo is not user2.main_photo - assert user1.credit_card is not user2.credit_card - - -Singleton providers -------------------- - -``Singleton`` provider creates new instance of specified class on first call -and returns same instance on every next call. - -Instance providers & Injections -------------------------------- - -Providers -~~~~~~~~~ - -*Instance* providers are providers that deal with object's creation and -initialization. - -There are few *Instance* providers: - - - ``Factory`` provider creates new instance of specified class on every - call. - - ``Singleton`` provider creates new instance of specified class on first - call and returns same instance on every next call. - -Example: - -.. code-block:: python - - """`Factory` and `Singleton` providers example.""" - - from objects.providers import Factory - from objects.providers import Singleton - - - # Factory provider creates new instance of specified class on every call. - object_factory = Factory(object) - - object_1 = object_factory() - object_2 = object_factory() - - assert object_1 is not object_2 - assert isinstance(object_1, object) and isinstance(object_2, object) - - # Singleton provider creates new instance of specified class on first call - # and returns same instance on every next call. - single_object = Singleton(object) - - single_object_1 = single_object() - single_object_2 = single_object() - - assert single_object_1 is single_object_2 - assert isinstance(object_1, object) and isinstance(object_2, object) - - - -Injections -~~~~~~~~~~ - -Objects can take dependencies in various forms. Some objects take init -arguments, other are using attributes or methods to be initialized. It affects -how such objects need to be created and initialized, and that is the place -where *Injections* need to be used. - -In terms of computer science, *Injection of dependency* is a way how -dependency can be coupled with dependent object. - -In terms of *Objects*, *Injection* is an instruction how to provide -dependency for the particular provider. - -Every Python object could be an injection's value. Special case is an *Objects* -provider as an injection's value. In such case, injection value is a result of -injectable provider call (every time injection is done). - -There are several types of injections. Below is a description of how they are -used by instance providers: - - - ``KwArg`` - is injected in object's ``__init__()`` method in time of - object's initialization via keyword argument. - - ``Attribute`` - is injected into object's attribute (not class attribute) - after object's initialization. - - ``Method`` - is injected into object method's call after objects - initialization. - -Example: - -.. code-block:: python - - """`Factory` and `Singleton` providers with injections example.""" - - import sqlite3 - - from objects.providers import Singleton - from objects.providers import Factory - - from objects.injections import KwArg - from objects.injections import Attribute - - - class ObjectA(object): - - """ObjectA has dependency on database.""" - - def __init__(self, database): - """Initializer. - - Database dependency need to be injected via init arg.""" - self.database = database - - def get_one(self): - """Select one from database and return it.""" - return self.database.execute('SELECT 1').fetchone()[0] - - - # Database and `ObjectA` providers. - database = Singleton(sqlite3.Connection, - KwArg('database', ':memory:'), - KwArg('timeout', 30), - KwArg('detect_types', True), - KwArg('isolation_level', 'EXCLUSIVE'), - Attribute('row_factory', sqlite3.Row)) - - object_a_factory = Factory(ObjectA, - KwArg('database', database)) - - # Creating several `ObjectA` instances. - object_a_1 = object_a_factory() - object_a_2 = object_a_factory() - - # Making some asserts. - assert object_a_1 is not object_a_2 - assert object_a_1.database is object_a_2.database is database() - assert object_a_1.get_one() == object_a_2.get_one() == 1 - - Static providers ---------------- diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index 0388cc5b..3d20e5a2 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -20,9 +20,11 @@ Nothing could be better than brief example: # Factory provider creates new instance of specified class on every call. 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) diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst new file mode 100644 index 00000000..4c26b09b --- /dev/null +++ b/docs/providers/singleton.rst @@ -0,0 +1,97 @@ +Singleton providers +------------------- + +``Singleton`` provider creates new instance of specified class on first call +and returns same instance on every next call. + +.. code-block:: python + + """`Singleton` providers example.""" + + from objects.providers import Singleton + + + class UserService(object): + + """Example class UserService.""" + + + # Singleton provider creates new instance of specified class on first call and + # returns same instance on every next call. + users_service_provider = Singleton(UserService) + + # Retrieving several UserService objects: + user_service1 = users_service_provider() + user_service2 = users_service_provider() + + # Making some asserts: + assert user_service1 is user_service2 + assert isinstance(user_service1, UserService) + assert isinstance(user_service2, UserService) + + +Singleton providers and injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``Singleton`` providers use ``Factory`` providers for first creation of +specified class instance, so, all of the rules about injections are the same, +as for ``Factory`` providers. + +.. note:: + + Due that ``Singleton`` provider creates specified class instance only on + the first call, all injections are done once, during the first call, also. + Every next call, while instance has been already created and memorized, no + injections are done, ``Singleton`` provider just returns memorized earlier + instance. + + This may cause some problems, for example, in case of trying to bind + ``Factory`` provider with ``Singleton`` provider (provided by dependent + ``Factory`` instance will be injected only once, during the first call). + Be aware that such behaviour was made with opened eyes and is not a bug. + + By the way, in such case, ``Delegate`` provider can be useful. It makes + possible to inject providers *as is*. Please check out full example in + *Providers delegation* section. + +Singleton providers resetting +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Created and memorized by ``Singleton`` instance can be reset. Reset of +``Singleton``'s memorized instance is done by clearing reference to it. Further +lifecycle of memorized instance is out of ``Singleton`` provider's control. + +.. code-block:: python + + """`Singleton` providers resetting example.""" + + from objects.providers import Singleton + + + class UserService(object): + + """Example class UserService.""" + + + # Singleton provider creates new instance of specified class on first call and + # returns same instance on every next call. + users_service_provider = Singleton(UserService) + + # Retrieving several UserService objects: + user_service1 = users_service_provider() + user_service2 = users_service_provider() + + # Making some asserts: + assert user_service1 is user_service2 + assert isinstance(user_service1, UserService) + assert isinstance(user_service2, UserService) + + # Resetting of memorized instance: + users_service_provider.reset() + + # Retrieving one more UserService object: + user_service3 = users_service_provider() + + # Making some asserts: + assert user_service3 is not user_service1 + diff --git a/examples/providers/factory.py b/examples/providers/factory.py index 63dbbff8..35532b4b 100644 --- a/examples/providers/factory.py +++ b/examples/providers/factory.py @@ -11,8 +11,10 @@ class User(object): # Factory provider creates new instance of specified class on every call. 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) diff --git a/examples/providers/singleton.py b/examples/providers/singleton.py new file mode 100644 index 00000000..1f287b58 --- /dev/null +++ b/examples/providers/singleton.py @@ -0,0 +1,22 @@ +"""`Singleton` providers example.""" + +from objects.providers import Singleton + + +class UserService(object): + + """Example class UserService.""" + + +# Singleton provider creates new instance of specified class on first call and +# returns same instance on every next call. +users_service_provider = Singleton(UserService) + +# Retrieving several UserService objects: +user_service1 = users_service_provider() +user_service2 = users_service_provider() + +# Making some asserts: +assert user_service1 is user_service2 +assert isinstance(user_service1, UserService) +assert isinstance(user_service2, UserService) diff --git a/examples/providers/singleton_reseting.py b/examples/providers/singleton_reseting.py new file mode 100644 index 00000000..efe2bd88 --- /dev/null +++ b/examples/providers/singleton_reseting.py @@ -0,0 +1,31 @@ +"""`Singleton` providers resetting example.""" + +from objects.providers import Singleton + + +class UserService(object): + + """Example class UserService.""" + + +# Singleton provider creates new instance of specified class on first call and +# returns same instance on every next call. +users_service_provider = Singleton(UserService) + +# Retrieving several UserService objects: +user_service1 = users_service_provider() +user_service2 = users_service_provider() + +# Making some asserts: +assert user_service1 is user_service2 +assert isinstance(user_service1, UserService) +assert isinstance(user_service2, UserService) + +# Resetting of memorized instance: +users_service_provider.reset() + +# Retrieving one more UserService object: +user_service3 = users_service_provider() + +# Making some asserts: +assert user_service3 is not user_service1 From 91ea2a54f67b562602f6a83ba07d41dd618c31e5 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 16 Jun 2015 10:37:57 +0300 Subject: [PATCH 30/73] Adding static provider docs --- docs/_providers.rst | 71 ------------------- docs/providers/index.rst | 5 +- docs/providers/static.rst | 42 +++++++++++ .../static.py} | 6 +- 4 files changed, 50 insertions(+), 74 deletions(-) create mode 100644 docs/providers/static.rst rename examples/{readme2/static_providers.py => providers/static.py} (74%) diff --git a/docs/_providers.rst b/docs/_providers.rst index a4aa7394..87a85e97 100644 --- a/docs/_providers.rst +++ b/docs/_providers.rst @@ -1,77 +1,6 @@ Providers ========= -Static providers ----------------- - -Static providers are family of providers that return their values "as is". -There are four of static providers: ``Class``, ``Object``, ``Function`` and -``Value``. All of them has the same behaviour, but usage of anyone is -predicted by readability and providable object's type. - -Example: - -.. code-block:: python - - """Static providers example.""" - - from objects.providers import Class - from objects.providers import Object - from objects.providers import Function - from objects.providers import Value - - - cls_provider = Class(object) - assert cls_provider() is object - - object_provider = Object(object()) - assert isinstance(object_provider(), object) - - function_provider = Function(len) - assert function_provider() is len - - value_provider = Value(123) - assert value_provider() == 123 - - -Callable providers ------------------- - -``Callable`` provider is a provider that decorates particular callable with -some injections. Every call of this provider returns result of call of initial -callable. - -Example: - -.. code-block:: python - - """`Callable` providers examples.""" - - from objects.providers import Callable - from objects.providers import Singleton - - from objects.injections import KwArg - - import sqlite3 - - - def some_function(arg, database): - """Example function that has input arg and dependency on database.""" - return database.execute('SELECT @1', [arg]).fetchone()[0] - - - # Database and `ObjectA` providers. - database = Singleton(sqlite3.Connection, - KwArg('database', ':memory:')) - - some_function = Callable(some_function, - KwArg('database', database)) - - # Some asserts. - assert some_function(1) == 1 - assert some_function(2) == 2 - assert some_function(2231) == 2231 - External dependency providers ----------------------------- diff --git a/docs/providers/index.rst b/docs/providers/index.rst index 92a9a0d1..a32ce952 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -7,6 +7,7 @@ All providers are callable. They describe how particular objects are provided. .. toctree:: :maxdepth: 2 - :glob: - * + factory + singleton + static diff --git a/docs/providers/static.rst b/docs/providers/static.rst new file mode 100644 index 00000000..bd61029e --- /dev/null +++ b/docs/providers/static.rst @@ -0,0 +1,42 @@ +Static providers +---------------- + +Static providers are family of providers that return their values "as is". +There are four types of static providers: + + - ``Class`` + - ``Object`` + - ``Function`` + - ``Value`` + +All of them have the same behaviour, but usage of anyone is predicted by +readability and providing object's type. + +Example: + +.. code-block:: python + + """`Static` providers example.""" + + from objects.providers import Class + from objects.providers import Object + from objects.providers import Function + from objects.providers import Value + + + # Provides class - `object` + cls_provider = Class(object) + assert cls_provider() is object + + # Provides object - `object()` + object_provider = Object(object()) + assert isinstance(object_provider(), object) + + # Provides function - `len` + function_provider = Function(len) + assert function_provider() is len + + # Provides value - `123` + value_provider = Value(123) + assert value_provider() == 123 + diff --git a/examples/readme2/static_providers.py b/examples/providers/static.py similarity index 74% rename from examples/readme2/static_providers.py rename to examples/providers/static.py index 7664d59b..42675e0f 100644 --- a/examples/readme2/static_providers.py +++ b/examples/providers/static.py @@ -1,4 +1,4 @@ -"""Static providers example.""" +"""`Static` providers example.""" from objects.providers import Class from objects.providers import Object @@ -6,14 +6,18 @@ from objects.providers import Function from objects.providers import Value +# Provides class - `object` cls_provider = Class(object) assert cls_provider() is object +# Provides object - `object()` object_provider = Object(object()) assert isinstance(object_provider(), object) +# Provides function - `len` function_provider = Function(len) assert function_provider() is len +# Provides value - `123` value_provider = Value(123) assert value_provider() == 123 From 7f439137d67867dcb5929e985587f7a813462f88 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 16 Jun 2015 11:05:12 +0300 Subject: [PATCH 31/73] Adding callable provider docs and some minor changes to factory docs --- docs/_providers.rst | 4 -- docs/providers/callable.rst | 64 ++++++++++++++++++++++++++ docs/providers/factory.rst | 4 +- docs/providers/index.rst | 1 + examples/providers/callable.py | 47 +++++++++++++++++++ examples/readme2/callable_providers.py | 26 ----------- 6 files changed, 114 insertions(+), 32 deletions(-) create mode 100644 docs/providers/callable.rst create mode 100644 examples/providers/callable.py delete mode 100644 examples/readme2/callable_providers.py diff --git a/docs/_providers.rst b/docs/_providers.rst index 87a85e97..f70a580f 100644 --- a/docs/_providers.rst +++ b/docs/_providers.rst @@ -164,7 +164,3 @@ Example: assert object_a_1 is not object_a_2 assert object_a_1.get_one() == object_a_2.get_one() == 2 - - - -.. _Constructor injection: http://en.wikipedia.org/wiki/Dependency_injection#Constructor_injection diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst new file mode 100644 index 00000000..9968818c --- /dev/null +++ b/docs/providers/callable.rst @@ -0,0 +1,64 @@ +Callable providers +------------------ + +``Callable`` provider is a provider that decorates particular callable with +some injections. Every call of this provider returns result of call of initial +callable. + +``Callable`` provider uses ``KwArg`` injections. ``KwArg`` injections are +done by passing injectable values like keyword arguments during call time. + +Context keyword arguments have higher priority than ``KwArg`` injections. + +Example: + +.. code-block:: python + + """`Callable` providers examples.""" + + from objects.providers import Callable + from objects.providers import Singleton + + from objects.injections import KwArg + + + class UserService(object): + + """Example class UserService.""" + + def get_by_id(self, id): + """Return user info by user id.""" + return {'id': id, 'login': 'example_user'} + + + def get_user_by_id(user_id, users_service): + """Example function that has input arg and dependency on database.""" + return users_service.get_by_id(user_id) + + + # UserService and get_user_by_id providers: + users_service = Singleton(UserService) + get_user_by_id = Callable(get_user_by_id, + KwArg('users_service', users_service)) + + # Making some asserts: + assert get_user_by_id(1) == {'id': 1, 'login': 'example_user'} + assert get_user_by_id(2) == {'id': 2, 'login': 'example_user'} + + + # Context keyword arguments priority example: + class UserServiceMock(object): + + """Example class UserService.""" + + def get_by_id(self, id): + """Return user info by user id.""" + return {'id': id, 'login': 'mock'} + + + user_service_mock = UserServiceMock() + + user3 = get_user_by_id(1, users_service=user_service_mock) + + assert user3 == {'id': 1, 'login': 'mock'} + diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index 3d20e5a2..d6ec5abe 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -48,8 +48,8 @@ injections that are used by ``Factory`` provider: ``__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 name and - injectable value. + 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. diff --git a/docs/providers/index.rst b/docs/providers/index.rst index a32ce952..7bb0970f 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -11,3 +11,4 @@ All providers are callable. They describe how particular objects are provided. factory singleton static + callable diff --git a/examples/providers/callable.py b/examples/providers/callable.py new file mode 100644 index 00000000..b3112569 --- /dev/null +++ b/examples/providers/callable.py @@ -0,0 +1,47 @@ +"""`Callable` providers examples.""" + +from objects.providers import Callable +from objects.providers import Singleton + +from objects.injections import KwArg + + +class UserService(object): + + """Example class UserService.""" + + def get_by_id(self, id): + """Return user info by user id.""" + return {'id': id, 'login': 'example_user'} + + +def get_user_by_id(user_id, users_service): + """Example function that has input arg and dependency on database.""" + return users_service.get_by_id(user_id) + + +# UserService and get_user_by_id providers: +users_service = Singleton(UserService) +get_user_by_id = Callable(get_user_by_id, + KwArg('users_service', users_service)) + +# Making some asserts: +assert get_user_by_id(1) == {'id': 1, 'login': 'example_user'} +assert get_user_by_id(2) == {'id': 2, 'login': 'example_user'} + + +# Context keyword arguments priority example: +class UserServiceMock(object): + + """Example class UserService.""" + + def get_by_id(self, id): + """Return user info by user id.""" + return {'id': id, 'login': 'mock'} + + +user_service_mock = UserServiceMock() + +user3 = get_user_by_id(1, users_service=user_service_mock) + +assert user3 == {'id': 1, 'login': 'mock'} diff --git a/examples/readme2/callable_providers.py b/examples/readme2/callable_providers.py deleted file mode 100644 index 97015bb9..00000000 --- a/examples/readme2/callable_providers.py +++ /dev/null @@ -1,26 +0,0 @@ -"""`Callable` providers examples.""" - -from objects.providers import Callable -from objects.providers import Singleton - -from objects.injections import KwArg - -import sqlite3 - - -def some_function(arg, database): - """Example function that has input arg and dependency on database.""" - return database.execute('SELECT @1', [arg]).fetchone()[0] - - -# Database and `ObjectA` providers. -database = Singleton(sqlite3.Connection, - KwArg('database', ':memory:')) - -some_function = Callable(some_function, - KwArg('database', database)) - -# Some asserts. -assert some_function(1) == 1 -assert some_function(2) == 2 -assert some_function(2231) == 2231 From ef41688e618839ddd59713a6de8c019c4a0f5388 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 18 Jun 2015 14:45:26 +0300 Subject: [PATCH 32/73] Minor fixes in singleton docs --- docs/providers/singleton.rst | 3 +-- examples/providers/singleton_reseting.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index 4c26b09b..1865cbb9 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -73,8 +73,7 @@ lifecycle of memorized instance is out of ``Singleton`` provider's control. """Example class UserService.""" - # Singleton provider creates new instance of specified class on first call and - # returns same instance on every next call. + # Users service singleton provider: users_service_provider = Singleton(UserService) # Retrieving several UserService objects: diff --git a/examples/providers/singleton_reseting.py b/examples/providers/singleton_reseting.py index efe2bd88..a35fc6a8 100644 --- a/examples/providers/singleton_reseting.py +++ b/examples/providers/singleton_reseting.py @@ -8,8 +8,7 @@ class UserService(object): """Example class UserService.""" -# Singleton provider creates new instance of specified class on first call and -# returns same instance on every next call. +# Users service singleton provider: users_service_provider = Singleton(UserService) # Retrieving several UserService objects: From dbc368d5f621898d06b3d717165c3e27c309d563 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 18 Jun 2015 14:55:13 +0300 Subject: [PATCH 33/73] Minor updates for static provider docs --- docs/providers/static.rst | 8 ++++---- examples/providers/static.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/providers/static.rst b/docs/providers/static.rst index bd61029e..c9e2d5df 100644 --- a/docs/providers/static.rst +++ b/docs/providers/static.rst @@ -24,19 +24,19 @@ Example: from objects.providers import Value - # Provides class - `object` + # Provides class - `object`: cls_provider = Class(object) assert cls_provider() is object - # Provides object - `object()` + # Provides object - `object()`: object_provider = Object(object()) assert isinstance(object_provider(), object) - # Provides function - `len` + # Provides function - `len`: function_provider = Function(len) assert function_provider() is len - # Provides value - `123` + # Provides value - `123`: value_provider = Value(123) assert value_provider() == 123 diff --git a/examples/providers/static.py b/examples/providers/static.py index 42675e0f..941756ed 100644 --- a/examples/providers/static.py +++ b/examples/providers/static.py @@ -6,18 +6,18 @@ from objects.providers import Function from objects.providers import Value -# Provides class - `object` +# Provides class - `object`: cls_provider = Class(object) assert cls_provider() is object -# Provides object - `object()` +# Provides object - `object()`: object_provider = Object(object()) assert isinstance(object_provider(), object) -# Provides function - `len` +# Provides function - `len`: function_provider = Function(len) assert function_provider() is len -# Provides value - `123` +# Provides value - `123`: value_provider = Value(123) assert value_provider() == 123 From e3ea517d72cff21968f3640eb6fd94df36e884d4 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 18 Jun 2015 16:34:26 +0300 Subject: [PATCH 34/73] Minor ExternalDependency provider updates, Adding ExternalDependency provider docs --- docs/_providers.rst | 80 --------------- docs/images/external_dependency.png | Bin 0 -> 15072 bytes docs/providers/external_dependency.rst | 120 ++++++++++++++++++++++ docs/providers/index.rst | 1 + examples/providers/external_dependency.py | 78 ++++++++++++++ objects/providers.py | 4 + tests/test_providers.py | 4 +- 7 files changed, 205 insertions(+), 82 deletions(-) create mode 100644 docs/images/external_dependency.png create mode 100644 docs/providers/external_dependency.rst create mode 100644 examples/providers/external_dependency.py diff --git a/docs/_providers.rst b/docs/_providers.rst index f70a580f..7187b56c 100644 --- a/docs/_providers.rst +++ b/docs/_providers.rst @@ -2,86 +2,6 @@ Providers ========= -External dependency providers ------------------------------ - -``ExternalDependency`` provider can be useful for development of -self-sufficient libraries / modules / applications, that has required external -dependencies. - -For example, you have created self-sufficient library / module / application, -that has dependency on *database connection*. - -Second step you want to do is to make this software component to be easy -reusable by wide amount of developers and to be easily integrated into many -applications. - -It may be good idea, to move all external dependencies (like -*database connection*) to the top level and make them to be injected on your -software component's initialization. It will make third party developers feel -themselves free about integration of yours component in their applications, -because of they would be able to find right place / right way for doing this -in their application's architectures. - -On the other side, -you can be sure, that your external dependency will be satisfied by appropriate -instance. - -Example: - -.. code-block:: python - - """External dependency providers example.""" - - import sqlite3 - - from objects.providers import Singleton - from objects.providers import Factory - from objects.providers import ExternalDependency - - from objects.injections import KwArg - from objects.injections import Attribute - - - class ObjectA(object): - - """ObjectA has dependency on database.""" - - def __init__(self, database): - """Initializer. - - Database dependency need to be injected via init arg.""" - self.database = database - - def get_one(self): - """Select one from database and return it.""" - return self.database.execute('SELECT 1').fetchone()[0] - - - # Database and `ObjectA` providers. - database = ExternalDependency(instance_of=sqlite3.Connection) - - object_a_factory = Factory(ObjectA, - KwArg('database', database)) - - # Satisfaction of external dependency. - database.override(Singleton(sqlite3.Connection, - KwArg('database', ':memory:'), - KwArg('timeout', 30), - KwArg('detect_types', True), - KwArg('isolation_level', 'EXCLUSIVE'), - Attribute('row_factory', sqlite3.Row))) - - # Creating several `ObjectA` instances. - object_a_1 = object_a_factory() - object_a_2 = object_a_factory() - - # Making some asserts. - assert object_a_1 is not object_a_2 - assert object_a_1.database is object_a_2.database is database() - - - Config providers ---------------- diff --git a/docs/images/external_dependency.png b/docs/images/external_dependency.png new file mode 100644 index 0000000000000000000000000000000000000000..831f2699376f0408cefd1029dec110467e95ce68 GIT binary patch literal 15072 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 JUfw43e*t(a#zz1E literal 0 HcmV?d00001 diff --git a/docs/providers/external_dependency.rst b/docs/providers/external_dependency.rst new file mode 100644 index 00000000..ebbdd800 --- /dev/null +++ b/docs/providers/external_dependency.rst @@ -0,0 +1,120 @@ +External dependency providers +----------------------------- + +``ExternalDependency`` provider can be useful for development of +self-sufficient libraries / modules / applications that has required external +dependencies. + +For example, you have created self-sufficient library / module / application, +that has dependency on *database connection*. + +Second step you want to do is to make this software component to be easy +reusable by wide amount of developers and to be easily integrated into many +applications. + +It may be good idea, to move all external dependencies (like +*database connection*) to the top level and make them to be injected on your +software component's initialization. It will make third party developers feel +themselves free about integration of yours component in their applications, +because they would be able to find right place / right way for doing this +in their application's architectures. + +At the same time, you can be sure, that your external dependency will be +satisfied by appropriate instance. + + +Example: + + +.. note:: + + Class ``UserService`` is a part of some library. ``UserService`` has + dependency on database connection, which can be satisfied with any + DBAPI 2.0 database connection. Being a self-sufficient library, + ``UserService`` doesn't hardcode any kind of database management logic. + Instead of this, ``UserService`` provides external dependency, that has to + be satisfied out of library's scope. + +.. image:: /images/external_dependency.png + +.. code-block:: python + + """`ExternalDependency` providers example.""" + + from objects.providers import ExternalDependency + from objects.providers import Factory + from objects.providers import Singleton + + from objects.injections import KwArg + from objects.injections import Attribute + + # Importing SQLITE3 and contextlib.closing for working with cursors: + import sqlite3 + from contextlib import closing + + + # Definition of example UserService: + class UserService(object): + + """Example class UserService. + + UserService has dependency on DBAPI 2.0 database connection.""" + + def __init__(self, database): + """Initializer. + + Database dependency need to be injected via init arg.""" + self.database = database + + def init_database(self): + """Initialize database, if it has not been initialized yet.""" + with closing(self.database.cursor()) as cursor: + cursor.execute(""" + CREATE TABLE IF NOT EXISTS users( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name VARCHAR(32) + ) + """) + + def create(self, name): + """Create user with provided name and return his id.""" + with closing(self.database.cursor()) as cursor: + cursor.execute('INSERT INTO users(name) VALUES (?)', (name,)) + return cursor.lastrowid + + def get_by_id(self, id): + """Return user info by user id.""" + with closing(self.database.cursor()) as cursor: + cursor.execute('SELECT id, name FROM users WHERE id=?', (id,)) + return cursor.fetchone() + + + # Database and UserService providers: + database = ExternalDependency(instance_of=sqlite3.Connection) + users_service_factory = Factory(UserService, + KwArg('database', database)) + + # Out of library's scope. + # + # Setting database provider: + database.provided_by(Singleton(sqlite3.Connection, + KwArg('database', ':memory:'), + KwArg('timeout', 30), + KwArg('detect_types', True), + KwArg('isolation_level', 'EXCLUSIVE'), + Attribute('row_factory', sqlite3.Row))) + + # Creating UserService instance: + users_service = users_service_factory() + + # Initializing UserService database: + users_service.init_database() + + # Creating test user and retrieving full information about him: + test_user_id = users_service.create(name='test_user') + test_user = users_service.get_by_id(test_user_id) + + # Making some asserts: + assert test_user['id'] == 1 + assert test_user['name'] == 'test_user' + diff --git a/docs/providers/index.rst b/docs/providers/index.rst index 7bb0970f..8815ba0e 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -12,3 +12,4 @@ All providers are callable. They describe how particular objects are provided. singleton static callable + external_dependency diff --git a/examples/providers/external_dependency.py b/examples/providers/external_dependency.py new file mode 100644 index 00000000..c4b3ef04 --- /dev/null +++ b/examples/providers/external_dependency.py @@ -0,0 +1,78 @@ +"""`ExternalDependency` providers example.""" + +from objects.providers import ExternalDependency +from objects.providers import Factory +from objects.providers import Singleton + +from objects.injections import KwArg +from objects.injections import Attribute + +# Importing SQLITE3 and contextlib.closing for working with cursors: +import sqlite3 +from contextlib import closing + + +# Definition of example UserService: +class UserService(object): + + """Example class UserService. + + UserService has dependency on DBAPI 2.0 database connection.""" + + def __init__(self, database): + """Initializer. + + Database dependency need to be injected via init arg.""" + self.database = database + + def init_database(self): + """Initialize database, if it has not been initialized yet.""" + with closing(self.database.cursor()) as cursor: + cursor.execute(""" + CREATE TABLE IF NOT EXISTS users( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name VARCHAR(32) + ) + """) + + def create(self, name): + """Create user with provided name and return his id.""" + with closing(self.database.cursor()) as cursor: + cursor.execute('INSERT INTO users(name) VALUES (?)', (name,)) + return cursor.lastrowid + + def get_by_id(self, id): + """Return user info by user id.""" + with closing(self.database.cursor()) as cursor: + cursor.execute('SELECT id, name FROM users WHERE id=?', (id,)) + return cursor.fetchone() + + +# Database and UserService providers: +database = ExternalDependency(instance_of=sqlite3.Connection) +users_service_factory = Factory(UserService, + KwArg('database', database)) + +# Out of library's scope. +# +# Setting database provider: +database.provided_by(Singleton(sqlite3.Connection, + KwArg('database', ':memory:'), + KwArg('timeout', 30), + KwArg('detect_types', True), + KwArg('isolation_level', 'EXCLUSIVE'), + Attribute('row_factory', sqlite3.Row))) + +# Creating UserService instance: +users_service = users_service_factory() + +# Initializing UserService database: +users_service.init_database() + +# Creating test user and retrieving full information about him: +test_user_id = users_service.create(name='test_user') +test_user = users_service.get_by_id(test_user_id) + +# Making some asserts: +assert test_user['id'] == 1 +assert test_user['name'] == 'test_user' diff --git a/objects/providers.py b/objects/providers.py index a8fd9ea9..b7b4229f 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -189,6 +189,10 @@ class ExternalDependency(Provider): return instance + def provided_by(self, provider): + """Set external dependency provider.""" + return self.override(provider) + class _StaticProvider(Provider): diff --git a/tests/test_providers.py b/tests/test_providers.py index 0dc37ee7..26bddfa4 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -323,12 +323,12 @@ class ExternalDependencyTests(unittest.TestCase): def test_call_overridden(self): """Test call of overridden external dependency.""" - self.provider.override(Factory(list)) + self.provider.provided_by(Factory(list)) self.assertIsInstance(self.provider(), list) def test_call_overridden_but_not_instance_of(self): """Test call of overridden external dependency, but not instance of.""" - self.provider.override(Factory(dict)) + self.provider.provided_by(Factory(dict)) self.assertRaises(Error, self.provider) def test_call_not_overridden(self): From ab548df0b288c1428d6dcef8d2171630ebb72489 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 18 Jun 2015 16:35:00 +0300 Subject: [PATCH 35/73] Minor Factory and Singleton provider docs update --- docs/providers/factory.rst | 8 +++++++- docs/providers/singleton.rst | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index d6ec5abe..77375eb1 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -119,7 +119,9 @@ Next example shows how ``Factory`` provider deals with positional and keyword ``__init__`` context arguments. In few words, ``Factory`` provider fully passes positional context arguments to class's ``__init__`` method, but keyword context arguments have priority on ``KwArg`` injections (this could be -useful for testing). So, please, follow the example below: +useful for testing). + +So, please, follow the example below: .. image:: /images/factory_init_injections_and_contexts.png @@ -213,6 +215,8 @@ Example below shows how to create ``Factory`` of particular class with attribute injections. Those injections are done by setting specified attributes with injectable values right after object's creation. +Example: + .. image:: /images/factory_attribute_injections.png .. code-block:: python @@ -283,6 +287,8 @@ Method injections are not very popular in Python due Python best practices (usage of public attributes instead of setter methods), but it may appear in some cases. +Example: + .. image:: /images/factory_method_injections.png .. code-block:: python diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index 1865cbb9..ab978b23 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -61,6 +61,8 @@ Created and memorized by ``Singleton`` instance can be reset. Reset of ``Singleton``'s memorized instance is done by clearing reference to it. Further lifecycle of memorized instance is out of ``Singleton`` provider's control. +Example: + .. code-block:: python """`Singleton` providers resetting example.""" From 8b479a189810e07f5776eb1a310bf55812f168bb Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Thu, 18 Jun 2015 16:37:19 +0300 Subject: [PATCH 36/73] Removing old external dependency provider example --- .../readme2/external_dependency_providers.py | 48 ------------------- 1 file changed, 48 deletions(-) delete mode 100644 examples/readme2/external_dependency_providers.py diff --git a/examples/readme2/external_dependency_providers.py b/examples/readme2/external_dependency_providers.py deleted file mode 100644 index f920b814..00000000 --- a/examples/readme2/external_dependency_providers.py +++ /dev/null @@ -1,48 +0,0 @@ -"""External dependency providers example.""" - -import sqlite3 - -from objects.providers import Singleton -from objects.providers import Factory -from objects.providers import ExternalDependency - -from objects.injections import KwArg -from objects.injections import Attribute - - -class ObjectA(object): - - """ObjectA has dependency on database.""" - - def __init__(self, database): - """Initializer. - - Database dependency need to be injected via init arg.""" - self.database = database - - def get_one(self): - """Select one from database and return it.""" - return self.database.execute('SELECT 1').fetchone()[0] - - -# Database and `ObjectA` providers. -database = ExternalDependency(instance_of=sqlite3.Connection) - -object_a_factory = Factory(ObjectA, - KwArg('database', database)) - -# Satisfaction of external dependency. -database.override(Singleton(sqlite3.Connection, - KwArg('database', ':memory:'), - KwArg('timeout', 30), - KwArg('detect_types', True), - KwArg('isolation_level', 'EXCLUSIVE'), - Attribute('row_factory', sqlite3.Row))) - -# Creating several `ObjectA` instances. -object_a_1 = object_a_factory() -object_a_2 = object_a_factory() - -# Making some asserts. -assert object_a_1 is not object_a_2 -assert object_a_1.database is object_a_2.database is database() From 6a920566085f39f81f4428e0bcda620bac56f233 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 19 Jun 2015 12:16:15 +0300 Subject: [PATCH 37/73] Removing old docs for config provider --- docs/_providers.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/_providers.rst b/docs/_providers.rst index 7187b56c..c898fd6b 100644 --- a/docs/_providers.rst +++ b/docs/_providers.rst @@ -2,9 +2,6 @@ Providers ========= -Config providers ----------------- - Providers delegation -------------------- From a612e42a992464ba6d97e0436605bd8e59dd0e2d Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 19 Jun 2015 12:44:46 +0300 Subject: [PATCH 38/73] First steps with providers delegation docs --- docs/providers/delegation.rst | 75 ++++++++++++++++++++++++++++++++ docs/providers/index.rst | 1 + examples/providers/delegation.py | 68 +++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 docs/providers/delegation.rst create mode 100644 examples/providers/delegation.py diff --git a/docs/providers/delegation.rst b/docs/providers/delegation.rst new file mode 100644 index 00000000..585dcdc1 --- /dev/null +++ b/docs/providers/delegation.rst @@ -0,0 +1,75 @@ +Providers delegation +-------------------- + +Example: + +.. code-block:: python + + """Providers delegation example.""" + + from objects.providers import Factory + from objects.providers import Singleton + + from objects.injections import KwArg + + + class User(object): + + """Example class User.""" + + def __init__(self, id, name): + """Initializer. + + :param id: int + :param name: str + :return: + """ + self.id = id + self.name = name + + + class UserService(object): + + """Example class UserService. + + UserService has dependency on users factory. + """ + + def __init__(self, users_factory): + """Initializer. + + :param users_factory: objects.providers.Factory + :return: + """ + self.users_factory = users_factory + + def get_by_id(self, id): + """Return user info by user id.""" + return self.users_factory(id=id, name=self._get_name_from_db(id)) + + def _get_name_from_db(self, id): + """Return user's name from database by his id. + + Main purpose of this method is just to show the fact of retrieving + some user's data from database, so, actually, it simulates work + with database just by merging constant string with provided user's id. + """ + return ''.join(('user', str(id))) + + + # Users factory and UserService provider: + users_factory = Factory(User) + users_service = Singleton(UserService, + KwArg('users_factory', users_factory.delegate())) + + + # Creating several User objects: + user1 = users_service().get_by_id(1) + user2 = users_service().get_by_id(2) + + # Making some asserts: + assert user1.id == 1 + assert user1.name == 'user1' + + assert user2.id == 2 + assert user2.name == 'user2' diff --git a/docs/providers/index.rst b/docs/providers/index.rst index 8815ba0e..070c57c7 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -13,3 +13,4 @@ All providers are callable. They describe how particular objects are provided. static callable external_dependency + delegation diff --git a/examples/providers/delegation.py b/examples/providers/delegation.py new file mode 100644 index 00000000..cfaff6d8 --- /dev/null +++ b/examples/providers/delegation.py @@ -0,0 +1,68 @@ +"""Providers delegation example.""" + +from objects.providers import Factory +from objects.providers import Singleton + +from objects.injections import KwArg + + +class User(object): + + """Example class User.""" + + def __init__(self, id, name): + """Initializer. + + :param id: int + :param name: str + :return: + """ + self.id = id + self.name = name + + +class UserService(object): + + """Example class UserService. + + UserService has dependency on users factory. + """ + + def __init__(self, users_factory): + """Initializer. + + :param users_factory: objects.providers.Factory + :return: + """ + self.users_factory = users_factory + + def get_by_id(self, id): + """Return user info by user id.""" + return self.users_factory(id=id, name=self._get_name_from_db(id)) + + def _get_name_from_db(self, id): + """Return user's name from database by his id. + + Main purpose of this method is just to show the fact of retrieving + some user's data from database, so, actually, it simulates work + with database just by merging constant string with provided user's id. + """ + return ''.join(('user', str(id))) + + +# Users factory and UserService provider: +users_factory = Factory(User) +users_service = Singleton(UserService, + KwArg('users_factory', users_factory.delegate())) + + +# Creating several User objects: +user1 = users_service().get_by_id(1) +user2 = users_service().get_by_id(2) + +# Making some asserts: +assert user1.id == 1 +assert user1.name == 'user1' + +assert user2.id == 2 +assert user2.name == 'user2' From c05879bada5d30c1f3e9ed02f1d09c06c7899bb9 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Tue, 23 Jun 2015 16:21:37 +0300 Subject: [PATCH 39/73] Updating factory provider doc images --- docs/images/external_dependency.png | Bin 15072 -> 40801 bytes docs/images/factory.png | Bin 0 -> 7808 bytes docs/images/factory_attribute_injections.png | Bin 6366 -> 32560 bytes docs/images/factory_init_injections.png | Bin 4112 -> 18876 bytes .../factory_init_injections_and_contexts.png | Bin 7370 -> 34096 bytes docs/images/factory_method_injections.png | Bin 8747 -> 35252 bytes docs/providers/factory.rst | 2 ++ 7 files changed, 2 insertions(+) create mode 100644 docs/images/factory.png diff --git a/docs/images/external_dependency.png b/docs/images/external_dependency.png index 831f2699376f0408cefd1029dec110467e95ce68..317903ecbbd1265e7219e20b8473939ad8779e10 100644 GIT binary patch literal 40801 zcmce-2UL?yv^E+<KtVu}qI9K6jnaFQj)2rqgGleageoE;y%XtDLWf9i0hAiL^d_K? z(2E2@FE@VQIrskOoVD&+_pX2aS&K#9nR#dS%<O0HXZD^%zSdMGC8i|?005+_DhfIP zz-<HofM0P3A6Me*X3l{7ciUD@Lk<9_jwiXaAizE2dFm+31FA;oH*pWlmMS_L0DwO` z0PyYu0C0{gdba@pcs~aKw%z~$;-3Kk8n>(#ZAsjF$k(s*6mM>BmY0`9Lql;bFD@?X z>+AV&pJ$ZyIj@(y-gb9)^Mdu%(jztVlg1m(ZkFARjEtCM#SI$^ja!PhFn=yCFOQCn z6yx4Kax+(m4uZj8cOH-@CnsMlxB}j42{^v#o}WHCJrVbFTHf9WtuCn_8-yjOc9$FQ z1-rodz8Pt7gu016q9k^C^ZaPa$px0NHDo)!x}5w@Zfk4H=yQyM1mn=;1mF%KrL*by z__%_C!lOrzKt_hih&q6wvWtrg;NIOk7FwhVVg}W@03#Jj7qg+|h5Jt!Wj^>kdcni~ zT1BTU9YB7M$U>`YZc^;6F+fJZ;a#AHF$loQAQtYE-PsBd<pn(FxbJAJ8W#${!xJ#o zlMeOLQ)Lt2p-u~v4|WlW@R3~TuqaPeUszZOv10u7Rd{)>AKh+zwAyraalF!~vNagE zKa+WZMQ`*tUgL^3x=(g~T%PV7ESBQm0_4Rg)n;jBM=DOWm;s*B0dC{3A+7b`S?}CL zMSUD-o^w<3ajIv<D5r!IQ&YZ-2^MmG%VVO$ASLpE?TNk`8xt*Q*XWRXMl`=YcnbYn zBk==3ga;t`96<d5aO;+chpkfLd(HgBU(BoexGltctFEj7_(Z^<f_u2@refp?06fb4 z`-i9M9hQRA27s!9oSxtO?p37aHnIU8p~~f)NO?C25D*>oLBm~SGGb@V3sPFN%L}W8 zht2*<=#I1GIF2r6^;rl$3<!R_gAff{?>;=;x2e<*52aL0q)>e~x!>B@{DPAB3u~Zl zrF`Dj&OO}V|A#+)qi5mg-%PWLuMR`#pt)7!*JGj3=5w#~V{;_Yugk7wd{AErocu~g zwC}s(d<aW1c{4W@7-)zQs{ze-gzYvLWfmCL$SQGCZPIvUADj1=dRFN*WAZq;y#w<= z`g5A3R*(7&rs{6gG_y%?s=#QUY(o4e<TUFTh}L&WDJu^0eUF_?ZBf10M|Ep+<u*u; zv%~dj+_4c%Hz|;SMJ|!ufQN{W<?V%6z8)*j^i@n4?I#S8bRnk)dwhq-E&4w5jqHB0 zYg>qeZ7us7Y}UO55G*N$rg{6$4grJ#Z;1=Cc(b`Dz1xwKjE6B!plRKXfTuUopuBHa zB+RVm?(Z?fv+*EoXtuq4r1bXjdqmv3b<DW{0XAV~57~q;t~|y=TmMWA3XlUUf2%?4 zg*3Nb9DtCHzB|TXHE+~%oX$2$TB{Vy|LVKV6oUddv6bHyh}^zom@=akA}2Rve(6OB z*^R41=|A6peKf6X5D|l**c(3{*t2}{w^_mrJmtl8=lpwwPhUG)C`P`#S3Y4%pKJM1 zUCJiQ!XqdD_rvNgoNxl)$hM^Nxmy_VTNIdc_5MfJ4>0o#0jZz@tx^k@?rrNDecvx6 zbtU(DOi7LD>IX)B$EBqUm2Wn-2<ti~%t~z5F~%M<5<A|W?KZNZ5r<|m!T{X*BqD;( zHEd&Uq3R`$xq!qK{)O<g+s098N~T}>tk2bABi25nv+JZ&e94qsS{jyewbFjpBXXLz zcaK}lPO7ZDIe<FyVC8p-GwbI2uX>-!f?F+fF|@B|r|i5Wt_XptL{f1Ll**u&i)&Nc zjhvVM4Z3yu55iTwEmOJg+21_Z_UOYH|K_WiiFd7;NkWv7gptUCnFx8|@T?ctV%Jl0 zxc=aYG(ks$S*XOamT-BfR?*ON>fJb(ufU4gIbF-c?^B62=Y>u3775Rq7aXsZ4IH;3 zMCKf|!RuSX%?~l>&%Yvqf5jZEqdXn|Zkjq+%KmVxI#--vgh>c;oXjb17tb0N*q(eO z_)I+qd9je>#~+y_(Y6+H#1tT>voODnIo>+fL1EoY+FDM1e0;7-s>;a6xcavjdMx#C zQ#(tvR)K#m4cx!IPNOxY1<xhIZIC2Z<}7;>TdZjGSN;=>PSymecfp05puweV_0T4> z?x!90%Dt3(Wxo%zy}a7FsSZARu)-Dkv%!ZqM~aHhw(vs^Z*T9O?^Ed1vS85G!W@=r zklUCIB2}u~b5{|uo7~b;A}wWxDeBvrAbjcecLz>DH>Yp^-GCWPzEwhiO>EuAl07BO zMl)}g)`K{Nz4!jMmAg9!dG*w&dsT_Z(P_cY&ANwdzFcsj_vdm;8?!OB`;vDCgc@%` z-r`G@?C+#6)OI_hDrdJt^h6?^5lT<yImA<h&7|9<$tZF7@w=&o#b~Qsw*7?9H{G<! z6z^tbS35%7ZA8|*5_BX6PCUXbA{J&Y%4QsrdkK5Beu9@>8|zooe4{SBwxLd6m@D*= zrAy4({K=Sc{4goSVPmz&ke+h=$EZzV+NYlz%|295htuEKSEo8r74rd?4=XZym}rfU zPQ0sH)_03nDh9T_<U6uE7DR=Ib?BdZW1q4Gp-pEEtS|NU(mledB${KvC)gy?@Slec zK3wpdvzEGp+*6Ky5rtP)^C%hpa>-iNXK=fEuKDv`;^>COAGX-@q<Rn=Bl%O{wOC8T zbQmmzO0L?<hdTA~?vL@Fofa^et7iy5Y}`Q4$g}L{oMaV3uaLB-<>uqI2hVcWK=i0` z^mJ5y&TiQkqxqt9g0(c=@;SA(6WeCm{g8tW({$l$cxMOH(5d`7gRJ@lId>I3w>#1_ zv#DMg8z=(ZZWvzs`N^_WQ~6}vp-wz|Np#t;xpsWltNXRh%jR4<Dr&VoJ#eeTSCH0a zKju7t61t$3h*;6TsyoQ4>G4~b8!lFc<?wAnwW(Y}0>VSKG%!)SD-!j8=7{3MT@?kE z>`X+f_*Y*k2bgkm0!>_xh8?tN?t+F}bS6Yht&+8#CeAowJc>wYt_W{cVbRFJ$oAJO z%8g=nUzbH5GwH7|?^Kj`7bt+Ugu(81*!%t5;7T>a9=cWMA+|n~v66K-TglDQF(yOA z%ri!}akGf6-q0YKhib@3y-tT%MV7x(Ih%Si25J|-3(?3afA$1ukf9tQj4jhDr;Jjh zu<)IOMKVykQLMOUDbk3J<x>%}S@0aszDH2t>Y5eLi2ZY!TG^X-lm$|G=<M1{x*-@p z<@Pn6EY5Fa8Ntr#KlI-&%Yr3#3jM!}{U#Ne<;H%C%GXK+A&gUVqD`OA`*?oOW@*=c zew-cOfw=NG+~&T7H>N<lT*mqg70JpC!3{6oaYU7EzEj^@d(393ws`?E?G#o=4z5Zj zxm?M@HB-2zvY7AH(LYQ+pw87*iTl2$1F~0&)|7fJXEtr*Ccx)7_Fkg)RiUk-eSwg^ zqD%@@W{k*TOWXmq{kb~vjE<UtQ=-^<<gIg?p_OAIB9(V}<jKC~=4%G&jJm|_>E%)O z1HwW@Wxn3jFxXCA`{D<UjlvdJW;jDTqgUl*PxuNlT3W`ew9MaM6a;D%IdDkj(5>=_ zd*m9RXWnimGp@a!A`<Mc6Ay2{ZZgY+ZoJ%+3W^>ewKrY+)1d^mP^VGU(a`B+O@nF~ zA6E9<cFy;5>rKze;Fyn7`%QM&+$K<d>@fqAO1^`R=3-9K=^G6FekR|b`oKhRA`~7S zF=sE3C8xTxvQ<{}6xh#U>!JGltr^p+i}jWbCpoaEC#Rw`63rGz%X<};DQXpR6;|tz z88#DkOp2->q^TY4*U;Z997ys<6fy6ltv5)=gUX{~V0_P{Vj35JB(<y*Cx|rG)t>*^ zf;1#S`x?!3UEJLx$e3dg&op!+(<+n3#t}vMoV+}7qeb<K5ckhE`OKA-D&U;s98RV6 zgKYM}_i?`4X&)>U`QG-QWteV%sQ>;XSxogAaK@us`zidXvcd4i(<1lG%saK4rwyFy zVs768jKH3QXy&B1oblw<3jUYjuPV=5&^&=Z5bWRIEKXU#$Tm>X!)#WI`9Y*Wn|(T@ zW8=#eg_UNbor+XbQs~14#{8bxCB}Iju*<WD!m5Zz8Mci5(P8(d<(V66J7!Zln1QN& z4%}!Vbz!zCMfW&W32#BGO~tmo4>WHzR+2wpxYS<hO=kRNsZ62^_D&5{Gfd%W963nx zv7MmTh6WWyYK`1?^V>9>mgI!Xnogl!?)sHq7s)kk__-$2eC(ckm@v~%u7pg4_WL%; zbaxviK+9QxE%lY>uS60jGS;cQS13PPVZ*B^k^;i_-kMBNv%pWOb5+$I_xk2gdLGSb z1n~_PHrpXzgC92kD4l*q$*43CWAe-Ui{QFLebSZ^xZUM>G^^yH{!wi-8n!Te$~+nv zUvwtiPV*rRMc67bKoa&~j{v!iiU>VsTfW<rS*-cq24)EMOuoNG_<W|@v}hT0T35}N zrh;_*Zq|RNH)TTO1h)3G`$gW<wy%crVABkEr=v6!YWq|`3}43N{*isuZ?quC&x5Wh zTW}h*Su!F7@M_VB4S0zExf_G&4yf?dtlNy3O;Lh7=ZL+1v=M|43HoqX^hg8AKy#$= zXebsjD?c`&6xaMSLy-J|MKDbd?LiGwbM!dSoQTI$#HoYar0aCKnJo9RX&9%p4Le*l z&@AI;@HP4QM|{S;91qyeY17VT1m9`o*J$S(MN<zKXftq}H!QwV0}aBF@frol!3^c` z8L1hY1@DNS+w>QNnDa-vx$ftdah$_m6iRt_h~9=C-Tl?{p^g3g87+v)Jb~sUD?wCA zCKT2Fptk8Mhe7@Y@r6#~fK~-FSs6777R6>SUVNpvCn}7c%S~evnhp4QHZ-2`yD)(% zi#=n0qo(-xD$>5+v!G@a)f0bPZJbbvMyA%Lf-@NGKs**9<*FvrSV9o*IsE4!p8>Yu z3I!<@NvmJo@*zTDE!eZ`^KIXaSTUY_JxLzMgu=VX*$p=qQd2;)VM|B$3Bh-MhH~>f zX3r6*B%4SK2}cxFwcp|t<jttif@q`ATQBPqY|bgVCPa&JJ0u@`Ef_g2N29g6xcM0l z&xk~0ThvbFChKSh9T|OhG7x#uK}sCi8vhJk&kU>vtu59^`_ehvtVI^DH7K3y4ms(b zbT_PfUKv{sr|=JI=t|F<XEZlJKfS6b+MQqf=(~07wW8c70`ni4pM9;Vts`U0pDoN_ zt7Niysi7V<T^d~cj6oez-75x{NG`jF&1YznQ_VxavMLxH;K&|~Bx{J$GdS4?680n& zz>xwpdYK}_<=OsirR4tP+$hE7)!cF1s(9<LqS?AstQO6RUzB~QpQ>$LwS*x?M%s%c zIjC^8Jjm#sREVz}xbGVYMvV@+U5KOdbL8p1xHH2&S@4At9?XZIv-gSEUC7zNn=p>M zsCw7&X(i!zh;JjIh-1?6UR(Rs2Y<PB!c2Q8f*JUgh8d1iR5|b)AntWS%zMN)@H<>X z6agf(4FK7tLy}-_1>j-kMG|OG1jjfk?#c{AlI##59dQmVfo7Iu6ou__?I^m6@Fav} zKf;yZt7FcGCTwlr7~jUphZ~s@C*us${$B89#xc{#oN_Wqy?&|5lPc`igi00ViuxmJ z;xJTBsF8~T+rXJcO@qhw6($__n##a-PO;0S(8I3OKs!i1iK9=urg{gl)SmDP)ztP@ zHtA9_Pf-hj5!vY6{#b*lL<_Z;U(+I$Ecn;`ZcNfxZpfhQ0P^RuZD(HVuXF_As8s{1 z80<Ja5{p($qGdNoIo8ghi6H5jWPSo~SV|G_PBk(+;6f4bE3g7{d{?0zuP$8IZbR7N zX~wS~D@xC6bp<wRd>?;PC|)U7Hy{yFS*3~XbY@NW`2OK#xQqH=3Dwl-RO&@x_D3W8 zn3s65Q%%K6MUTv86LwOxklf07vk6}M)8%@qIpo2%8@T0_dV})5DIT(lDem=$c&jpI zOOq6_z0hpc`GqXLUpd}sSktOxTF8%76;{r~)Cf|@@gU1}Hov|fQkz3M%JOe*DY8^Z z?nk2a?bf+dACL?i7VG}zp65ReLwv)#54lQ##T-l;a>E-2Qt6(44jm9ezOeLBEKf3o zwJpktDc5%|D4DXtTT%%dm8p6IqhLt&EP<o~l5oTWdPn=$)9$GcsOM^Poetl2VMSA8 z(E6bWS!xT&RaA_7Jdc0gl!G^A&}Zs{IKRR!OwxL=rP_}=ME+Eo;8!S3lowTF2f0zO z_1v6ULV=G)Sms(m8gFGTJ!m?4rH;e=7s}&_GivqRA~To=E{$98h~n#X^Mn_B$pjE8 zd8n5>WOE~80fwnG=uqB%3iqpLE93kslkc2z6$^t!^C+>?hfnb$9lzP;rJ5GMd|Y^1 z%zX9+L@}b`nBDsx(G=<U^HT*rB(!4X%2mbeW=H0P`+=|K>G`&&X3=(Mo>8W-Ps-AG z*}VX#bQSPH8Dw7N`)fp{&aY4QlD~W^3rT2DibY!=xnry9QoSF>Gu9*guL7;}%5OJL zEANeCXoHb;53F);cFj~SjeofMj`nw|zf|rwhG4BZL}q=P<;p2=<dc*IuKAX3yF}7} z<zX}L3_M6k_^yRrjWm<v2JjAd^-m<*q9Re?EMY)G(6z6x@6Bb$AG$-K^Wm%O1<&^O zv;ALTwFY2b`&!y$dU1ME(q`VaZ_e8X4zp`hTGYP_K5}u)uY&)KqV@M!Thvq}45B66 zy_-Q-e$}oZ9q=O3Y*#aaZf5e18Jn!|!S(zNqZaMSfB>Zap%_>WiwP%-wl4G!53DNo z@519HUD1ck&+a8QtvFjwxu{61TAPHWNlNd0nCflQ8cbElggUsvd8=OsG$#h<<wAdq zEi}be(KIf<1T(+%D?5MbvqT(q`W#MFFPbdi4F1UhR`oA2KH!4II^AC+vuPk@y;-$6 zsqwRK&V_zs*s)B;4ql#WpXib1zLbW7Uh)nMA{Zx25ac+Mg15PzntoEvA{~R^iVY0- zksy8FIrxdc;UfcDOp8~O_%lJmU4$yS^J%KQbfCHa53a$H4fM7gMt|o|j}xCfHsi=u zr8OC7sXR!kn?;=A93~7NBAin=`FeB7y&fl1ct!K@&>e++^4B8WS$4jR^z2&}NS2TX za}eMxo2+D6xB0a^&JIsp7rc=DkHWW-@X^bRAGtM8NdME8JyOLMcYOJIu+HO^`3|8; zjFUVR_F`vW%-7T!4vz?uxq}hs#2HqioMFbJ?f8z$bL(rL*^@A4c=9crDgAYZh|L8_ zdwf7F5&vUkzit-RCd`=p?=i+WtF9W5^xg>o3C+fb>}J;0Cz8gQf*acY;PJ~Tp}j+L z)7>8|lZ^L1RG~{XJ_V#R7huGnFvA}vK-YN#-@W?B;&0zZ5!BrIpO*fAx(p{S_;Sca z#_{q*;;nyth!Yp^kHLR)5RX%5RNEMD|E(wg|LkL&c;Rvue^%x*#>3<-%}Q}o_(+%f z9w93{s|Pj@kt)%Uu0a@=VOQn_Xq%Uqc?=Cf>+Cez23KsE-r~l#1tSs3G@`f4=&tx* z+&eOvGX{qnSU@UI^1mr@b<Ar;M>w&=)yz|AfQqGwJYJNzX)Ajdn6sm>208uZZQhgu zelN~x%Svh#Wk{z?P*WRdY6|5fC~fd-$P?!w$;S-(D=FwHf5qFonwi&h!p6<hveWaH zsoVEJX}ixfX`Ag{UJ5#S`!9MFyd}E}+RQ?aHL=i8IG0nNUm2(;jmS67B;Mg09ij74 zN<<ht&<~dXgsQKwdi-Emr~94fj3g-p;5MNlji%9~e)5^fNNH9@8xQ<r3G9b%vnjl5 zy}wiw#F=ESiR-&GEr*u-?nJ&bBz5~ZpiK_;!eCWX%bS~iHP*<;LKO5myd4GOfy-%P zdy|xX^g5J@j;!gJ#EoxaahghwqX36WkOOVYfjPg*KRWZX)XrX0pWgCHKOH4>_!>}{ zEz_LAtw+dE23%s-Hff$HOR=6Xr09O(>_jQAn}ndP5J`k)6(wvR7{{q$Da~a;_ZqGv zpW#4-hm)TgrGLkScBU@C9)c}^31J*m4GR|&qer?7R3!^1%NI-hnku;$6oT;|JYgC$ zf9)*yVRi<iqvNCyx2>X0hCMH<c@0DnkP-dUmC%ltcuJ$UxFbd7Ya_b;a%P8;M^L?a z)3zv7s^M^SbW5Z&zK>n&_xXt!u0h@l9$;Bh1$t^#<0lt;aZ-L>^o-9s4*q``&M@6X zZza0t#Y5}N0t4wNL{d3A%4I03QJ?m#S|^1vDd0oH<Y%WK8VIR=)f3EsK9{(z#(+B0 z`9STfzqSfTe|A7%>&WKQW~Sm;G5hyXPvJ2A2U>_&`xtv=%^od$rBN1Ou>Us<?V!D} zdg2Usr5TPJ(cv&O7l}{;(pdkl>roC@ix)}(jgQEb@l;?e`}x@7#~S3I@eF0s&Mxl0 z(PLlUCXKQ|ggm&4JHI%+%B@C-!YTxnDnVdw98Y8XI|~5_71*BHpAR0oRjE1jalFdh zplm^3N}N1MhfCC;?FkeAClII65LzPYZLyz;a_qqF3kJodZIowOAK?}@twn7kL{x`v z+<tyMh$W3?cT<;4{3AlRY3f=Lo^!k#Y>Wf!n#R5`-#|27nE@S~BX)yeTqojTyId~o z6r<bbgKQD7GiOcmmW~sZtK$!CuD%zGUlb)^97dtepHra0W+g!TwKtQx<4=Urpia8k zGakyw=>59>S4Q^B`y7gYEz*rxtjt`{*O@2ootng5&yODS__H?C@^Lhf7WDFY#%5z_ z77VRRN!uAw`kCeS!@l?&yL8tn$P$F+r>nSip*`oxx9v~RU$<xC#0VgB`-5ji4&ZVP zJ%PWi{;rTXBv$;%jZWQ>{6b(|$03j-ntJkru-xd&*!HfiEL=AMilN~43@D4DRODo9 z-O!y&E;XxlnrX<ChCXYl;@MzetE?==Oti0R-N9{oMKY+B3IkVA2O`k)yRKK|B#I{4 ziv&JrnrBz3fwv)3X8K<Gzc|n^6@z+Np|+<?#(HHcHyU=zU+k2%Q=6=G^M-?c|60K= z+1wn&E#fb0y7NgXAZ-z+F{!Depq?jba2rIJB_D`*nrG>j&+Wff7`_UHGPD!Ia;e2@ zk{6beF)KlokTXQjc!ZX9Usm*OkHYvpONrZmIr_}OVEG;-r)IMYsvljz^Mn%!=1Tlk z^sv}qM#J={NGIhBT+~{^N*9778Z&h_IdPQ8?Nf9Q>v*r|nMoRGxOCLCXZJ8)<f0i- zWWRjCp`c_-F8*YCpuFulvHb<?h3W$EUg7!q2mvPhri(1|M5YSiz{icOUYmb)_yKWe zSwBsahch}W0wX`)6o4};I2OZgLrhC%KxI;5S&jU-I&pX*wfcRW8G9KVZ?G((TzX@O zNwSSl)GtQ3@o7=VA`tI#IX!BSFK86)<m`k5XZJ&62Db4#80)qazp%-)*?W*mJ$DS= zWN=NId4%yF@q`!!BTVxr-3Dwjo;5xidI}M%k~p*pv@_#eFxV001s>WY^ks8=i~Fkz zN(E|y`TSkB7%oA1ne<Z2uBSGszDoON3blj66yD@RkgfwQ8dU0p>!ZgI(v`N@-#P?L zCSVd#@cloYipA2fH|46<&YUtpLN2=zjmWz)36m0AxG>m%O!RzeTVAZ#17hTOfPaR< zlZ<<5f=b=zgb>YB-UXdqDFusVkViELwIII9O@CEi@Yu=A%E9}z3^4Y?8WWbzV7LxV z7I+`mwvTNcG@VFF-Paci&TZG!1e>hht{Nq0Nfg?<k5fP=W;p$3|Gf}#WVy?eF`g-d zGR5na2Q2<=KIwhgGm828X+~9x>lS#c&MZ^F6v)@gk2+_apCVcxXKa4WCG}?sn~X+m zSec1C3^}%uO|k0U#SVnGGb&PH{3U)KM%SnzKDWL6yK&5Lr99chdqMYTQ2JxZ`tV0W z`lA-Zmfln?SxeO)3sn$hM6~qU-~BRKBVwl$0#o1{zlpnS@kb-*QXUW(ft&5#Ovl}c zwLN~M8WwyLbS1?M3>L8CpV+?>%7BL>CiS&M_7HDwAlaFu!NF;fRlA3#62M8HqMYB3 z3l>({-O#XwCQ=G6RC6hEO|NdwAwL=lo6I~5JrX+jK=;!=Oi-OhwoiBGc;HS{!i=Nn zQpZMKeQ+@jST<ou$6-J0JO}@eH_DEqNE{cpCEQ|d&~M6%${h1g<mrk?%Ikg$iM&<- zV}2!?^fcr!-ND=<vektIU17fni|Iq`16ZNvi6Fj=>56jym&vjoiGKP_qnN11MD_&~ zoWHV8%!BLRLyW($S`bU|M;`dnK>sl6^hC<-1I{QTH(Fy8pn2TN>sB7IH8Cu%C@T2Y zT?dHG7e5n490)KnL0oM|fyPGH^tFidqyir(s^0!42uVUu{daeH;o)Nhhh;K$bt!_< z-rQa7`C6P5@P;P!u6MTB$Ock>NjAdu5XhdGHWE8vqvRB~@-bCT(BX6X+XA4jQ{ARj zD!<4?A7%^F;Ikiu-yr`l=USVZ2}@&NK$fED;=;1Fu#<-Kzw|X@57lsX3Nf!ENq3)w zcS%V-JMLAPN<Yi)&f!nH@%*V@wwa@AL=Hz*WV>-&V`rFtPGP@{xN03oo70a7S@FNF zVTz^}yFELmV_|>2=~KMGcX+=T9n2w9@(0XGQQ08T71#mn>sA~n7-?d=YtEuY<u>}_ z>Q~al;J|ZQCx1IaEoWZ^+b|dNp}8bz8<u-HOxyNo<blBx9DBy;U~>8sch;Zt3(v6$ zG@^nUNXJox960<FgJ4>po6L08{KRuC2M17O*W{lZtkcmTj#CfNp<t6b=F^Kmkl5?^ zH3nQ7lgfp%XaFhh4RaAbx0VOHvPmR@tY^<<>V3q9SMLsPSCly+B0k&G2TYJ1<A`|w zt4vT7eIBBUbC1{9e)-EUwu+}$@2f;E%y91#V8qoR*=ElY-1&qr_5Ur<#1#a$s9o&c z26|#QJtme}ar}`P&XP)V;6}zj&_&(Ri$A!1eSH{uqj}Q1hptEeGOk2Fcp}Vrblo*b zl6CvD*KsAn1iT14`!TT4UM>LkZ}hjXs*APN#2w|eZ$a8paTd!-OmJG~S6vX(SzbD` zolrP_w?zVt$^+zfC4xWT$JeQ(>f0t^{3qWX>LhqK@t2=9o=Pd^+~n7OeR+=5Jy2_P zC5}7ici;kzF;Jb}XDAoKFkEF6-UEGpr23wmon@`nv<cp_PiuD{bL%k?#-Do|J++pn z*(a&@CYQt~fUDTbaHIX++7GgI;wWF_r_jOzO)cMV&_rgximJ4HMc4pK?MtRk8~TlO zLGdwyKTX&(Q!Vn6f=TIOrw<6(d0DWlbtQtB3-l;PKaN3OZsJ{pJVTuIH@U~nN`+lv z(i}b;5B60-UT+F?Y&ar68<)*gp;EWVt%w+2G5J4>q_6Btgr?C@F_tY^Wb8iyCOpOM zlTpIV*NIIOWl)TKd>te$*Nr$2fe;=pn7(KA)7r&>2GS#eu{i<;D_0K^a@$Fe9w{)A zKJJdTB^jT%MuCO|%h5t*8=-ff0NqwD|2jk9ZxthnfY-{30`6a5o$u6-d_EyFuGHk9 zt(IQOQ}&!rc2VK@WMTMv|G{0%UbR@EzEND2@oz6%{%Rr=0l=_-zAkZHMUc*jU+Mu_ zpEWv%*4Mb%ulw9hnVWW1k4ewK^ec^#N?i$2E;+eT&I^@6?g~Q8EkK1;B_dyy(nNjJ zEZ3xhYs`!8AnrMa7|r(3RAkZ<f}Lb`A6QSsh2FkNi=t=3k}zEA=TKdIUU+*>PsQSo zWDt!Xrsft$%0XP<Q*u<8Reo(v(pduyYKmqsbue~dOBiklzF^A1Z7WlRZW>5Jtn-bQ zH;LJ1^*2r05^&>}i&rIJ$mDkEQbGe2;Xz!U;8Y)G<-Hka6D$1vR{ckY^nUFe;ojA0 z;6Qn$cz96!JyJ+$d>7}SW9SntXDP-HKxS&c)R#pTng^6NYDe7y`QZ|s!QeauvG#X1 zi2i_Nu2DSsW2Hq-17tMyNsg#I_}A(m3zXtmnpZs22VETzOp%{l(dA<@E>bBo@20R; zxz8)-y0#xFvsD3XVeqY<fiF@q<n{_(HJGKmlmw5kTTg)ipI)M*nFc|Rh4ux*+1=Nt z2{Zu5cZlg`yFpb!kNwO&TFk9CB+PK3qs9Q~5{Ww8m<1T@OxXPGe-7pePahGUSN@G% zs!-w3^FO~JKz~n($=NoM*PIHqZzH;DtHfPibJDvUJK>IGcW~fd;)dHM-&8D>LjB%d z7_6}Eb-H;o!C$r|;uhy96la8vF|@#02i(raofSPIca!-fK2)2d#4VxrCr7TvGRP9n z9)^&O`ilx&mX+JCWEfqq=Tv&b#a&ii6TMYiQhpB-s!Q+}h8(}_>in}q@69RdtRAdm z-;{@29cbs8w^gCAfw5;+&)5cNz4VKj)%oAHeTr-(J-V2a6!%&o&69_YP{3kigOxjI z+Gp%Vng0Vb+;9u6SXFlauam*$1^%(2>DxSfnp?EoLiETxqsFgQA*88WUixuqR%y(M zI&)5zQk$ic@{s!e1b=cU-I|_lg+E%}7XI*y9GF>=8Qxf90G5O)DH66n&M*qa_-{;F z9pt3z6ab%0$=j4DAFXVZbG(#~=ZZ|cLv%hVsTnL;sK7Blkz~;|PZ`+%<5Y$2d*om9 zR{zi~CI)QW%XsPbCmkW~@k@o{9Y13DJwiNEyi?l%`{;+|+=SVmq!F?%q$7`GY>?JF zLP#j(-<5ukAgrWDe>@r^Tm2IHEQX5Gxbkb+cQC&^<2{ZUlchObDqUqsu?Pb_nHNUN zsKgv;cp7v>fg9&gEXa7^7Z;=UA**Hw13Plnh?dGU!(9SMe_hRP9xd-a{op-?MFNO@ zUU(ObohZ*R2?Q*|5d{un_Us^Tx*<kEYDoCzFA{r8<@r`6hp$bw*5jQ$b=8*a1Hn1M zTm93W!tnMAs^djVD$Fg;zq16<?p%-t3(l6IAf;owlxalLQ>4dc0$tuN2t67mF$XtG zT9MfZ3`J}`NN6@bU&{YD_5s{mWLE<>*HwI+GK`{xR2o9jdaha9+tS8uE?Q_>`sdyh zu^3k1)Ntf?L-F14mcsJe3{%=|xV+j=g0RN^6#6zR(A}D!qBP#AUk)ecIA76~fNc%u zX#Uf8VEkVPWQjcNr*3hOd>fh~p$e&&2zRNP8HZy^U<ca^rZr<*Xe9!0(i&XY<Wobe zat-U~vsK7w)5TU(Pk<FLyJIFbt(pu)p!x70SA=~`q<5uJJZYzH`xVLwf3y@_am>Mn zV>h^jgNYGN{oo=MsDQ;-%I9_+;;BkEbN$B)p9vs%ZY>B32)4;{Mu086tzEC?U};Fa z)xWrCY>=1G{iRS<A^G1J9d>YT4vls8?pa%`Sz%=g1I;5oRvKJG#%Eo^Su^*BS-Mgs zNW-V!CK<ZGas_eZ2UxN-H`lBa&n*o9b$LF_(P99cglxTeWQQbi>VH}1<=Nbh+U*T7 zUM_cS&jNZSb%#q<0E5clL_x1{fe|s0MlJo?)5@~zde7Y`&+CURh-=mm)pc^{`tru% z4x+4zMh!VqJ9wB`JE-M<7`7A~j8&oATwZXTeqD2$!Je$`@`&>c>d)c`U60?oygc4q z>2)%QcMKE#H<(zIW&S$uI2Ou>%bXVjp;}Sahp`lmnb91I5<oG5z(Viqkl&lH)J!*M z?GBq;nu=;bdUafEjD;v(+jNX;O*b12gf(8u^v_82^X~KG?CC0Lvn@-;vftj>i_)dV z3z;+>c(|OAEcguzADpS5k%C+*p|na=rR6pK`k!@zNc5V7L{y<i0AH+$J{9zNh}Bb| zz7)rzX|7bs7Aa(ROfXz(yvP-#1&ySr+kO9*dtQmewr(@IIgP{H-7^T*zL}gADba6@ zcm_QiUl#m#q=$?v3G7iFDgw)!hmj}@tHz<0R-kTml{`c>a<G_NH#%*GwD0ZmXcZe{ zfZq=oC$Hoxd&Rawq$i*I+114`ENeq4-Cw#taeYhu8IXa5E1TcronQUA$-e<v;oqia z;d6$mo)W`U=-8}>I`_TRO%uIS3X}2>h27p>?~u__zWoGMdio;Hn?xVUmt9=TlVm=! zNrw}Gx6e~wOjRz8pyeTn^DEouM};E>w;<V+xTwsB%qFu<UHT6}i7^LsbKSCc3;bA; zW;oQa?d2s>*=T)I63IXjUSkT#*xjl!&{OzVg(C!inK?XoX2D2155f8~sgfehtm2wF zVMY}X5<2YnX+D*&zz0UBwl2znh;z;pXixz|x3t#-ZEZZ|!F4BejeCOwB0U<0G$fcP z`Gy72Sxf27ULaLJx66iFU2rAf-w-k<CPv%j1AcZNoxSyXTCry(&$VvUVqu%SxXyAX zEj7xUC7Yq@)ZH@ms=IBUh6PyJrZwf7dsOsC3;VqeVz!wa$YP%UI-#?1e;IsD_^)uh zqVea+;3bc=V^uR%O+Of)3uD<>a@PmMh=y;ZK&_a;1PxiSi>O;bzIfHt1U`47^ePwQ z6m&46xOi}o!#e;HOx5EH(yHTfHVsT#aF}e~-W(im8I1TR5{?K{KO|1ri@<svnu1aF zr{TQ>5Hp>sVx|YdE53nE1+x?Q&MFO2s-Ul~<7{aQefhy)#Q71Lf9_4k-G9Y9aSNiu zzPrK1E_!eeYd6jy)P3~y>F<rLWiD)g{f0i<J#n0aaHBg+&2{+Bc(va@tp(1^8;Y2_ zB!`ren^z5=H8van3ofwO=y>!*!VKrw-++JfwPxv?d71~FI+%fC-uSxyZRv2pPPoIY z7!O@m0)j6;(oBY@8QOA)=jM-l9+~Pagfk`Z*C_o76@7vu_?)SOuA*JNn`6jza9|kK zyN9S0ly@*pS`>5#@vZN73JPZKsS+P@6)$s*6&wx0^A6P$`!i`<%m&=!gwo#hGIe(( zE}b1@Jt!Os{U_+P>l(;)naKkW5!fvUFbh53+)2c^UOl-qu{S3I*yBMMI6|&mFAqd+ zzTDi<g-Gpk<1w@0B0(tEtAjps=*<nT-CY1Dt{q!Q=EGi@>tCn?*Ww^vKp{TLJLNK4 z=DK&;8gjMRanQG{dSMJuAwq6HItvK7JUAIO1lxw(-~<KFgYad!{w2S7P9!}hA&0L9 zw|87U?hyh2eczVPSK~u2hLGFKN|{oCUn<PzSNPW;l=m@tT|WR2fSv@CtA#(;oy72q zu>#(}Wx@NlxJzw~OZb3eVieXT=Ope_!mgI+%|5PXjY)DFdfuo(_XzMN1ovz`MJIPz z^?H7W;9Dd<qz&3p|5Ul~6~!VOU>2A#(|UHn?LT=VRW}<J-#24U?(h&v0{BYz{GK4- z*RxRE<$2}1ILa-mhFcHC4#wNxh;YX;Ff;H^UMM1t21ycVhpQmKF<x5awqGdXTLj_% zd-d8kOiRa2*0G2*!{1K67uNQXpa`S|anZC}kWg|`ls5vGQ+|mLVE`u3oc@pn|Cj3F z{f;1w3yN=a|Epj?02vXOeEtcJnnvK`Xg)m~?%RKr9SHb)w!;JXbp5Y0JmUQ0mV8VF zaC2jZ>;Bpl-sJ}T`XvjVTRlJc$+Ku0Xg=@T&$K>P25!-A?4R1Fv0(PO_RBto;=M7K z1wUS08%%ETPw3e$(=kVaXw;;FBqUn(ml>zd=7x7ub>dCm8%#Zn+%k9&$zYyR=3p;n zit{@voZszlL9C+=_w)StTx0$CnDnvld3)o^ma;gpSLdz%Et0K)I*rR^TPr(j$t|KC zF}`+qOKJ(dw=RRP+oNwWC*ww5p$pffq40LE^Y-RFe<F|=mhu)d_R$rg_I;|j)>U7V zIu~iMo+aEXaeC@lr4|?RtE?S%H3gUzO8|W=p<RA`yC|pAZBsrSX3|6Y#(WZcc6P=A zqw5+O6-%as@a}yv)A}81)#)&APWld)*s{J8mB?4;#`tXiqEOL5U&*d<oF@b(I8{3c z^zTP<FMT%+&acoF$<Fqyw+|5l_>iGe*+vSS643>^$bB^lBywB(R>k2Vkqfj#n!^@% zu~Xtz*)z<<84GROx4XEtAX(IeODMRlUNzQgMbTAMxw_UN%D8r}{vd}<M6^*<`=``G z<L14*Cx9&41kf7u$!C?#wc}DX|FWeYeW{TM>C$}>Tk@%L&!m~~!Z;dMxPyl>c5~V* zUexvi&n*MDUMTjsRK`NK82M617GTs@KkPwLuB^09O3^bw>&i9NSX{)$hWgRLt>VG| z+gt?xG?g?9T;($n2O`cedT6~rm==F5`uEQ9g%E)w0{9c}TLd6^<Q5=~0tXkj6j?Cf zUBT`DrhNVXYAfy{e<1U<%RJ5B8~yKMa982}A5i_LV*dATc0R&87$@0riu^|8&7%!V zbiB-X`z?SD4t%(j-=FU|@KNEwhf`e3zu==sZX4pjM})g`{Qsjm>z|N`=lt@i9?pCd z5haf>;z;``4hns^w5hac!c6sFY?7h8D{$Bh!(sEkRCnAQ3+<|_Ko3d0vn~&m=Rtpj z`9==7i5&e}+Eg!qC{fW4wF?l|=X%uM{F_O$n!b78CHKv<z=(F?ch?D?XSYP@&*<m4 z(dLln)v`96EozHJydU+gcCcSOVFOfdh68G_NB(1QgdV<8Z+dBQ-SF3_nEq{f^mu!! z46~Sb;u>61<znqN{1>-(b_1<J!V3szs@8?(^*dB*%c}#BwCcsuZMa4GzJ0j`L3%Ri z$*#m1{<w;OtKNXx#q@3X?^1_(2SYp*0T*sXD+n<203<gRj*#L)g!s&GJ<%_S;Oosf zI6Y=Sl5Svo8<%~@UG$Nl4exvt_BPC7p5{EJtABgc*SCX@ECdpR$uMz*&(*BioBxiR zdktm^c(hTF29hhCcC`MeR;u|Q&9~!m?Jv<Q@XJ$_HFv#BqmIu!sL7HUPAcjEA(hBJ zcC;2(i&f@6i2;i&FNwaHKRsJ-ZEal+R=FOC2ZKkF2ASbqZu1xilxN-pVzbl?I*J4Y zcs4me16)Se9{6JbEz++gvi^niSmsjc{9I~)L4XfF{wkeqnMAS{7j8JGL!${Ea!3|_ z-ps{aGs2Td1vSH8Jr%J-+f|S6d405aCrFQeMwql#Y|%LLdty9JKKGc-M-gFod6VB& zDPNo{k~s54X0MJ~t+(FGKSe06q@kMD5sy@yfp3w$9DTY)=#@`qE@<x5aTv1eHQ*nf zq?78{|AN<eXCEU}CWP^CD#?HiZqu0mYEL}z87<cq+1WRrZtEXxUX3>|Fo*cKnshvV z#!_@1lcoX=9>c~U*abx1tk3EpUAD07A&=8Qi@fJ`8%QOWTb`081OkwUQG$;q74NET z@_KzDmXz7uzrcm92zNBWVcPNg$75ffzWvhLHY^hK#3^H-e*x2`1mjPGjlA>q@-s(p zul20lhz#J{hk#1+s{B|l`udX|5VZA7PEYl@+aEkIH#1KsMTAFPNqGIHDlL1$XOQjF z)zl<1Z!~xljcEzKx7^>>?56_~u|1FfEYpEIUO1#OV0R_VhB+`lbp`zg!gZ!xfj1d4 zHzUofZD*;rdSK0<vKX_qOP88i>(0#g@6bYH9b6skH?#RqJ1rg(2m_}bZ3?zOs9#!V z`kVAOjX9t9#tu{!U%|`)nE7|v{py9xWBp%g!g=mO>QiZjjLV?wFw^uH0gCz<<#0dH zP{ztmsv4}=qh$rpndb-+V#+TUk-5Do-Ww*(B*IEZ+E*mZ&&06E>6ZG|nD{#(1E27Z zB7yO@w)V;1CtUE%1*Fn)S+7zxB4@Jr5V&=)6C>>c&z%LYh)YR+ZrYm|1Tv`ZogS{& z?hH8cwI?B}kTQ<hGa9MeXFM4hFE6&!6f7w|o!JCEwMdaVF|?Czws)!SwX@$cshV5U zF5-lHr70NqWPGr6s&SGo{`ndlg8RvfoH80C?)8-0O9OTnk~+sjYNnG)V$G5Zh9%8X z)fV~XXy~p%`C%)FES6;lHZ{J%^6_Vav(6AtMN{KJZYHpW`Mu)$xwT<-bsn!SCT*77 zg*nebeN0Q<#-{dq=nSQm*+v3a(o8c?5KE((Sz-a-@K<rks$T`&rqJBe5-1i6?RdR+ zy1p|IouVtqo)-wOqARAiAHjI@^)oy*MJs8%LGWE*UD~EFSS6pu?)A5*$|7rRy<*1` z4!Kzc11=kEM0GkMxT*ERU&SP=3c>n)97FuD!fO86++q_io6!8@)b6U=KpNLSGKDFj zRfbPte<)t{+hPWMS>2u7#qE4H%E!0qLk@b>hNcU)B=Yds9#6|W)%<wE3HQW4a;Yd= zcrEXa@`mv-`kg5S$#7J4`nIb2>+7B_OtcW;<%Yn1ZEKwvwVA7e@i@GM#(q>Vx}cN- zplztxB)YQKy6s>Zh`XM?mDJhsq*Gl=zhv8=efjoA)?#CDQkKo(KeD%9puaST>O<<; zzHfPu_<;h7pWq^(ls%*?EC<Raf*jpfb)9A;$NtrRxwoDR4-rGslLj%gZkDDYsR;j? zrRSAz2nvRyjtvWVEA6gAC5eAo`GH=#RV2-X>40X8RhCm9=<9&3*s(|GwH;kQ;1<_N z^H(0TC7liI*S*H8hwE`T@voYw94Le|*wBg>wqSX115RuWM<sAwb&1Hd*F)pPg@Id{ zk#rMV+9a8E7~6PK6!wfed^{pMWK|E{bC-H~dG!{Dq2-Imw&vn%<8icgqCWk~>#w}{ zr&_5YrJ{`yky{k@maS6`C{WPjL{P*+r4os%&C403PP$(E0{W3%Gx{0*7`RF-L876r zFS*UsqGw&;k?u?3q~MfiA>Gh(t+Rz5D&D~H#F?`*m}J5|sS~$6v~OeCR(Gzs4I1`P zJc(LFCADzQ(SdEem%=)PJ(LnMHRpJ!FfR&=@#u7ZWAMmWj7=wX)e(;(OG4-B@=EdT zM9I3s^q=d+`i{PU+TYO8%%u&9-(KjRL^Y1dv4jcUV_A6C{y}dr96Gc4IOvEDz0^cE z|7__mDq!DrHp7KiOG;mu@-*`R#lM_sW9Y+b#ZHo-D)cgXVzFW!qOGzO=u)a27$ zF2sU5ZY0p&HuIa__z1xz^BmQQY46jHE@%o(j%Ps|IGS#=Ly`AHnFlEUQ8taumfw2w z_5iQg_?vxq5=o${pY?%&Lgq}E*x;Zidqu_5J{`muoTzL=R5$p~qmpkKTKEg=2}6QK z?pDy@27e0{$W>3CzQ+Kj%#BVv<+A>w=uke6p$oqG)r-&~o-oQUCYGZ0=``hxmT+qx zqH}~ST%q3@qWW}!j@y2ig7Cb_z%pxx%YwG?74brR$ADd9klxJEVGE9r2}RH7b74#P zM)^9D5iZtF!(}baDIY5rilb{iu~IvX+HLbzz3H!tV+o6;NodxG{bz?mQ9@9*IOM5& zehs!|HpU9QRYd`_V}V4IuYMU6^oP{9*z2;`811s=9bE6<3|)EVo1<*O7n@k~)41ji z8K=S%;(%Z&yIK9VYgu~Ty_3RykYWqNQ4>hfuAsZ>lTc6d1C4vu!jv1V;xH0*zQJg| zm)M9fO<M)nMUhv5$eMH&`p<?6xRAPj@VO&5L|c+d#6-$8sa8*aF$uxPX?=;o@!c6p zSM7$=-5vhpsre$lm%Vg5=I?aczVJcvX<p}m9OsV_(_Xtam8#p`MjWYP8jFEFbn5l_ z&NFL@YVySzRb8$v1JY#&mbGH6n!U3Zt+A>k_Y7Rj=IgZ&Xtc)t>bnp52e)?@vFrYk zykPQ{wYbtLAgUOsuRo=_;*C8RY}DYs)9(+8q;WUksWkM>arFXA3$Dt7=@Lq5YL&AS zwEeMloT%+xu|H}S&pUT~bqMa_C<`(L@p0_u$Nd2Ebu+A6!R(T4m_!{SZUxJHA0Of@ zTZBrzJHOl6zFHMFxNV2KCP?@%vHF%E`i2+hq-DXS@4nypZj9^c9YP1MOE#<?HzEK6 zyT$$s;24S!eiMRGyZ5}K-|*0+K-u05EJ+dPu~pmbEVA0Oc=B3HuLXLZtGiAHZ?`sb zoo=4|N>sxMe;6Y5jQwC5J6L;p&)8Ku=;ssZ=B9?rs0W@DGYj(v+_KxE1FE)_ekFd~ z{xgur%K^3C6shf|H=U%6HLrd4oG-5=uZ=bwih4xM8XJp6sc~*M47rUyqgs9uHu~kh zxBYA+qBr8zmv}R9T#w~-<y*{gWFW2wWpEEES*+vN6^AI-jc{@Z49SQR8j99GN+2I! z6i5O|cp1Ko5+oLzN;L})41BEDGWJX*hx7e-U)n;rniWsg^Awt0GW66B7MUN6^Fz_- zz${IjJj7lzm$Kpn9_f*&sH9+dRjb)_GUWAlrQb|jwXCns@X$iJhMK%7(3pYykRr-y zG?K6{qpXyNZIy}Bd1^RcccRbOyK1U&D0Et~VlqP+<FQrK6CYQ@?w+=G@Ote1{)WBn zdK&iTtLgj}57YKWNax1DxMjshOokzKyo<~fsJt)x3%-Nq5%$v0vQm$qPF<4~SR2yr z_9KwdW#Y!^i85|OeWc42z=Ui=j*wJOE}FPjSl{9HAomzA<MXGkMSTf!4OV7dFnbv$ zl}`Kq1WJB>i>fz-cUJS7=WS997(dvuM)MB@`hF4WF|m3+4W6A(yEl6DymIH+W3g(` zr?u4|VM*=}jg?2P_BZj^d!sGEfvk}JAA$qeIz$Dt>Cw@}NL{45h94lJh_Njt!ZksT zv6Gsg@z>ncO918%#`N2(aP1ZCX1_~5#t3zg!<^R}RUq}SU1;H*>yU@68u@gRQPuRI zX6bl`{cD-w&!y^p#ud+62z_+~o-BAV4n}v}B9D}rvHaP(CdxP_-_AHX{oCK4C8Xya zR==33M}cVw7}uJ^f*(5tkzo>CcL(F=DsTQ?2^}K71=&q78!U%M<XDjY`7CVt*i1<) z<-7bqB*}*Ez&-2pYT^COlO#*BkKT1wru6CHPvpC#g#Lw<SzGpx`?KiV{sc;%#?gLw zx<ay%u_-`}?oqtpFA~(E=3i5d@*A3Tw-tTkc`&B{Zgb<$`}i1s&N2|aC*{lDHT)^v zDKXjaqjID#e&Su{>~Z5rSHqdAL&j-+sU)cMSH?MK2lmT!U2VqB^l66D6lJ=stvn~c z7jCiU8|LvMl#6aW=Y<F_J!Dtl6wKzaAV)&}xuN>?Z<1-KK=LzwPM}nrMZak&qhv-$ zwuj+Y2QGEf=xwza;TLQgD`NUKZb3_xHbSM5#dZ(9XZ&PySEyyY|LTa;CJ*^(-^=M3 zMKC`hG`%Du;#2%byd49-{1_$0Tby^R2n!4(bktqGy_7({h)Qa*FsvB#px+=?P=b)n z(uxU07@5Ssbd5_&7x-9UAo*Bj39&D_Qk=_D#pz16b!bFFC2*jW>u6oAqsCS6su9{( zaxIJTNZtKYxjvxbda(X#Fxq9gsLRs6+Qvrmg1m=Xyq>aAsLc?(XBz)u!21=C^p|Hn zHa4iU5}lxu;aq`+{txOk3~HXv<q$pRpKJQbo5M~FRsHKR8qHo#zYa@2!ZP~e`K4G& z48fQlQLnOa?WLhH3*B!_8tt@m8@B^1h8BMh#&@G%tB)XAbR~kn<zyb5aBUq>;y1TD z2k-nnpcsPJ_(1+GF>yR`1=VZHydy*!_a=XcxU0v<%*UG)cl%a+*A&egRr$D|G^T^T zU9-gB>wvtz6`wZmP(P$i&*82&6>HlPN4q02ZqpmqPCXPjUldt&f28mG>Z?KQ7P=-T z<3<k0OGMj4#P~A?^2<rbP`_8Ch{a|pyal#mkkLf9>e@=Y)#|<|XEYv}K7QDICjz9_ z8wM-U8N98}!!o*x#QnTvZOEm_q&%lT+EN5!@C7X-)Hkpb=R;W(N!uJ+>7u-ZOQEx< zd7iHe4Ob+1>(Y&`ey6jwDWHF%mh@)y?n!|EC(y1Ch;MGp+((m!(&<p<@xN0KGGmJ1 zUc)8z0xD8JFL31W7ra$^IH~hk0W&aIl@r&`I$ZIYH|ZN%w9@ghrT)-c!=O0OLT@40 z$O#4R<lFfjR8P;Hh^TYxX=OMp*wjvGJj82{QwFb1ueFYgBFO|KB`zb4YnwDHiPOWh zHLg^^In&Yod4+Kq>7cNEOuFiNXLGgs{NudL&fD7Y$qo`@uyn!z@aj(&#%!nGv#Li@ zPiqy=z&ybJi?a8OYjW$>eiauM5LBvkL3)dH=_0-N4ndUOL5iW;03q}i=}IR7LazZ7 zK}zT?bQBVL4ZV79)_V3ndp~FI-+5oZ#pEuznVECUF|O-BvY7cK`bE>Dhp5C-j`c%^ zQZE}mo*j$@?B0ViH;7zlGG;#qPglHx_#Ai$O1qYn%@o*qP4LG)9uRKaRn_#1v~J1G z$)fz}&mJa7K>zuq+ooTr!W^xjWsMbCvg3z*epus1X~saw76`p)Gb7w};TKQUkvr2> za@thF(-woR9UWHhu_Gg>V%;0n6yjmQ8p=--Z6RYziK%oo_=m4jyU;@XNql9j290uE zf(;8Z?W!y{J@rQ$MUFP=JLb&q6VN%*cB8czo%wp8u~m@+Slibf`?!TgHLqv-Kfl>8 z6>KP=d7@Cq(A0|xR7Snk9mSV&nL>aDs16vP{#!rZ35=U)caZl<pykCAEy7rsAa6O| z(|NSs7PlL8qU?QVJF>(k<o!{o=m4kRRAS4>xn`rCB=YMt{A)p&ZIDhl>o_edmaTC3 z7S2@thEQ&4aMF_}BMhPV1^d6CdlSK&kk!I>F~hov&IRvkdV8hGXUV_8IG~~d%6Avc z$zMlpLsGga^E1(1>O8vB9{i<-duF3?M#$CLoW?^<UL-`7!wdVY%vTPqNi#Pm)HqaZ z#&@Xs9Nc2j=QXvm_u)=B!ZU9^Ov<&yF_hAFysKXDB<a^s{57owrPY-OXsDP3yY-U# zT;&-ZkO*mVD_{0ycbgc#cqAe9T1PUCrJ^%l$BJTTEwT;}wJqoMCo4<a+Et`*eDW{D z7-bmYuX~kBClW<Q^~~_)J`M<z(wv;&j3thN(9XCCgLGK%3!<W_ET6LZdv;yLQ6gP? z60!oW3iyOTKjS?S#%xr*&(u=ZJ^UwKLMh2q$W)hgq!_um?!-uv60@UAW!elVXEm&H z;YMMWbCzhO2eyIPeJJy`HwAf$kMxDghyb)hM?bJkPvCA=9?9IeLg{A8K5U0ql;UXD zq3jc?9;eYLVDc4J;9oG+_}QQ(r@9Yes-Gp0()-h24;*;t{|L{5o+3XHyaO47*wqx1 z))P=lLqY)nMOl+tlC5agoJ!OP?yP0{2|mHm@#Mj)d|q{_aY60;2mQZBoE7j+IGX@Y zq#Brsn`kvnL&s(`4)V@ho$gEvWhX4M61usE#wUE361-Eo|1>eIES^)xSdicNC8TC7 zMiRo1jLMs*^b1OOlGByRzRxn5$66=lXH~hM0P<_yy7Tqu<8v}|g<EPIT;t(|?gp86 z)`A2r2Q>yxABPs`zF+B*fbtKmtA9F!h!2N<7wVj<p~NR}F+*p#TL*v4CASo6I+mud z27}ACeid*)u(ySoL90J;YR=iYM*%f?s9w2YjB8Hq8sG|X{kat|aZkx|)d<A(qJigP zIr;<9Y&^}2)RcY5o&{Xj%|{8R#HL2al|6E+wk?L#`>msIj$mVD3M%U9N-R;es&DO? z-poev-JaZ-3?0#r=86@8r(tC%S4Qt)I0fgCPlK;XaQV6xxRVVOZ0Tt<{Kt#vX_eFN zx};Hs>98LzBgN)xdp<q73OchYr9sDaC#gHg#*%4}*Ub7N3pTM#oqkYm;y9i(l4@9p zo%DJ>`HYFV+JtDpGJR$EAk{wRAUDLjnXSdBb8oFu*H|dxv~|Su^{YqRxpfjg=8cEz zW^LTXUrfE(g(j_zP{&EAA&hL|rUc*+N%#E3>>1WjiZ5#`lQe9O1?0!Fxw#1#qD;*? z|2MTm>5-<d!rl4sqji_H_Q<l+*^9U`DVZ-Q2`9wr8!+Ps7Lup?A@deW2xn<0$g0c= z-QIUx{=%(1^Ni-xbFrh7qb92n{f<fHWQ=HC$T)UvbvyWZ%pwdU>Npq<gEiX@*PDSu zE_X@sYF=^Go=pp&dtVZ7o~5d;bOExx<AAG|*5{>4?@Z1P<~@2}|BY`U#hYFG@vN{d z9!<QF4%FOOM~cqx;ME9#-2#?yypk1Zbs)^$DhE~tGPgi3+YG4N{z1>q#+H;;UsVDD z-S`ISKk40+kEq}U@ehBV7wD>*gK2Ky)d+#~FIxh@FHyA&5uBvO)?C9T6U9-RsB``U zAvp)++yIoM81VblI6yAG(JT&lN|OKQ$B5DEd)qV83*qg^tGoQ?e4*G5hP9BB#vQ~5 z6qU{+hT$Z@B6DdqlO0@a4<ufnO||CS1L|Mn`0cri!x21^KLI1%%I$r$xGn2?hL+`u z6D=SZRw}1*Cx>_@PAHE9is`Fcf)-xRuMhtmIO^S&otwP~?2=_bG5!S<28ifHC;kK< zEizk803|XkA=vsy8JX<t>;(j2b$RyopZ^-sg3Hcdczu&)=mNgaFG|rM=@roS7U^-} z4aoH_VpLlJ$PVzF{rU!|8Tiskfui9%`9xEQ>0DOtk~vb7hCwT5g-Pwce?o^#<?4%% zSAx;hWY|%gl<ez2L1M4;?U2E^;IR>7bC<>rRUWmDXOnjj;s6Z8ac?s#bMLFa|2lBo zlfi!-_Xjv`OY#H7*@1;2D*rKZ@};AC>k}bjOlC18)NXq6{vtBhNtptY*(`OvbNNhu z4JfnFB*F@fW~8B2=_l6D?3xW;Ixc&0iC9i;DTH3E2(}Tw&S47@4pkY+iCk(pu*{#a zD^~rpa?xEr=x4;sZ{_4Du$0EJfa0_FnWp}H>T;Fl?<zq(b=^<0)f}ttU!}3N_f2eW zQ%>ew@Pr2Q>E<l;I+#Zo{wBnJW?LSreX+2zxM@}rb*EEHl==|LU9P74vx`YDE#<=Q z3o^%HfIjkP+cW4PHG}T`&JQu8W8Uqaug&=TAp+$D%_iy8mbPePUrtD-o?&gqx4h^; zDxBAtx8lLu>iXPOT0dTphQ!%jV2ld#gCut%%hY4OPB+LHvLU)OwPFycgud6doot*R zs_X@sMe}_QQoR!WS_ULuD8|JSAc3ulFQ=Z;uhFGy?C_t`I2c=#!HbwXIbG0x<KeMU zR<%XFnH)Rye8JSZQn5AXWZNEb^-5I{Ky@zIi59y(<Hwd8kV5U(5RM`P#(5kKL_9^& zE+-bE2QK5x$uo!3565(f`E@VN4Eba#+;RMsJ?IpnsO!u>bD~H_=$@-amA=k(s|3Sd z+t;Z-XahtW)AhU$;+7{Y5^^{eso$l%Qq-zXk~Q?I={YRsuPdNduT)|3QSR*=9$}Ln zD(X__??||qDOu79Lesd}VSRiL<s0#DQP0A#wxK_iCsiSoeR`RK&y}f(r%{}i)nsfr z1qTK2L;?;^gg>84K1kI7P|}leIC=fjP!Kj}166*q9rKZtwp!xVP+fG0`WzW9Wt7hM zAa&F>{IrU*I^8s7!_QQmG(dtGWL%~}I$Y``$DSqE@(7tEE&xcgHXR)6TUNg4ID8Jd zg&dXWq9#I)DlG?WexzX+!sDd}swjg-6Y==o1XdH@*)C{$l((~i1<UR2{TI6L-}5{e z&Zy(_Ns3D&&|b(ftAw?`M=j6>#ilP`tQZ7)U--9n#8fGM%!-E<i&j?It5P|(*m8o@ zRlPaAM)Z1>ZV>_dB|!R^;-sh^iiun!+jn<%{f;-eoH~t;hD)jmJ_ZHlvciDB+#bhp z8!Mh=ag<L_Sr0ri_*g#zm9szMvZu%kcvjPUEr!0tyiP-4aS5|169joFO(}IVklUfp z#3gI!8*Qedy4>`O3$UG;d;o*sgG!HI%`Ijmth*6)(_N%(3p=LIjrkfoXBH6pZbsKj z7*FOrVFuQB8^lvTMn)Kj?gpBV8PB|96AwPr0JnhJK6@sPSS<TN@!YD;N&FhcxsuBT z7p8r6yx|z!>Q`ay;?U~d29!$d@8ZG@adhno9ruNIf^+70FX1yVGTsMLV=#O#y64IK zp!x?vj({KI&x~&Q|9J)y!GF*J|1dJ;2(?}?=2Q>?bvX~Zg&qziSH={1=awGnACCps z?lC#N@?4_n;n8}c+5PI*Q!MT;ePv}WGHFdNmEWTkpW~=;A6r<%@;J@PKiJGx>N{(4 z`2E(3Y)q38tEqbHf+(WGi7ZExio+cyEfUUrJe8voR*Bg!c%`=LepfAQByfo1oFF3N zuafLeBZ>zTIQuCUS||grzXLQCJp$c`eEeggw`L?}w4U8k9Nw9}`K67hR%B0xsHhnQ zd$f{;eme2Kio^$c``}j%+QvPI$HmO+s@$7YHn$=WgNAxd;|s(6A=<^L3=<L`ANk_K z3|`1x8#QoCGRhGZTF=ed|5O`$oUbLC$_=x5V(LKoI(OW2OQUg6HPW}gnrvUWD73*X zjA&(M*r;~DI(~W}+4gj3ddW1G0@Ji?eeX<fbUI7YsWb&9bE7cBE@D_A_|&0M&BXte z4xAw$wc|gC#_MH1Z&6l!!!^$t*LBkdt|WipAQn=In&QUrd)F7dTchOO%%U}DtPUEa zRQECJMraiOE-Lhwmq=SH`192F710g1ZNcBu`2LV^-`xm9En_ho>v;ZK5ec1FIlw$O z3{JM$Af4jFm#zk@?%H*&S<<w<G%*B++UPlpJ2teyIY6C33Q`E7T|DHL>|x*=Ahj|o zxpk<(t6#U-a9Jc?+ZWyk{a(WFdZ{V-q%bL~w5HpImSX+XCRpgRYAdo}6r@N7^{!+| z9xLQqbI(mww)`}ZBR1tL0B3UrQi5k^@}v?M+{Ad=YO~UqoLJu?I?~J@Y+A|$92Bny zCCF^~XzIj@UsGY&s7J-T<CGXyq&CZ^!j3H$IZxzx>z61`*Yo>kw;R&ec($CnaD*C@ zh+2V-Ihe4eS~*yOI8#Wz55jIcZI~?`-}8_d&;2nrS@NsfX=RPJdPcXSI;F~e+Y|*W z5=F51*b~V!mlh)!k-p*V;mZ&HoJc{mvr4L6p-9phK!Nf;&fv=g=|z-TD7tm@OD%u0 zB#)$=u#G2eOXvh#s@{KJ1t?U%H6B)i@T%;>z-!$t%)~jcT&!ye)Zv}ShoI-d5V!rc zvILCE6l$tRI5M<zN0rrsyk3<@*Sh-kx8y?;IA3!s`RXHJkY$vk7991(v|Aq`ZGj~0 z8%3~Xyy1KoRGu#erSi~H#O3w0`1V6(z@#&Y74AJU2>5E3ITC#!9)1!W`&t=H`Mim8 zDyLjj%w2j~6*I`AF8@alO9_*@sbvB-YG1k`Oz(BOZSksbX^a)2GOdY1;S2f@XeGLX zNmJA-iW-Pd-nX}R*<*=_i9PSv4N-HGkQUP>6VxG+#iN`&NhcgA!>*8FvL&AjDsY(# z)fK|uy2DVx8egWjuYTqqafH5r_4WDyc1%l{wnCORG^6^XI)*pd*?3A^oE4UMQ(&*U z;>pTN!E5fpwPLT_&eC;=44m>%#nr>==Bk`P!ZXK=?a#Nun&aDF{Cy!tpS;Ais?75| z-NIbH#Zs^{%A`-=D(C~!(&dK?bdePj*0LboIAI$cUdhGwF*2+giN4Vl$XQ6hP<Ym* z9ARnudBm03a%yU2)%b0j+NAQ=Y`ni!S+f&I-FSGssdrnbQw$JiU1<$~XEFw-P@4H- z=#csn7jOD-<&)a>!zlcZ_fnE26pfG*zd^?6o<IklU4EU0G2Gk(%Ah>1?#^m9v`Z>K z{(~1nglKvT=0|G&JM|!}jWZDLsK$5$2oQ;ZCxYxD-njAKBn>GpJv@MbfeoOOC^q5= zl%M@$z$W`(tW5HkJD{CH>ddad?f~K5hw29<gpP|>$@zbM^Q(kB5U3JBT>ljoUtJ>3 znENV5{3nZl^+6l`{|u#V0h3qDydtmn>!ziF-E-0A*0F<sosQo3@XKqTGkpKFk0c<y z|2y)=mE#+wS|O0-L%hF4+~&XH_d`BpItcT7;o#^%u?~>4GTq1g@$jsg-KD$nuaMsg z5_DEJ%3<2r(5$Bo=zyFrx6xxGN9ZbT?fKQ%y~b0Iy^GaD!6a%1{2R~i=>bq#S(jg( zHub%NvQ7}}_x0+{Q(a3#rWQn@IbZ3meE9s~KI|?eABdgDE0rOZ!7Ns*4lC!+i#wfX zmwd{yMvpiQg8+S!k7|#9AYAYJEj}cVVRMi{tbOIhf~uv3A;Lzwc~Ncqk&k6DqH2%Z zwUIfM>%j7|$Gt_Wm}mUg)}I7sB*jy1$ZEH(F;d$8B}^19l#!L|=q{?;`Ldw^FdLkv z*$EY<_#Cn$=>!MHI0Wv5s;oV~B#lP7_46m6KIh6lRpR%TkZnTgU|5i^edIb?&{Jb1 zxAf~!ryhrW8*w*OJ{ca|$EDuO`-yOt8N(e=X0BNug>=Um6VWH5q;P!5z6%)9z?gTH z#1Ck>RV%&tpO@n1rM#;q{m?U(HTa2WE`3~c_qu5R@0|AjF6eYinTm`(rrMu}+Cz)~ z6?M?>J{$OUwJ&psJbU(ej+;$q>Ev$c@KAmHM#6i+z3|}6priTQc(u^0y(E=)?KcBg znZ?wdG!%Vn!CDOoPmSoQ8{M&>>mesn#njV0DTSJ+5Z=4S7yiOtEa`qFlrh)S-;J`a zUEj9|=aW3K+vftsDgG1;St+T=40(JN8MA@3U47-nhdlSFag>UVSo#m!y!1_PDO1}k zdaw6a(Yo3;xm9m*NH3Y|dUh7G-DnJb-%>1j-bqrK^>j-U4D+l!zHb}HgX=)Rl)%Po zXucngkC}LkJ0&?oEGFXPsOw5oEq0~U9{HVL4TW#I-Ox}4BTho@&s}Mqf6SYvl->;! z?OGV_=Rbk*_9YQXwHg@=gGKW%s>h1;qf@%j+<MXa5-;3F-b<^Fu3%ho{;%URO6lS5 zPN}2i?V<VC(O!;1FlL)<{p{hCM%H+(L^x~W5VcNOb(hH4sc+N%<np>)V=8zmCvWr8 zx&{Te_na~@v@UaGLBe^1a~PI~VhACnF6PrGR)Q*_xrxU2N4r%jm$VIr%xIc=$23Si zZs^5$y>T?#Ust146_zVyZ3;32B!XJ8@H{s41~zA<bX9jvgs^4(bB@n&y}mA<&tp)F zJH+sQ<w=y1I%79nI2#_pb{1J3I%9%OaEr&9+Ei$jG_DVa!rq9CY#hxhX)S0tb*9cb zL8L963}?eg%wSe6+3DpyUF+u?&$sKJTE$_g%T@xC62Y@ug@wjbM?2wckMUl-&>Y6o z&&Z~D1#q?SW9UxWf!<V6m6A5?X1d<zdsU_~Sn}+1xwX$LDltZZjn`T-3WSsT9J+D& zC+*s!rrtr*2hphd;>^;n_i5d_`f%HxF{&Hd%U@8j=(sWhaQcp^g)h5nRi0Zz32)UA zbycfk$Xl^&BlP;(s=CMqw`X@IL)L`7I=*p8vW%Y`-x%oM*xV2k=<~XHv&Quj7F8`k z2n5zVNyW`uN-rlVa`S8O+=@hq^tP|6Qaxj=R<CBuQJg;>TbQL)%9Iw+{~EvOkhmcG z(;9DFOvOJGuP+msOx?hl1k2BcOhx7wQg%9zBt%dj6btoQD<_)(^9NYdTd$ctJ}BfV zU;y`0<^-KS?adYg_VlUon5B4FT`Gz<m+LUcb-c!$7td6fECbcUijV}6(~cs<g--1o z;e{qeB@SHpt@g-KIyAyWh?<O1{yKwgij!R^B9;As*|YLY!uRgqCxo@=f}7&6h!*wc zNsFsKjvbg;1n2kk@+rWKd)t#6U-?(-Pm+Bs=nrI!2TS=m_uL*YXdX#X+=0(&<k0VM z1(SWUrTwQ?`_vLLhO2T&sX;|1G<X`BJbtZd$^_11VZ)o<K9599jbwMDZE~aPyN=d8 z(~a*(2ylTW4Uo*Pfk1`<^=$~f9?D+X$VFw6k=GZEQgd3u@H%E6jg5YePG5zR7DiA_ zMiPzAe#=(x2qZEZA{fBgA`0~PRyZZzrr71NU1}f3b1^igeW5}-vy@)UC>XsK4IugT z7`@)uSm%2PKzs9_7hn%gqpNvAYJVBG{$7Dna^k%TBiZtC9bq|vnmIM8f~jn)d^%+a z6UCT5LKA*X+>~gc@4)%71vpPxOs9lrekqM$3;ug5B1n#l8MNhKt(`x$(fTN<5e2N& zJd`nN;B)TUU<OIEN-1|AwsY3_KCEy<tkeEw&3yH`L?_Q=m05MJ8@0NB1d(ulYRg>4 z6!{ka1Kw_^Rj=Dri|Mdh8g-wp2;ylX`Ka^&>a(V~+G+jHNGe645G2LaARQ%@#s1GC z>S2JNy2%rmbnN!N=KD~S*$kg;>*C6XYyT{}rpcHYqLV)W5y3m>)1mpF;L4({w9{Zn zAEx=&CTwoR0ryu~>*LOiXqO&h{p@!eJ?NOZYsdFSd1j4`n?+whX)-bu!0Ya=B9OD8 zz9ag;NB<PvnGtyZ5CHiQkb*loYp%KQ>mEY4G(AFU0tI>CJpvklN%mh<k+mrRR19np zpk<%CX0BUI(o;t?(Bm`O$YWw<sZ3HQGC+EjdIL@kY!x@P0wAUH!NnfnXi<a^Mb}L{ znPrTGDlSTbN1e1`kob({X7g@3<-YH~6qf)CW^n3I$p!T=h{V6)r>{>lJF?B;OV1_= zsG`|=qV7N}ShkZNSwC{2hNb**N~iTIrZ_xvXa4!?T*e~N);R}caHr>%CRLW+Q_x}e zEJ2OovLG;qfzuwSr5S#yE*+#b=((r_^LQJEj~fpy_cVAQB;(qC_(I=*RRYJjuID=F z%cb<pzK=J4JRgrO7j)3Q=x&^r4rY-}dDU$lZR7`_r+@3tTPU}5gx5*Jry~zl<;3lT zX;(lAAc~1n@tV^$W~9&2xCCUi?zXFYI<3gkL-SVXe(k!qP5G$t00r8))`61eS8IiW zae0pS4bOS0W4QY|GX*n}p{fS;RL8N{x3H7+cg>**PJ(ATnwGopUf0le3tF8)!ZH_W zppC;<bBo(*lhpS)f6gt<6yOtSR2zEWN}4%ZUr065*s@0A{c&6uM{lX9Ugu158fXyP zLc*Y(uAKaUVJbf8hd{QM#jk`-#?4-RiQ;3YV<J52G#+Q`>YiGIUpV1AUzj;mo1Wd? zD{v1u$T?Zww6r{UF@n5*%W^M&$5|~$kDGR)?YHi?_s^8*0_YOOyjSK8z}egPiW5iT zU`}E;UqzZ+VQuCN?Oy4|gAuy@#mr18pz<~%3b_OB8=mH-2l?My5T`e&?r-WZD&-HZ zi*Ubk(_rGO&;O#-?8b?t7muC&`QB-_d#ag!y%g{?d|{1R45D~XLdz%dfG@u7IEi&U ztXuEaTC!b*J`A&7b*oQ$R;-5$f?xRU583@j!q)P~@Ye`)UuqP}1+ph`^ar1Aq$%<K zBncX-fAfxyxZNq!T8Ou?ap&Hpyi7ER`bptNA5!dqIMQdJc#j|PRNG+XGqDP(`frTA zP~vSfMfJImQTzfMql;DKX;v^pB7cAu)9=qOh1ft}&&n9<I*X?@PfQ29&%0d~6rfAE zK8U~u&JIF;84UhH(CDUZ6}vsT<Z}AOuV=m7#uWTRt1wZ2zoH=35)I8|uI({{td8fU z=$fS082;uheRS&{kBe-AkvTTsK;F%1+~mh-mi_=Ep?7C8m7^w_$7)EGiP&joaW<pq z(4;lgNHPKQEF!K!LD?zqKnY2$2!-E*lq!}8W~vj2B=>KwV{t3*^reFs&6R>VSGjtV za1_bwROuyRaI~dAy0Eyn%j!H<<B6~#IDS2~>zAb_%}Ewd#_K*TWtLl)p{AQnx=JWL zw(FdBmpH0r>(WZ_H92LW?oS7_g*@Kro5deA@?+Jt8<bkLR1c#~74-^a6X9>N9-m@A zM<GA1-PI^CO~^>(D}vtC>Wg~7<CvRoWnB&#y=#bNLNwv+Z$n($=x}3dyruER%z7rN zg4IS2F+}zs`A%au<e5LGz#iK0;#a$TJg$#9N)M>eSz|kz_Q@3Wq=O8YN%NjVDECv! zl3WbhR5TCv8Y_5?)XGnWa2@g~r}}yc`O2Ah#?k89eTz*(jMO>&b-c@-=W6!`9t!UT z(NNjL36lda{I{rPP4{CtZUj*l6IJ4RZBPCxV_flgSwNWM0WY?T889p9ri1!>i5NYn zhs1k9$zii?@_QO4AfQ%uBLbzOa9vesaA=5EjV>rTqvQjJ?xId#3MO}^fM@Yo1^O9n z<hL@y-}7C+R8=d44Jd;h>$F_czF9$fd_1NNa3D$Eyqc;9N?^9xf8}6m^4~PeUAHh5 z3yVide05LiLj1^l(vzfIrm+@Pxsd-pg_^<8gc%w92KQUQ=9{nbswmR9>3wD;YN^)s zR;0{$)bB?>a`i5a_Sn!>wsGHKxcoY8i$ZLFA2TnJHVd<4nm|{ujNbyQ$6DUQy?fp2 zVFo@XLD&fP2%CaMmWo8a;Gqvik*EbC>hPjMPPhWK;Bx-6{;VX}Wx2xBp%<@qn-Wvh zNY`n*U~w-r$kdfb3!d_NPiT<~JlymP98VjmcAXa<+beV#rGB9bWU@dSZ8ssV-<YvL zGC#$XNqy(B`I*xoZl{=%Jz$@PJ&qZdWi}MOk%|f%e#^e^74ckxn-0YE_>7KX(sSb= z{xMS1?p|f?b;iJfDp%tI3kwdAG+}Ml7yq(*ca%T*D)Q*3B6KyI^N-jWq^)Z&!}l~C zA=!-v^)}jEHxs|McilFVps!x3|AZ{ovT73+n<SRk>lN?fN@@4}DLsHyq`Ko`zTD0N z!a#$cRoQ6z3mefiO59!_hL&kO%_%r<z1airyoBOJ;=hugJW|H2qxL_90~)ke{BXyq zlFirN<0>@QD^py6cvbNLqvH+^%WB{Zql*swnq$6i1*4X&&Z`MbO`a%HsZMq%M}Eo; zt3cgMh^ft+yz2_CshRj~vdaeB@&HX}fS2yKr1#m>2*$@DobzxAy$Kh1$L8`M?+ce0 zwUaj~Z2N^pG9hLXRO{_A+}Kn}GK7FnuDyCwCzu)OFZC|oq{pzJHI!ULT{Xq|W)hn_ zH@Pa@teO))Yyv)i6@wEYp1wXdqi1IX_+R^6W>pUwP@F4VB^z9nGOh-*zd!xpDlPrG zR?}lSwz#8qWcI{vy~bSnqPhaZ?QP&bxN<NR&CF9&o*@a41J!X;q4csvd5hDy3aQzR z^&rTUvgyl0GPHBiPn;5Sr?Ei$$j<}3Q`jwvvC$#j{-5{+YZwD%x4JefHjO0(u?ET- z*YAkv>eC}9YT~se)Gzzu;4e0Dhc0Zs7)vY38|uyGW|=1WRVfRt&f)!1Vl_@8f`DT$ zDSltHG@W-~JRTzi;qvv7uB`3+VP(=?J#-hhxK{lD@6X}xU+1X{rci9YAK>{)st%(2 zPK((;v|>gVUU(Me>ofOLlGde6Kn!l2ClbkYlL{NsewwU_9dn2+cF{U5Sz7UE%(*${ za5$7=;T#u7EqhnTER(4v8=#+acQa6PTBQ{)^=PCwxAdVOaUc*5{G_S4wDh73)ndCe zyj2oRvBQ+gO*gFrYEdC|mcF7|RZ~bW5W1~y|0$wEJ%@2V9YV&Zia>!<@d+s2THc7% zb`kgCEs1+@S>$9b-?A69MZeI*MFuv<G~=9eXaTl!u2|BLQnRuQF5n#Fj993@fAPo; z|3%;}%J<ti&`TjnBu<6L%!$HC8H_Ec6dieX1Ot8kSt2*hD@^p`jdHH#ZRlP663yZh zs}##jHV8@aO!<BORM8S^NmSJHNek!iNknxYJG%-}T%57~OsMdniyE1vGH$hLh<*dx z0Lcn}@P%WpwNf|*<S-iYG(UG8vXz9TtoI3#N&Ja~ZCL@C0HEk-Fx;J@5?03cXv_gJ zB%+CWi`Sd?QID}*?|ye&>~MVdeL(6>MMqeUwy^|{l=IfhhTS}7efzDoc6X=e)l<S6 zgzJq}7aAO}0W4d-eWSdyE~Cax-+E!!wdeXlRHqVgn6t_CxThprj#E?LX=s~kzUyvF z^KHGU+cjKLoUQ9#2H#W+e;HYmX)voW&jvLd%+o;&P1;E7)DA=xrL>pS0+<Ab!HgSJ zj^CF3^N*Y}-Ge0I9!t|^&kJ6i>&YS;_L~<{KhnoG3G&)T@zNW<Ueh0Who&~4G~xs) zi`h)l2e0W3Gx^k@0%NsB7nMneIbJPcu&cSH#3!gBT=*@?1Zwa-|98GTSgVK>@WW>; zQ}d_BiHZ$l&eT9=dHgSB+%BB`LX(C&ihEb0#XEuHo{AX$BqQM2G4bpoId6ZTKKCwj z%C>pIWcC?M&G|TxrAEAJ><B6ILd)KhH}zRx)T&v+6kkYI(UUm)n7xP$b&e#hm$yw? zDOw!+y7O<__xtoyb7x^Lc6$B0D|@wj;IJGFThK`2TofHzasQ=BBSmtJnsrdH3Fr9( zydU0qcYHApb8)e3aA{-pA`_*Q85hE3=KuA~=?c&WqS!>V@ndUJd<*}?FgN^sIN*#a z2@slE^eemQ=-1o|2(vwOaST_#`7Y7e&Nk4RH$o#`6JmQeDld)5G}(BT_#`$b|1`~< zcR^N*3RFxz-{o7-<EFGtLUh@rgjyzoayzPbl8nc4Ux#Gg2C{`VhG0!etZYQe_(uU< znlo8TPMLrciX>L}Dt}=hj%d>+v;)JU-nFjqKkqzznL*O^PQP)pk`82`>bY?m#O##U zqqWlY5PfChe`QoHyLh&|TO-5n+Q>S&8|J@=i4U1O?X5&f5vp|V`!V=PtY=DeEhnvc zTX|Y3Hy6j!{FBxEc8MD^#;N5FI~vv!zoR{UxHm8z0OiwO{Tk&efehSxw`w$N?ry07 ze!&Fffp<2j+}!t4Dz$LqJ<waBoJWm|T2`^%RmE*n%|rDgtEnO5UF*r-UXYu)wh$3o zgmc1C_em&zPN{J6{C%$>kTfL$_IobUtfU+k%~^Nv4Q&_G53~aWH>p6(3*jYCb-Lu| zg@r$J!=i}#n1{X~8cFud4(mtwIAZ9A1)75|ffzRLe(clZKemJ^wmba6U(>AcjCJjb zgsEY<2qnD~Dv8W8#`hfAfmH#z;6UqFs=T*KGZMsOB;bjKK;Hn9imgv{(<#1(Ni?sN zMZBj}VA<={RB*sTDA`qjs=V|cbjIgQi(p{ZtUsNSnAYFvSfyZ|wFZrB?n+KYgWVOx z{J=NMbr-Eulg77q2L~Q|nezygNR4cF*Q|!vyl3Wqvf!^I_)yV`<YqG%!S;BzN>@V4 zK%s5~y?P>LmJ1eM=p)82d}XsKU?#18m>TKO>$S$s2<A9X<=x5)vMn?Dc{g{BsKMh? zWIZdEaPBI<Z;nQk`s8y)E|?p%`d?I{@RiM_Qx|h@7g%Y|Kpgr+h9=MPm$`SJsfg0@ ze*{Aew{&nzObOIYQ2To<t}!Ryz-0;BNzs`SWKrD;@vdw)szmoS;?Otp`MY=u{XfWY zU}$tsz|MpEg6ZLF(fGzbo<gJp#Qu9PR*8rl65l&5KP9V?1VG0m-vZG9fX4FJi51xd z=MqknbPC4&LgR-M-6)ijI#Zt(3=(s23yoN>(0urb9=PlkSjtY}UUv-lUsRLFy|(lk z=WKK;gH!s$zw$&evinknB?EXI(?Y8!KKqbUi;mZ%tGmtkS0}pI9v<H%ljK)pLfUlV zD~P-1IJunvco=^dvG^*#L0>7aq{~Ecn+XOSAn<CV^AA_$+xi*>ENEN3hOUJsQ?IQ$ z<{wgaIQ?*okrzzOHZpdwdyzz+%-8u_TT45-`4}aTg!zm_F`s~2?>nb2uiS3^{bU|i z?32Bnhw^zE=beZ%)VUMumLgWbgFHgrCLw)a+Twl%|DxinxU60OnEM0^A)0*dMhEd! z(c>&hpw54jJJaZb=-9Ka(w~M8ZVoMfnNM7;LWcr<ZIpOH{WP!rOI8&jsa3+&?OpHb zEj`Z+m4EJX@gB}B*p%-Ca=1F;#5I#h<hxn=4$EzPaX#@GXkr^OtK#+O;M6#bD86Ss zwU;QGG@LFP^BAc>!Es9S6CXLE^p#2Cg{`!$<6h1RJb8V@z6rA|j~;fQqUF}23$1W6 zOc_y1Jg!L=PVoE?9PYfz#;&obHuZ`@Gx{l^#ay>YZ0Ae0$+$#&g3RE`w2hwi^ZW(^ zIU^6dHODFdQCky@x(Ofo5}RQ}auhc8<+}_sQ1iK6(_1~sSDf?YVO8y$mFGfF_K6_7 zRdT_XVkw=;;t!a$q2nv-KRF?S-Rn}5%BH8X*xa!4db8kf69enwbX;Y$)Hj1-IvU{^ z_UHqk!j)$-#z$?oP>;(b^L4t@b5r7#^Wc!Ct93VUHydijFBVXLsBWBnU%unw{x=?t z*vp@9@vC{&!0@ltl7JcK7u8x|V*R~A&AH8k`rLOZ#tnsD4L}WcqE1OF!1Q<Mpd#r? zB}h4;Y_(W&B~ehhQoDiN=xP5!Cs~A#ndK@sGl_MClVpKuq@qJwZzKNUcU~G<TtI<E zaEI0fZ{>p?=ZOHYW*83OFg*Kt5?nR8O@^O}d2V&UwdRO@Ev=SxnyK3)&%KTs?8;VW zb&b|7!!U?SWcr%R61!AO*sjhGKCB>bn3s2}L1Eu2wd#Knj#W>R<o)!$2)0go%iuRB zd{BeEJ<~it_k#whu*Ti%)9lNKy|`M3hLPcskSHz|M3;K(>C2|fjGk!k8nh&jrBG4H z<TIbcY2q;(6L209TJ5e?9#%L_G6v{IPA=ml#DgKO%HU}59M@|?oL9Hzg<q7i_T*RL z9JULN#J4svNjM*0UkIt7`jp<A_*izNy}J@eoKi_Bdyrd1NM}RQbGJRUta4<Jdzo8E z9zW<>?eZt=Sj57_AFJw7Q$Kl`!oBmp6~#%;i&1xDDMa~BR%+-WKqrfddz^rw($5wE zX@nSYA!(w@H57f*#*$(Dp7S3bv^)UtJj}|hpmMQCAdioLZ5$}W0e}VI#g&Kr-(E-( zAaA_`SP1VjJxn08^C4Pi#2oJcj|`qb@_N<3-T|s^H%5Sbo7V9!ynoO+Rk<@>&9dMk z{Z`?(@Dxmk);#oPdb~ch<DZ4^syknCK4pU9HocDeO5?YEe}tz{-*d=9+k0U{$@Aj} zxO|cikqj9(0S@QGK`Fwr`)}T5?o{AHulL>SCmi*$u~7cdV}*POmYMQx{+%Q%iOoe5 z-$-MklCqbQfa}uP`Y1ZvR+qv_gKe2k4<23n<}9V~2MS2auIVk}_4iTO^XK;dFzD|c z+>f3cOf0$`gp4UzpDL4)G1vOwvmmBYLcs3M6c!HMvEIfVB<o=|vepYZQhG}pn^_)6 zTSygmuA{5A*XXDN4DRJ{a9cLVv+;jvsY+gO)i4YS(6i7Nk-{$tI4z)p^^CK9=WMP) zuJ6dzmnHbNvx`}E0e&^Of8(ilewGPXTYD_sIUimPmTpQZYZuFt7#}IstD|0vNa;^L z^}0|YB%A)LEMnh}lHsI?DO?)7H>WPs-SKmz+wCR*hYNq(i{Dq=-`&ZiVAEp88Gud< z$q&iHZDQBVWI&*76$kt5QI2>_a$~&A?6SR;#=G!#QT>t7je79_|Ac2+S{|>_zdutP zE3K8txIl&ghtsv=`<#^QZgpz{Nh*f3Jz?4zqH15&P5&r8KP#|o$LpzKJc198+wVn# zR^GlzFJ9I6W`(S;arKhP7MF8n<GV5s3jt-{@%?tlw9n_>%+#Ck*O6&%9nTvTH_U>> z&y=R!M*SQULVgMBrnt3T`q%B&ma~J875x3b<TAEVo3P1^K{IN=+ju%T@HKiND{{Xl zvwZ^*hiY@|(W?@vuM!OvIp$T20H-K#<a<uv;RYtt)dae7laT8DJjspO_G#};GcZ}J zE>KjKRw#_xQ|>X#wj4Wk1~*aT34VQ^wD`+fvYA(H@j^aHG*}3K+D~F?Z}n!K`d~BC zuwWYH@LNxnfTp&wbNVmKM0!Z6jHPEarP#2n0^d<n66RlmzZZ2gvlrrK1x+X7#Q7j3 z(+{emaA={qUjJC%q-HXpyc%u+!OnX?T+4FOYFhwSPqYjT;)QRo9pX2p#};j0rt27v zrB{XX#MJX=XXRbju(VVzb)hau-kdZnZC%2&4qXoc1c}$0Y}Ny~xA^_L<1v1xvTjqu zfP?tOs_v?<&nYbW2mVy)!E~ZG^a){?)2`@OwK9a7=J~$f)WxEZbjCMl01|nv2^Vxk zQTIIrS!r9QDHgW3ZS6O_4*$GDyj_oKKE2#bq!4d?bK37|=#@^<)KCw1vI>&y*kxx1 zNPFleTur#MVCIH45X!!tO%MmF&u2MI3Rw@Y&dc^1FJZj4_E%bc)^*7Ba`QPq?NVB+ zoy?hx?R|zXy})2EH}}wHxPAWR`UGEnA?aVigV#2wX7q0n$U0o}CEhB&;R)cMH`TBG z0@{T9{{SeocdlQtDu91)_vIE@{uh|a|I4iSkL$!qEK{!~0Ul^XHOLxfvGIy*CKH&S zlEeW3#NmuU$boSP-=_KmpE1oCKv~oao1xU;jnienKFPD$8b9_7{K&FDnS1P67+3ME z_Chl`0Mg^9=2ih<pX+x<fu56WJV0NJMotk`fcCJS%ITAOnBC2N^&vHYaGmi&T1#n9 z37`fNW0Qj(fvy={gV-_w50Vlfy4(UNg@oY=ux-frUdOC8B<oM0=lZL<2_FE~cg@Iy z6Jn|c8K8!Fl!&FbL0do74f)|Y^z%ont1sW;EL(8&*iJwUO!$pRFAjr_$6(nIt~w#~ zEUxUJX;k1VBndKQJ*^<#7BKdIenpyxp2Oi*PHRw0#7*ZoPCF+oj@K%25#+kFTr;MV z8SjyTW<}($r}jIiAPj=WAZ;PAHGD1;X2$C2GPt`4bxj2(jYb%FcaX7w=8bA8{d<eG zlh?al-3fbY)=`$bWeEWELEphSA}22g#9j=YUlSrt4V?RC>B6xeTN`C%AlJ>SML;<k z9YQe0;+Vrg)JJcIXKxXu2<k2V*ayL8z$?`3craskvG1iCo;UgyBUV+;e=1WhPhY+O zp2l2vFwQV9K<dk%C9+jcGMY>+EN-U~VZo#E%K{Ju9mU<7fv|$uZuL(xTxXITGq(sQ z_-Yz`LlpPPcBxSdyzi6xj6h&+VO{-BM*Y;z?0X$>AXTtAoWgi9l{lsGIYfLZ(xt)o zG8ldv0MWfT<N;yYm4&F@nlCGAqoFzZsj|PDvZ7u|Rtw{rMiZaHO{-j*7)^iHWUwQ` zW`|17UdxPfc?pagX;QGK{63{8s&erB8LykjgUv-rz>t9Sl%XYz9}wMLd_)mIb2;N} z^aa%(gVK|o_I4%ir|&e%;*6(UW3Ck!5&wO8Ze&7?+f%a&R-NMA!Y(LQuW~}Dgn+DP zrjniyDPH_&D92sZgq$dHp2fXKL_O52B=D1wicZVN0HbI@U8s<3`jN&#O?_g!-vN}& z!E=SG2aQ<OPS=;e6vpQe@gf+x5|T}!(BY1O!!z0Iz|WXxV%^nvwB~i7ji+$#b^v<j zfEJ9;ZAzlsSWn;-T|6)2Zz5oLu**rTM(sQ4s0besAs~8=DEAN^DffY9Dkrlt*_&lC z6y#d3r&y%dX2Rl(k6#Q6(G-`0Tz*n-yPO7+10x-_aZoGtK=n&>$AV|K9Lw$gQ>n1M zhVq7K@4}*inR>;Z{fZ~F_$XqW4~{GQ`$4|lZl`bxwOGuZ3R8BW*(JN3XfSjDOQ}Nj z6k0p1sBXya>Ybxg=J;M1_%;2g!c1#T|J0o_spajjezZ0ep`HMtbe%>ze)kmnM8>pe zl7hTJzbW$=B&kK$kXF#8eg2hPZJJkNNU<w5u(cq4KCnk8h%8B8NOiRmWk*J=m0POF zu(sN$CP4!3dUC{vY@%#uP_R9yLpuIpyBZ<>(|wd;R+Gb*ebJk!rvln^4a}-y$_+hy zV~UFB`$Mp-TRyP7m#IrZW4wd~mgu}>xn@QciPe?S!Q&6kTp~Y|(+&gek~*#8bIRCd znRjv?@$K+}KHW`@!+cEdB%pN7cY>ap@7&>yq1;SZu3Qj&jBIMM3RXFDzw`D(<@|L2 zNc4ifvQ3-J?ZCv_{skWt>f68fe`LCQdioF(fn{6G3U=XgwAE$OxeMd?Dr*ur?8m(J zRv`Mcr2jxp&O~_VN3bc_--;e0K2n}H>Xho^rzaVQx?GcO3Q?MA%EYu>`uZIKv|{fa z|NFoX-%rnHt?I=>m8474)|+AH(dw7tiQmSNxSa%w9Bc*9LdV5#t?xj<BJCx^){Ge< z{DLE++uICd`qg&2HuuOAZJOzn^P|3c{;r(`V)Aj{p4aoLuLjkHZm$^`5q13sTqUL> z3ErbgnbaRrGY0GOiOS4REreYqWlrX>HLB?tq@OI~u`5ut&qMzXZ~t9y3pIXN+Clw> z^quT3=M2%|G{l)$Gy$XS=NBTgkqwY2hjBajwBmaA_M0Z=#cmuPhg051Gp@nJq5)IK zd$aE07b90wHa!@8=xd}R2QDa%u`2BSE4_Q&7@!yNl7c|!skNv8n#LUw`hmT})3O62 zAPO!4EFSj%ZR(CQJ_N!f0MhfHGkbO)_TZpy{@xkjS$OCD4pphGq?`<B#T)-)w*UVg z^7k1zJ^li&AoX~2n#={zvwaha6Se#IOHFEkk6MGJH?p<7=!342-UF^Gc<T1}+A2V+ z`uETN+im@~x3`mFl$siLkjwO#!XMbhXQRy@v~QdM@U&}2J75T8D5-od-3fn8fX!Vp z?{6z>5c9D=c#|%~r8VZV(0XFF9QdwQPg0=g`qeeQ2jFn#EvEkAsI^*Y<d_|l(&RJ~ z>)`8Z?=+{!-+W+ZsmP=`J(p}i3N(5M#e8_yD3xe@QF?T!gvVzyQ8F&^S`q<<2$qH( zdX_D2t;jO3i>Y)@2CLruzt1iNfp9liq)nGCcO`6^i4@8h`eqt)pjwOB6GTrHZ3h&= z7T+?5uE#8EZN9X0Ywltc%74$&VS>Wc{_TCpQZQVi$WWLP9g|nq*#AzRZzpqMZVd1K z<6)Umk+8TVgcA({XY{+8VKqjM2n_cR>O5{VaS`506vdm4R<pwF&GjiYGR*A$z84-m z%Z<2bz`~F~6G)}>WoF7k6B6<zFol}!jc<Hp0>naO&t*<rcO;@S{YumXSJcd$nz4=j z3xTyw=y-CTt`v{q?WJz8?e+AjNF^QA@OM<tWT|VM(^gM$$w6rJIJ*hz#DYL^J!_6U zM8I^(1CFOIbfB=R06P?O^64mw*t>cnMm1<Rp!5tU7W&;3MTw7#z6C0&mA8>oh)3qc zAy{>j^nosL9Yodbx{CAT{9lW-!%fYSxJhH4o_le=$a!o6rW(UJ#hQ{E6V9M;{w-+g zKKsn@LO9?rom$x?tk;UBRME}t@lbzw6;)6H{)WeXQ(sXolV-x|wG{mENcIh$6hJ8e zU$V2;U0~(^rTeAU``);??&5_Dr?N2K0!(q+bR5X1?cqL;YWubu_O;7r-6>M5{4NO1 zQ0^C}sZK-9<DPnKjV-G}x|M?B+zg2;XBck+LE?Kt$Vry6DpSy?Jj4@`pzYTPCSpBK zP3(GO-sj`<AZU@gxZqJjwmj6$QvklW<R?=4TH1|oQvIbIxI*TlfI)1cDWVIl`xB0R zYOeMMkW7H1csKeMmy;_{ybOa8=hYNKv+scBOD_nKdC_LzTGO;hRbJ6s`JoAq@iEUx ze`k@FIr(SB&!faG;WLg}KDmMSZ)y$T6jiMZ<X5P_lcwjhvuWu9)PEYt*h@&NqTaXx zoU1S2dZPgq>Hj0IKttmW#1*hi4dW;wtJex0v13VXKI3whn)RFNzP+rj8Idwn64sQ9 zV6*tv3A!X?pK*S4{u5>!A;OvJZRM@62E&In6)rIYPM%X&>YvVX5}p?WC$*Lf3=*ce z!&ApTi)&X%c_6B!6P^gyG#`GxJ(@ui{wyY~QBD($PAv4Fdag*OHB=k8O4M`5Zsvuo zVOb}MRhIC?K=U%mVeR9ypdQeA9v@DtKuxQknnpzyl#njD{FnC<CSNYN236mHrWPM+ zNW1LK$afT`+))}3o{$G$iEmf&8sOlUv-<jmcMX1pyI&{l;amIZcCn#@cGhahDz(_+ zwkCRN6I+b2xPqeOs61@()-p+e?c0{q&$@{Ew9S#aO~m^!iWbF7Ts&G^D>nnD(D@Ev zmS4)N{vopL+VEAc8HvYW=7VMbnYwK^*X3;3LzXIY*J|B7D(!lz+stciJS%_f&U`Ul zF3T4|6cx-^S1-li16q8XOK3$XJatXeg6jj#B~)4&6^3a4=%>XW)w{OXr1$6gi!s<V z8RQ3la-^Is_U0W!o~gvQv;2{_&5y{2tu;R9egVD*ALvz@<{uZl9KLUN?`nW_JI5a7 z)g8_}`g^?m+l*aq^k`S*!`ZJm`TL9_SE19h{lxz<uKzE`i6&w$kXFE=@cOFNO{>W@ zpb7k8H_#>G+W)#M_%BEQ*G<F!v`%D4^$-IInXA>Ny}(=S+BNzBRRuW%fR_A?=n--Q z$aItwbn%@1y@KI;WUlV{EvoYW@a?KpRLkYzne`v<tFZ^%)%OiKU?u#&KF`%%yf4M! zxVAfLmU~6vb5ONOB&_b-9_Mo4wd-^Cxj4=J=*Cm2zk^XTuuoG9N)%ENnZWI4WX~B# zf@N!TnNr0GZzi(^4TN}FwOeS;b0^CKY^$x13;zk(%qxudc?ZFZH|(I0b>U%%z^Ru7 zX0ogdgSFM9H{{k7MU=EyPb|CYaBKdvXab`;%PfS$G)wW%i3ma*<7}imNxx9?rASSL z%i@ThYr|ZxlD~8OK$p$Etj-MRmTcVoG(M=my^;!^#hGt`>#6Wb=vTljuL6l}UtGo- z_Kg;0vqQEF4H81mg&WD=drw}EK*|VRJ@yws*YPh4#d`6)FVSh8<ius9o)*STFA_Z` zXd`1PGjh~#X{gr}B;4lKk*R~67^qMdRs%Y|x9TSj5!9p4=awmwB{2_ZFU0a^eP+w@ z5x5|c7STqvGM(<0lPGHY)B3km>VX0_a(5cpoqnj0;t3wfqjbSNua|5XOsl{>P2Nyy zN;e5|<33z@!ea54tv6T^E3@<^R*n?v4xnN9Pnf=*excEFl)izHLAO$^_?>c^9_U}j z%W5V%<T8<Kc7Bt2@`4E;Jy8QjwK(drDA+L;)qWruNYL<J<L|%g-*dMvS<t9eOJX(3 zL{hWzZv_#nE@9AkpEb)}i8os6!6r~ezoN%ST+Y1$HMchSI<?2eiB$qy;;D@Xh$!V$ z_tG@SZbo*f&NC;$a^I-CuHnrr`=2jiAN9rmrPtuNeg~Mlov)Up5j66SVl@iYK1>TS zjc-$<071TrJ4qNP2J(3@JVvG!b>;j~$)1ZMMd+7_?Naj`bl91J_sr@Q-V;gbB5}&b zOg-pfb321MJFCbI&I{f&cEJkEu)ml1tA1eEj_j0f(jQMdbKdlRRdMMr&hJ8#0#er` zr&7S$<f1sHWV)+|wHz>GMy9r8sCwTev;==KUjT0trHEb)-lrc?-dJ4fL2<^5Hgo$P z5MFfdcaNP|<oCP5v$&-L+pKQq{!+^&a5g*9YEiEO*a&DdTvy0?Ump0mKB%;UuuY@X zl)#!Nyk0#f#^ho}j*!WjVI1es=Z{W%Y5EH&k4kv%x)5ZnI{f$(jeA`Ic;*E%h(=|q zD3+N^!izF6)M1a{*KMF>=_ya_ToxMoKC7eOgn4M>XU=v5-a(HePA-#x-_c4elk!ct za?R+CmJA8%&s>-zOAK6`{z>2F5}-2RZW0C<$`W&Fd#~OVIIRU`Rq~;ij(HMb`2~Av zpxC>CQm%pIZ=`SMq0{GFEt07Hip*#N#MQzL4^s8yxco!oDf8_rO-6SU3Y!#kxVl+5 zEZ!z|=pFBWGdo1ThN#k|1b^gISKRvLehLxCYT>AWU9r=!baa5_muw8c(0$hE!UxLE z;k9BZb?B}DWCf=+E~1HsnD8`MXvxll9Cy=Q(s>^7g4=$J_Vnm<kF}Kvb$ptBLqify zdnC*d-?puX8F;X4a4};xLl$((hUAAmC>k@)rn#C)ueyu{ig}R9E1_=qxq9T$oz35# za}9h9(C}eCcz6KwA6=kN*wL6n>k$(NR4dO9bB4pU?%?xYP#PZ=OjJ7^DJTIE{kL1M zGEp1l+exQ?%UH*VT!0#@Dz=6cRIctWJ0+96i@E}$ep7+}ljZqe=JSo`U{4H^+Hd<8 zy*VkT>t}awdcWHvOt;!9Yu{*;|F^lfDb9FiHJFn0p1;2HcpY5tNoSX=dyt*DZXb!- z<hfvd^N!M+u9+%Vkf&SWTy<gJ(dFQ%D3aCs@DcE(Lm(oy2Di^hq~-bqe2-5T(<ffY zuq>7qcrRM5?ZD?*B5&1xZu0+8D+E<o@icc0ATOl-`(Ygby(vt1K*4+!6mLde3QWL< z^`4~mN4^6Tn0UNc>J%?&qZ;%#bt|J|lV=9&7Psh)gQeh#zD=te;a9tZarp%ucDrdQ zn4;@k2Au1kQnJSf!@Q=TsZnAfnLIa`oj!E_^C5j|O@-UEB4`pbx^PFNpzn{xpU1Dg zN0$yaTFV(u>ezio)hw6`lQjcmh_U%D+6C{trOG_OBa5mW;rX9?Eifr{(dRjM`iMHf zR9w@pnAtswqls0kHK%xW5|2ysuXnujb4`e{YoM)`BR@5Pi_f)53o3NN-$MPD#8EzR zRXQ7Esab=8hBDZjN`&wKY3|CS+3eOmTAzNc(pK>)Mb%sttyzOkXb@A(LueI6&6F5B ztEwp?z9>>kQ8kp5im6&u#Lx;2icihN7{tuo>AB~wGu*T8x@Vnr*7+wp?@so+_kQ2K zpZ)CT_w47_%3nrXEs!ndQ(`Wm6{%LHRR~45&S&$h6QL;Fhdh}Ff$FR}XXQm`1sAJ8 zILC^Uz2`&W!@Pq{>Mc+8+h0Zjig9X&YI~b@9Vcz}z4u$`m%RPv*FR7W_fbR>?=9wm z?>B};WrVRGpGLcnM-`On6HtAdJ$H#lhv6487IaUaB!=eiq#?4S<bV%pftac-!Nsp* z2!r^dT0)i#Mk-3BT6^C(Z-R$-$db<_n=;LbfHsPlrY@&I49bmZae$P>2<QcU<hj|x z;s{+=<aIMuMonHNy<a7GoHc4Lnz=Lla4)e&C^O-K-pwMoiz}Dvmv^1*go`7JM^7i* znwnWJe#N05l${qQ4kzRN-Gxbdk~#(|y<`rl*i4rb6;ms+LP~DMXqfcQaj0;daw7Gm zG!}C&B;@PJfw)FEyT1Q{jCW%sw9%z;u$O9a4cxfheS>7_G46c$XInK{qlFJB&+Isn z)$T)pM<mfSttb4#Gg)iN%x8#OQm&k7@*F26TB%dNEhpsZBQ&F;+Yx~r1m)29{9KBX z1?`8mmqlQ<fuW_rW9bg~apjZ;cyeqcmkv2iM)6tDnEX)EdRj3m0s*@??(0xoU^3f? zsI`Gs=4hvm>Ss<$jpeH9qYOB2)h+@jI_5A%;QPK#Ssg>?TaBkYn}ueWPMc<ZT1xGU z(yF{&B&c!!vhtv=7UFn>jZQpKf1u1o78Ct6K0a2>>n6AHYIkpJr{GE4bL_Tqs#<}H z1Mq{p!F6OajdD%)P^irG4m8Odj<Xpw|IL=&7I}gki??c~d(6bisTw$f4a0|t+Zigl z^fcdB&hW}4{=vz1bnZB>v3O1`0^ig=a)xFaDj6SBmiBaIWZ7g@F~&;_g=5XwhsYvr zVKofeavjcCOF_EKoD_9OC{wK;U1i)xmbvfNm#aw&T{#Va@3-OYhyvF-Go;Q=dF8tr zD0u!wzyY48>hL61QL*78z~!KqIRkkt#7o>UDkmUy0|IS`<SIh)M(cC`R*PU%zh{TI zGiut%*2p?bF(te+@*8JIfj#M}L19<3Z8uLg$ym@6iBU6x4_#|cvnFC-f_Rd_Bh>XG zSFBv;bE&cMvpI1K*uPbP?Z}=ThZ*rSjf%{@Xe}z)Gb<@yel23Kg=}~#NA8br?VC+k z$(#O~e5hnEo+oS$N0XtH<j+YJF*j}wxQ|<R31rJl;U(+8hQFSz;tG8qVXxa^9O@|< zH=*d=Q|S=a!M#5gI#u`b?B~8)3Q3nXPU>GAB=V^ALP!Ss93C2Y5E3%W(|6M7L(+?Q zNYxS5KpP{9T%8^Acg+Lg3YjEwRFUG8IlJ)l2RRhZ<Acq~LG(1KumF{fBdOu0UG$O6 z!wifb5no_4m@I!C0+m}_QF4VBG#(?Z(`!nmi7ExU<k(_TX8*u#ZHuNDsRW_ia$Wng z-}Totdf;aB*){K%;5eMN8bNL**QWQ#A4=`kP>No!l4U3i`D#&ohWE!bOy{;kK5iB` zD6y8F^a;_-_b!wfOfaHYP|Uns`Kfoz;2l#l{3J`P^LHM~@rjUz97{~qgZF}-wG~Jt zmulFw)*{bzsPbg|F9CR2rNefCkBLy^irc`Txhfh(^2nILxXFku_q2pG+*Ef?e?Q>a zvnK5^f_$wkqvdxQ_4U#lEgWCYgfZK)xzoFvsm-ZFG_JQR6!Z|`osE+!JWKsM-t8Bl zGxesa)_$Lo+o_HxW%uxLFQI}?G?D{-eAb5AyCh1JJ&H5(zx>KqU8kGd_O;OQGjeY{ zJx<@tJTO`06jQb`v@@wI<CjKg1J#~oUlb{(KEFkZWfwfXPAv<eY}yDoVyx}}Sjf6T z1EoBdxF>FFtN7bx^X6US<fci_p=ZU~f-f3SqwgIaXV3p~)VY=+%#_%EWiJalf9HRt zT?qeXIFF#G(TK0SI~zTX(3_t9CFXw+Dn)chK@gGu-Jl1c4yMhM|DWD5{q24WSQTkL z^&$*ofcE?})wKb-g1^|9EvqrrMw60fXihV?>~5F-D9J*m#n4`kGmZ27wHNYTyJu_w z7T+~)U(mI+04deh7id2L7|>L#Tx~BW>ZHS7bX)XCoh}55Q){}TOrm>nnLr3&XNu^6 zbk%7#knL}p1K!z|{i&0pFK_RrFYQuGqIU|b>i5EXdDvKtj)C?ti4^`(%=f?NEl^<P z_&>3?zX&_;WHkWJN!#@cf_^$#r5DbW=hiO$G?LDNN{z7OWsdSd7Su^0Aex+iY>#}C zbBH|8(=a554Y5}5>uh%shd2x~!j$lRJ#!Pw`&>A||6UH$H}z!(eOG-O%B_<Vyz2^O zJ+E0nt{J6L6K1AIe#~Cd^e^z4sg|ZqT-J<014KTvE+fN1yP(k6);7T=6X&N1TBG-& zou3}Zg$97B-&i0xMcc%mtCa-eOOMX=rGyeCiZUo{95?xA(o%w8TUrj9Z);u?0?F)Z z{---(z0HVSt@&EzDByR;ax*h}LEqw?lQ&7jkr0H*7M*!qBz~$-bv1;9ckJ-Cx#ebT zjFv+d#ws%S+}n<?%kxH@=CI6#%}y|42&s(V0b$Umwtzz6PuSq61jEz7Nm&KD6qRZ} z75hdT{YBWuj9;w8F6fN1d7megLq$Y%0Q%a*1|R6~8Ss{0oT!Rdtd<@;tq7x7rubiV zkE`!Fd&6pmKATkGkk0`iV<R4y82XjC0>X)kESOQ+f7f?%d4mQC4klfod9&NiDdRG( z8FXp3@{{z$()G|OEwp6uSU12&v^Gtj);~i#B$Y~dlqycwaKphKIgT7GS;gH6Xy;&> zNGij3mkx)9>LA@-Wgsg}VWSZk6|GEnl;*Y3ZxTMWITz!YfV!IMw%D&@j|x^!dFLe9 z%>!szOU-d%es=`2u&|)5XE$$E+JmfJ_dTjo7=Y)%Qs;2q3Dk`DnZ+F-obHpXx-%U@ zI!M)-rHR??r&!_co=<(_O%$nb*4>Zq1Vsqo-BqdKqGoCmEK==|;HbAHuOTAYO#w!N zA|=8-6qIy{-N8I*$x(%w=V-U5lf(!6afX2Sn9Z1*RQE=&|1;ng37enarHf7`rJJnn zylxF>E+>C4EdAtek=7)9^D_#Bp^XFMk{G&8Uu<4xWid*>qTG}|LVL<`7m$$s4{*&T zQL^tD<N(Y1wHI4Q|7wzm)$OX=KOJA4EOB@2fj!tuVR7Qv4qtO#FV+t<j@VtApCpvf zFierksy(Qa{S;ZXwJ|@R_vcLZdhP0zc@PZ=%HPWYta48LCh_ZeO=qK?D#8GJH^AvX zQmd=ArKo%1!E4HMo*G`vyiY!dlK6CP)aOR%NC8;ngZKLNtT@_Qb+t%WT{aIBe%9Mg zU+m!yo|1g)!z^(1JYxHB(P|j;C#y!U6>`xUld+v;_E~9g<8maA)7sCAEr3OBWNz}V z^{{^67Pvdu;IkhDb4tBcq`e<ZtLo7_k%h?W>aCLb$VP*>E#}Rlw_m#@>?+UE)(<f6 zfOhP4sLzSu6=4Gd-@(6={t+H@U@_nqy-ypDG}v}&)zy2FbDq5qeZA+HG%k7{H!S)q zw_La1?J??i7P{&lx4+l$kGO;clr+KYJcnkVz%DZMw}LmdvQK%kwkS>Nr+7F;V=x-@ zFHBi+nce-5xjbE_C@o@JWHs?XGuk6P3^7E*E$YD!(=Rb8%xkq4K~^=EMCv?v34fnP zV*yN$-Bmk+o!sEqc?`PA@#71<3`1YhYk$kc)F;f@+Z)FXUGMqF22B=C($CggE^~?4 zT?Wo8cg>lHPGZWE!-TAm#eS!)c-v_z42Ij+HtVD(H5Kf@dN=CSNiVz1tKKZCF?H-! z7B*bw>M69rp3Y8(E5TlFiKY@7oBV|Gv7e8Re^hO{Y*@lFB5IZXr>1UUr~{IFhP2tE zok5z!g6Dqyw_xVuJ?Wd69G%UyUPk(bkP|Q4Qx006JD#|N)u?V`H2F!`Ru~+LRmRKl zcaOIa3)x<`Ci7Tpc#V}O9y+Oh%ZOaQ@x1OBkS&(Ic{ME#_s~4Px>LWH23TDN?l#0$ zWvj2|`hxkEQq-3FjV=h8CUpsto9uLM$P?Nme|mVWwy%egr~$(560-QVImI?`o0A?2 zLQ4p7gkh{Q4xhvK!Q-=E)%idG5xAe-P%dtR=d`S4lGm~J8}v9o{7d;fQj=P>+y-KZ zOfL)Z>ri)1UJDEVCMk0JK6KE@abz%@H7F_7<tr|{#ZzJ}=GRu%7KJbjKZga}edV<Q z)WQ)2Su%pzXD@{EK5Q=QgPr23YEu{a5i^w|pTOI+1?|f8w2>HcJbu;&n}Xr@3iRmr z%p_zfuL<}GSJp%}-}*kR);kG*qxdPibG{T^D}Ib#_UY92I!ouFY{FYyxXS?FM(KdH zRuCdpssShW_?@B5rNB{2G~M52_L)f}HiVOIOXB_=BP8@|SVX_ItiPDGl3#~D%J2T< zISsp&LEk5tuwFR}pG`T4<D20V8xQFR`KvVH`8ZK;Q)JiGW<k-C)qy=g6eh(XN}FAl zoai_lz|fWHZV5m&@tGboGu^cckRwmJ%2yT#O>CAcG?zIhS|Orcm3Neq%1pzs7^?Z0 zY7BS3C)FaT^8Wjy(9y7{#%+JlsZqH7m?gvP;>S}**;iw##UYW+Qx^szJL0C$7gfBt zy2WVuFVuPRQr_Pu25#7%g)sWl?dAa3WRNzmZa@%{X_S&i727<lK@M$^@kfL2oxYAg z%s>osx!|xx)94z>*595~tFN0bq1G8++6d0Po~AxqHh@qOS5aQT!#5tk33x3ZI;Va6 zc<pv4eY0?Hc30pn&-_ApHGii-!%}JI^WHVrdGq==xB4irRzmRK?>Iyyy3UHNiDc}r zsA(7tVJQ8+{?0eJ$eb`J;FAx7PzvO}d3`^xGc!=6EH|gR5Akhn09SKly7vx+`skMP z3)PvR@*rcn#*hkxB|iE}-S_wF#15c@vHG$Aa^Y}eAbe`~q2@-zz$~53xYA0yd*#S0 zKrZuv^@GBfY9P0USuP^~HK}wd2N19fqyEYbchG>+;6#;q=BmGs1vU2{ot8?M5FLyo z@2Y~Wh%XBtFyTWsScmpAACfgD)n|jmy(kHK#>LWKbB75ku!3_z|JKyxPb*Xg!DpEQ zg77&lh<Xh$wL1<F+~;4CI<3*^vwK7GxpN8TKi7r}sj0cQKL=$H*wIWbBo3!Z`a%18 zOS7gwXAI+Npzlg&>;g7c+VgzWl{feL!-Z4wFA!hME_Oe(oaG)w1JKi#<r|rdm(5M9 z`3l@~&^#wczC#zu&nkM{2quJ^Qq*x`c)G-vmh8_eifY2Gcu5wF`!(H!>9E&ocz*Yu z8v(p2BZ=gU(A@!RgA20{ehzHDv2klY+!HNBBefqwzTS}5Siw;@v=DZ}wE-b9WP0cd zfjd+6=c>exviWiCMFkT7=t44GcIH03FIU3F)MMH&ROW<p8mQH&<V{@7Z5JX`d|V<c zg<pDHWkYNH9ZIa6(8jt-;6)4nY?;?{D?f{|+~tpHJ%KP2#iq=1%a%h)pfvtXij~7i z-i@!gC%9KhH9~kTec61tI6U1%UZB-eOs@kBn-55vGY~y?34e^ka!<F^gGY3K`(R{p zaX#VG>y%gKF<2`H+q&L>$o_*cZsu$$t&6Uml(o|L<)OY2&_QC&5dC9R54ik~(Ce<# z`7$Dtv?wiUX0wLhQ6J0z%(qVIOiy^{Ynx0A-q^J~rqh5cWjLyx%kFY9toJ<Q)X(=> z9a)(q0yVQ02p>}|2Z|}zhYrWK3CS(o<`?G?psonr%^;J19oYMErM{2pA9m!9_HS7} zI|<+PjKD^Wg^TU+y`lf_NK<F(W2`2woPwo_l1$fVPxj%JDw9k7s#^s|^J587g)HGL z9X+2Tx&78KiOOugM~X2AB}KM^GEa^evgH<c?Pjnoo>HqfbIP+nwa7NCknWfhQH?*w zZvyz{M(IMc2cT~Ie>zM4+dhU@*7x>Foon3g6REEUwMqo)SO?y`9_XUs?C$~+mh%ed zl+P-toIS5-eoj&2oPx$V#WM;D8VU;VubpOpRlv*Vrn@WZ9~Xc=3!Z283#MaqwfM5r G{r>{xzLQ7* literal 15072 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 JUfw43e*t(a#zz1E diff --git a/docs/images/factory.png b/docs/images/factory.png new file mode 100644 index 0000000000000000000000000000000000000000..65c4072e3098b02e157515a7a07670cdc85a181b GIT binary patch literal 7808 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 literal 0 HcmV?d00001 diff --git a/docs/images/factory_attribute_injections.png b/docs/images/factory_attribute_injections.png index 29b982510cae00ed543e0e8555e80537c7fc305e..01273e8a14cd9f6cefb6ecfaf6b776d2ee9e3681 100644 GIT binary patch literal 32560 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 TbD-6)|GJW#s%)9`>kt0}ybpml literal 6366 zcmdT}c{r5syGJQYmO?@*^|fcsE=gHJl668e_N-%yFpMpQvQ`*dh(Zj;G7RRm7P5^k z#yWOcX3SV8gro28oIlPVzw0{Z`km`K=lt<p&-*O*=egheeeV1IT=)Ct;R8K37Je2w zIyyG}d)lUSbPNC;9sPBt;|aQxwwhXhIu|V?Ejs$hk8(>$+v72VgQ1=_-BDCRcjNJh z`RP3?A3C}V8GjnRzVFMV;|ETCZ7p;77&%jY0CUqP(pmK_>LRB~xnI+%$2#*{Xa^pa zBc3u=rRmh}@*5@LMr9{Vi;*gBS*ma7Up-mFtsolhUEy^z{QYWI%IU+;@x+knPC|L6 zBi{dCYZi1sot<Xxo%RN)Mg;Gj(t~lT`&sqk8^Y4j6q$(#8v1x59VH@hz*QtRJd%32 z1ZJw+p|qg*JRGKKH-E_bMdZ>FI2xbwGL#<RsOLdaG4b#0bUb;PhDeJ_hu^^Pqp?O- z8Al7!N4$CKqs!w_ISR~nGqvkn{xb(2N4EeFJU%P`@Z7qR2>rbKcB?R;W=*k0G~qk| z(*_JvhhAW7{TK~4!PvB)qtw;~ff)OprmU?`t#~J@&riBQghh@Q*kfpyfR#~jA8KMo zd5vNE;9>9F5V>!tWVbKg5=>4n!&IxE#tmxPxq2$Tnl34Lk13B@ja~K|{e3M%T>)J` zW|A2V$C*Wd;zM;SQ#$6#124&N{m{>#bv|@1TZJ})<Z3W4IxOXpzC`)~&Q1$Wa`F=x z=v<P8W?!@S=x<ckA-|wE30yX5BVVAIleULzB!?T<_H#7tzk@V&!7W%tyfe8fg(Y!n zj+0C>KZ`mJaK^@mx@8}BqB}2Im=xzKiJCZesKbbfa`yKHCr-80B*}leJP-_zVA1?3 zqS?SkT>ET$fLI@kmu{8c6YCb0FqO27rw-tU*8o+)Q9QziFmwBbfl{$Dr6|{X*A7me zT07|>2>7hb9lC1L2P-h!(xZ{)=lg^`zu=8h;`LjN#S?9tJzPuP3~TlAkT8~vwWMiZ zkx+Ko{_QSeWao_i_tcmEqe-;w>?7TT?YWt%#ycm_wR?QRW0~>^7lup-3J1GxH^!=L z1=fOFdgq(FdU&oEo-|v`vGK_zaNimg=Rkv~?1P_@o6MAKKFlOnc6f)S=4Q|&KyUl~ z*Dek&4hn%pn{2G%5f4R}l}V;oy(+eHZZtj^>dELYJs5jR;R?xD1f+dkyU{o2%q1N@ zOo;V9y>^C(w;V1ipvv=tu_WkY-oulWio&(k#>0h+aHFx0MxKif91;4@3|2vIw?^S9 zJ&y<>&>9-EW+G^V#c~9LQug)z)IIMIn`t?B5Eb}E0PbN^y4X9DcTdHZ0={(?@aM3Z zclQ)EAGu$cZsz&T)%j`?(u{2S#=a_GzUqhpE?}lN<Lok>nw{2u3k|@tmrfCp<zs&H z!^YD+ILPR5WB?3rKE+eol26D8Rjf)DoHB27>hCUhW0m3I&FmoR!V7w?9o*w0I$Tt; zs9P~KOTS3CX_6;UIFZdv3H=^b*Ark=_}xlMuZYr;k(|VhU9C62?7V}E4B_lryli16 z(<-h?ku9F-A>a5^<@SN!GD8otuP~FD{(W%=Pjs>i<ZBJQ3iQre%xA7f6!o+>;4RcK zi#B69MWartnHTGT>M8V2b?YN2nzRE1_!xN}Jv|yjB{(*mhP8etKMD6AjrAoHA`#it zyJ<JEl`?#ObH4Hk<|kwoQ5&=J)W~eF&7K|IMeQ(b-t)Y~MaW3F^XSdK1oN2^=qIkc z1oNd%)A$ZF=MFAunv7Jg-0Pw4IbOZir2f#Qn(TXH^j$G1qkZ?C1hB>QL>`-Fi#k)6 zEcM)7+*4<E8$OzexeK@tso~bWrs8!qccj1PG3O+2|Av8H4-ijExgm%*?=QC?&XON* ztoU^?&yx|i8=vvgQKIVZ0K&N76Pqj$L7C%NP|69D@v_AN;h=U_YRDIlHiQv6SBDvH z7EMcs=)|0(=5tdN>!Z&LPaBC7Jpy^844N`b0m7DqbyApe9vr=Fff1vJ8LUGFQLZKo z#H88!d{BSxNkF{yp8zfFQxDTiU+a@Ryvsc};F>^Km@=_SZ|v>Ag!<oAFJabqa8G&9 z;Mq|dxP}R+3Q|n)kU|Hj16mK#%!iO^8|>7TbdaQJQhN*P()Fd9>KY%S#GzDr{<f{q z^{&PF<TDgF&r#=NvCbZ<-~Qt^9JN9F5H7X8Q)dz}&u(X;aG>{dvI_+pUZ)lfy~|vS zY9kH>0##!@%#+LbHIn-ga-4!uk5fVvpi8Vk<#%YCi#pPFpp>)|DhWT&Pj9nfv!1e{ z9WV~69&Y8b>0n$%M3SG|%Vx7@un^c@gUO<*rxXd2-c?!cBkrO6sU}Mq{hYq4f^Kv6 zyW&=O{hm@L8=Ah{E}Wp~l3%>=*x#>E`?O4oQEOVLY@(6A<f{19ocy6}g&gZXwVdkt zOl28Adc^)GhumnB-wcqcr(MkIc}Y%-+3NwCrJ-xcJ7}X_ZALDa111@AcRizKGWgRA z&y@OFu)XeR)m?J9?cn0VvG&Y1zq4$EPXG-wNG`mGdP3K$FV7BqaNKoZU0p&nvdouS zG*dm<EO<L6Od4?mcN6S*%j!7nNJ4H0ilmZgo=J3QSk1z#`r*a3w9vLTV?{LMGIA~V z+uKb(h{o>-?4^n57hRAPp(VGfI_J%F-m*_R`6C^9GJl(^uQxyg&Z>*TXhspFHZ6*G zp7>de^AVjli+Ib>;s`N(cQE}i{Prv3X&&>^YLYmB!8~m(8X_(vM$m}%DY!6<m@Jwo zdvgf&gNKLs!MR?^ccVD;jEwSjU3az8eT0oQw(xv)%M$`~rV=`c9^p<%EbtXPacr#w zE@IPo-_@nGU66*pz^gK7BdT85#Su}~kv8PMIl$Xjy5)~d2_q;^%)JVP98E|?5Rp2Q z9LWQiyC^@UH0|$})fJV*aYC(!u?G*dHzTDX%+J}$+Gx)KB3vAEraR!XYY!GC`4{n) zazeUUh|3?O{Z|Q9*IUO!c!APcKi$d`$2OqdnyEDF4i=a?Md?dZ&`@t6o`MH|tvCLK zR1@^En-N+^##%otU9@;#rveZ_aKId<UN`jb1VCUm53>GyMAU$!pWS<I`rw|;Y@THl zsZXhL<l(^;U@bVh567=8L)^n>2@XG#Lz@ofO@mMAMhfz5>Oy0&w~&yg)jzpSz2YVG zOYe1#!gx_;%E#SzaqNGT4ZL#@qOX=*7yNKJLj<_n#it(oXTO(5&PMzX0~3x!ORxn- zp+#%a>$6=Vs&IaYF|o5NNFdLE*6>uw5NbRqp_U~gsm~1=UwX=2{|`hCVzitVnpG0{ z&L012Ucm{=70W6F#@o0ouKM12G}iAT6{p9w7B4B%v%dD_rU^XiP$lpm7r+B9@bY7= zbGZAsh2Gs~2!4rsvOfha9Dc}u4>ED~^W*D^eWCDSFe7#GSH1v?yL8DM@r&`{-m|TL zIEIaQp50>h08}ziu?Ed#DaV=YG+yTLb|(?wfN7~CioW|M-Dgr)$RzGPqd+#CW;Eje zepS^ODd7Di@J7Ef$oZ5u?W*;&%fwhCw%WSCHrK0imM0C<q=Be@*5eOWBKo+1&AX+q zxm^l)Rh{Af8Q`GY<apD;>7DnB4d_?|KEGUIJod3+uF@H)f=sgx_0h%N!N_s||HX@d zdynPIpSpuo0O~4_B9@(%|N4(uQtk8lDN!BHx(|aEc}epv-T)T%&M2Z>Mg2#ice&PT z7Rv`NC3{6cpQ1OG*)pSL;_3cABQTR&#Kd)@maE3G_>1s%;=n7%XyXz#!MWAk)@iHM zPZH@rbMRJA*q>5OH%|&Cs{lK`4OffJ&Qc?_YmI5LMwh?Fgw*W`8u5#hKC8SJQA#b7 z{(Tk=*3zpbaKeX1v2kRSokE75Wj;Gv-S|<#)oHdj-sp0+dcUIw!mGb?pkyp<ur}nT zoBCmBHUH1;xB>!inYa_tw963OKg+myS`zA?v%AcbnYnE+OolebYD7DblDYkIr>v`^ z@4M#&HVK>;Zrk*V#X2M{{m75y>3)E@`uQV14I-PhKCu9hGau;KPbnbpFMe2|D>Zws z#v|NI2YZ<0@>S9$IXjzlyFMB;XwD|WmK*R2m9=*oVG!efqKb4{s*PpbD6d3LZ(DV4 z>xBfW#ZMxgq2_Z+!gd$!^`9_CW42wgnYQ?0F7KLtGDD5WBcm95O5aU$fi_b`7W)dQ zAy>6}BkhNHcHe=fa=KbFq9Lv7{y8-}jUSx-$X8SyzN~#!_t!~JzrHPwKaltHavaat zJl-mFoU<9GeGlZ%L(&q0ZoTp^emnM{Rl=s(aEgIgCPq)GhC?}6<HXXZGsk?utWz&B z%~g)r`cav7&DrUmcS@eG&r!W%u$4E?unw!<l(fF}<O?hGi!`Y(l9}ibZ0_OjO*C|v z;%*#bg6UBGFH+fsf>B}qjsPE5vch#WIKoS*FyU<-uXD#PlZ<a1+W4E5rOB?fT>f8O ze5eBb*)(&si<CX-TUxPW$KwoTn_u*lVYr7q?@4~Hmks%&onrn=EGys-rjebeE6^vo zoHd_E+GzQF?<#i;ue<8J%|dKZf(F&TI>H2AZNg~~1!DXpWa<hS+ee6fQw>5>4JH$= zZL>yJLGROPCMN*>R!IjbTlo8>j;+H%M(U+Yuv*8)*z@Hs4r-8DvLpwbBf;MoUa-L0 z2ogdWogmK7lDBy!#e^Av*UDD(kZ&2qbd-SgODf5D7z;J)g3Qt+i1KycLv6O5CD5N| zT7wIcPPg4xI2dYpPXHgsyR|0PgzyHmDKK#7+(~$EJniqbFxnPeivnQ)ezqGz*(vN+ z5m`)B-Pc&nkdp3f&gr=0>n_O^$DYkXZF>WfQ(xuUdc*!Q#qv`iW*e0J8x~M#+diXd zY5mvXSmG(LZB+AWFWeP77PT3Iy}nvQt-RgSw(LBQyR{YwW)B_c3xu9~LlITG0fqne zx?XZ*Hp#7hir5|U%M>2faC?QC=4Va6S-!Vhvm*px4XqyaPvrO^!_N}EM%5bw1R6+R z#|aCu7aJW!e3`BXt@HP-h(PPp(9^z#^{cwFCZkf@a7;`_Va$22Plb02aNqdxZ;V)B zj-qNyBzMVZT*?+HxI4a?_JKtrkDby8Q<-M$&d9)QKWR9P=B&yUMs-_)(rkw&9rCNp zMEj$!-va6?)R~Cs!|1n3diUC#&H6;4m+I6sUHRh^twDS5HN=DVXLnNEY=aXHvPR#j z9S->iGL{|3S5c$nYrqMktAq)gj!tFa-GG-b2u6N})aZaXNmZkBN=ems{QJD21&VB@ zRuY#KTDh^Raw3B37-on@GIe8}o}K7$xWx_e*Xz`zR^Q(`55bmR;j7!d;I>SN4Y{?q zfcZH79D=Ks3Zh`SEI;(eF2~4DCKkLjgeU@x=u1b9(w0n+O^fB}o+VV9*Yf(?W!@we zz$>d_{}*xbTdHgCV6!Uh3V;=skun}Q2PCnZJ?eZ($kUJdF@h(Xcz(MUluTRw{U!v@ zm9H|%14-Fj2%S+pdU6tW3*A&7No(q-cX2e;Y)SE+4Y=^lxCybbQ9^spK|C$)tpOSt z%P})sXl?c=bFQuuqI?Njv80~g0{67?CILGVoDI2$o8LZb-2|c+EY7rMKi-o86a>hV z?!G_e$Fkh7LCn$)kX%5f)8i3DP1CrcH4FJ8J%gNV`LBvuV*~@+%cs}G{-i+~vuOXr zi^>;W4nHT?g}(0=VN`rJg0Jkas^BwrdbSol@g9~E^V#>>GR_ovT2ZjIS$ohYa(y=c zH+g>KU68xtz{K?u;t|4{yv-EL0eg+HF-@>_O*JT%FGb4}n5+UqLrM3DgQ$GY`|}B+ z`<a(h=io(SBQD0n^dQ`>p9Daj(A;R;EI933m?yaqI-HNGfjleRp}po<@|sWSsK{cy zG449Nw!{<1(wSYKpglcS^|3ac6ysuLolEVkwb`>BjaiF91dp1pupEXuUS8MXR>qME zQw7iuN+qo22X~xFKP_gSJfcMC%~i-Z4^T!&k9fVB<B&LH&bSWqnA6MwFt5lwsOfK* zhOZBcDnuFX(oz~OUs+?XQY|?E4-D9N83ZGgy+u~!pbvM@)n@HlcRw|_u3xaeAIYy8 z@l4-P#5b23l0$@vX<8nWe(wFRC_b7}YN4PHlE8R_Ct<i0)hY<o$qIlK<4gQ_qc)3> zULApWXT4AP-w#`;hqv43b7?p+V-xhY=25UQd`OKj6l;yxy2%-_7cQ3bXj_VBb==l) z?8@)t1Gf1j1JW;_DM4cPg>w~42hBo1T}jO&XNf$qrO<jOh2e^H!XchO?Ht!EuCh@{ zljg!|ZjtJ!hb?x14*k~+eBXpWa1B7MtYd;U%tMjqb<v>4$As0rAOriyd3d&6$x>Dd z0Zmse<|$P+SH-_m=7?9H{N?uo%fH&|1>N&zgDKi_LT!5ZHK=?LuU=u9GZYyhtU_#Q z^26PQxRFsdVpal&Db(HJ1~7;BhJ=SiVk_O`Y8^?83pFK@0pM`0ed)*c0u4t)jXFXy z^p_+8!7z;x&qmMuYLgvBEz)$!vTxIa=&`?yDlWUP#TCd~ROSjJi0P#2GRf<_*MMlX zqn)mHju*5p5S`8Q<oWM8xI<xbEk;PgHWjMP-(HmdIps;tO4NfsF|nDrf{Fm?Q9`x2 zh~vbEkKWYk56sQSr@wpva_rx(^V%uaTQQ9WatE<<c8#U;rlYoAQlH%m*3IKE`x$pO zT6RD*Ut}`*qZ1ex6~3F?(HWOKb~j8p*cZEWXaG7peZVjjs@8q%Ll?%)#BLvx(O9xL z_myKh+qT2a!g)-$91$#xOw_%|a*YUvlgET^B<l`61JGdaX`Dkx51Ep!E_fJrOcDMo z;@pU&Ln{Wr_RGjadWdV~TcuzB6R7{9QvW;RVmqIEQy=q>75{%Sg(f|W1KwyFYf%nX zf$%sUAdq3o!aVoC`OUzYEdjUVGRylX#c#-8``wAXada@#bFpt$dZOH;S0tmUV2`GZ zB+P3KuEF(lFpvQ~%wa&svnJl+Y+n`wJkbo@_()6q?Ek?E`JamY(9sEvqkzJtT92Q{ zKMaJQ>pXhyWdGb*&C%QWxTBMol~a_GRg#ibF_%?QlT%Prl$Vs1Rg;x{FOtylp9G*V bC$}d7|6E`Wq3nAsK&P+sK)dvgUHHEN|G>}r diff --git a/docs/images/factory_init_injections.png b/docs/images/factory_init_injections.png index 31ddc5b77e14da81ff5e558ffdc24fbac2076f5f..8a104712f73a995290b85f6f150e7a1287d2e9a9 100644 GIT binary patch literal 18876 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 RaTQPlgQu&X%Q~loCIB#7)oTC% literal 4112 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 Q?m0jZdM4NFbZ_4K7b&}hYybcN diff --git a/docs/images/factory_init_injections_and_contexts.png b/docs/images/factory_init_injections_and_contexts.png index a3328ed00ceb77c36fa18bc30df5aa26edce29d6..2eb6c32807142073e83dd5014df878d1e00d4527 100644 GIT binary patch literal 34096 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 literal 7370 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 R#Y!?DQ;<`UErGr8|2KeBw50$5 diff --git a/docs/images/factory_method_injections.png b/docs/images/factory_method_injections.png index 95a44af706bacc859c92f6481a847537928ab125..a30cf299c07774a96598e630de0f490d86608812 100644 GIT binary patch literal 35252 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 literal 8747 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 bf9YuN|33>fNVYiK2;ga|={`lMJb(Kii-q>! diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index 77375eb1..4af9b846 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -5,6 +5,8 @@ Factory providers Nothing could be better than brief example: +.. image:: /images/factory.png + .. code-block:: python """`Factory` providers example.""" From c56cb70a24b076e188b02badb6adbb131cecc0b3 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Wed, 24 Jun 2015 12:29:58 +0300 Subject: [PATCH 40/73] Adding images for singleton docs --- docs/images/singleton.png | Bin 0 -> 9899 bytes docs/images/singleton_internals.png | Bin 0 -> 11572 bytes docs/providers/singleton.rst | 6 ++++++ 3 files changed, 6 insertions(+) create mode 100644 docs/images/singleton.png create mode 100644 docs/images/singleton_internals.png diff --git a/docs/images/singleton.png b/docs/images/singleton.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc8ae7f84ecc9474ebd500f2f29a62a76b161d5 GIT binary patch literal 9899 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 A1^@s6 literal 0 HcmV?d00001 diff --git a/docs/images/singleton_internals.png b/docs/images/singleton_internals.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb058282036e268ed770502f0d487525c181f3c GIT binary patch literal 11572 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 LDpKVVppgFo`2!qx literal 0 HcmV?d00001 diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index ab978b23..e3a18b76 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -4,6 +4,10 @@ Singleton providers ``Singleton`` provider creates new instance of specified class on first call and returns same instance on every next call. +Example: + +.. image:: /images/singleton.png + .. code-block:: python """`Singleton` providers example.""" @@ -37,6 +41,8 @@ Singleton providers and injections specified class instance, so, all of the rules about injections are the same, as for ``Factory`` providers. +.. image:: /images/singleton_internals.png + .. note:: Due that ``Singleton`` provider creates specified class instance only on From db09503426639e2b18606eb0df3ad238b77cc0b8 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Fri, 26 Jun 2015 10:21:23 +0300 Subject: [PATCH 41/73] Adding better scalling for some factory and singleton documentation images --- docs/providers/factory.rst | 2 ++ docs/providers/singleton.rst | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index 4af9b846..24a78ca2 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -6,6 +6,8 @@ Factory providers Nothing could be better than brief example: .. image:: /images/factory.png + :width: 80% + :align: center .. code-block:: python diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index e3a18b76..2e62e813 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -7,6 +7,8 @@ and returns same instance on every next call. Example: .. image:: /images/singleton.png + :width: 80% + :align: center .. code-block:: python @@ -42,6 +44,8 @@ specified class instance, so, all of the rules about injections are the same, as for ``Factory`` providers. .. image:: /images/singleton_internals.png + :width: 80% + :align: center .. note:: From d3ee3edc4e15a9b5cfd4bf666b024c8d25de9659 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Mon, 29 Jun 2015 21:32:03 +0300 Subject: [PATCH 42/73] Updating license file --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 5442b8b7..a5d52629 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2015, Roman +Copyright (c) 2015, Roman Mogilatov All rights reserved. Redistribution and use in source and binary forms, with or without From 4db4629c758979171ed320aa890e92089de276c0 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Mon, 6 Jul 2015 16:52:51 +0300 Subject: [PATCH 43/73] Fixing comment in catalogs --- objects/catalog.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/objects/catalog.py b/objects/catalog.py index c69346d0..75b34e1d 100644 --- a/objects/catalog.py +++ b/objects/catalog.py @@ -38,10 +38,9 @@ class AbstractCatalog(object): @classmethod def override(cls, overriding): - """ - Override current catalog providers by overriding catalog providers. + """Override current catalog providers by overriding catalog providers. - :param overriding: AbstractCatalog + :type overriding: AbstractCatalog """ overridden = overriding.all_providers() - cls.all_providers() for name, provider in overridden: From 77f5d05071440a7fb2854cad34dc8a9554b5bb28 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <roman.mogilatov@cupid.com> Date: Mon, 6 Jul 2015 16:53:09 +0300 Subject: [PATCH 44/73] Updating gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index a419efbc..a1c86b0b 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,6 @@ venv/ # JointJS Experiments jointjs/ + +# Vim Rope +.ropeproject/ From 4620ad7f29721713801b11899d42107f646fa21e Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Sat, 11 Jul 2015 17:21:36 +0300 Subject: [PATCH 45/73] Adding delegate option for injections --- examples/singleton_and_factory.py | 69 +++++++++++++++++++++++++++++++ objects/injections.py | 7 ++-- 2 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 examples/singleton_and_factory.py diff --git a/examples/singleton_and_factory.py b/examples/singleton_and_factory.py new file mode 100644 index 00000000..3d044608 --- /dev/null +++ b/examples/singleton_and_factory.py @@ -0,0 +1,69 @@ +"""Providers delegation example.""" + +from objects.providers import Factory +from objects.providers import Singleton + +from objects.injections import KwArg + + +class User(object): + + """Example class User.""" + + def __init__(self, id, name): + """Initializer. + + :param id: int + :param name: str + :return: + """ + self.id = id + self.name = name + + +class UserService(object): + + """Example class UserService. + + UserService has dependency on users factory. + """ + + def __init__(self, users_factory): + """Initializer. + + :param users_factory: objects.providers.Factory + :return: + """ + self.users_factory = users_factory + + def get_by_id(self, id): + """Return user info by user id.""" + return self.users_factory(id=id, name=self._get_name_from_db(id)) + + def _get_name_from_db(self, id): + """Return user's name from database by his id. + + Main purpose of this method is just to show the fact of retrieving + some user's data from database, so, actually, it simulates work + with database just by merging constant string with provided user's id. + """ + return ''.join(('user', str(id))) + + +# Users factory and UserService provider: +users_service = Singleton(UserService, + KwArg('users_factory', + Factory(User), + delegate=True)) + + +# Creating several User objects: +user1 = users_service().get_by_id(1) +user2 = users_service().get_by_id(2) + +# Making some asserts: +assert user1.id == 1 +assert user1.name == 'user1' + +assert user2.id == 2 +assert user2.name == 'user2' diff --git a/objects/injections.py b/objects/injections.py index c574071b..15d20a5c 100644 --- a/objects/injections.py +++ b/objects/injections.py @@ -8,17 +8,18 @@ class Injection(object): """Base injection class.""" __IS_OBJECTS_INJECTION__ = True - __slots__ = ('name', 'injectable') + __slots__ = ('name', 'injectable', 'delegate') - def __init__(self, name, injectable): + def __init__(self, name, injectable, delegate=False): """Initializer.""" self.name = name self.injectable = injectable + self.delegate = delegate @property def value(self): """Return injectable value.""" - if is_provider(self.injectable): + if is_provider(self.injectable) and not self.delegate: return self.injectable() return self.injectable From e38cecfae0e936987be98fff67711cf057db24e0 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Sat, 11 Jul 2015 17:27:28 +0300 Subject: [PATCH 46/73] Updating example --- examples/singleton_and_factory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/singleton_and_factory.py b/examples/singleton_and_factory.py index 3d044608..8a1b6853 100644 --- a/examples/singleton_and_factory.py +++ b/examples/singleton_and_factory.py @@ -2,6 +2,7 @@ from objects.providers import Factory from objects.providers import Singleton +from objects.providers import Delegate from objects.injections import KwArg @@ -53,8 +54,7 @@ class UserService(object): # Users factory and UserService provider: users_service = Singleton(UserService, KwArg('users_factory', - Factory(User), - delegate=True)) + Delegate(Factory(User)))) # Creating several User objects: From acc9259ddd30b6433dc93ea1604325ca38448132 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Sat, 11 Jul 2015 23:34:23 +0300 Subject: [PATCH 47/73] Removing delegate option from injections --- examples/singleton_and_factory.py | 5 ++--- objects/injections.py | 7 +++---- tox.ini | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/examples/singleton_and_factory.py b/examples/singleton_and_factory.py index 8a1b6853..6a8b4f70 100644 --- a/examples/singleton_and_factory.py +++ b/examples/singleton_and_factory.py @@ -52,10 +52,9 @@ class UserService(object): # Users factory and UserService provider: +users_factory = Factory(User) users_service = Singleton(UserService, - KwArg('users_factory', - Delegate(Factory(User)))) - + KwArg('users_factory', Delegate(users_factory))) # Creating several User objects: user1 = users_service().get_by_id(1) diff --git a/objects/injections.py b/objects/injections.py index 15d20a5c..c574071b 100644 --- a/objects/injections.py +++ b/objects/injections.py @@ -8,18 +8,17 @@ class Injection(object): """Base injection class.""" __IS_OBJECTS_INJECTION__ = True - __slots__ = ('name', 'injectable', 'delegate') + __slots__ = ('name', 'injectable') - def __init__(self, name, injectable, delegate=False): + def __init__(self, name, injectable): """Initializer.""" self.name = name self.injectable = injectable - self.delegate = delegate @property def value(self): """Return injectable value.""" - if is_provider(self.injectable) and not self.delegate: + if is_provider(self.injectable): return self.injectable() return self.injectable diff --git a/tox.ini b/tox.ini index 2dff08c0..54d47a1f 100644 --- a/tox.ini +++ b/tox.ini @@ -39,14 +39,14 @@ basepython=python2.7 deps= flake8 commands= - flake8 --max-complexity=8 objects + flake8 --max-complexity=8 objects/ [testenv:pep257] basepython=python2.7 deps= pep257 commands= - pep257 objects + pep257 objects/ [testenv:py26] basepython=python2.6 From 7224fd4b37d1a61136ecc921ed9d3e8ff6270054 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Tue, 14 Jul 2015 02:37:25 +0300 Subject: [PATCH 48/73] Updating callable provider docs --- docs/images/callable.png | Bin 0 -> 15150 bytes docs/providers/callable.rst | 64 ++++++++++++++++----------------- examples/providers/callable.py | 55 +++++++++++++--------------- 3 files changed, 54 insertions(+), 65 deletions(-) create mode 100644 docs/images/callable.png diff --git a/docs/images/callable.png b/docs/images/callable.png new file mode 100644 index 0000000000000000000000000000000000000000..67a7e492f5321770e88ac57027ec61beafe9397a GIT binary patch literal 15150 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 literal 0 HcmV?d00001 diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst index 9968818c..9d1b4b35 100644 --- a/docs/providers/callable.rst +++ b/docs/providers/callable.rst @@ -1,64 +1,60 @@ Callable providers ------------------ -``Callable`` provider is a provider that decorates particular callable with +``Callable`` provider is a provider that wraps particular callable with some injections. Every call of this provider returns result of call of initial callable. ``Callable`` provider uses ``KwArg`` injections. ``KwArg`` injections are -done by passing injectable values like keyword arguments during call time. +done by passing injectable values as keyword arguments during call time. Context keyword arguments have higher priority than ``KwArg`` injections. Example: +.. image:: /images/callable.png + :width: 100% + :align: center + .. code-block:: python """`Callable` providers examples.""" from objects.providers import Callable - from objects.providers import Singleton - from objects.injections import KwArg - class UserService(object): + class SomeCrypt(object): - """Example class UserService.""" + """Example class SomeCrypt.""" - def get_by_id(self, id): - """Return user info by user id.""" - return {'id': id, 'login': 'example_user'} + @staticmethod + def encrypt(data, password): + """Encypt data using password.""" + return ''.join((password, data, password)) + + @staticmethod + def decrypt(data, password): + """Decrypt data using password.""" + return data[len(password):-len(password)] - def get_user_by_id(user_id, users_service): - """Example function that has input arg and dependency on database.""" - return users_service.get_by_id(user_id) - - - # UserService and get_user_by_id providers: - users_service = Singleton(UserService) - get_user_by_id = Callable(get_user_by_id, - KwArg('users_service', users_service)) + # Encrypt and decrypt function providers: + encrypt = Callable(SomeCrypt.encrypt, + KwArg('password', 'secret123')) + decrypt = Callable(SomeCrypt.decrypt, + KwArg('password', 'secret123')) # Making some asserts: - assert get_user_by_id(1) == {'id': 1, 'login': 'example_user'} - assert get_user_by_id(2) == {'id': 2, 'login': 'example_user'} + initial_data = 'some_data' + encrypted1 = encrypt(initial_data) + decrypted1 = decrypt(encrypted1) + + assert decrypted1 == initial_data # Context keyword arguments priority example: - class UserServiceMock(object): - - """Example class UserService.""" - - def get_by_id(self, id): - """Return user info by user id.""" - return {'id': id, 'login': 'mock'} - - - user_service_mock = UserServiceMock() - - user3 = get_user_by_id(1, users_service=user_service_mock) - - assert user3 == {'id': 1, 'login': 'mock'} + encrypted2 = encrypt(initial_data, password='another_secret') + decrypted2 = decrypt(encrypted2) + assert decrypted2 != initial_data diff --git a/examples/providers/callable.py b/examples/providers/callable.py index b3112569..73654eb4 100644 --- a/examples/providers/callable.py +++ b/examples/providers/callable.py @@ -1,47 +1,40 @@ """`Callable` providers examples.""" from objects.providers import Callable -from objects.providers import Singleton - from objects.injections import KwArg -class UserService(object): +class SomeCrypt(object): - """Example class UserService.""" + """Example class SomeCrypt.""" - def get_by_id(self, id): - """Return user info by user id.""" - return {'id': id, 'login': 'example_user'} + @staticmethod + def encrypt(data, password): + """Encypt data using password.""" + return ''.join((password, data, password)) + + @staticmethod + def decrypt(data, password): + """Decrypt data using password.""" + return data[len(password):-len(password)] -def get_user_by_id(user_id, users_service): - """Example function that has input arg and dependency on database.""" - return users_service.get_by_id(user_id) - - -# UserService and get_user_by_id providers: -users_service = Singleton(UserService) -get_user_by_id = Callable(get_user_by_id, - KwArg('users_service', users_service)) +# Encrypt and decrypt function providers: +encrypt = Callable(SomeCrypt.encrypt, + KwArg('password', 'secret123')) +decrypt = Callable(SomeCrypt.decrypt, + KwArg('password', 'secret123')) # Making some asserts: -assert get_user_by_id(1) == {'id': 1, 'login': 'example_user'} -assert get_user_by_id(2) == {'id': 2, 'login': 'example_user'} +initial_data = 'some_data' +encrypted1 = encrypt(initial_data) +decrypted1 = decrypt(encrypted1) + +assert decrypted1 == initial_data # Context keyword arguments priority example: -class UserServiceMock(object): +encrypted2 = encrypt(initial_data, password='another_secret') +decrypted2 = decrypt(encrypted2) - """Example class UserService.""" - - def get_by_id(self, id): - """Return user info by user id.""" - return {'id': id, 'login': 'mock'} - - -user_service_mock = UserServiceMock() - -user3 = get_user_by_id(1, users_service=user_service_mock) - -assert user3 == {'id': 1, 'login': 'mock'} +assert decrypted2 != initial_data From 7f92b886bddb397fb37e5e49bfad42bc2378dcd6 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Wed, 15 Jul 2015 16:14:40 +0300 Subject: [PATCH 49/73] removing example of callalbe provider --- examples/providers/callable.py | 40 ---------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 examples/providers/callable.py diff --git a/examples/providers/callable.py b/examples/providers/callable.py deleted file mode 100644 index 73654eb4..00000000 --- a/examples/providers/callable.py +++ /dev/null @@ -1,40 +0,0 @@ -"""`Callable` providers examples.""" - -from objects.providers import Callable -from objects.injections import KwArg - - -class SomeCrypt(object): - - """Example class SomeCrypt.""" - - @staticmethod - def encrypt(data, password): - """Encypt data using password.""" - return ''.join((password, data, password)) - - @staticmethod - def decrypt(data, password): - """Decrypt data using password.""" - return data[len(password):-len(password)] - - -# Encrypt and decrypt function providers: -encrypt = Callable(SomeCrypt.encrypt, - KwArg('password', 'secret123')) -decrypt = Callable(SomeCrypt.decrypt, - KwArg('password', 'secret123')) - -# Making some asserts: -initial_data = 'some_data' - -encrypted1 = encrypt(initial_data) -decrypted1 = decrypt(encrypted1) - -assert decrypted1 == initial_data - -# Context keyword arguments priority example: -encrypted2 = encrypt(initial_data, password='another_secret') -decrypted2 = decrypt(encrypted2) - -assert decrypted2 != initial_data From 295c6b56eba0c038d6502b919aa41139e6566d04 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Wed, 15 Jul 2015 16:15:45 +0300 Subject: [PATCH 50/73] Removing of Callable provider docs --- docs/providers/callable.rst | 60 ------------------------------------- docs/providers/index.rst | 1 - 2 files changed, 61 deletions(-) delete mode 100644 docs/providers/callable.rst diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst deleted file mode 100644 index 9d1b4b35..00000000 --- a/docs/providers/callable.rst +++ /dev/null @@ -1,60 +0,0 @@ -Callable providers ------------------- - -``Callable`` provider is a provider that wraps particular callable with -some injections. Every call of this provider returns result of call of initial -callable. - -``Callable`` provider uses ``KwArg`` injections. ``KwArg`` injections are -done by passing injectable values as keyword arguments during call time. - -Context keyword arguments have higher priority than ``KwArg`` injections. - -Example: - -.. image:: /images/callable.png - :width: 100% - :align: center - -.. code-block:: python - - """`Callable` providers examples.""" - - from objects.providers import Callable - from objects.injections import KwArg - - - class SomeCrypt(object): - - """Example class SomeCrypt.""" - - @staticmethod - def encrypt(data, password): - """Encypt data using password.""" - return ''.join((password, data, password)) - - @staticmethod - def decrypt(data, password): - """Decrypt data using password.""" - return data[len(password):-len(password)] - - - # Encrypt and decrypt function providers: - encrypt = Callable(SomeCrypt.encrypt, - KwArg('password', 'secret123')) - decrypt = Callable(SomeCrypt.decrypt, - KwArg('password', 'secret123')) - - # Making some asserts: - initial_data = 'some_data' - - encrypted1 = encrypt(initial_data) - decrypted1 = decrypt(encrypted1) - - assert decrypted1 == initial_data - - # Context keyword arguments priority example: - encrypted2 = encrypt(initial_data, password='another_secret') - decrypted2 = decrypt(encrypted2) - - assert decrypted2 != initial_data diff --git a/docs/providers/index.rst b/docs/providers/index.rst index 070c57c7..1b5eab00 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -11,6 +11,5 @@ All providers are callable. They describe how particular objects are provided. factory singleton static - callable external_dependency delegation From 54eb60698b4e9f6e6090ef1bc450b720b51adfc5 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Thu, 16 Jul 2015 00:48:30 +0300 Subject: [PATCH 51/73] Reverting removing of Callable docs --- docs/providers/callable.rst | 60 +++++++++++++++++++++++++++++++++++++ docs/providers/index.rst | 1 + 2 files changed, 61 insertions(+) create mode 100644 docs/providers/callable.rst diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst new file mode 100644 index 00000000..9d1b4b35 --- /dev/null +++ b/docs/providers/callable.rst @@ -0,0 +1,60 @@ +Callable providers +------------------ + +``Callable`` provider is a provider that wraps particular callable with +some injections. Every call of this provider returns result of call of initial +callable. + +``Callable`` provider uses ``KwArg`` injections. ``KwArg`` injections are +done by passing injectable values as keyword arguments during call time. + +Context keyword arguments have higher priority than ``KwArg`` injections. + +Example: + +.. image:: /images/callable.png + :width: 100% + :align: center + +.. code-block:: python + + """`Callable` providers examples.""" + + from objects.providers import Callable + from objects.injections import KwArg + + + class SomeCrypt(object): + + """Example class SomeCrypt.""" + + @staticmethod + def encrypt(data, password): + """Encypt data using password.""" + return ''.join((password, data, password)) + + @staticmethod + def decrypt(data, password): + """Decrypt data using password.""" + return data[len(password):-len(password)] + + + # Encrypt and decrypt function providers: + encrypt = Callable(SomeCrypt.encrypt, + KwArg('password', 'secret123')) + decrypt = Callable(SomeCrypt.decrypt, + KwArg('password', 'secret123')) + + # Making some asserts: + initial_data = 'some_data' + + encrypted1 = encrypt(initial_data) + decrypted1 = decrypt(encrypted1) + + assert decrypted1 == initial_data + + # Context keyword arguments priority example: + encrypted2 = encrypt(initial_data, password='another_secret') + decrypted2 = decrypt(encrypted2) + + assert decrypted2 != initial_data diff --git a/docs/providers/index.rst b/docs/providers/index.rst index 1b5eab00..070c57c7 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -11,5 +11,6 @@ All providers are callable. They describe how particular objects are provided. factory singleton static + callable external_dependency delegation From 67fb4181f4294487d63261902d12632591cc01f5 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Thu, 16 Jul 2015 00:49:20 +0300 Subject: [PATCH 52/73] Reverting of removing callable provider example --- examples/providers/callable.py | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 examples/providers/callable.py diff --git a/examples/providers/callable.py b/examples/providers/callable.py new file mode 100644 index 00000000..73654eb4 --- /dev/null +++ b/examples/providers/callable.py @@ -0,0 +1,40 @@ +"""`Callable` providers examples.""" + +from objects.providers import Callable +from objects.injections import KwArg + + +class SomeCrypt(object): + + """Example class SomeCrypt.""" + + @staticmethod + def encrypt(data, password): + """Encypt data using password.""" + return ''.join((password, data, password)) + + @staticmethod + def decrypt(data, password): + """Decrypt data using password.""" + return data[len(password):-len(password)] + + +# Encrypt and decrypt function providers: +encrypt = Callable(SomeCrypt.encrypt, + KwArg('password', 'secret123')) +decrypt = Callable(SomeCrypt.decrypt, + KwArg('password', 'secret123')) + +# Making some asserts: +initial_data = 'some_data' + +encrypted1 = encrypt(initial_data) +decrypted1 = decrypt(encrypted1) + +assert decrypted1 == initial_data + +# Context keyword arguments priority example: +encrypted2 = encrypt(initial_data, password='another_secret') +decrypted2 = decrypt(encrypted2) + +assert decrypted2 != initial_data From ec808b136188ab8b36a8b41ff3ba9f42f0981a92 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Thu, 16 Jul 2015 02:39:21 +0300 Subject: [PATCH 53/73] Updating callable docs --- docs/images/callable.png | Bin 15150 -> 39392 bytes docs/providers/callable.rst | 46 +++++++++------------------------ examples/providers/callable.py | 46 +++++++++------------------------ 3 files changed, 24 insertions(+), 68 deletions(-) diff --git a/docs/images/callable.png b/docs/images/callable.png index 67a7e492f5321770e88ac57027ec61beafe9397a..5dec3a6564c9a0e8aab4adf8036c8fabf3931e46 100644 GIT binary patch literal 39392 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 literal 15150 zcmdtJWmKDAw=bFs1xm3}JQOQV(E`B>#ob*>vEo5fAXt%>;_gsfi&I=0N^o~gLvVMO zoBrSZ?(^Z?ea9VpoUuQgjFFLN$$ZvYbFDS!{LMKNs-_}~`;_7-006+1my^-}03L$? zfCmFukI*%kryIoRpU2h`$`SxTRTR#R83wxiz*R$55>P$_+(Z{>%;hwc0RS&X0Kh*8 z0JuU|`ELLK?py%C)_VXzC>a1C1*bQui=gR1YD!wt_xJY*1R@|H0Ns;=gM*Zo#V9Dp zCAY^ewI#55_4@kSzXAEFbWG7M2&DGGr+Qw?Gyb)N>N7%Oi>OLT6IVKJQ8qEft&>Z- zuN}oBYu7ioZne|TpiKgC@QL-KkhX>Q#bYOzH-GldlDm=cKl{JO=AOvd03JNV_icWF zPs$n&qX}vEs+?AHjqt9R{+Lj29Fli(a^mRd`1|*7DJiL~tu1|h{kXU|GBUFK{QSDQ zy0Njb58-7FY3(!=G=5h8>Asn9kc66;y2{9E_o5;2_uscSx8uzdks7fl`=^_Wn<?h$ zff8RDVw+rz-AljyxIDWo53Kx^-6_T+t}Ld~S3a=6zE6Nl$jQjHJdVl>F0j`8XdrJG z>J&EKKd$gf>EVNi1Xu)YqDmAD93LXe*x#x+rgz|zP!d&t8$h${!3RZIDZp0@Dmiok z8!V^q3ILF${rx_WcMpsQ06;79QW9F9=5{ke{TB3G5Yi;hgy+Qj<#lc5Op#Qwqzpr^ zCgc=6rk4)G9U??g<SZV0_xIv*+M-6vITCMX2QlCHA%>p?qmU1ZbT3Yu)jl0PMvwGA z@OjC`RQQ-5BwA(62w+c-<DHM%d@dO12H?Wj4ncXn_usB`nc*M>Bo1K5Q2X0mNENvN zDl;@)?8WmHe`jmXGd$|}OzYwxo~QVmL8#vN4S=1LZusn7layqwHXs=Q<Hiem<d01Q zM7;(5Z^b_cFv2c8LWa$S6PrZM80)yr@xW55zy0wzff%bPA0-4iJ+%l{<t4h}T`V3W z0UdOhq>-^Mm)#DGsrjuhrH+{Fr_-p^)wQZ$Xi`OPeY+c^1p;PP{=j0?3hupf9{Iu| zNK%$n>I{1pc-v_vv1hZfiN2+w7P$U2J-wyO1+h%Fq%y9=A8EzK&|_f&bU+Q@JSk)P ze7cfq$;Y3wZdf^rJQ@gz6vuOW6c*K=nP$+c#4t25m?vcC^q4Q7kcSNnB;upz`v`m? zhNlxo=bUdq_&oopK5@NzVok2bfHa1kn4Px^KEB<DW35fY85OklU2BUXsNgAp-_swd z*Uman`HhK!mg+^$gW?l!xtcth#Bd`M>k5`5{#2UOZ$v>7ueQuqK99cx0V?}D2T))8 zQs-$ir>Gj9E~hae#!Vv9KUYU&p`7zAMwo0*XxF~UuqWAg3A=owLGxiXo6%odD~OPx zI{AP_Ah=V24{sQ!QEb%Bq=z|d6w@XhltW%X9_PyU81}$l8}BvHCLtN)3)|CR9r7(o z81hs?f>o0Z8)mS@P_P&qSHYs}AjJ~^2E0!QoCewEK2G`gj&3qEc8;l?C~_nwCa&yH zyqSbM`4jb=3<?>L0&8u}J4}1U;-AUxXx1izZop*&j|Xw62oG^wfUGy$u+g0nou`}{ zzwY~QDt;E$aybB9Y?-Dz^+P_O`%i(O)UsP^N>*1Q{X)}X;YP1$$5!<wvj;Nz2L52x zEEMy$mMpw6tQF={qhhfeWL9!P6P@XG&R5x(F+zY|KQ{=_6-4Z&ps{L483Qys*n?Ja zWK{;=;-L2{zY>Z(Xz_TwI<jB*480_-Uq`{6cm#L=Mt^YlBP8JcL#%Glf4lh5&>sw_ zB%Y62cR|0qlK71_{O=eKg3N(`=kylze_2tq{kSIU{)73WAoFxP*kM@K{SL%Fi3%`v zu~?|;cj?`UOAzVIAB;Npy*%06pW_e)lpTg4{H{(msc+2MAHcYW)IfI!_%k2d@56+X zDgDinQ7bGLs67_+W{l%>bKdFIo<-RwQ34V#<FZ73u4=?>bkG9D4OV6L8t{_46QPFQ ztq8DDY1V^-qRWi(NjxN(Y;flZmKg}cKT-UWVY<T)4>=Qp)jiypaHLqP0U$dF%Q~*u z<h;j1%cs$HOB<gnS9JA^lq~uE$uJGjd?d?+vi`}Rmp9FY0-NVz#<M0V(<l41Kyx*5 zO~(P>_T<{VvGdQE>%*ky2MBA<Aak~QtnOIF)3a8<!lO6ZjBhnD{JBR2g|LNWACNuh ztQvn0BJrnu#^fL1%=O@zKQ4b^dZ07cD$t+yQ?J95PrbP4habKqpMJdbfBE<*1^eM8 zU?gxPfLCJUZKZ7HUE?lW0~3~xNE`}BC%ib9M86d*(rAJV0f)Pyj<HIeir<3Rt9_9T zc<3EKU6(%%>ZBux?0y*ZXonE1+x!9S!5LN%stSMvct3_6>iL8HMIRzRvA+d%ybJ(~ zkkA0%N4*8T#38_|l%)YiVPIj-(5v1D?y}7Ypf~PsD=_O2pBd=5mln(u_3|Wp{n+wS z)CmXu+MYx5djc3?{#DYJmFT?4m!y|^pbMxCGRW}E3z;tRZ(3Sld@mw(&I`_m<Z8xe z0|qD_k}M`eI{%IsIeZ}yM4uZmIWlRw5q}@zdu*8DrC!r}jdOgR;Z<B#kk6i^b?7p+ z5lH<LhHTWBlrvsjEXNxG&XsPS$^5uU4(_pF@O$^8DbLas!;E=0#L~6R=q|_vA;&|U z!OS=vX9Tmk{kvorC_IY<uYxWoC;msiVf5X%LcUE&8IDm?4TeotR^B6Cy26#+S1CfT z@ZHwbV!B-Lboqr%nwyOmK{YGiGl&+K-X!Ihm=?X_jC$powD5gpP<plZ7q>N~6$Wwn z(=VK|p7HgN<(>?S0IN>FOC<ul12r_;3WEbL)>AO(6S_su74;QxN-i3QEH$a_Wm#Vt zs~^~^UmqQ$vPw%~J8@oepScLi_6bG9Z@AJH7q{Rkm%#LQ6HIs?zKs`s2>wW_P}~Ei z6UTbK+@~CKI0XZy=R*lCH<P_%f2c3<>$$jSRxqj_9enyBS3rp#{U63s!U(-yPIF(V zYW_OE3{5B$Ut1r;UI}=83dy9FBaEbrZwleud?ihlY~ar{{8Q{tK`X(Fo9X_6PGIWd z?UowI<<=1IY^??EkXK}g#h{)+%8nJ>Y3S2hR@C@b_F8*DboGt>Q{w6`hFT87jMxPM z|Kc)&0I%Y<Ku+^llBxADTb-9Wh74}(8K9;&PPTGPC{+JPIFCh%V5C@!j2MXCvEh>y zq+RGmq@L?nOm9Ux;uzm-j?dB6d3baxdLQp{bk?8+x9WC3d+P>p1bA>*fnq_AL}*I! zX&@QB6tYX3UpKent;Gr}eO_n-fKT5Q+b2)PkMqNj?)cRw&QfE%8ZUl;Pf9zjo1ZDw z|9<aebPy{i-yE&J61T3gan$K_M0(iQv?kA{m1Ztzru`9r;QRVX40iY7B}ZkC1+{EB zAKqw;38<tEo()54=xdO>vBc_tptrmDX_$>UbPg1+tD8-!G6n6n*eSh56T_=bzxG6g z-d|zYT_$CKUj$OfLU)HG+vyajtI(Q2oH3YwR95g=U;wyC;juQ5ANFf9A`ff+<<l$y zei*HHM4wz*E&*+55pkri`=_-$8_0?GxK{A5P14VF#g|IbMz4N=dK#-G+GXauxd%jW zwG~;>3dQ@q21umjwgXZG#FCZ6bJ{lGq{EwQrhP;a5N?>vtv0T$uJJNIA)UTZXr=W? z*W<iYBGKKNUr_3HshwFWPN8qiBVbs!2Vqo7n;E{8C~X)+aH=qPDOIk=QC-~}H{!Op zWr?;w8c4@^Wi1UJ%S(SJjkHRe#{MEJ6#uKV&fLmtMM}RY7ie`R?cgQo`D<NtA@;j{ z<(zWSA0RO0jPTj><NI{BFqwK9VfUpF9S+t;vTg_OHv^ZohHnxglYC!(c{WYrqMU6c zg4WF5&hzodJfW7bB61q#G{VTd9e#PkE^bxE(s!0t)>bX0<P!(6Gso3(1@=17_<nCU zNP8;2sf}|Q@anf?Y<%?(L#(=Qu~y}R&1oBe(4>@Kx}3ct##3gA<#1Z;BL$|EEB(a8 zS%>}pzvk$lyZsU^Ap)=4;P_v{j`h*Cnyl5{rhWdQ^$S)H&{n|bZ14#EBiMrusz#@X zz#^6U3DT=+^YyA>itec-^K}F%dcr>zbU{sRpHF0xBiy<>C^uW=$ZNjtrJ<X4Vo+&6 z!$ty7z$`E@Yrp&}idXC(6JUnE+Zy_hf$`5J<qa~QZu^#4De9P&LF)SFSo%ES-Cq&h zZGA%yi&^BB`?wTYvg7_4{*1@d`z$j+nf5;<GA%GcWqL<essdY9V=r;hILQ234-DEj z#QjgP+S#1_To~s|=)kDzVhag5N+KuSDWl;V^ZFm8pco4Ae04#wdhPadWRR#nCb4V` zqODPX#dZw)R>=7^NPpSJA0?tV57F*h;Dh}NJ#Ijt#qRLr8o{%(0_Vh(k84&E2p;*g zY3*0@plJcM7WTdpxgp)u<Hb+9`GR7FtSF<4e@j88VEVF9Ad^50B)w$>qHMfm1xq+y zy0`cYap|PVopJtpR9Ply^CG$4oQn0;BisNa_=@MFM|~+J`j|fU`QXXIUy)XC?oOMi zMwQ<dofbpAcC_~+^q!VGhF;86z0^v2ZT0SMcZLqqK=S-J%jiQSU7z455L&aup>J)b zLPMC6i3Wb4nxy-cmMlASWJ}Rr0b@x~3#@$fO-@t91j;5lGC6jn1(P#Cab9=vwCmCX zef{{q_&R-PbNl0gL$RLgk|z{Hq#F{eCHbkRUaLn{f2kx|U@5$t5JX{LbTI!`tm`$s z=>L+stAh9J$5{o2yiSrfmh80ED|X>xrsCrhzlo<w0!kmataP_7gafR2M$~*MV2U}> zY45uh(eic<>;3Ig$?a#!dbP@QkoKTF%YIJS)!?tLDXjM@hRrrXsGqv}|DjZ!2qWc6 zai7n(tPM7bl`hhhhN|qytsGY3oW|jsN2Zc}H!wU{PM@bRjz4yEX9hY<jQKjTA`Hj& zJL_<;gIN-^vrh@em$*!=4+8l?)iL3=^seP+AZ^ml3+^XJf?^0`Li7PN{7n31@KFXO z^1XE9%T<wV=7hNpsrchQDS%>i8II0E1>W!u{}}H~8XV7NW7#A76(WI?Tl$DEfxpjl zDRX!;7&S)&eq}afhlN@B>yX?}15~p1h++26yH~~s2Qr|G^(DSsvbAQ`!-Hm4&vWAh z1J>tex~L7^FV_4B?cVZT<!vi~E~!S}^Dp;Jb-C28I0NA^Wi~HTta=CcONu&PXi0+n zG0^*5?-qG9PAzn${@AnVmfazTfK-}tRRsLB+s$J_;+TqG-mJhe6_0R?d3~<2cf08y znXPMfblqyhh)q}0jBy)IsTd!ZR&x;$Dv`)HNYt*G4xI`3unbJ3SY7x6_Qzbi2p1Q8 zz)n}vCmA9<{@F!*T3t<F;Uw^}{&9=lDqSv&h3$BC8m2f{Z+?l4;>C3^Qdeix(j?s6 z^K~aHYv>uQSG{Uw$IoQS^4lR<>8#3!>zvoE=PviNrgBd7t2tW@6(VYOznH%(1dFya z+H9?uU?BnceQ1_>^)*7dnnt3Y=Q$rU)Y2qyt!vL<%PJ_VeuZWVsYb+G2vPL4AL3Cn zBw$^_eUJrtb)<byN*^H)Kz5-z3;PKvuPCfq4Wo;;ialbBYMrejLzQ>x)=SNgrLQeO zQS`QLIu+bA)RytbsN+RqXDGaV*EoTBYsqETBo<fnxPI1t&A&H}5|0A2Ansih4@*UB z<=hX(Ti_3|FJjIcm(wI7s?#~ht`ny}M~!ZRqdH;Jrs`X=fpLhlHjaN}Ag|bG;&-5q zUuc2z4nza|a{yc<ZQrMSz#g^uGu!#r;WF97+s`-4Ot>WCFjW`~g*ijpaM(Zpm7Cdr zb>{z@>!9O-r^i)`G4#+StuUiKww=kEb0`g$w6Mb7^b;o92FAedzRGxJf3*C0qmDz= z`!;0A<WQ5D?dW{v^OBK~+-OF6Y=M`DjFSoaN+wB>a@w0h|ALn;tZr@)IT_e@mUyi9 zxFGt9M>KbuDap;_ZUx87^>R6!!}B_6=izXB{EK0ZSqzS>*)|N<DuPJvL|UNivc-2) zIzwAAiLa;3gceRSkB>B`B|hnV7v+-s-C6{rPl2q>7^%y|Lj__q;&~o~`k4OAEqx?y zs)}Qy)<GA~@0k*J)_6bBn&o!L4i2dUi4)16G=j+2>=K|zc<);QhjU`xN9|nFy$}87 zUZ|KB9N`>>blv4;EZJ+w8BUzIW%&JKAsO+(K$2Nw!>UY~I^$i#PT<o#+@Jl%CYi5! zRyBNlWUP$}uFSzMbj_wM_F?z4Hv2>#0pReO$H<wAI0-a{FoW)vkNGl>e{pwIIQ|{a z;^ZUG+3<5VPi+6XM5PIj{TdBk^@G47vxR@Vy9{0ob0BIXdO0~~#xsxa*Nw(h+wwR+ zrIls&j*+JC<WW;KfBZ5)0zmUNAFKN={Ta+GCJny7xIJ6L#Cb7|9JJ%myrcT$=}Bv> zWqPCv(0yszvzOLAg9+nSXaFKVRWmUKg7sGTQGS;<tEEg8jm)O<p{YWsu&|o(;95nQ z?~H1sGaU>DlK2zM5H}vIFVbjPP`IY~>OIjH6^EpOwtvepq9&)FH1pr4T8ft9|L9`+ zH+SSQs3nr7b9KTdywQ|hmsw%ijpl76R)n96mGH^>b3x&zr`_CFdtM*~)OKmY`;N`S zUU<yao&iV$m6hfHAdE`2kyLi8c^d%7w8Ln#BP63PBfcn?eh;nG`O{1iaQMq0VBg^J z|3~B8W7C@_Xi}X2!ppaVRj~WH?jfQMD;$67DRi2SOH7aLz&Nbq;{A^f$m@rw!2hAf zsBVa=ij9qkkL~qSN3hq2=JXEbKh3V7ult$lvu!`P?*`5=!og2A^~equ8-X2=*|W&) z07Ed<&$eAm4Eu+Oj4lc2c~B32$1^CMmLLfR6vBadu!!~{A|?&M8xv=_4?{X2)-`?z z1{Vj!gaJ5o$U&U#Jpc;fzdkocdlQv^1QR$USUx~x4Bq*W!n5#$%=J4U>yMC?SpUV7 z-s$4VvBo@J<0AsRu(zPZU~R<dSDt^$ku*j231n!xGBr?SH-x(H!e*_O@tCMdS0|V( ztK_VSw;Pvw1r3UEI!pGKl>g}izp#{y$QYkNN^?WCS6sGuhI7j}J~(j6cxGA@JD$Ye zh_8FvXk0Y?a{g3T7Md=ytdy=4)%%ItGrG8&Akxxo5TfYOAp@F;AaW&+8h}uDT&Qcm zDR|oDVq2m{%8cLT(a7GngY2`{3UndACCy2#cNvQoc#*1*NTwPVmj_mI=I^WFKm~f6 z^+TxKMG5h0m>q96pyvm0-7wo#_A$wkKJv86v*%T<$$V_HzA+PbM@5eO8ZQgeY2xLb zLJM3hvk;SnjSpF5q8|Qu+b5`F4Fz+uUzT$^8jwU}tu4d%(6YaiQk<#q4Xz-+A#ojL z?{VJa-(}dk%fEA~ie!^5ZK2&S)LELLvjhUWeG;g#in)GOW7!E`OE~5^EOsC6wWP41 zw%G7Oz}KzqngCvyXCJZurjDmDf{V_|ow8<X;!K3xP_g=zT+s+_{!qg(CVbi}&!laN ze)?ZiaV&S-`bJ3-K`I<I48eDT*4x4JjptQ%(%C-fR1o4>e}q<C3b5w^d2m~~-uRBM zm5r6t8k7%R{4voxS_}Y#GAPA`5I$csZA{a?)mhtG8a+=S<E5CJ-A-i<uq*NQ(q}Q$ z6<8|TD{i&3arLURx&%<|{N0#d2&OWziTxEHb;iEfK(x-rlmo*cQ4I#6A)i~A(95To zPD+v$o2ooX3__f(<72;83di!Ey^)|1e=Osb7gz#~9tC4{S68ky=Qk9azL6xTp<Is| zfl%9@8NaBXtg2M1{qf-{0TV{JQqYxr20!nWvg0;4;>okr@RZkWWTSr1wf**A94wft z$%c)dOcHORj*accJ#K@xKl;u;w5RZE8IAd7Xbs);wGD9+MX<bC)-+i0v_Qqu0{dZ! z`+d;x-vTcU*BmraF_-0Cmv_kU2ov7l4hpD%f_2A7uqyVQOGi-CO%W6_%GsD8FA;1Y zVhD4W1SNJohkjt|-fLEDDE=WAHZrgxu7W;cRgbe~`l_z?o;%vIS<XIDWO>bpE8q`i z$GO;pzDxqMKSM9qe}4!QW`_1G{rf2lR@G5aEdX3m+&EbDL0`+Sd`P`D-C0At0|vK? zy*B;N;NPBN)eYiDA}{q@FgPg&*9@LO`mVt6ESzol<a`B5?|kVaC^l7FGZfJpczC=g z-GN-@>ubieq-wDcIrcH1Zed$N44|o+t$ox`!z)1>i`QL8L#dfC$m^@U+i+@6!$`c% zy$7MKCIRdEMYe2%lzpua(H-N<?Mpjf=z8Bj7lJ}A+nNIpJIA7gP-zldQx`Vpb1HfA zbSWpxn|SSh5lkOSWi00?KzvTr&8gbv&b^iT&u*6_2W?g;K{k1qm$xsL^j-)jXijAd zuHvGc?0LWZ)W1H?7)}HewAQ`G(`;G1P8vZr_n$A$!UY1bU5;PA*Gu7gWq?PK_`7!{ zQ6z<PJ!r7>vogDGVV$N*odq4H0^o)G`{keT>=uF-MKi*1b~7Ed-OZdQA1Bn9p!S1? zbVRRz4*vZ3neMkVaf*+0i`h+tgNbsmQE9Ki=dLx^PNjLG$O`+g&KJ}>vuF)82wA5v z{m?WWY{G5$1N=0itOy<@Z!RWGAy^B3^Ds9=CRS8sX}a`C44>#iA8&+gy-I5qI@p2R z6eqVm%--kSn*hu=eAVBCbC8-!7IiCV8vzyJx&u>^7H1CcI1gY9@7R7u8w+ko|9yiO zc(~p#);{DI?FmmX57|Q7JXJe?Ds05QnfN}O@{Oz4PRubeKf{dYmg{pW_o1X%2l6Qp z;Y(4>&G5)PQS$dvLYJH`o1~BQEHELJ`9yy_SQ{^biMk%EvmlQG&0AEdQnP6OM?V9( z_i|X>hfgt~(>Y)eYlJ@KTw`c1Eqq-_Kg05>_!0ex^0SA>)1lWS#^s0DwPeK+oym`F zT~t*G_#ebhEIShwsw>d+AFVOlFz9GB?`(bCTVtwg$WJ-_>`?x(@(0%EDa$uYHVKxe zb(t(!-7(ncaWcVDYaFk%490nP`BrIgLI$=^$H@@2q{>)C#%u!|#bcYKRpE<nVUHcy z`Chu2AF^+-TQCO}e6Vg?TY0l~&VQ9`Y`Yco2xU5N_0*ew+Y=89sh1B%>+7eowlJoq zh^}$Qjb<`aTh&a0{8n-b)ED1XHKN4tR5<+<x42DeOxl{*{j9Gu7=do3b8XP)vU1H! zE4A_VX;ZXJV{a7$)*CclyA7Nhc%ive8n`x{TfAqPdfLLwMi8m}FE%}1!z+a^w{aA} z)9V)0S>f_|&P?#<IIa&od3^J`<5RF%wlF2;Ri2&Hf4@{Q$(wy)Kw`_qdoiI`Hg?nb zQ)pA(f5V_$q+elBr%jS=P+3*gWAK7<ex)`zU3*IN*5NA+Q1&(Oz&H&?t1Kqq)Lr`2 zhV-ZC_*^vGZ~uHLpQJsy8fCFGQbjd*0h7Y@_u~NK+Tj`ZaOFi0itzGkhq!^04@_gJ zn!5tnK7#F~xVpR?446|I7z3~3=s1e(YWcOheJK&a<L63>_Z|!3+3!G++90$&6-+-7 zB~c_&-L(L#9iJ#DPPtuEpc{YxM!{aDtSG{?+#Jbs!$4j9G2BVa^<Ai&aTspKcfK}G z)O4LM<#7LevAeQ6=N<(_dAshC!)THu=#8;A%E>WKabUjXq?u%mGLs-Oml*G&d@&{0 za(QbeUTYCnVy~sE2zT)4jZHBj-Hg^;(FvvG>jvBY3<||X;L7zrh_G^@IL0nhiUVhw zrKHS^IOjL=dp{gj9>7k+P3I_9!v9o4`ltVkvqjb&x#RJ}3W`jI5>`J)pgvZ&Q1GL+ z=5UC%*N0T$aA0zdi-%k*+Ff2s9GTVu*(FEh4w`Mu&)kVE3;BbAQGbsQrC-vpbjJnc zH9ArWJ@;i-0Kur*P3upk*Af6o(96G<^39$3Bbc)Y>~O{(tcMQjA@$h)F@I=)b{KyJ zHX0iJKt~E5BK^T-#Asug21pQD_wcV3g;o^kkP1lv_$_GapXdP|R=0s5+G~D^Hl7%O z@5TP}J<7y(=qg4a+S2>~_bLd_T}?kJr5&W_!ywGr<<h?L?1MRO+ckP9b{8g8)<_q8 zZq>N&V=K(Lv1<QA#U2hK10Nm0K+|3JmPXVaW-Ww;g|bhv1BX?HFzqV%r>>+R$F^vF zgr0DU&5Z<VrGK3_42g@=9md&IxaEeD+I}7xx0g9AU|>T8Wg!>2uQtw@{~qv<){4=G ziwiPb!9)a1(?`>oDmYAz?>UD!<ujj|EQ?mCZ0<Cc{0>8Zh?W$bI82Pj(#CZiid&%0 zV$8XdSlyR6jn=CP6w6&*XfVQgfj4YYL(#Ivr*a(2QQPI=>*eh1b+>X#-rDl%C}fCY z_2%=2TVz`2KbC6GE<9;HWMG_gc#vHDcC7o?eU`BifheyJaCmbkHed4PE0SlvEtyr( zMwtgrd@)aP?sblj&#&}#W!MNKtqT{&hnK&rwx2i~jdZ1r^Lja6flOMn$NL3NQsdh5 zlAs->q@*of8#|jdI#AOk6T|;l?R@zC4xjjwBxU8#8;u40FbUH>-jm>`-Mn6&9Ck_7 zQGQOLL-Q}S;yP<MzHm;z0-7EXn{E(`o11+yckIOavT#5tq>F5Ll^Ar)t24T8AAOv} z&g_6+vUZTuk34<-n&e-*&^UOJ6fqs9FI*u2b7qXf5T~O9a!N_-iE(HtG&mmFa-Gn* zCtCfH-eR|V9{ID4CS+p^M+UUQpS3;K8<#W}?>RU>v~o72I)wR-Q^VSZq;bflAL|7a zA~qGAJJ7#&|B-ccW@zHHH3c!{c-TkPp606NNE)faQ8Z3K53Fd;SM>e-jPq1~>-njz z^Q?SNQ&4VPSbug%`kTPY!7<P4pKGgvhTl~uiZM=~S6d_X0`}paZGP><WjL}j`p4}8 z2^(uF6*>_4H9rXF7=8N1Px?N4>Mf0>JBCri2!sIV6~8PS>1}N7MnW2lJMouokoic< z#yn6U2t_XNAwG^0#+~{Lb+p**W8*^I=Iw-(E5tz!!67q|o)TIEK7F@2mo^HH@_IYD zaEc-3Dss5rq&t45z+#|4Fsk;N!N)9>m8l>KrH`P$T0KU();vdk;@O$Ax%PI%!bB(w zo1AE{kup_;gHJ?r0v*S?*P0>EBSkOwM1$$)8@`U%*?!E<x||NDZnV@i@tv}WO<jRs zWRgBvBo$E1nIVHu?ko)83_j4nU6DpOC@}EQ0Yhg+iM@5>JeT}V=gcK%-w#nYrhjk$ z(qlnn(`IQHX;Q<zY?NBze<YsG?&Y<s4i9Ni_Ol{4ZD}KX;`u@*2o<~u^toH^73}@K zlP16p<P`9F!k?9PiuFZ(2u?63@2m;p$a6iJb#42_DJ5V!QoPB@V2hc{=?>Z&y>#qp ztVIX$9E?|KeIR}?LP2HR*F=}>H`#}5#bLd>-A$@a5<!Wj*0wjvTU;Bp(Y!?y;15qY zN57?8$+oc<xX=}Y8#TI1MHY$dJcZ<0*lrM}sj;X)&6)t9s*>`qzNBt-v4&>PATeg9 zJv-g3-huS7U-e|Rq(-mtN?PN>`~}l(Z3w4KP@ta;qGb&+q01w3xu$Uq7~VMTegAE9 z&9#ORIpY12Y`FlO4z}FllPBJuq-=Vh5hG#im~c9dP_eqYaK3cZQHv=C2a&JqX%*ul z7Nfv<(lO3I*ph;o**(qPL;Ez_rsG#9<=^QlZEGSEF?5H2U*yk-ZCrV2ut+1YT$u$1 z>J5VoiX!iZWjM7K<ez2FZR2x%YcRT}RR1Bn?q&2EyHkTb*}a!}6l$5I`B6KjhTTPU zOb?_XFw$O4o8<M8rqQCl?#2F1d7ssK(NC$R<beJ-94{8t0c_=y$K{G3{zev{0h6%s z<Qh<5s8(_PGDE3Z0ipc!+EJaj1mKK<Px(N89*(n{52C~^y?I**Rud+AKGj*Joxq3F z9v4p~J$-r^A{v(-;bbrVeM}gV_Y}UyJgH$2BEJ!1FSnxMa+&+t_?h$@&45G^4Oh2< zR5iZhc|+zId<*kpFJMqz-a7Q%ELp$ICQn7aTmzVHHrgho$7gpz<z}+N?|8bozlYwt z*CEckb>(cj{qnRTavCy;qe+Zc+$EQ|iiDou*^?pczVuQ2P`=7ANpZ&Lqa+g_fAqmd zk^kC7!O*aA+F>}g+^g@Y%>XUac<MVANEc-98-tXY^vJP)Ik`Ch^!m}L%&yO63fJni zk!6wWbhSFp=nEByfCGJ9yg5~4w2?x`N?r5e{aU@L-)((!>NTHF)i!Nn5USLvZLuBP zk}c>%YIreU(SEm!C|iOAIwLHrinS4PtS^30Qujg5J1pEeos#lf_13#W4vp(%#AXES zU-XUpJlcHr!QAe3nVrk0fT}2KcFUqP+4f<zZC^Y)ciOr-rFb2@;wNzGi^xrjF%$an zw+`W)ON1_X#fgFPt9;T8afkPN`|WpE+kO|5LsM=2aW#S9o<&oi8%KP}<3SFljM?*d zZeIAhx0B+Pz4v$fk>e2hT*Bp;3`$+hqs3M(o12nF@@=_^WZU(!92I8LwL^`<IroBx zbEr$(*4PQ?peW*v@9U^0np19v`e0?uIFr!QTlJ+N+wEVYZ$YpRMRS7=g87MoED^#* zXBBtq(2FdOpJ%J9r5RDP%AmIUi$fH?6m=3aaG1k%firSgJk;Rcyl~3yWbtF#zJ@L; zS{en%JX{pzwt<@FH};JiIr8P>qSkH0XP!xWR}W9N#2N`FyNp*Y&_vWTf825_*k|5; zJxysk2^zQ<O?qlL@T1MPXdv57T2NwsluBUtx5iqB#oU`1d0!JD0=!u=1#az(L;79@ z?76F~DY3!f4kgt6u~XaKmB4)q;&U>4?&WYLE4*I!B)5D>Y_FTL6q6uQw9@P{_h`|m zg=<14lK<mG1pc4qYu7$II47p7$vf7Cw?cVrj%V`g4pe7w&gv0}R;g!Jr}&v!pKT9z zZJ<1>_6Ow8dR=sagWh#)9f!`UP}W-0;p9qis-}0Ig?}lYw`F;1Ohwt|0;6d8kOrSU zOWf(Vg6$$=yr0eVD8pNt#*L<Q3Gae9gZXmkN3j~~tGWFp<g7kusXaeysok%eFKWNt z9QWd2@cg8+TlE&k<kh_;dGcBj$H(h_S3uY8^epge*E;ouk*QA}b(=u}*nZ+vXQO#f z2N6Mu*j;S+dbZzu?bcUZOy7ow4)Nv&+uD3_hzusJA`f0}N=PoZkF}QR@hq;8YP8}p z9>x8nxr`|gPQ9V@Y`nTZmC^jg3H-dLs8nkd$eUiCt82mwC}-L<@L#JOn4KX@Rxj@$ zYiD<3UwH8wh)PR58|q{^XUjDXMlq2@;_IFaHt*|^F8LKui}~HjIW-4Ea@ev$#lm!2 z%rP!|4CQso(MM)iI7bx$y}#uNM)k(E?|CIf_CYjT8BuUn8dm)4)5Tk%)su8y&Z#rw zjlOn5ffgQKv%!81&i+~=7I*Wix}jz^zQ#hL4GWc}_fWyp8g|Do^|>=jKT#ri`Hbct zZLHP~Je{vS2&f6K&9c}xuA-G{%E>)ZbJ?VcgDHIt@$>_>-pP$6-<9d%6%?rc(KU;` zvRO#`TGNpeb$P;A{OF!?Ld8=1^#v}c$>^7JgggeSQy{B37(aGre3Ce<Pxk6S-Xf@O zjg16PWw2OJO>Ad^{<>0q=>D>P!Q}Fk!bc$G$XKwUwY*yJQ$<^|bs;obH_nD?!Gq{N z!}x65RQx?#K1=SRkZj}GL5BYA7MqP1v|u0M6FupOq}Syv7xQUae$<8{?!BY(>4g2# zIJ(2!rMYY{LVh|bHFf2_Im`Of+<d_i)R}pBzdHBn&!Z|7nBC{*H*wfGwJ*>4Nx}r} zS4x)s>)`s6$*7Y{Ugw&X-Ru4Q)WbX3@?hvY#K)KWX%syg!MWtP_ep-i`$K1o2~WFy zdoo%!_lEYI7q!+M;}DMfbQ<E1Hn$0{zV)=7-))!s03X&1FZrI{Vfx&)`&?(7eXPY1 z9}{reoOjwhRy}#m6jN+s>JD?xhaE2B!MHsJRT=j;?z}DU7VpvCA+ZB>99dOc6aE&a z(I3j4xQ>L8ouaJ5kjS>_pHE6VzLftwN-2MWqf6b6YDedRAr-D=5sC~e%`%{H3nK{- zUJw-`7(8Q+tDIm0vUn?<%9gcs4?g|%M!G5ZJZs}xHGM_lO4_rte!u;;hnSEa=(IVG zN$x74x%w52dn|A>a$CU%x%Zvth<1jnP2SSqg>2)Bwj@jK<B2%?&_egP{r2(R0vS+S zYtDYf$0UkwXGr8r3^c+idk;E8soox~@0a^t9p29G`+D8$gqY-q<r-cb#MqJV``vtW zTboza6_*$9UXRKejM1e=_}(?>A(MrHI9_NxqW|kL7aP0lLozZntm=7MkWSqSR#Fkf zGz>sb41=?gsu`@*zVhVf-_~2x(sny?2~hmJN$EcwR_+3zdj>KDkxZ@+Fa7@_wdyY; z0T6b2tnRpZNzBjk=mBQmRW1uB5(c4q9e#cL^$I=d1+KeC5oPGO%pmT+fD=i9j)3K3 zG#*^S|KBhk9y)j|hIV{nV<!K_SOkAzo`hx>1wmv!+V=tB_)nPk-++tgCH}WD=Qkgu zT&vsmoI~;TkL)|@!+XQoHdj~G73EcKAKoPu0eqxh<6jU=A)af$J%=k<C?|V-aB>gb zTFDjW-G^tU7aS$Gr369K;915p1b7#FFet<t<(&fYdCghR5ZOyL4~3xY^pj>QrTPz- zqmDjqw?$Sm!`|}~L?+;%;j};ey!uktT&|uKB6YcOCQQ*jpy+}UNe&k7FNG?wQ}}tH zH|kF_&ha88eAuy=whH6oo_PQ`s$#-s=ORTbyIXj)#pubfOlIk+eu*5p@YP=TdZ3;z zoKWoTd<3!&r(TukEHzP)QX&2g72*hdQ=zzIqmVn0A%%}$BVuj+m8!(GhLc@cQa{Y) zHWVr4ycXgWs?J4<)eZaWCwPyHPBfFL(iC3VnDan=(dtKhd#cjU0_<bUart=j+4i~3 zx|eQdbnTqvQjZ}$pRa*E{|czIK+mP`Ykv-pgG5x#5Z`uuMZtHGa2)QoonxFfF;)e6 za?<p^gflba)vGuSjc4e5K-dFBog-AR#OhZZpOc~c@B&$q7TJ^$UU@QWyy0Giskeld zW)H5yP-om@Zl-nR(Bx!%HUVDtj21rM3>T|NZeRAzoSf*oSkjB%tXI{;F+MLhoo|Su zj}kVVB^cUCSq96*BtenVXg+!ii0Ov7jJ881d&3Xo9Bp71DIT0Q!K^z^qMlMvh>u(R z;31Na35hk*ns2xAF2{1I<FF6sY|gux?D(KG<;F?F;ZJj#GjvhxII7i{S@aPnPn;>p z{1&|c<6yAGari!;fE_afWR9y%FE<{w=#f>GklIg3O#O>Yd^hoTN25s-0%B7KKOac^ zrkbER^WvSnR<adCQkE!cnB%W|1!C6b-MzJB96p@z8{{gWZTS4cNU+qxv=|N%+ID7h zslA;|ZZSOyKRj*$^0u9c_Wv>P4sX!kiI(@82Vc@gh&PARpgknPmwRRroG`s&j9e}? zLKOk+d50qwCE*wY^CF~CR(e(T7A0I&xEMb@N4Uj?iDc;1TuH%E+3~JOq~*{$i7*Jg z^<0R>utU_Ye7^1Kx513Jd@~HYiMA1(-%`Q3%0Iuk$)<nb#DDJEmHTc|Abfb0)kivk zGBt;zF}aSF<@$LsSqR4cZumZf%eYmD>N%U)uZx;~tiN1J-ro}mT`M@$=dBsVW{XMX zSn*0=6BQyRc2wpgR(FEBeA1*PVKpl3@idi+Z%{ELEt`G2bUK7egRg)4kU$(ewC-ij zp2$%=<VH;jfnS$=7w|PWAZ`{q9-22J!3{D;{yj^~z<THLi!lI@vr2N?gci}%3Cm=( z-{v7UJfTv;BPK2_(IuK}+riNwhkMM+zhOV+4X2jUmIxlIm)F0x8@E%o%IY?(6)3LQ zyKEWH`&QxZ`wpbT4lF%f1mCuKkLbqLST*_0oDk*HJK^RdBYco`7QK0u{JU+H+hI+f ziQtu%wbxx4j5la14)ks$kck(Co!q4ajl<?39E$-NCfw*qHr-!Axp?8cbR^!K|Jp}> z@$SYCH_l6Vz+v9;rnm>wvdXdpN+R6K^cblZgBC&fJI!DCe4|$}@y4{^v!cFavCuC9 zakRiF1@yUw@QcknhE=^p0@D6#=NJhKkg;-X%9%+3!BDa_<vI}M@#fXgIakpX07<sm znTo#gcB2=!K`q>L5&7}^K)h;UMgh&+J&z2{K-+qZ@8S*U!!c?&zs%KTnB%JGfsQi& zjo!5vFo*yC+?>Izw3=LWxjqC(kdz6HkP@;}`Y{%|SsDTh8gew*tOEAuP8Kr|Tw1BD zTDArCN))CZ@mh-Mvba}s!(T_Sn@8)|g%$cTn!evV++o*K_|dec>ekPtTdy3GDN7Yr z3*5Do<h@3MXuYfrseT?0CF=ia=J$a>P+y)`=*N#FRm!@%g&k52ah?#-dE$(|zKDJ` z`EF$(Q_As0vrO!!Oad4CY4RF%?wrxrds&k=XYM7AGM3RcAry~w9Q1|aWu23<jSB2w z47GJ_(Z?v!=f9Qz_`Q1ig9<gg8osf$i#h+48~&wUSIXL>3>_HXY!;>zcV~8HkaE>i z+tlXSckjDcJ6-u+Zt15GIlM~HPb+Pl&q1uO)8pMktet7<WTI$nN1o>Q`@;TOjotAx zb&q05rbQ90_DsAx`)t#Vc%gE`Zw2h_B0>{P__`$Lo6oUu^*+A7`LSTsN;t_t3PWiJ z#Nlc$<nZ0Fx$99@=vLIX_xdXmFTxtBbVgZFX}e{)+)O7Y+eCDYDWQ|>6`Of3*paC$ zl$inrMa$-?elr)DzmuXYyxMcmta7gsoF4v=TiKxD;$*+h3o!L$amg>JCr_!ODZjJy zWYpJquka&%`bixlke#aV=c*ZH;S@TUj$Sk+{M^7P`BQ5l1@Mn&TP_m2Ae{3Iub;*( zZTVDr1zyIhn63X}wQemPsOfQUu|g6YudH5Ew<u(j)8-tKA3CS=1Rc8=%L-^390?NN z;QVS!)SS<Iw@~zi<gbl>94Gz3S_B<WT7*D!cK39Y0>d2n?r82OY6puJm5k-22g@=m zC8wICq|M~jjSdp!(8txHC|ffXUs<kBovtF9JgEIlRIK$$Hx-%RUcaPH@S_C)x(@{6 z$i(PyvZhCAcgg`*%_|{3feX;trGA-<t8Ja@s?M~7_Qc+l{9!eYCv_<zO3f~Ys--f< z+HF-E&x1}LNeZyY*#>4DTF<?NRdJys0zQ!QeJ9)9o<T{6(%|~iv$x+SSxuav#{r>x z&zD0F9z)+2AtrEGIG*2?BBsWU&b?7~x7@otWp6qMX^x7MZ1EG=;HtDhwkK`Pj7YiD zafnfcLJ?lR219Gte1s`py<)VdYI~|pc$Rvs0!d~{Hj|I84Zq2H+#?a<+oouZ_4fRD zt9)AOQuqaNmzT0~Jdx%RPtlZRKZB+P4=hpP)yzyFxQz5-FE$9J^Wk=;oaw`++Am17 z61gd6yn&Hm-dcM(x9=<J&A|`jzv9<5Fz5LPb?|#$)s*4NQrjlP@vgKxiuH^@V`_Tr ze%x+;H^_3ZF-R=%Q|yMJCymk8%!<T<u}^2ywZ{g~3a~Mmz9_L7LG3Vw_T$zL*deYD zOD1YX`WuFf?*v@n5l(nTE~ag#OoBGijE+VwA+*-Xb>#3t0p`9El@p#pS)c0z)$}(} zJ{gxumMKBss;$r&0)KgY{s)~^-d0S%hQ~i>jG%vJ9*2~1bwydDe9=(=bRvfsJ}WS0 z`pB<2KlE2QN5r{q=gQ&P`vG<JizTaW=O)FCHOlyfucyZm6&`EX#~lB}j15i}Sy1bX zCmr{)yam(YgKPt*${9Zb2i3VVR;kK{pXG`-zd#7q1X5Bj;Gh#~5TY%%uCDgiEMvXE zeSqmPoV|@_o`K}#(ZAcJFY5k=DgMspAN%!x@X0#}ZA||wFD2=x?=*=~XWgl`2N&Ky zsVj?`L<v+2k>=Z_JMV!Pd-iCc&g526DIJAH{W>8SP1R2eJy#OLt!wwEl~vdfI&160 z`w2i~bOt~nv!;@!&!_&QqF(|EY5ZG3(vI$d&Zp`81%+h)tsqm?XFga&d;1^$7db@# z2dnX6_n2oNH4_mIz%KM_8Qi4x+$_x8EQQQnEYUvz9xiUa*IWXxxp}pCc!julgt)oc rxVVJ4xYpS@|NiUre-Su1S=d;4{?`PF&Pk$wCoV6oB2_N={`3C>SGxkn diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst index 9d1b4b35..a9091e99 100644 --- a/docs/providers/callable.rst +++ b/docs/providers/callable.rst @@ -18,43 +18,21 @@ Example: .. code-block:: python - """`Callable` providers examples.""" + """`Callable` providers example.""" + + from passlib.hash import sha256_crypt from objects.providers import Callable from objects.injections import KwArg - class SomeCrypt(object): + # Password hasher and verifier providers (hash function could be changed + # anytime (for example, to sha512) without any changes in client's code): + password_hasher = Callable(sha256_crypt.encrypt, + KwArg('salt_size', 16), + KwArg('rounds', 10000)) + password_verifier = Callable(sha256_crypt.verify) - """Example class SomeCrypt.""" - - @staticmethod - def encrypt(data, password): - """Encypt data using password.""" - return ''.join((password, data, password)) - - @staticmethod - def decrypt(data, password): - """Decrypt data using password.""" - return data[len(password):-len(password)] - - - # Encrypt and decrypt function providers: - encrypt = Callable(SomeCrypt.encrypt, - KwArg('password', 'secret123')) - decrypt = Callable(SomeCrypt.decrypt, - KwArg('password', 'secret123')) - - # Making some asserts: - initial_data = 'some_data' - - encrypted1 = encrypt(initial_data) - decrypted1 = decrypt(encrypted1) - - assert decrypted1 == initial_data - - # Context keyword arguments priority example: - encrypted2 = encrypt(initial_data, password='another_secret') - decrypted2 = decrypt(encrypted2) - - assert decrypted2 != initial_data + # Making some asserts (client's code): + hashed_password = password_hasher('super secret') + assert password_verifier('super secret', hashed_password) diff --git a/examples/providers/callable.py b/examples/providers/callable.py index 73654eb4..a85023dc 100644 --- a/examples/providers/callable.py +++ b/examples/providers/callable.py @@ -1,40 +1,18 @@ -"""`Callable` providers examples.""" +"""`Callable` providers example.""" + +from passlib.hash import sha256_crypt from objects.providers import Callable from objects.injections import KwArg -class SomeCrypt(object): +# Password hasher and verifier providers (hash function could be changed +# anytime (for example, to sha512) without any changes in client's code): +password_hasher = Callable(sha256_crypt.encrypt, + KwArg('salt_size', 16), + KwArg('rounds', 10000)) +password_verifier = Callable(sha256_crypt.verify) - """Example class SomeCrypt.""" - - @staticmethod - def encrypt(data, password): - """Encypt data using password.""" - return ''.join((password, data, password)) - - @staticmethod - def decrypt(data, password): - """Decrypt data using password.""" - return data[len(password):-len(password)] - - -# Encrypt and decrypt function providers: -encrypt = Callable(SomeCrypt.encrypt, - KwArg('password', 'secret123')) -decrypt = Callable(SomeCrypt.decrypt, - KwArg('password', 'secret123')) - -# Making some asserts: -initial_data = 'some_data' - -encrypted1 = encrypt(initial_data) -decrypted1 = decrypt(encrypted1) - -assert decrypted1 == initial_data - -# Context keyword arguments priority example: -encrypted2 = encrypt(initial_data, password='another_secret') -decrypted2 = decrypt(encrypted2) - -assert decrypted2 != initial_data +# Making some asserts (client's code): +hashed_password = password_hasher('super secret') +assert password_verifier('super secret', hashed_password) From 839888f445fe62f6493819c70d34a793b3e7a160 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Thu, 16 Jul 2015 02:50:55 +0300 Subject: [PATCH 54/73] Adding some minor updates for providers delegation example --- docs/providers/delegation.rst | 5 +++-- examples/providers/delegation.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/providers/delegation.rst b/docs/providers/delegation.rst index 585dcdc1..cde345a3 100644 --- a/docs/providers/delegation.rst +++ b/docs/providers/delegation.rst @@ -9,6 +9,7 @@ Example: from objects.providers import Factory from objects.providers import Singleton + from objects.providers import Delegate from objects.injections import KwArg @@ -38,7 +39,7 @@ Example: def __init__(self, users_factory): """Initializer. - :param users_factory: objects.providers.Factory + :param users_factory: (objects.providers.Factory) -> User :return: """ self.users_factory = users_factory @@ -60,7 +61,7 @@ Example: # Users factory and UserService provider: users_factory = Factory(User) users_service = Singleton(UserService, - KwArg('users_factory', users_factory.delegate())) + KwArg('users_factory', Delegate(users_factory))) # Creating several User objects: diff --git a/examples/providers/delegation.py b/examples/providers/delegation.py index cfaff6d8..2d8501d4 100644 --- a/examples/providers/delegation.py +++ b/examples/providers/delegation.py @@ -2,6 +2,7 @@ from objects.providers import Factory from objects.providers import Singleton +from objects.providers import Delegate from objects.injections import KwArg @@ -31,7 +32,7 @@ class UserService(object): def __init__(self, users_factory): """Initializer. - :param users_factory: objects.providers.Factory + :param users_factory: (objects.providers.Factory) -> User :return: """ self.users_factory = users_factory @@ -53,7 +54,7 @@ class UserService(object): # Users factory and UserService provider: users_factory = Factory(User) users_service = Singleton(UserService, - KwArg('users_factory', users_factory.delegate())) + KwArg('users_factory', Delegate(users_factory))) # Creating several User objects: From 3b9d36f2d2bf74c2d6a094c8524a5174f103afa4 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Fri, 17 Jul 2015 10:01:27 +0300 Subject: [PATCH 55/73] Adding fixes for ExternalDependecy provider docs --- docs/images/external_dependency.png | Bin 40801 -> 41683 bytes docs/providers/extending.rst | 2 ++ docs/providers/external_dependency.rst | 17 +++++++++-------- docs/providers/index.rst | 1 + examples/providers/external_dependency.py | 10 ++++++---- 5 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 docs/providers/extending.rst diff --git a/docs/images/external_dependency.png b/docs/images/external_dependency.png index 317903ecbbd1265e7219e20b8473939ad8779e10..4195412e54f21eaf2866b50b2e65822abe707d70 100644 GIT binary patch literal 41683 zcmce7XH-<p)8_ypf(lAhNuo27lSqytN*Izu&PdM4kTZyYfFcackcK2lhMXNTN*c1{ zjKYwUAUW>k|2(^A_se^B-w(?<oauXSci-yjs$W%C)s0YBmA_5)fD8lz-BwhPgMmQT z@E{OT;SD0-&P+v8Ch&93`nk$;5UA|)&9gVez%_v@OkNgL+{dsATs$;afT@5$K2JcP zp!Xoq32-ZD1q5>E1A*2|K_Ib25Qy$Ay7sjMFz%PSvgXUn%gedBx!~YnpeGLxPgPab z>FFsC8+BEh`rHq*J1k7n?>$t%Ae53KxQ#ViTU!Tfj4tO~^lS5UYqFVT#Psy^)^`7# zo}Imn4%*w>yZ6>aF3SJLU5dE4xYH?TkeQl*y=m*@=-$zxn3u!c`bu!w*Q%f0IWdZ@ z1=`wW={x~WIUUV<Dy+e8Mek9QIhpe9jX2!n=YnC9o~SE0<s`55SPw4D#RWarOZ+G& z&Xkjr(=$AD@7_JojqB8ohE7gSYinyddb)A-l^|VtIXSt(!9mb1(i?BoZu7DKm>34> zDNs8Z^~_C8tt_eN>wp+&<)Q*ozt@2t(R&wu0TB=g7;0)NLIk*IQ6aJcPQu|H5>riY z3Xsr(f`Wj6fIthTU!_8G6S&1j{k?^6=cfnrH41Cpe%oUyr~8X5ZT1(yt(Dfpje)bH zt(}>CB0|u^2M+_Sg3tkJah}ME*s9X#^6b!Dsi)E^QmO@!MXpBf5zbNiiUye<Usa&h ztTk-z+`gL{@p7cri1!KKkN%#ePRp<1n4q^JE(We3t(QM~yOboLwpw<&@_ORD;*S}? zneVd1`6OuW(r76`m>=8*33CZLnsFJx$Y`md$x%;jjTt3{??PBW5_}-qyC6cs;30Vr zU~37?pz?B{55$ZLzy;}B1wB^~=w8azKY^lqNIW1VAVs<7nqHHe=cFd~xY4`_f|lox zWn~{};0qpq(@D~S<ysjV8NJyEDG_z9lcZQ=l5qF%?A0>59(?D913tHFbHcH%yJE^@ z#J=c*qz&kr!lc3A<*{X?q+IJP;i@QS7-Lx(0r2ks|9_@c<I^zvp3&T~rogj_(U47E zapOR%QDm=U$>ou8MZ?GBAL)+wCw5QFD{==CAa`yRakqf<`qrCTIxZZ3D^PP$)bW>3 zr;VkjR9R@`dzlqQa8~(cGMrC%9Jat?mGg;8q($s;C^9d{`z53whaUwT{alysdKOq+ zI%cBx$7xWB(dQheCm&Dd!wq!cSaiC3@jI_+r)e=h((C*a@iuE#<G&refetwG5uL!J z)s@amlm^GzJ{@g+`T}l$MEdOKdjF6e5e`D>go|B3wZLPhVTcqkHvMvG#kxdVt>89T z7%b{BO%eE~Y4IU8$KoA6;B0Z_1|o$w25kVJ7r{s!&0Y<9%7c}D-9Ugy5s*qSlrquH zz<*poHN#`jQEoi)7r*FKcoNdaaw4(Q)&V<Nh|}Y-tgQ5a5d2b4AtX;zF#r|sBl)J@ z@HGZjq@pt|3$_;TyF{gE!$p~_O+LSjJcx#|H`FwxXQ!G^C@Gd}a$#zU%012RE2UPF z*=Ik+I2BlcKeLFr`F(p&l_PSv<)S-c^gwATdzu25^`^M7spRP83uhPE!5Lkne5&<^ zrgV$SvL@yc=igbkpj)2<q0gu1E?kHJ;*Aw~EE=hiV~?v|zJl{~*mfU(>tCnA(Kxbi z3UigPBWLG4J>oBN<!v}OZa}ZCpbRycqx5ntEe^-IMOphx@jW}4lpe@?kBY(~%OcMQ zR+h38RUTn$z}7qkPjQ~{(uOi?BMQa8r$?e5F(Rg&H8swW``2;3N#4+6+i<&y%#5N! zO+JHeP61j`gOmfpp*+7ld>8{O%60qXBON3`RnI!IBZ=CVn^Gm+=4YqsGc)>Jr-IN{ z>h48dwc81J7{j$e{w(6jLV1RSk9hw6M2P(7DF|3VAI^?c%=^Ky05^P6<BNWMe={r$ zdbjPa^)s#)G*KulLj`->EDCKPwDHX+IY1l*nrV_At1iOKf4!v^Hk{<PoS>ZlrwnVX znOd)I;-R?J57R)ZC^+@?Xu&5qv=oWBXFtb{bP1+DRI_CZ>mD@bWM-CDTo!?b2CU56 zxixAsaab)O=v}5+xoRrBk6Plkk1JFVhL2INPn4e;CFpYGd1g^IBr#HI88x<B<bI4U zuN+6XkEU~D%{bf<c(L5$b}JEs*643fmhMYQX%Z^FgUIVh#+oVTcRU%0idkDpjxE(@ zp@}o2d4-6V)W)B`O_pQBn#F$&a3JiAH!@OLV*A7`8le5m%AUtz>r^h(vzIqgn9VWz z>_OjZGMn=&{FppPU&PXvN@QeW;xlVZ!7hVc1545uw~&1!e}R3s!Lw?Cvi1v+YW&3! zoskC3L#(KP4(@e^HcRg!<gG^K$ow@LRShl7%roy-YJ&k9Y3z=x^JFJ}1F7&)1ikBY z2X{@rs<hXxWMDNv4$?+(-|1#ld$ti5qO!i7V?t2;Q)vX=rsm$zNKJfEQyj~i*ZFUv zJ1w9a_-9H<ZrGm^TMNaM9_+A%`q$W64doe*bQAhBa<_3sr&u2cCB4&=cp-556eE(M zDNu?R5w*IPtBtPYSfZSHsjOFr)}Gg^4gXq!WgaE<$hoIFaSt&afiuA?!?hx{ST8PE zp<5ku(aI`XL4Y<&Ky<SBcv83%FnY6*V;l?(?9rpiwJOChZgml157-{+&WNImBh3xL zRlgx5yd9D9OQd{Sjk$dKLq}tP|02HQ(!m^|;Q@|yeMAa{f1#~Y;n5myQAwS`4OS<5 z<ZL?W!bQ8u+o4$qsDbwy`;ynuHw{89ZP!yo0^xUX-NJb7=112m^FHd^DalTlPN4`n z0rdL=H3XLp56e)-uBviE2sc(2Q65%>k7UTF5zwZZE*`36GrKK+Ob#jPqJbn^d|E`n z&D}Ug#uv>Hesq=48VA9rOM5MN{+q}Hfz>ZGn`;VU*7AdPf!DaP(r;Dv)%uvJ0L^#( zgkQ;du-pY<FJd4=9-DP3`@+~(qr(T@$I*-k@ftGZ7b$Vv3biYauV`4l{BDtY{)eUe zlh?+^FJv6^Wra$NA;!iZ`Sk9ofhCk@Q9;#5ihlR3;M@0Au1@N3h`ip@PjrywK7m=% zSoT^ak>9n&G}kS^cSZhv@S@?`Je#)B`zYI$snL|(?|Jy8$e&`I7P|14?DcG7k-K&H z4;*$46nQ$8UvJYd9YGmVo{4^k_f=YS(G2cF?cN$>J;qjwaO3o{`d%}#iO~(pG9^q? z7;2oi&A3xsVT)q%BS$#RMQMVpq4UVK3G*kmMFWWB^&`bWU2dLz4JnftGTsFx(IMXp z-irj|n29>>nwkc8Hl``jbB_bZ?Y9eOGO3Ik6LnlzUXrP&MT!0n3vbtd?P>aWQ8cA7 z`lXr?PT*n<MXV`kL?-}LD~`Z_^L>bjO$$nNyYs&7HYyR;mdOH!=?O%eGpfWJa@e}d z;w^%bPrn&`FJ@EP6;hD<ZC-cJvwmn`4f<D+KcRSPNja~m*yhziRIap#9Q^)yfahWO zd#18m{$?gm%mgW6Ws_xZvR<A$hc2wX>N&O)5flF@=zvPRa0eH8R`{Ad!k$06v|?4* zYC6+_P0!te-Uc?fA^|;LYoX!E^vuAqjq$5XaoAIqsdt0EGD!6i25CiXh$Z_6idIJ) z7S^|ycFD<$+3-hAO=w%wt<giBphga<`9+`p-i$?8K@s8_Q+sonaTW`Pss2-w+H=PP z2QAgLUQ=)?a0062Nq3PKy6mI1;@117%~93K*0<5uE3-Y~R0Z97T(+FC5Ya9w#$Exp zX`Wz%Z4I|4=r0ZP#iU`%@XZBXvHXQcsF=st=@`76*`8JO<KH_9PIGcThGaTIFY8`& zdJVPPs#B*7twBF2@>tI<mMw0~?|^Yho+)LJ8r}ddCTJGJVVP23wbG~kvZafyxqHR= zWHHm|q$>PZ%C5&#`uaMW9zq#Yqg~a+$8rOEOq%Wx_am^{j`r=hj9ScJ|3K?CIljUA zG~p#5Hb}fTtdtIhTUgYT1C(axSHpPwJUZ=2=wH-D&exW#MXisstKIYU+Ho|OKdXMp zI(Jc_vSKvyGeqH~EZND@;)Ze1$C*0Jx)X{xyTDzxBUmWRg<)hYn@7*WUhvgWL%n0d zuLlY>DN&sfVKmb#cGYg0D{r~1#AseY=#UyOBb4H_!3hkQ;^f}=ooFJ@gD3m_m9`n( z<F-X)PJI)~bw9=oBd0eMRH5aaO`_rmsG?dpc?SJK6Tdm)v?O|1Gc+qJaHvYMuYVSO z-exb{`%w=XZ6EJg90o%o){=tND_YO5X=&l;6g&kN__sX2(vnSvX0f)#*1D^btE(qa z5NqZvDXl_rj<~&11CNR+;i`Pd@~mZ*BgVPd+*f;}n)R3>FH!m+#|2*JaUMxxu295{ z5*O<IEy|dI{y?Fe3cW;gvBQ=kibEpB$8}jfq+8#w^s3r3*FbGLABs7#Lg5s$UHOvm z<pL#_JJcwCkNozskK?Hiv2XRo_y?!Q(-C*#>qx&;<6(6j?au50CP{{34xfBSU&xqE z^S^!c_yAtV&bs*(-x=subgOBE&&Xcqg5}rjsM)aF9qUKak_gua9N1`jp_%;GLu*(( z!XWhszSLh_-P<(I07vdW(Gpr9DB$k(;xgu6m8DXJn}jfNvXaOK@0eL}U@s@_M@BAB z0vDETMPpvK<#Azqok{4FCJ?Thk+Zt)2mHpRzvne|Oet=-^S7mM<^&(&+<r_t$f0xd zryEZr!qEb`k0ia(Df#nBv)6tqz&@8Me9omO8-`ukvTHL>@_Zra@V4*TME5KQrjqt9 zz&IQm;scXbVdrxWjuaGrjXh4QxQ5<C5Vv#sY~-)c;B0R59x-n5=_upNJ=Cgi--NJ* zKBEyLN~Gy<52~hBuW5AdJUJC7r7i6f;DJjzCprm*)xj`I`4gt1ci8B9e#=CeSHKiM z!@HNDIZEP*sa{WC^B`L-mSpN5*o1~%$$Z6{*8t*F7LldDS~E061ch(Sl$?xhiM?W( z7C!0o%R7674GH<wRNqqBU!1$&On%;)JFA#;Bz{jNr{_=_8M(>q>fdAPEUdgc%+G8d z$Taq&Y^Kc3XDW46Y>T7CF!J{O-kk4SEEc#<(u9J~&!T%Fc*Jd7>=NaKMctcx_$%`_ z7}~C%GsB9itcy__qn4l&tg#r4l!qjTc6RrqTIW{U`_J^J9{K@}D{~*DVm_)*hF!>K z8IN6vskVJN3G*s_YZQ>@)AXk4hp<dX2<wp_Eh3b!f(4v6?fr0MggZaj$pAq=k@H|R zbUm^3B`bRLTMbA1y6{a!yZRFNaq}HYwIIBe$h{-+L*$lW48F0fxR0j63BEYg(0x;B z<8{u6=z*49skOCR;_YuWRoI;=dKoyB^g59*Az1iFN3BP^*pZLNE5ww>+FnZSui|0H zefOaW2rf0%$z^6()C1GF>7NkHI%Rj--SP|ymIcN#t?yn_a6(b6Fe4hPn>t0X0`3RM zY<HR8j5;PoGb;N?E|2C1u80AY*y*dgvwcj8+h&n8AI8++w$`woMPiDTt5;9uqsWUC zUwQO}N7s24IgXXR5cd*KpZ5-TkDpcw%122MAPlM$1%d-xvXjz4xT3wi<z^kz6IWoh zr7^d4sdYQssUC`QDc+!Md&;f2(qDISCx(GG;d+!=5^ci4vXTD{1t$f#ndqfBIl@2{ z9=BwCbnNVxPX$C0?mh57{qa=fpZlzd$05uKp&@wf$lvm}0*-K((II$L+%$EC%`x#+ zXYc4Wl7A+7D5|C|qw=@(YyY1Uy6aLmz{>>2mp{)5z$COpK>KTPw3bc+fu>FZrKXM~ z0U`w7{3QqvtmD7mxEBW;;*NXQKMz7>;GD$3i++3n&T{KNf5w{VPzK|*$rQ-B!rtJ{ zf9C;5vx{H*@~e<hDBK%)`3t8wEUP@)Km~WoyiYbVZEa^IZlCvoBxP%G{<t6d06`Sh z!i`P$ULBb`6JO}nhZf)QS;SA__d~ii;iD6;k>yfJivn8~7zTvndh!Sv<4x)f-`Jks z!x><?65nIdJw6w7P1;&X>466&L36l7yq)<V{f;i=vJ00Fk$-9r2-bmijBv^eoMtZs z`%a3Q&$3O=rH=<pat65d#!X9O(!S^H`gHB!1f3UMSqe(Nh4;DW*p4t&n(QVOp2rpf zCZk%)>-TVMOizDneMOHAc1<n1y6kYQvfF!<J3=)bM~c6q6kiFCf}@Cy5I5Cr#=u2w z`#dz1_@4Aziw{Lh?|sAvT+j!OY3h6$gXlcL#bda>)VC^!%6)j8AJYJ(cg)waN(D#g z%h<)bv9TF&-^In?DI+Kgx;9!r;qAah<+IPsZtmWfhiA(2#oCk|eN0s%ZOrn#9v8## z=X&fkv%iUkk)Scs@Hz3k-rd(K#O3%eLgJA0x0{0#aBijy7}}g$l~Qw24mH&+>)6<; z0A_WvQ`}N#vytmO!L+%fty*89ifX6u<L_yTzl$M&9X3@o#hr&GuYI|HATO29%kIO^ zeG1u8iGZ-4qa88#>~Irx-m7dMC?M>dTk<yL;01WO1o-u4HkT*=IJdLD1_4juBiyPo zUn_DlbB$xUK;NG#8jp!#(7g^{Yue|u!`!r1fU|UqLZEQ5<av(@Qz?_8fkuVCiQXuL z?8g1mdm~~~gOu{skIkzK=fl7{3k3tJ8Jb^`3%oeM`vc{gZjR^3@)wAOC*M3qtEs>w zs1MVDDb$B^$J-Y|VFLOK6ip558(p{lCbE`j>p+#5ajeNS)v?^7)?<6cu(yj0(Dx#Q z_G8~>dN+GmaIrtTMpdi19K9`dbP7<0IS-U?-Ddf1Ofu!74_DFDX+gxCZZk5T2X}OQ znwOZ~pRH(QRNi<D@LNk2-ti)dewwlxk2c~&aAKp&s^=X?p2q&NIi9q4)VN#qQD?C} zY%ONoaB3oG$|atFk-{_r;OxoVWw%H)=HjHdLYk5B*yW8~`VI!aJD5BABqCm<)()O7 z^WpRc+NeOKcun;?Hksq04?d5w9YV*84U16_H%KFCK_0V*AN&~?slj(uFOcO>3SZ>Y zhQ$QsupAy<kW_5yoiC6{Ch$qOgLU4HaKFG%-a_iiaBGng6VYhdj@lF~Z76NqWy-#D zjjqyS;oR3%N-0^)sjIZ0S^v2EiPg{%&e5GU+o~P<vo9>u1)h7s*&*x0_f~vI^h%uJ zYrn!Lq<RILmMOIr(o3XAk;@OVZQ~ZKspB=FTC)>5YaA)BYKD@`t0Dzed5n{vsrCi@ zYT-8)?3*d_kt-e97URJdK0u+p3prDc7yzlb^;ETQu77c=@DrYL!ZZ_wEMp-K;A^~Z z_oRGxyuQldrloyoM!u}RB4uXA{<I%Ab3)v~izC6q$H${YC+PQGf+KxTQaz;Oot>>! z;7T^pBV=AO%v`rmBEp#i7sLwYrUpml;r3VX7_z^y#*FPd(Fy#Fx<cBV1Vb^TM-!-N zzDIU<*(AU3gtbKaRS5yEh#Ja^MR#FMf=pa`Sq~pe&+ZFL9ozudz_=Rlkw3qj5+5Nm zlY%dgYBa6S+iED*Ucfoq2BG9!q>t?-&U)OnoAd!#XTM@syY~9YW?qxm`D-6i0LO#y z&1UyZJon}2Jj!JM#nKJBgtYX?hgc*b0EYyKzt<GVfd=7!yFpC-k0~HEUT<Rt)cGz~ z9Db?Br}g`DcbXBcQZ|$#obwu(1Q-000Ow8kf7PhTMi4<s0qYXO0L)Et)tE*ok&lc( zu8n8`wh&k;n-wqiSTdnh_T>Hly1e4#)egs?S!LirgZjU2)EmI7)HmB2bYNq$6Jsz- zD(4|I2Mw6S?<RPebQ@)8yl65_|Cs*kaN+yRu`cw|lX;AoSp!VbzC`OCzL^q)^Zs53 zq3a5Nb;!XRS)B7OPErVMDTae!IHdeIm8vYVvH?1;$-vY2o?yS%Wqp~9`e~>!5qjIV zFkk8s)&at&`38c^e*z#%n59plJra@-_~KqDEcn9N>Tj^0$^n@p4VxfqE;oB|A$+jV zt1yXIt82&MyG5DDYVwYD9az|m8TuYG;%CfJmkG}S-+dD^GtO1zfLqj>iZ!g~sA)xx z>0=pt^!086*i8cP0$A`gS%OZHjCclN`C&P}{7Z)VOJYJKr3q_>l4Xtpf&gc>31g=j z(WX3@=y=DWUaZYgC0AWEnG?yuDq`hOF<JPBFI!eCpP~Y9N1$a3J+I2f&~&LI&Cyl+ zC*lB8-T|incL-v^&=JGAYrK-PX7_v#rp+BWBO)K8g0z%Z3=H)ZzN0j(q?zWb{H588 zJ^e#>X0@jBlp7y?`9~#0clq^~aCnk>#&=%=C9T(fM3($B>ypjDUfu!dzXgOmdwuqm z>d+{|ky)RYaBtFzN^`;k_i?FWRlNp->NtarF1RvSkLnFPdMyU=;!z(4g+^F#!`~<( z;48XX5t(on(O>NUnW|Wi1NpU4m!kpJQZX!q#LIq(dGDh7rMZpM0A4(kAyTj*rfoh( zTV5!y!pT4Rq6LxlZb2VTBh^~u0cTgV6FnVy!}G6<`IXk5IN@Awy{eklma>rtd~q*X z;cC$i0ACE)F&`0G@889*Y`wgL6V!UhiMR=-tPR^hq5Do=&2j&$I)9OdhGrsL%lI`r zndHt51t$xgYl{r#<&I)^)m2Mg*-Ic6jPIZf4S3?1Bk;2}p8)6TQ7~TO%@c%u13JD< z^Nw>UCC#Xox?<o<PX5a7nNmwk<z$DQW#5#hmKb{Z4O@}^cTFF8aKi1cLFMo2g&M>V z3mAt-Q(a9vBKQ8K!5ne3;b)K_4>lR2Tzp3;C-70RCbp2njnOBE!^S`>8J)AV0fPwM z;bM<$Lz_cJBIzdMqt0~6u4{&>Xyt#r#qv{HWY>PslI&?=TP#CrK5VAuHjcpLN=?Gk zj2KZ2!r3Z9<}byFWV1^sb)MO4A@nla^9|gLtc6QD%`nPk$*x>btY(mTtA3hlmqPs= zgCTCw^F$pjOih*cOI)*wJRGi!oW)eg!cF=AC&nbLYeGkVeafX#8VU1Xn60Wd>PYr5 zM`Jq%*M(D3Eh^Y&nSkZ}c&g|Wnz-!;-|W)lzSN+s3G3^<2RM<}75b=*;|vQdcAO^+ zc=!0nm!X%{;<gI@PL$a!<;X6-C-DHM&8~!65J$61dl}uZ|9xod;P|XbJpP$UvQfr8 zt~P0t8(@-pA^<;?0~-kuQA=O8=zi${ZgUV`TLvzQbOjKf@Cx~A2oW#9HDCY`0M8yk zX2cb13J{#PdNBrGw$U@+Z&DF8`NKb$t_F(yZ~~m%Bl0Wykkjvx*yJijTv*pV)u)Rm zx6cf<>x9Zb5J@NG&>Z8m7#@oLBKcov=;!S2K1gKvnCW!jk)Y3)-@iI5F2GnJu<%a* zbsRT~Zc#T?ZgMEtKF>B<kte=N!V2}F8j)xuWh<R-S@I~=9cd&mR<-n(5n(7JecuYK z<JxDH@|ai#-n<Ra{Re~Jdwi7XB}4qKJYm_}W9Gis?B{n1Ji4!Ux#|_oHh2FPoW)33 zmw&eGu5Wp6P@&vGxKR*f>=Kne{lMp%39ZWjBI@tZskhz`OG?R~+B@|ObTlIu=%p*m z1u!g87EUmjnABH8tGO6cFj1JHnI_R8@KKW^RHURkBW}Eot3f8SYe+||Lm%@X@~?%n zUe3ErTD7d~Jj-OhBm~#|Lqt{-l3gd|kORV@h}y!mzR;57<O2|$96<CJi0&|1>ia*T zt_pC{2Cwt?dO`ci2NF7lUwcNBMv-6_kNx+F+)679aZ0vAb6{s;Dj$87g3soD`pQYi z2nby%>jR#MBd<_2%1v2QTA2L$Kj!njj?VfZf|J!4y;fg@KK8-I>;&~_CaHb%u%tA_ zge@6$kYOkb?<*o;*g6*Hr7-&RUuZfPzIB&X-}z8`FTR_riB3Vg8eB*1%IN@369M3) zd>7YHo)&Ttt^7f6(B~P#)uRacO{v(N)Jb8%sxgvVtAJ`0k@{HlXSRZ>m_Bx7Yi8Z$ zIlP(T%GA6}nFb(cy!$pvE60|j7~MKCa;yjM;~%sQmY~Z^C6qVI%!R_u3q&l4FgQek zvZ0&$ZeVc;&A*H3S1jhj5|t~c7>?@k0WaQ{9j>QLaOKK$)OxzF>d)RF*y#7Hsag-N zl~11_4;J413s~Gg41k=@a$_^~_(CxH-Al-4(MYOZ%oiQS`Hdy-ukxRCewKe8;i#{? zH6|V+@dZr%wH5bHyW@qx>k8{40qBUPWqvZD5!c=2t?Tk|ODXNIeolmDS7*F`%%U(? zec4NU!mjgc_S_j9G$W|SYc%Sc8L;P9)6<kRw#~an|J2S0M}2|iAXT-!du451y5S~U z<35HHWYA)57)`D5K!fIOUe6cAm6YiO|1MRSd0_1G;*>#V?EcEl95_p##zA{QjwyGG zH6)_JfK4!D1cP@$v>N1i7;_{~JfvxUyzM5>tz%E6;)~eNO}h0>opN)eON-yZnCWEf z^Tn8c&M2$(t+0RaqD5GPTk%M!#_~!#iK1CVd5?ndvO)qjd!D~`zFP|BSu$v=!S9wd zmHs-n7#_PHc;_LO9q1DO;J$zaeR*)#Wv9dxF|MHvMdo`RO1%A~X!!R>=^HWA)JLoc z=(E3<3ujyjwnmmXM~<rXeI45RI19Uj#|pqCe^gS?;ar(`p=u<VJi<88v1L!rT=Q@u zWq%ojNFh{k5{1-Yi<$?^1poFEfQ5-;rr}D_&uSL0CW!)4!xfj*GH?wLj=KOaB;+B~ zvinvlp}+Y|^I6l#W7@tA$YCFDW;aXVgK`5~>m-ysh$gaTsUr`f!=#tTcQI>SIQh7L z{Bz+Ok^RUpz&uI=6y1w6TuIfa_;k%|JJ2fAmKL9^Y(wC}2>3lT3QlCRx<v&^{oUw< zV|{c-spZX_dWpE0Ps_)mn#S_E&)j6w^fK@fvLj#zElXNco-fm6F0_oNmLZVydxgpc ztI6K)1>!_QEL9D)7S&Wfkm7>1t|L<30Y~3o`My&UIhIH&6emZ9h1ecO`Qmly=n`DD zvj>%31bZocheaU#kD-hA%M_(HgQfR<->(;~(%32;-2PKb-Xil-Z8&>aBEc{e-wY$d zsk9UzZsyB;9n~iAxJ~><Fm1AC0u{k;`3f9MrRK3EmZ|gpVbSY$hev%|l);NyIWadl zw2E+~UCO*ZYq6kB@mMs90pf(|GOJ|)u&xkbFdrCem9I(0=3}eZ$o>bTKZ-DV?(LUm z{Q`sYTbQ<dh;UWC*1O?)cFQhFg>I0xV3pXV{AmP3NncLF1evPtYan)k9H6q1g@fvE z0lQdIJgNmdh!o;V<v1-FUaF|_Yt$^)aeJ$}qSv!OFZfg>+ZHlxEr;@}bu7nIW&PBj z)elpr?F`0)yzT>=U|dwZ`yg-WVfWWZX7eJv#;-SFQojmUOjA3jTo2ZiUD`-FtBd5) zeO#_{cCU~b>BF`8V;DfZ|1hS4?s@NLP0oVpFR0RlA{SNNSTsab?~hbLJ4ENT;25Oi zv8V!hP)*XDD=BAozYc^h!OmJ{q!N$uac_~;=Cxv;e@XnpFxFl5nh}uV0^hvTF8cce z9%J^yOClw4`pL3_)5Xx$LO+&wAvnKTe=qzB|H}1PblgZ#i#>c#mr^UDh66Zh4wk9+ zivEn}A(4lpOSwqp!E`XBUj>-6OlccaQT(G6PllmRKK!@>5S~?7jt{fhg&l4t?+4j_ z@D#mff1R3_`>ULJJuK7x`vX>Mz|&-9h&6oFw|+}o1UkfI_4GNsQuL6F6HL;~X8%|; zau)9rnp`F4FJyxVw}>dR;*K5Z9y4I|^7^1yY~ubY{);4Or^VAZ4M|^Vl2uWKlD&NC zj!I;TIyYGmM5ezBWAU?4p+B?MIxi}WIDmtg>2(=+iRgN2)X!@iX<Qp19KjzT8N#VK zH^z)1A%6h}9g+R#I0w2%{GXE^=+(b*Fizc0E3$_GgSmJCaPZTHXZqPB$5}-M{Aq0( z<(HiKlkHa}$JSJ;ssnW4{HKd~l%tANevKEwhx+w57wWFN_pmP|lPGY(5E4Ll4xz=8 z7F9YBYiYJOh#kT^f~N%6M|JJzL6lM&uF@+psRcX#%J82Pq7$l4%qm0};b4L0E8r4$ zVf&*?O&5*_C4#PmlGh@xS4T-O>1i~+V_jec7xH2YU&JB(F8#*ZzIMpgfby_5X8}y1 z+Ttb2-FwUhtIK=d+HPZUMww5I+KP*<3Luiw&4vjT!T9EK!vE-?y|!jbb{6Yp(GnDc zC`uB%k&4g$Rt@V-?r|u7xr8#*$cO0>+d#D!DZSfz`9~9tDLW8`!OEEax3yL>$Vm(( z1#+pDkL6$JF-9`*s>H>RB9pCXiZjy4##8IfP`UX^AA~d?j|g<RJkyEIA21*t`<Nu? zZ)+_7J?UMxMLMp#(w&%W$zt_}rVhcqD~9RNmD}FGz4*!Un}C}#9D*Akq)|%}vQ>aX zbncH9w)kxQtwys`97D&HiWG{ueJ8wmm2cpJEs24lEVz+fZ%o`Ev?a2@?u(c<(z0nF zJDMavViybz?pnb`DkVNezjUhX!W6%Bc9_%LbFad?-4-Fh5%47)=i3An$aA5Ewb$Wb zoxbI^0A2-E)MuV&TK0Pu2HIyF6pE@*{mB<&lD4=Hcn*)}fZ#6_s@Drj=K_$+ji|t6 z@@ncp2bsoTRlnoBH5eI-i|xFxKhf0LfAm2+#Zc=&_Ak@@TmMojEXIV<+al{_eOHg< zPLR!_I$nzoFW1|V8en3Na;+|(9`9hJK;h*)Llqe*xKBSCx8=6^F51d3Jcpb12H|r} zmEnS(^hPpTlff9K1#Na6&4=9ty0{Un3_@cuC^33b^BxB@EJnQ;fw_u^WwQGzqpI`2 zg~!C)o+9wQL28s<top`8MN6r-wI1-D|056dpWSIDpI4Z=eJz~ird6rOqYN{tIY>CX z&u^d}=*?v|vsWA|WzfuX+oo}r7Om*kK@0|2*9+x4f4raamU?WxdV(ykoJKwr1+@bd z{`v$V6_qJat$U{O{Q6LXvfuYz3P(X{Z(so<!N6lJoFFIC>X9zHT27???_P*4#+)w2 z*_<9sqRnt+#{eEnh&U-5jeZqf+<MPf09BL9$7vJ(c>YGCifWeVfAVn>pM321w!U1y z)8Jd(LuI<v*0?bBfN$^z{k|r8fVJ5LB%L5vIvi*{{U_*k6$EJ(iJ4Zq+IBJ^DkKA7 zA>n^w9e?iUt+|<-|J^fn-uu%doj=#X1DsZ_0^~;@C58Hh-OGf1j{MAahdu`eQBZ?x z$btCG8#J@Nfw;5(T6Ikx*WZ|hMv5=wov8=2x&EFp({=>7VB#`QQ~yzNAYtyXc0>7c zTtZSZfjK<IgnV^iDSuMxJiU`YPF6Mfa`8`J!nQ+BFSq;KF6kz8z+9O|>Uy_BT7YnZ z)H!^mk;=b{yS6h|Ok6NebtG7k99KjOcm&tN^Q^O}MhDstiE_w=4u^$jk8>NH{U(;I z-#3<9Rj>T@!l<epH(zQxu2L_<2y1Yum<DIJuxMwPi;|IpLRar6XQfNGobmC67jr9! zJXj-5`KH6`SMEDT){--I8N<7bBH2_^CU{zw|3tX{hQE6<)L#AKmH5>B_^NWOn#b_{ z%fQAmZx(V5gE`Oag<v~`xV1ICA!EaUr425Bh;cUswa~7klwZd_+(NGCX#WFgrsn7z zApIDb=6YOdN#Zc&E1qX~kXyXEmNHf5yv2Yp;D0E}=UH87YP&E^j#~NUDfCn4B;7t@ zPVseKWR;a-G%SX$=__yT9d1$b%SOeO_CASc`4qza!bhj|zm>|`(l`E=<mDP1409~Y zdNjfOzS#;cD<<X(i}suW+YB%*QJloC`~B;bwH~{}NqlqE`WFMcb)edm({?j{y)YWz zr>9G&B>odfKo_ZCB9z2avS&rk;66TYpCBq=4xFx;H!&A!X-;~tG~nnN?CPH0Myg&u zMbppM|AYvqj~g9B;o{W8dYRKgW176W!O29AxeVZ3-(Jk{)x1%38gg(E4l^TFvcr5d zW?)!R=u^t%a%8XbYvAOcda_sr_ViM!8ZJ3eZF2Et0p!zyMYI(3M6k<WYwqwHxvghy zv|_Yspi3$Pf&nS_dn`@WKZD1kGw}sNyi``EPEghL%_FSFV=So(ya0mD7(?tNXOv5k zfqJM&6Z$OUe&ld(!NyP8FOG9L(J2dvESc@^OuWKiZ0dIX&P?P5b;93N>F#K}+-Gr; zxlRv<F;^(c1k#4mGO7~S!FJgZCvk$Y+`a_MRS?s$>!3sdUlNoJc@zAwxh-jrl3`c9 zN+YN7vtqO_*M?Qa8=Pah|8ng%Q<RhIa!Rd;gk+Z3dh}yaj)QKNn%2$y&4wS`bzSB8 zp8Xz`_-eJHz(uvD31l)2VmkMM{<Qb)h^%TdiG`^9^#|w8Osv9>uqun1g5d=P%Y!}b zZ<s7+&-%m-;!lQW>^xf*etYzUNvb-Te-7_08xS(_(=`hP*F4`Ax`T%2B#%6%zqRt2 z6l7dlVJq)(;u8A8yIjdwxc~SF%fw$e<gnFwNx$U&cdr{OrCKNMJ3Ug1^<GgeE3=hc zep}pK!`I;{L}Bu+LJKjyRITq?eYca~5}wf**cd}ms)QIa;+);tKEF6^T3+0*$q@Nv zQr%Z?$8XGyQ|#HGxxCnJZQ7pM|5-wI)-%x}{8{SDUjs?A%_9n3_+{{zCs4)u_qX(! z(Gf*MBLxVQND_F-e0D(*n0I;6GIw~Q3IdsupJmMjUY_pGN$&#Jy05g0d`<U{It*W* zpL-TpUYM6`69+-AA^wVA;tvD=sOiBk_kbzX>Ko}ms5=UM%V!n9@MU@~?5Dts)9uTi z^*RF6;~@Om?KbDjw=bYh3(Rn35|9^j47%x9zUlIU+3_CkTz<tD^y^#(-WXPYz<ZRZ z;Iv?3vp@ivZ8=MW21!{5X}uUh2)OHjf_Q`QQvEh2AzPs!&=H}+*3ie#4~|)Z(apj# z@bo2<kDo5jJ90mfgMLZIOj{@If$5|d7We%LfTG^5inA<IcMVL7**#Lw1qgBa?9%T$ z75U{YNea*r5J?A>4g%;Lgam>EprfGU{2N!lAO$D(fzR#$DHPxu;B*D@qXzB-;Xy}i zKt1Y}ulE`#SOp=7eq{k!Y9MvcEFX+V5du#0XF?n|F<`fu0k046@<38u{~W|d?_526 z=Vkxjn*}f;|0fxLeR&8@&@8~4E{Fh%3!eck(;VP*0OGt2CIRW%0`G2CBEk`Xv>*Jt zNY~$I1MA`-kj+CZ_N~X-J|n2q(3FK<ZK7`cnL)V0+^fFLKi#<v1vTU&`M!r!D4KCc z;|=d~E6^WE4BC?+KvH9Bxg6`6F|4yYiGo?r2@9!?9Nw(Lx_H$V4HM^O7`eZa71w&d z-l~&BUOC-YGcuv0X-RMoh_glZI-@c?R6k{S@C>)mPDLAey#1CrT+`sZ=3s5UtehGk zt!_XcZZbT&6zwV-wX69~igvN4w||BjQ~;zBZqKn(Pl+vaN6%It%4t~e!I3a7QL#U% zp6t4(<vZs=ocY!kRVu~BVyq&UOmvXre(cw6<0e7S88I-Hq#a8AGhcx7Y!YU*uIWNF zqf=Fb#U8(0ZLjTBDQ=0xhp7z!k00Ov+q_<LJ*X)NUmt8%%*~zaig6D3`CVN7m0#Xq zLut`75_)lyeN-&k_1(m=Y}JhG#5CTlA;2DVbW@@4vCyVI2UJPNs43so9|ql$C9Ll4 zb=@)<p90t1$BD8k(`bS7*Nbf8iA?V)^a;2HhA^>xPrWlI+{osnJ|!+Wj1X5J{Tg%A zDL}mPvFLKEXI;gcj#c3MhHn5l?-?u~mHZg0AQ~KRVQFwkQP_$)@%ZKvP}-n~m_l%@ z(<*K?`_KQ{7`{b6VF4w)@{H;i2O=8!a&n?&D<pxF&$!p2S-7tuFWZ_1^?>8wZ&atP z*i>H<bHM5E{6{*q6Mqy{6m3i3RmSA6>h9jsxLI$To~|FauhvMCT^ym^2|<5oKh*pe z()F(j0fIRF^p9FYBLN6S_aDLQ*~VU5q59v|?7tRPC#$oIx-n0n&>wKs?_a4B$;}Ba zAh85A5C()-Iz<ky0kSk8KfsG4y;4fR)dG?`1b<u}Vj)*bxd1372vEunKq*02dPjug z{y!$@`&TK+uO5bY+5f-IVx0=E!RDai<^m5-$fepxpIqQgrRtX}s-zH8(+4NpyDk^j z#&gZ`69<~E-Dj*M&iv=r_Wodb<|7%tYqauwGU;-kFYyUFjHT}kjT#p!u2Q9bx&10R z^Q5J^^Ge?Lx_+jgom?+u8%qnQz9khm4OHr%BTZfq+I4qJALoqC$?-|^G@Loy_j@9m z^UgSMVJs#CCeCz$E2+PD^zPVYanZW_mpCr8{-V8vMUQu#TFL!C4}R`H_Xom;5kPKl zi5M(Q2837vPlYaKnhgkHa{UQ8>Spe^z{gB;5aB+R4_^getJo1E$;NXl_o7Z8UaYRH z)cpRf&dG|M>ML;mI)vRnA*Uk)3wObwJlUETMbA`nG;!<njOH%Pt<q<1ZhPzL;g@*M zC)hMtN#Lrl@!W6OVEijRJDeai=evQel2VlcRe$BI5Pn+s7s*bCNpy7d#cs%{TH_>Q zJz9hU;Tv3~*J;&`=)O*b5|y=FOnL#-4H=72c|qYA2gzFqifeiKbZY&wmsRJ#d9$%i zlkTIIsOkMwNa^W?<(xyb!WNL&S~oFvFXH;#eaiU`-=3I{pVzYFh^g`m5~2!)<=YY) z_G$;2ao951qc|arT&Xv-R?+M6y-~Q!Wih{-NTuggxDm`IEPyRXLn&XjYJ?U!s_n>) z(a&$qziH6~nlt*uqdA|llv0Gcpv!?7ZmV1B67M2d)lx?Eq%ID+NOt_zn;kYc8jec$ zf3q|>F>UCPH2O>WEtd2E73deHm$-yIdcRAz{Ey8{TQ*T(&r6XNdYsYBZJr4gNu^=m z!Be$VdTwlZ%Yvk%$KpfbpYErU?%u4QYhrnLnOCgSBZuYLqG~the9r@<ZvY#y0oJkC z8Ye5#m%S#d%~r}Ft39MAv!w9Vf-0ig0cq#=rF9vtLC*W+(gb!M*O!2_TYF~!Z`@S1 zr5co1wzW+CtPxdnw1w$n`1Lq`LpqmUP2shkOEm{gdHV!%w8w|f`0U}95t};)U@ffe zPT#(W*ge`mtrim(F-`EleC7E!)XyuoPqk{g8YtGf*iAp~Xo9EiTmNM>d4+RlPD7Rr zY%VnGu0&E88JFXW_vUskUIpyQ>B%KD?IlRg`hDXkAu+O#3Zzmy8Lx6#`L#MLqPfph zA27sBh@iK$LQr`tR1Ou6v&2B*#5wvC^_XkkoOf6Ss^p$;YIlk*{!xM-s6Bf9n!xDo zC-N|i->l;5m)03_H|9-!<X=IYes4AVr(23xC<_nlqcV$8Q7g`F^1~~q4I#(+T|<bc zmz}}-X>b|pF;-yT@^3-y_;^ObP=i1<TI97F%M;bJ-CZI{nDzN$$0rDKy2wjqE$;JK z_`p8ST5x5qBF3rK?IQE>&(v!khgO$L-^*tm)7w1N$m=#sw`|sr8wL0}PBecYm%U3~ zI(-(VoGsfym6>?x<Ieru_I_xR&h=xIin9ryGe*WrcIB!k;O8AO3RUyxGrz@ZLSo;h z!o48gF`uZH!<}+|Wf(qA?5~4GEAhnMwwwrl?kbPghw|9WywOtry08E1N3O>M4uhsI z4t#tS0h5Z%tuG?mdECxjKfkNyX8baNn2Imj#y4*|!Y87WVByP6^)dIHmTxZm=(z@7 zAlC{5^<lW!WTsCpU(=2===*C2r#(v6OC{7TGOl}2F>ZHz`|C4rPOpb-v~uQuM$Dy& zF-B6luO8|oXj9GZFTgHxb5Ya0@=bl+90i=B`Qx@YJsNROcP%^Q=DX}+n;NiTo?$&& zqFY))QqZVW&UlnNF&@ZbqO!jyFWY?;&D>Vnc9rN5=HxdGjpWtKjaT}1LE{4POG8X) z(v7wdx!d8oBJkBCqoU5t80VDM>U{<w+)ul<(}06XlCzFEw#3tv^n~34D5B19u*f32 zppInyp{LZXag&*}VMSz4g>M5dVu5WlR?uV4SBONsYuM{_H2hTnJB)o45vR063DA$6 zrjVBpOis|!)`An~k0Y^=ro!`h8eAKMV<GGu<(2zTj2i9YG@8%S-H=$XM8KG0^A4}v z^%^(wt*lf`5l%DFpR8RQ^V44Tl*b@OyU|Xi_SrW|sRDL`C;oT(k(0AS^C!6<2c{8^ zL-H$1!s$&4OLBP3;;6bu``AO_%O&Skm!0mTIcICL;zbrZ9z#h6aJP%%ZG@rPb`(C% z`6GViSC*7lR>~0*mV3LrL*$b`g~!cb3r{_ylp)ykz|7JBV^^!<Li{(g4knxMZ)Rh( z3ob=!9d9Qst0X#PpPwcdx742u^YKEK55!)7DX7)&T&`$QbbbZanfIs~RbLb;fIj9I zN?pTPEFXwOQ&F|sXAi`57E9Dc+qgfAM#XPIEL~TNHDafuwPy~C94C*yJjV9+GOh+y z`FS<wK)j#j+l+NMi$d}^5ny2_zB-f@b~(DB)<>mERl|h_Cs}&wWHd5jjlmha&;yya zk=n8B%B==kNQ=8RM|z;>qdIF}IUJmSwPFzw?Z1*Yw`7GJK{CioL7)aI#Y<(p96P3= z6xy7~jAGhBs33hwWjCq{0JRdZnuVSeO}7t2sAb9zc6o^WeX>kY`jQjbfk8ywL$?IG zDl1Qk_sX<0V%Cp_-fw+lvzYU{Opl)qTXh~_BpoCzt6))a_SFt`3t!7hnLf@qME8Yl zdr-7ul%iK8$b0S}wnhZHS7En{>jrlQmea1yBHkAL@XwW;ZK}7#?bqoPR?A2C9{oE1 zk>j)Bk&eyUhZ%V|rStk8GR!BnOGQ&Bl=VNKJJUp*?yI>*Eod9SNu7R_bEbx3?hoHJ zrQ2E1;>t@F91MBHX3jmvo}z<TPn#}>h}z##=tROb;jrN1N@Qg<sbDH^x?^2<Ok%sR zhI_G?bB^FtS#!z9IPo(dtE$pXMs>{1s*19|pTM3Nk#ceMaPh%E9zNAoW%-SIKVFen zt5M8d*z-EOj|}*Ks}OQdXDa;748|Hv%-{H2r=|r+*uH`tk>q>)q?AIyf&)Wq(ktvm z?~gbm(FTLQmd6kFJui2c`5CfS&%O5x^v4pjp3n88nb+-r%%wgRU0VUoeer~t-}h*k z9L@B)-Mf~M_~}m8Cjun0Zg-84l>lZ%JH60Kse<Ld%rAK2UOl)}*6PAp!z~JnNwyq6 z;K9B2^Kf!b+m4wU4i<ypHr2KE*NKIjHea8;sv6#=7mpt66P~q75@#|F!Xze8z@#?; zJGQ%&KUUY^{a`Q6Db42c`GKPM4C_pNJ4uN%lW#-Hlsx84O4{ZAp&HSMK_(92|7Qc! zpLkkP;AAlTgo#m9P-~Zt7vV3^=9T>O{QE}xkA_xpsSmyqprc=$-W%(|VgtybhLEU| zxjgP>v;6RwdIit#qwmkRj#{?5^%5Q^I8mEOX3TNuRn~Ln$*@>h_64I!;;eX%O-=a( z0l%sdVK`)*vgg{b=8s`;s!TcM_!M>Vkmu6e$W;F!_O%~G)I^=_{Sspbw;{Y>CrBz0 z$Qe)rsad`e%0xQXGY7`BM%dm`zR4mPP>%4V_u5~x==35Lffs#pswU#AS7k9ksWBh# z($U1^gr6nf(kaBV`XQ$*JS`~Hp}9VB)q4F;fh6zxY|U6)qX9e|-NJt9XCL`{gV`(q z;mY02*Q<YP`&GY~L@gFvIE#2+(=Z!XA$rPs-7vH-=gfu4%XG&-Z|L|>2~<f}MBvO} zXQR->Vm&6kU{*wWeBrXmDcyf+;s}1=7#Hr4#vHJ)Oz{cN)=k`hSmjxYt!g+|Vd@nX zwlwmaDSJ9l)^M}R|LsL@+Ts4$zPE{V%Ncmt=j38htIF<}!erK4rlsN7?u1l;AG;+i zy&zv>Y`#yMuq6UzciXU@mB(%ej;j{Sn()kpN`?-;ot(NDc5du%Vl(RbyAZxrx2-rJ zQP7V{OIPowdy^}M7s9Hz=QgJ1heT}><s3zzqbi7!&R>CRipW)YkAB-pHM-|kS5uI8 zMxV4+OFfUA(w?GEA#q!YVK&yB+gq44=^s8=?aOmI2~|5I1Rw66d`;KoFQ6?C_vw*? zZ@$!?*3pO0s4j=HM;1#pzC{%b^eb$+L>8)&GUg?AP)N{}^&nh(pKU5jJAysGm1Pa< zq<uLN7hQL7HMfRtM&N}kM@yW`Yy3M~CfK*roc)AZ!9Q4}L;Rh_oQsZK!=8*JZL$U| znQU6AZ)D}&h<#I4jVD8`mm|RRWM9kCWW=dc8N(9}3Triwo~8;L-+(w&xCEo{E0qvz zVH*4UzJWKhA4yW}xFBR}cfTXLjROjDmv!dz!`vrAzZp}9Q(C>aR5EF^)KqXvoGKs> zysW}o&{9mvkBx@b!ZW74wfoB#qw~P-%PkHb&Tg}PL<v4~{P)Fcv@=r;4B#^)qHyQs zHAB&=A5v<uJky^0yMr~UeU})4jI5cT^+xAEB1gr1`b?p4omBFYi$8_i+Wi``_nm4F zrs_P&XAMnKLdJ{?;7ezl>bX+}>xmcq74qFye<#G;*P=Z_2Nj~HmZ}wD^uCq898`D* z#NTl}lViU7oAjHGIP2bF^Ck{GwA|A_5ha?pJs#|MA^2T~Qsy?;O|6e2(s#JP&yyqs zzC!3Iz6J?yr=)q7b9`=J_I?+ep=b5#iFcg;?Y!K-=-Afy1a@VM>%B6a%IX~&KWKUi ze@I|8phA{3VQ`i8kDoj7-)Ra22N<_jZNn!lpZ>6hSd`cUAMY$Y0o3_a`X?2lGJIJf z7|->>2nTlX=f?KsR85TaHw>|;y0=jUNUTnHdDl`TQMcN)EJXB@_+XTb1A?g%A(qA7 z+9GMv(aXU@p&mZ*JNnL2$$H$1kh65s+CtXNQ`H+|j9*(MOHTNXOj1OH<aa%EE!`+W z3h1c_rRIS0ubO7)tLZhthu5Dl_Xj<4{;bn*e{cVJKvY5@mgGdsaJ5GwxH)4E8L`E5 zBw<~<=pDto?R~(i8o*w#eguVAPok@za*JvY1wXCJV;FQ~fW3@Qb$>H&Y(L15#P(6m zp-$CLxPt+=vlnratLNF6V5p^L+gkezi<o?BA8Y(Jtc~W5^*}+kZC7~^v6M#9x8?TA zuFh^hXgQkBx@g$WC$}aDV`Gb(6rx%8k;sq3=zX83XG^iP34?Sf7CcQ5<E<T9dfDPd z{>vj@&-};Eh#Z{8ey6xFDUT6BAKaJ~BA(Q)aBGw*BI2_bO=wGwLU^>)(5zr!8A$_) z)DL~%Qb?YF)Hto5&`pOK7%Z(8eNYEu>yJDx%u|@}?GE0#bH4F6xFfhqJH!Ak)`hoS zV#>Bi`nU>1tkp9fw+I(HFROlm)!_I1QpT24_p?{ewlou77N%K7LGRxJFV#I|R|!4T zOKM|1s;sSxMR={sy*|6GM!hdm(S&o5G7wjV>`xbCRpS}9x9;H_3rg~C>F9`-+=x<B zZ*X6E4~0)3Sg(CeG3eVE7dUV2_i(XIOGM<!+C||l$VDpnXn8YD)pYb!|GX2Jcz?}` zvT#KI_+3$k%%?oUScyoE&nldHNf7-Z;t!SY7(iA;R*o(2jPqLX2pXGY?gINC#l=F$ z1Q&$zu7VA0<Z5V~&TU8!p^z32l2}>mO_EUqpO~;XIPd;f<AkO!M6oZzO|~oXEA|(| zi`Z#hdC&Su+BS|_B~Eg`HE{&}^jeZX_G1CLwO71_r<LXPI`!15juKCYR8CbKEw*t) zyRItAeG>0vG0~Dneu>|Y{v?Jt+)cBdt8ZL&9dn%f&=ZTU=O=G-D*U=rT=1h58sI%& z7aKAI?c=onHQile(VUrL7;9~@J!?`<v3=w(x#lg+yLe%BD4aB54fPaOFi6^aj#fjV z>uP;63dMjAIxF#w4h-YMf{(Bfj)4M~t^Jzt_UlT#;u?tF>IT{uoc;UiR2r8136dq& zCq-gK*7Gk%EphrX1(2Z*+(r|eV4|PC!gA5?gY{+a^4}+P9Yzc}$jw~gyoF4#qmM*{ z%LiwUOlOFNN?rckOX!x4bBCoCP-)Fz<bvN8mDlet7ae%wJ-<kO@;@kh�!hsBP48 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 literal 40801 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 G{r>{xzLQ7* diff --git a/docs/providers/extending.rst b/docs/providers/extending.rst new file mode 100644 index 00000000..fd272267 --- /dev/null +++ b/docs/providers/extending.rst @@ -0,0 +1,2 @@ +Extending of providers +---------------------- diff --git a/docs/providers/external_dependency.rst b/docs/providers/external_dependency.rst index ebbdd800..91fd629c 100644 --- a/docs/providers/external_dependency.rst +++ b/docs/providers/external_dependency.rst @@ -20,7 +20,7 @@ because they would be able to find right place / right way for doing this in their application's architectures. At the same time, you can be sure, that your external dependency will be -satisfied by appropriate instance. +satisfied with appropriate instance. Example: @@ -32,8 +32,8 @@ Example: dependency on database connection, which can be satisfied with any DBAPI 2.0 database connection. Being a self-sufficient library, ``UserService`` doesn't hardcode any kind of database management logic. - Instead of this, ``UserService`` provides external dependency, that has to - be satisfied out of library's scope. + Instead of this, ``UserService`` has external dependency, that has to + be satisfied by cleint's code, out of library's scope. .. image:: /images/external_dependency.png @@ -58,12 +58,14 @@ Example: """Example class UserService. - UserService has dependency on DBAPI 2.0 database connection.""" + UserService has dependency on DBAPI 2.0 database connection. + """ def __init__(self, database): """Initializer. - Database dependency need to be injected via init arg.""" + Database dependency need to be injected via init arg. + """ self.database = database def init_database(self): @@ -90,14 +92,14 @@ Example: # Database and UserService providers: - database = ExternalDependency(instance_of=sqlite3.Connection) + database = ExternalDependency(instance_of=sqlite3.dbapi2.Connection) users_service_factory = Factory(UserService, KwArg('database', database)) # Out of library's scope. # # Setting database provider: - database.provided_by(Singleton(sqlite3.Connection, + database.provided_by(Singleton(sqlite3.dbapi2.Connection, KwArg('database', ':memory:'), KwArg('timeout', 30), KwArg('detect_types', True), @@ -117,4 +119,3 @@ Example: # Making some asserts: assert test_user['id'] == 1 assert test_user['name'] == 'test_user' - diff --git a/docs/providers/index.rst b/docs/providers/index.rst index 070c57c7..352d73e7 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -14,3 +14,4 @@ All providers are callable. They describe how particular objects are provided. callable external_dependency delegation + extending diff --git a/examples/providers/external_dependency.py b/examples/providers/external_dependency.py index c4b3ef04..796be0e3 100644 --- a/examples/providers/external_dependency.py +++ b/examples/providers/external_dependency.py @@ -17,12 +17,14 @@ class UserService(object): """Example class UserService. - UserService has dependency on DBAPI 2.0 database connection.""" + UserService has dependency on DBAPI 2.0 database connection. + """ def __init__(self, database): """Initializer. - Database dependency need to be injected via init arg.""" + Database dependency need to be injected via init arg. + """ self.database = database def init_database(self): @@ -49,14 +51,14 @@ class UserService(object): # Database and UserService providers: -database = ExternalDependency(instance_of=sqlite3.Connection) +database = ExternalDependency(instance_of=sqlite3.dbapi2.Connection) users_service_factory = Factory(UserService, KwArg('database', database)) # Out of library's scope. # # Setting database provider: -database.provided_by(Singleton(sqlite3.Connection, +database.provided_by(Singleton(sqlite3.dbapi2.Connection, KwArg('database', ':memory:'), KwArg('timeout', 30), KwArg('detect_types', True), From 0e272f9d58d0048ba3c3d6337d4e611f664836c6 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Fri, 17 Jul 2015 19:31:44 +0300 Subject: [PATCH 56/73] Refactoring of Catalog using metaclass --- objects/catalog.py | 52 +++++++++++++++++++++++++++++-------------- tests/test_catalog.py | 41 +++++++++++++++++++++++++--------- 2 files changed, 65 insertions(+), 28 deletions(-) diff --git a/objects/catalog.py b/objects/catalog.py index 75b34e1d..490d752a 100644 --- a/objects/catalog.py +++ b/objects/catalog.py @@ -1,14 +1,38 @@ """Catalog module.""" -from .providers import Provider +from six import iteritems + from .errors import Error +from .utils import is_provider + + +class CatalogMetaClass(type): + + """Providers catalog meta class.""" + + def __new__(mcs, class_name, bases, attributes): + """Meta class factory.""" + providers = dict() + new_attributes = dict() + for name, value in attributes.iteritems(): + if is_provider(value): + providers[name] = value + new_attributes[name] = value + + cls = type.__new__(mcs, class_name, bases, new_attributes) + cls.providers = cls.providers.copy() + cls.providers.update(providers) + return cls class AbstractCatalog(object): - """Abstract object provides catalog.""" + """Abstract providers catalog.""" - __slots__ = ('__used_providers__',) + providers = dict() + + __slots__ = ('providers', '__used_providers__',) + __metaclass__ = CatalogMetaClass def __init__(self, *used_providers): """Initializer.""" @@ -17,7 +41,7 @@ class AbstractCatalog(object): def __getattribute__(self, item): """Return providers.""" attribute = super(AbstractCatalog, self).__getattribute__(item) - if item in ('__used_providers__',): + if item in ('providers', '__used_providers__',): return attribute if attribute not in self.__used_providers__: @@ -26,15 +50,11 @@ class AbstractCatalog(object): return attribute @classmethod - def all_providers(cls, provider_type=Provider): - """Return set of all class providers.""" - providers = set() - for attr_name in set(dir(cls)) - set(dir(AbstractCatalog)): - provider = getattr(cls, attr_name) - if not isinstance(provider, provider_type): - continue - providers.add((attr_name, provider)) - return providers + def filter(cls, provider_type): + """Return dict of providers, that are instance of provided type.""" + return dict([(name, provider) + for name, provider in iteritems(cls.providers) + if isinstance(provider, provider_type)]) @classmethod def override(cls, overriding): @@ -42,7 +62,5 @@ class AbstractCatalog(object): :type overriding: AbstractCatalog """ - overridden = overriding.all_providers() - cls.all_providers() - for name, provider in overridden: - overridden_provider = getattr(cls, name) - overridden_provider.override(provider) + for name, provider in iteritems(overriding.providers): + cls.providers[name].override(provider) diff --git a/tests/test_catalog.py b/tests/test_catalog.py index cc0baf8b..16bedf1c 100644 --- a/tests/test_catalog.py +++ b/tests/test_catalog.py @@ -33,19 +33,38 @@ class CatalogTests(unittest.TestCase): def test_all_providers(self): """Test getting of all catalog providers.""" - all_providers = self.Catalog.all_providers() - all_providers_dict = dict(all_providers) + self.assertTrue(len(self.Catalog.providers) == 2) - self.assertIsInstance(all_providers, set) - self.assertTrue(len(all_providers) == 2) + self.assertIn('obj', self.Catalog.providers) + self.assertIn(self.Catalog.obj, self.Catalog.providers.values()) - self.assertIn('obj', all_providers_dict) - self.assertIn(self.Catalog.obj, all_providers_dict.values()) - - self.assertIn('another_obj', all_providers_dict) - self.assertIn(self.Catalog.another_obj, all_providers_dict.values()) + self.assertIn('another_obj', self.Catalog.providers) + self.assertIn(self.Catalog.another_obj, + self.Catalog.providers.values()) def test_all_providers_by_type(self): """Test getting of all catalog providers of specific type.""" - self.assertTrue(len(self.Catalog.all_providers(Object)) == 2) - self.assertTrue(len(self.Catalog.all_providers(Value)) == 0) + self.assertTrue(len(self.Catalog.filter(Object)) == 2) + self.assertTrue(len(self.Catalog.filter(Value)) == 0) + + def test_metaclass_with_several_catalogs(self): + """Test that metaclass work well with several catalogs.""" + class Catalog1(AbstractCatalog): + + """Catalog1.""" + + provider = Object(object()) + + class Catalog2(AbstractCatalog): + + """Catalog2.""" + + provider = Object(object()) + + self.assertTrue(len(Catalog1.providers) == 1) + self.assertIs(Catalog1.provider, Catalog1.providers['provider']) + + self.assertTrue(len(Catalog2.providers) == 1) + self.assertIs(Catalog2.provider, Catalog2.providers['provider']) + + self.assertIsNot(Catalog1.provider, Catalog2.provider) From 71101d98f88b3cad14aabe98f54d01100a61f02a Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Fri, 17 Jul 2015 19:39:54 +0300 Subject: [PATCH 57/73] Fixing py3 errors after recatoring of Catalog using metaclasses --- objects/catalog.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/objects/catalog.py b/objects/catalog.py index 490d752a..f4df7e04 100644 --- a/objects/catalog.py +++ b/objects/catalog.py @@ -1,6 +1,7 @@ """Catalog module.""" from six import iteritems +from six import add_metaclass from .errors import Error from .utils import is_provider @@ -25,14 +26,14 @@ class CatalogMetaClass(type): return cls +@add_metaclass(CatalogMetaClass) class AbstractCatalog(object): """Abstract providers catalog.""" providers = dict() - __slots__ = ('providers', '__used_providers__',) - __metaclass__ = CatalogMetaClass + __slots__ = ('__used_providers__',) def __init__(self, *used_providers): """Initializer.""" From ab5bc6a503c8a5234676d307aafecf23508c6e70 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Fri, 17 Jul 2015 19:42:59 +0300 Subject: [PATCH 58/73] Fixing bad for py3 dict.iteritems() usage after refactoring of Catalog using metaclasses --- objects/catalog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/catalog.py b/objects/catalog.py index f4df7e04..57c08952 100644 --- a/objects/catalog.py +++ b/objects/catalog.py @@ -15,7 +15,7 @@ class CatalogMetaClass(type): """Meta class factory.""" providers = dict() new_attributes = dict() - for name, value in attributes.iteritems(): + for name, value in iteritems(attributes): if is_provider(value): providers[name] = value new_attributes[name] = value From 92a598279273638d1b5f08c74a3042b1d9a268bb Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Mon, 20 Jul 2015 12:58:51 +0300 Subject: [PATCH 59/73] Replaceing pypip.in badges with shields.io ones --- README.rst | 10 +++++----- docs/index.rst | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index 99e33eda..beb6e77b 100644 --- a/README.rst +++ b/README.rst @@ -4,20 +4,20 @@ Objects Dependency injection framework for Python projects. +---------------------------------------+-------------------------------------------------------------------+ -| *PyPi* | .. image:: https://pypip.in/version/Objects/badge.svg | +| *PyPi* | .. image:: https://img.shields.io/pypi/v/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Latest Version | -| | .. image:: https://pypip.in/download/Objects/badge.svg | +| | .. image:: https://img.shields.io/pypi/dm/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Downloads | -| | .. image:: https://pypip.in/license/Objects/badge.svg | +| | .. image:: https://img.shields.io/pypi/l/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: License | +---------------------------------------+-------------------------------------------------------------------+ -| *Python versions and implementations* | .. image:: https://pypip.in/py_versions/Objects/badge.svg | +| *Python versions and implementations* | .. image:: https://img.shields.io/pypi/pyversions/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Supported Python versions | -| | .. image:: https://pypip.in/implementation/Objects/badge.svg | +| | .. image:: https://img.shields.io/pypi/implementation/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Supported Python implementations | +---------------------------------------+-------------------------------------------------------------------+ diff --git a/docs/index.rst b/docs/index.rst index c35ee4de..301fa0cf 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,20 +4,20 @@ Objects Dependency injection framework for Python projects. +---------------------------------------+-------------------------------------------------------------------+ -| *PyPi* | .. image:: https://pypip.in/version/Objects/badge.svg | +| *PyPi* | .. image:: https://img.shields.io/pypi/v/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Latest Version | -| | .. image:: https://pypip.in/download/Objects/badge.svg | +| | .. image:: https://img.shields.io/pypi/dm/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Downloads | -| | .. image:: https://pypip.in/license/Objects/badge.svg | +| | .. image:: https://img.shields.io/pypi/l/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: License | +---------------------------------------+-------------------------------------------------------------------+ -| *Python versions and implementations* | .. image:: https://pypip.in/py_versions/Objects/badge.svg | +| *Python versions and implementations* | .. image:: https://img.shields.io/pypi/pyversions/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Supported Python versions | -| | .. image:: https://pypip.in/implementation/Objects/badge.svg | +| | .. image:: https://img.shields.io/pypi/implementation/Objects.svg | | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Supported Python implementations | +---------------------------------------+-------------------------------------------------------------------+ From 311c15d389001343176c287c25572c043475addc Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Mon, 20 Jul 2015 13:00:03 +0300 Subject: [PATCH 60/73] Fixing minor typos in heading table --- README.rst | 2 +- docs/index.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index beb6e77b..0066048a 100644 --- a/README.rst +++ b/README.rst @@ -21,7 +21,7 @@ Dependency injection framework for Python projects. | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Supported Python implementations | +---------------------------------------+-------------------------------------------------------------------+ -| *Builds and test coverage* | .. image:: https://travis-ci.org/rmk135/objects.svg?branch=master | +| *Builds and tests coverage* | .. image:: https://travis-ci.org/rmk135/objects.svg?branch=master | | | :target: https://travis-ci.org/rmk135/objects | | | :alt: Build Status | | | .. image:: https://coveralls.io/repos/rmk135/objects/badge.svg | diff --git a/docs/index.rst b/docs/index.rst index 301fa0cf..b766bd5f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -21,7 +21,7 @@ Dependency injection framework for Python projects. | | :target: https://pypi.python.org/pypi/Objects/ | | | :alt: Supported Python implementations | +---------------------------------------+-------------------------------------------------------------------+ -| *Builds and test coverage* | .. image:: https://travis-ci.org/rmk135/objects.svg?branch=master | +| *Builds and tests coverage* | .. image:: https://travis-ci.org/rmk135/objects.svg?branch=master | | | :target: https://travis-ci.org/rmk135/objects | | | :alt: Build Status | | | .. image:: https://coveralls.io/repos/rmk135/objects/badge.svg | From 2690d9b9d4c7504b71c1f067fb5ff2790c766773 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Mon, 20 Jul 2015 18:46:45 +0300 Subject: [PATCH 61/73] Adding docs for factories delegation --- docs/images/factory_delegation.png | Bin 0 -> 21495 bytes docs/providers/delegation.rst | 76 ----------- docs/providers/factory.rst | 122 ++++++++++++++---- docs/providers/index.rst | 1 - examples/providers/delegation.py | 69 ---------- examples/providers/factory.py | 1 - .../providers/factory_attribute_injections.py | 15 ++- examples/providers/factory_delegation.py | 50 +++++++ examples/providers/factory_init_injections.py | 1 - .../factory_init_injections_and_contexts.py | 15 ++- .../providers/factory_method_injections.py | 15 ++- 11 files changed, 170 insertions(+), 195 deletions(-) create mode 100644 docs/images/factory_delegation.png delete mode 100644 docs/providers/delegation.rst delete mode 100644 examples/providers/delegation.py create mode 100644 examples/providers/factory_delegation.py diff --git a/docs/images/factory_delegation.png b/docs/images/factory_delegation.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa652793e09235f6ffd0e86e88b8b46ee1acd6e GIT binary patch literal 21495 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 G=Dz@0YwEfH literal 0 HcmV?d00001 diff --git a/docs/providers/delegation.rst b/docs/providers/delegation.rst deleted file mode 100644 index cde345a3..00000000 --- a/docs/providers/delegation.rst +++ /dev/null @@ -1,76 +0,0 @@ -Providers delegation --------------------- - -Example: - -.. code-block:: python - - """Providers delegation example.""" - - from objects.providers import Factory - from objects.providers import Singleton - from objects.providers import Delegate - - from objects.injections import KwArg - - - class User(object): - - """Example class User.""" - - def __init__(self, id, name): - """Initializer. - - :param id: int - :param name: str - :return: - """ - self.id = id - self.name = name - - - class UserService(object): - - """Example class UserService. - - UserService has dependency on users factory. - """ - - def __init__(self, users_factory): - """Initializer. - - :param users_factory: (objects.providers.Factory) -> User - :return: - """ - self.users_factory = users_factory - - def get_by_id(self, id): - """Return user info by user id.""" - return self.users_factory(id=id, name=self._get_name_from_db(id)) - - def _get_name_from_db(self, id): - """Return user's name from database by his id. - - Main purpose of this method is just to show the fact of retrieving - some user's data from database, so, actually, it simulates work - with database just by merging constant string with provided user's id. - """ - return ''.join(('user', str(id))) - - - # Users factory and UserService provider: - users_factory = Factory(User) - users_service = Singleton(UserService, - KwArg('users_factory', Delegate(users_factory))) - - - # Creating several User objects: - user1 = users_service().get_by_id(1) - user2 = users_service().get_by_id(2) - - # Making some asserts: - assert user1.id == 1 - assert user1.name == 'user1' - - assert user2.id == 2 - assert user2.name == 'user2' diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index 24a78ca2..d8e13cb1 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -20,7 +20,6 @@ Nothing could be better than brief example: """Example class User.""" - # Factory provider creates new instance of specified class on every call. users_factory = Factory(User) @@ -98,7 +97,6 @@ provided by another factories: """Example class Photo.""" - # User and Photo factories: photos_factory = Factory(Photo) users_factory = Factory(User, @@ -118,7 +116,6 @@ provided by another factories: assert user1 is not user2 assert user1.main_photo is not user2.main_photo - Next example shows how ``Factory`` provider deals with positional and keyword ``__init__`` context arguments. In few words, ``Factory`` provider fully passes positional context arguments to class's ``__init__`` method, but @@ -172,7 +169,6 @@ So, please, follow the example below: """Example class CreditCard.""" - # User, Photo and CreditCard factories: credit_cards_factory = Factory(CreditCard) photos_factory = Factory(Photo) @@ -181,12 +177,14 @@ So, please, follow the example below: KwArg('credit_card', credit_cards_factory)) # Creating several User objects: - user1 = users_factory(1) # Same as: user1 = User(1, - # main_photo=Photo(), - # credit_card=CreditCard()) - user2 = users_factory(2) # Same as: user2 = User(2, - # main_photo=Photo(), - # credit_card=CreditCard()) + user1 = users_factory(1) + # Same as: user1 = User(1, + # main_photo=Photo(), + # credit_card=CreditCard()) + user2 = users_factory(2) + # Same as: user2 = User(2, + # main_photo=Photo(), + # credit_card=CreditCard()) # Making some asserts: assert user1.id == 1 @@ -211,7 +209,6 @@ So, please, follow the example below: assert user3.main_photo is main_photo_mock assert user3.credit_card is credit_card_mock - Factory providers and attribute injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -250,7 +247,6 @@ Example: """Example class CreditCard.""" - # User, Photo and CreditCard factories: credit_cards_factory = Factory(CreditCard) photos_factory = Factory(Photo) @@ -259,12 +255,14 @@ Example: Attribute('credit_card', credit_cards_factory)) # Creating several User objects: - user1 = users_factory() # Same as: user1 = User() - # user1.main_photo = Photo() - # user1.credit_card = CreditCard() - user2 = users_factory() # Same as: user2 = User() - # user2.main_photo = Photo() - # user2.credit_card = CreditCard() + user1 = users_factory() + # Same as: user1 = User() + # user1.main_photo = Photo() + # user1.credit_card = CreditCard() + user2 = users_factory() + # Same as: user2 = User() + # user2.main_photo = Photo() + # user2.credit_card = CreditCard() # Making some asserts: assert user1 is not user2 @@ -278,7 +276,6 @@ Example: assert user1.main_photo is not user2.main_photo assert user1.credit_card is not user2.credit_card - Factory providers and method injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -330,7 +327,6 @@ Example: """Example class CreditCard.""" - # User, Photo and CreditCard factories: credit_cards_factory = Factory(CreditCard) photos_factory = Factory(Photo) @@ -339,12 +335,14 @@ Example: Method('set_credit_card', credit_cards_factory)) # Creating several User objects: - user1 = users_factory() # Same as: user1 = User() - # user1.set_main_photo(Photo()) - # user1.set_credit_card(CreditCard()) - user2 = users_factory() # Same as: user2 = User() - # user2.set_main_photo(Photo()) - # user2.set_credit_card(CreditCard()) + user1 = users_factory() + # Same as: user1 = User() + # user1.set_main_photo(Photo()) + # user1.set_credit_card(CreditCard()) + user2 = users_factory() + # Same as: user2 = User() + # user2.set_main_photo(Photo()) + # user2.set_credit_card(CreditCard()) # Making some asserts: assert user1 is not user2 @@ -358,3 +356,75 @@ Example: assert user1.main_photo is not user2.main_photo assert user1.credit_card is not user2.credit_card +Factory providers delegation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``Factory`` provider could be delegated to any other provider via any kind of +injection. Saying in other words, delegation of factories - is a way to inject +factories themselves, instead of results of their calls. + +As it was mentioned earlier, ``Injection`` calls ``Factory`` if ``Factory`` is +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. + +Example: + +.. image:: /images/factory_delegation.png + +.. code-block:: python + + """`Factory` providers delegation example.""" + + from objects.providers import Factory + from objects.injections import KwArg + + + class User(object): + + """Example class User.""" + + def __init__(self, photos_factory): + """Initializer. + + :param photos_factory: objects.providers.Factory + :return: + """ + self.photos_factory = photos_factory + self._main_photo = None + super(User, self).__init__() + + @property + def main_photo(self): + """Return user's main photo.""" + if not self._main_photo: + self._main_photo = self.photos_factory() + return self._main_photo + + + class Photo(object): + + """Example class Photo.""" + + # User and Photo factories: + photos_factory = Factory(Photo) + users_factory = Factory(User, + KwArg('photos_factory', photos_factory.delegate())) + + # Creating several User objects: + user1 = users_factory() + user2 = users_factory() + + # Making some asserts: + assert isinstance(user1, User) + assert isinstance(user1.main_photo, Photo) + + assert isinstance(user2, User) + assert isinstance(user2.main_photo, Photo) + + assert user1 is not user2 + assert user1.main_photo is not user2.main_photo diff --git a/docs/providers/index.rst b/docs/providers/index.rst index 352d73e7..aa0b2eba 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -13,5 +13,4 @@ All providers are callable. They describe how particular objects are provided. static callable external_dependency - delegation extending diff --git a/examples/providers/delegation.py b/examples/providers/delegation.py deleted file mode 100644 index 2d8501d4..00000000 --- a/examples/providers/delegation.py +++ /dev/null @@ -1,69 +0,0 @@ -"""Providers delegation example.""" - -from objects.providers import Factory -from objects.providers import Singleton -from objects.providers import Delegate - -from objects.injections import KwArg - - -class User(object): - - """Example class User.""" - - def __init__(self, id, name): - """Initializer. - - :param id: int - :param name: str - :return: - """ - self.id = id - self.name = name - - -class UserService(object): - - """Example class UserService. - - UserService has dependency on users factory. - """ - - def __init__(self, users_factory): - """Initializer. - - :param users_factory: (objects.providers.Factory) -> User - :return: - """ - self.users_factory = users_factory - - def get_by_id(self, id): - """Return user info by user id.""" - return self.users_factory(id=id, name=self._get_name_from_db(id)) - - def _get_name_from_db(self, id): - """Return user's name from database by his id. - - Main purpose of this method is just to show the fact of retrieving - some user's data from database, so, actually, it simulates work - with database just by merging constant string with provided user's id. - """ - return ''.join(('user', str(id))) - - -# Users factory and UserService provider: -users_factory = Factory(User) -users_service = Singleton(UserService, - KwArg('users_factory', Delegate(users_factory))) - - -# Creating several User objects: -user1 = users_service().get_by_id(1) -user2 = users_service().get_by_id(2) - -# Making some asserts: -assert user1.id == 1 -assert user1.name == 'user1' - -assert user2.id == 2 -assert user2.name == 'user2' diff --git a/examples/providers/factory.py b/examples/providers/factory.py index 35532b4b..f1a48df2 100644 --- a/examples/providers/factory.py +++ b/examples/providers/factory.py @@ -7,7 +7,6 @@ class User(object): """Example class User.""" - # Factory provider creates new instance of specified class on every call. users_factory = Factory(User) diff --git a/examples/providers/factory_attribute_injections.py b/examples/providers/factory_attribute_injections.py index 1e5f1e79..f28c179e 100644 --- a/examples/providers/factory_attribute_injections.py +++ b/examples/providers/factory_attribute_injections.py @@ -23,7 +23,6 @@ class CreditCard(object): """Example class CreditCard.""" - # User, Photo and CreditCard factories: credit_cards_factory = Factory(CreditCard) photos_factory = Factory(Photo) @@ -32,12 +31,14 @@ users_factory = Factory(User, Attribute('credit_card', credit_cards_factory)) # Creating several User objects: -user1 = users_factory() # Same as: user1 = User() - # user1.main_photo = Photo() - # user1.credit_card = CreditCard() -user2 = users_factory() # Same as: user2 = User() - # user2.main_photo = Photo() - # user2.credit_card = CreditCard() +user1 = users_factory() +# Same as: user1 = User() +# user1.main_photo = Photo() +# user1.credit_card = CreditCard() +user2 = users_factory() +# Same as: user2 = User() +# user2.main_photo = Photo() +# user2.credit_card = CreditCard() # Making some asserts: assert user1 is not user2 diff --git a/examples/providers/factory_delegation.py b/examples/providers/factory_delegation.py new file mode 100644 index 00000000..d9fc33e0 --- /dev/null +++ b/examples/providers/factory_delegation.py @@ -0,0 +1,50 @@ +"""`Factory` providers delegation example.""" + +from objects.providers import Factory +from objects.injections import KwArg + + +class User(object): + + """Example class User.""" + + def __init__(self, photos_factory): + """Initializer. + + :param photos_factory: objects.providers.Factory + :return: + """ + self.photos_factory = photos_factory + self._main_photo = None + super(User, self).__init__() + + @property + def main_photo(self): + """Return user's main photo.""" + if not self._main_photo: + self._main_photo = self.photos_factory() + return self._main_photo + + +class Photo(object): + + """Example class Photo.""" + +# User and Photo factories: +photos_factory = Factory(Photo) +users_factory = Factory(User, + KwArg('photos_factory', photos_factory.delegate())) + +# Creating several User objects: +user1 = users_factory() +user2 = users_factory() + +# Making some asserts: +assert isinstance(user1, User) +assert isinstance(user1.main_photo, Photo) + +assert isinstance(user2, User) +assert isinstance(user2.main_photo, Photo) + +assert user1 is not user2 +assert user1.main_photo is not user2.main_photo diff --git a/examples/providers/factory_init_injections.py b/examples/providers/factory_init_injections.py index 9d068ed3..18755eb9 100644 --- a/examples/providers/factory_init_injections.py +++ b/examples/providers/factory_init_injections.py @@ -22,7 +22,6 @@ class Photo(object): """Example class Photo.""" - # User and Photo factories: photos_factory = Factory(Photo) users_factory = Factory(User, diff --git a/examples/providers/factory_init_injections_and_contexts.py b/examples/providers/factory_init_injections_and_contexts.py index a43e5f5a..dcc39f35 100644 --- a/examples/providers/factory_init_injections_and_contexts.py +++ b/examples/providers/factory_init_injections_and_contexts.py @@ -39,7 +39,6 @@ class CreditCard(object): """Example class CreditCard.""" - # User, Photo and CreditCard factories: credit_cards_factory = Factory(CreditCard) photos_factory = Factory(Photo) @@ -48,12 +47,14 @@ users_factory = Factory(User, KwArg('credit_card', credit_cards_factory)) # Creating several User objects: -user1 = users_factory(1) # Same as: user1 = User(1, - # main_photo=Photo(), - # credit_card=CreditCard()) -user2 = users_factory(2) # Same as: user2 = User(2, - # main_photo=Photo(), - # credit_card=CreditCard()) +user1 = users_factory(1) +# Same as: user1 = User(1, +# main_photo=Photo(), +# credit_card=CreditCard()) +user2 = users_factory(2) +# Same as: user2 = User(2, +# main_photo=Photo(), +# credit_card=CreditCard()) # Making some asserts: assert user1.id == 1 diff --git a/examples/providers/factory_method_injections.py b/examples/providers/factory_method_injections.py index 83897a52..67acc041 100644 --- a/examples/providers/factory_method_injections.py +++ b/examples/providers/factory_method_injections.py @@ -31,7 +31,6 @@ class CreditCard(object): """Example class CreditCard.""" - # User, Photo and CreditCard factories: credit_cards_factory = Factory(CreditCard) photos_factory = Factory(Photo) @@ -40,12 +39,14 @@ users_factory = Factory(User, Method('set_credit_card', credit_cards_factory)) # Creating several User objects: -user1 = users_factory() # Same as: user1 = User() - # user1.set_main_photo(Photo()) - # user1.set_credit_card(CreditCard()) -user2 = users_factory() # Same as: user2 = User() - # user2.set_main_photo(Photo()) - # user2.set_credit_card(CreditCard()) +user1 = users_factory() +# Same as: user1 = User() +# user1.set_main_photo(Photo()) +# user1.set_credit_card(CreditCard()) +user2 = users_factory() +# Same as: user2 = User() +# user2.set_main_photo(Photo()) +# user2.set_credit_card(CreditCard()) # Making some asserts: assert user1 is not user2 From 996fc4ecbf9b4c12f5b1b260631361a5e70054ab Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Mon, 20 Jul 2015 18:58:39 +0300 Subject: [PATCH 62/73] Updating singleton examples --- docs/providers/singleton.rst | 4 ---- examples/providers/singleton.py | 1 - examples/providers/singleton_reseting.py | 1 - 3 files changed, 6 deletions(-) diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index 2e62e813..dbe03bba 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -21,7 +21,6 @@ Example: """Example class UserService.""" - # Singleton provider creates new instance of specified class on first call and # returns same instance on every next call. users_service_provider = Singleton(UserService) @@ -35,7 +34,6 @@ Example: assert isinstance(user_service1, UserService) assert isinstance(user_service2, UserService) - Singleton providers and injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -84,7 +82,6 @@ Example: """Example class UserService.""" - # Users service singleton provider: users_service_provider = Singleton(UserService) @@ -105,4 +102,3 @@ Example: # Making some asserts: assert user_service3 is not user_service1 - diff --git a/examples/providers/singleton.py b/examples/providers/singleton.py index 1f287b58..92caca00 100644 --- a/examples/providers/singleton.py +++ b/examples/providers/singleton.py @@ -7,7 +7,6 @@ class UserService(object): """Example class UserService.""" - # Singleton provider creates new instance of specified class on first call and # returns same instance on every next call. users_service_provider = Singleton(UserService) diff --git a/examples/providers/singleton_reseting.py b/examples/providers/singleton_reseting.py index a35fc6a8..be5780ef 100644 --- a/examples/providers/singleton_reseting.py +++ b/examples/providers/singleton_reseting.py @@ -7,7 +7,6 @@ class UserService(object): """Example class UserService.""" - # Users service singleton provider: users_service_provider = Singleton(UserService) From 0efebb337f37b1dd8ecadc35354af731a53ebfeb Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Mon, 20 Jul 2015 19:31:31 +0300 Subject: [PATCH 63/73] Adding explanation for Singleton and Callable providers delegation --- docs/providers/callable.rst | 35 +++++++++++++++++++ docs/providers/singleton.rst | 30 ++++++++++++++++ examples/providers/callable_delegation.py | 16 +++++++++ .../{callable.py => callable_injections.py} | 0 examples/providers/singleton_delegation.py | 14 ++++++++ 5 files changed, 95 insertions(+) create mode 100644 examples/providers/callable_delegation.py rename examples/providers/{callable.py => callable_injections.py} (100%) create mode 100644 examples/providers/singleton_delegation.py diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst index a9091e99..a2ca017e 100644 --- a/docs/providers/callable.rst +++ b/docs/providers/callable.rst @@ -5,6 +5,9 @@ Callable providers some injections. Every call of this provider returns result of call of initial callable. +Callable providers and injections +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ``Callable`` provider uses ``KwArg`` injections. ``KwArg`` injections are done by passing injectable values as keyword arguments during call time. @@ -36,3 +39,35 @@ Example: # Making some asserts (client's code): hashed_password = password_hasher('super secret') assert password_verifier('super secret', hashed_password) + +Callable providers delegation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``Callable`` provider could be delegated to any other provider via any kind of +injection. Delegation of ``Callable`` providers is the same as ``Factory`` and +``Singleton`` providers delegation, please follow *Factory providers +delegation* section for example. + +``Callable`` delegate could be created obviously using +``Delegate(Callable())`` or by calling ``Callable.delegate()`` method. + +Example: + +.. code-block:: python + + """`Callable` providers delegation example.""" + + import sys + + from objects.providers import Callable + from objects.providers import Delegate + + + # Some callable provider and few delegates of it: + callable_provider = Callable(sys.exit) + callable_provider_delegate1 = callable_provider.delegate() + callable_provider_delegate2 = Delegate(callable_provider) + + # Making some asserts: + assert callable_provider_delegate1() is callable_provider + assert callable_provider_delegate2() is callable_provider diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index dbe03bba..4da14692 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -102,3 +102,33 @@ Example: # Making some asserts: assert user_service3 is not user_service1 + +Singleton providers delegation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``Singleton`` provider could be delegated to any other provider via any kind of +injection. Delegation of ``Singleton`` providers is the same as ``Factory`` +providers delegation, please follow *Factory providers delegation* section for +example. + +``Singleton`` delegate could be created obviously using +``Delegate(Singleton())`` or by calling ``Singleton.delegate()`` method. + +Example: + +.. code-block:: python + + """`Singleton` providers delegation example.""" + + from objects.providers import Singleton + from objects.providers import Delegate + + + # Some singleton provider and few delegates of it: + singleton_provider = Singleton(object) + singleton_provider_delegate1 = singleton_provider.delegate() + singleton_provider_delegate2 = 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/callable_delegation.py b/examples/providers/callable_delegation.py new file mode 100644 index 00000000..d8569afe --- /dev/null +++ b/examples/providers/callable_delegation.py @@ -0,0 +1,16 @@ +"""`Callable` providers delegation example.""" + +import sys + +from objects.providers import Callable +from objects.providers import Delegate + + +# Some callable provider and few delegates of it: +callable_provider = Callable(sys.exit) +callable_provider_delegate1 = callable_provider.delegate() +callable_provider_delegate2 = Delegate(callable_provider) + +# Making some asserts: +assert callable_provider_delegate1() is callable_provider +assert callable_provider_delegate2() is callable_provider diff --git a/examples/providers/callable.py b/examples/providers/callable_injections.py similarity index 100% rename from examples/providers/callable.py rename to examples/providers/callable_injections.py diff --git a/examples/providers/singleton_delegation.py b/examples/providers/singleton_delegation.py new file mode 100644 index 00000000..9ca2fce9 --- /dev/null +++ b/examples/providers/singleton_delegation.py @@ -0,0 +1,14 @@ +"""`Singleton` providers delegation example.""" + +from objects.providers import Singleton +from objects.providers import Delegate + + +# Some singleton provider and few delegates of it: +singleton_provider = Singleton(object) +singleton_provider_delegate1 = singleton_provider.delegate() +singleton_provider_delegate2 = Delegate(singleton_provider) + +# Making some asserts: +assert singleton_provider_delegate1() is singleton_provider +assert singleton_provider_delegate2() is singleton_provider From 7d3460debaf7fcb42964c8546b82fe657eaf0233 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Tue, 21 Jul 2015 09:29:50 +0300 Subject: [PATCH 64/73] Add functionality for resetting of last overriding provider --- objects/providers.py | 17 +++++++----- tests/test_providers.py | 58 +++++++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/objects/providers.py b/objects/providers.py index b7b4229f..f08efb99 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -47,18 +47,23 @@ class Provider(object): else: self.overridden = self.overridden + (ensure_is_provider(provider),) - def reset_override(self): - """Reset all overriding providers.""" - self.overridden = None - @property def last_overriding(self): """Return last overriding provider.""" try: return self.overridden[-1] except (TypeError, IndexError): - raise Error('Provider {0} '.format(str(self)) + - 'is not overridden') + raise Error('Provider {0} is not overridden'.format(str(self))) + + def reset_last_overriding(self): + """Reset last overriding provider.""" + if not self.overridden: + raise Error('Provider {0} is not overridden'.format(str(self))) + self.overridden = self.overridden[:-1] + + def reset_override(self): + """Reset all overriding providers.""" + self.overridden = None class Delegate(Provider): diff --git a/tests/test_providers.py b/tests/test_providers.py index 26bddfa4..65c93676 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -63,25 +63,6 @@ class ProviderTests(unittest.TestCase): """Test provider overriding with not provider instance.""" self.assertRaises(Error, self.provider.override, object()) - def test_reset_override(self): - """Test reset of provider's override.""" - overriding_provider = Provider() - self.provider.override(overriding_provider) - - self.assertTrue(self.provider.overridden) - self.assertIs(self.provider.last_overriding, overriding_provider) - - self.provider.reset_override() - - self.assertFalse(self.provider.overridden) - try: - self.provider.last_overriding - except Error: - pass - else: - self.fail('Got en error in {}'.format( - str(self.test_last_overriding_of_not_overridden_provider))) - def test_last_overriding(self): """Test getting last overriding provider.""" overriding_provider1 = Provider() @@ -103,6 +84,45 @@ class ProviderTests(unittest.TestCase): self.fail('Got en error in {}'.format( str(self.test_last_overriding_of_not_overridden_provider))) + def test_reset_last_overriding(self): + """Test reseting of last overriding provider.""" + overriding_provider1 = Provider() + overriding_provider2 = Provider() + + self.provider.override(overriding_provider1) + self.provider.override(overriding_provider2) + + self.assertIs(self.provider.last_overriding, overriding_provider2) + + self.provider.reset_last_overriding() + self.assertIs(self.provider.last_overriding, overriding_provider1) + + self.provider.reset_last_overriding() + self.assertFalse(self.provider.overridden) + + def test_reset_last_overriding_of_not_overridden_provider(self): + """Test resetting of last overriding on not overridden provier.""" + self.assertRaises(Error, self.provider.reset_last_overriding) + + def test_reset_override(self): + """Test reset of provider's override.""" + overriding_provider = Provider() + self.provider.override(overriding_provider) + + self.assertTrue(self.provider.overridden) + self.assertIs(self.provider.last_overriding, overriding_provider) + + self.provider.reset_override() + + self.assertFalse(self.provider.overridden) + try: + self.provider.last_overriding + except Error: + pass + else: + self.fail('Got en error in {}'.format( + str(self.test_last_overriding_of_not_overridden_provider))) + class DelegateTests(unittest.TestCase): From 27441353d953b16ac81d1fae6231a45fd0f83081 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Tue, 21 Jul 2015 09:42:21 +0300 Subject: [PATCH 65/73] Updating coveralls job --- tox.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 54d47a1f..0dec390e 100644 --- a/tox.ini +++ b/tox.ini @@ -18,6 +18,7 @@ commands= [testenv:coveralls] basepython=python2.7 +passenv=TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH deps= {[testenv]deps} coverage @@ -25,7 +26,7 @@ deps= commands= coverage erase coverage run --rcfile=./.coveragerc -m unittest2 discover tests [] - coveralls + COVERALLS_REPO_TOKEN=k2btfiC678lpPikhQxZnyPbdI4RjxNE68 coveralls [testenv:pylint] basepython=python2.7 From 6b482d87e0ae1c180be375a419bca665768a42fb Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Tue, 21 Jul 2015 09:48:50 +0300 Subject: [PATCH 66/73] Removing coveralls key from tox job --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 0dec390e..bb950ba9 100644 --- a/tox.ini +++ b/tox.ini @@ -26,7 +26,7 @@ deps= commands= coverage erase coverage run --rcfile=./.coveragerc -m unittest2 discover tests [] - COVERALLS_REPO_TOKEN=k2btfiC678lpPikhQxZnyPbdI4RjxNE68 coveralls + coveralls [testenv:pylint] basepython=python2.7 From fd8be776350bcae5c411d0f274d842671cce20f3 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Tue, 21 Jul 2015 09:57:13 +0300 Subject: [PATCH 67/73] Provider overriding first pages --- docs/providers/index.rst | 1 + docs/providers/overriding.rst | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 docs/providers/overriding.rst diff --git a/docs/providers/index.rst b/docs/providers/index.rst index aa0b2eba..2909d655 100644 --- a/docs/providers/index.rst +++ b/docs/providers/index.rst @@ -13,4 +13,5 @@ All providers are callable. They describe how particular objects are provided. static callable external_dependency + overriding extending diff --git a/docs/providers/overriding.rst b/docs/providers/overriding.rst new file mode 100644 index 00000000..e100fd0f --- /dev/null +++ b/docs/providers/overriding.rst @@ -0,0 +1,4 @@ +Overriding of providers +----------------------- + +Every provider could be overridden by another provider. From 1b4c6dbf8b9e7003b872e12568ee276f2d7c812a Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Wed, 22 Jul 2015 10:26:34 +0300 Subject: [PATCH 68/73] Renaming of Provider.__provide__() -> Provider._provide() for improving providers extending --- objects/providers.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/objects/providers.py b/objects/providers.py index f08efb99..16fca49e 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -25,9 +25,9 @@ class Provider(object): """Return provided instance.""" if self.overridden: return self.last_overriding(*args, **kwargs) - return self.__provide__(*args, **kwargs) + return self._provide(*args, **kwargs) - def __provide__(self, *args, **kwargs): + def _provide(self, *args, **kwargs): """Providing strategy implementation. Abstract protected method that implements providing strategy of @@ -80,7 +80,7 @@ class Delegate(Provider): self.delegated = ensure_is_provider(delegated) super(Delegate, self).__init__() - def __provide__(self, *args, **kwargs): + def _provide(self, *args, **kwargs): """Return provided instance.""" return self.delegated @@ -111,7 +111,7 @@ class Factory(Provider): if is_method_injection(injection))) super(Factory, self).__init__() - def __provide__(self, *args, **kwargs): + def _provide(self, *args, **kwargs): """Return provided instance.""" init_kwargs = dict(((injection.name, injection.value) for injection in self.kwargs)) @@ -152,7 +152,7 @@ class Singleton(Provider): self.factory = Factory(*args, **kwargs) super(Singleton, self).__init__() - def __provide__(self, *args, **kwargs): + def _provide(self, *args, **kwargs): """Return provided instance.""" if not self.instance: self.instance = self.factory(*args, **kwargs) @@ -214,7 +214,7 @@ class _StaticProvider(Provider): self.provides = provides super(_StaticProvider, self).__init__() - def __provide__(self, *args, **kwargs): + def _provide(self, *args, **kwargs): """Return provided instance.""" return self.provides @@ -259,7 +259,7 @@ class Callable(Provider): if is_kwarg_injection(injection))) super(Callable, self).__init__() - def __provide__(self, *args, **kwargs): + def _provide(self, *args, **kwargs): """Return provided instance.""" injections = dict(((injection.name, injection.value) for injection in self.injections)) @@ -286,7 +286,11 @@ class Config(Provider): self.value = value super(Config, self).__init__() - def __provide__(self, paths=None): + def __getattr__(self, item): + """Return instance of deferred config.""" + return _ChildConfig(parents=(item,), root_config=self) + + def _provide(self, paths=None): """Return provided instance.""" value = self.value if paths: @@ -298,10 +302,6 @@ class Config(Provider): '"{0}" is undefined'.format('.'.join(paths))) return value - def __getattr__(self, item): - """Return instance of deferred config.""" - return _ChildConfig(parents=(item,), root_config=self) - def update_from(self, value): """Update current value from another one.""" self.value.update(value) @@ -323,11 +323,11 @@ class _ChildConfig(Provider): self.root_config = root_config super(_ChildConfig, self).__init__() - def __provide__(self, *args, **kwargs): - """Return provided instance.""" - return self.root_config(self.parents) - def __getattr__(self, item): """Return instance of deferred config.""" return _ChildConfig(parents=self.parents + (item,), root_config=self.root_config) + + def _provide(self, *args, **kwargs): + """Return provided instance.""" + return self.root_config(self.parents) From 541d3c0e4b454cf798ed366e73652fca0d358d63 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Wed, 22 Jul 2015 10:53:16 +0300 Subject: [PATCH 69/73] Refactoring of utils checks --- objects/injections.py | 8 ++++---- objects/providers.py | 2 +- objects/utils.py | 10 +++++----- tests/test_utils.py | 20 ++++++++++++++++++++ 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/objects/injections.py b/objects/injections.py index c574071b..3bb70df7 100644 --- a/objects/injections.py +++ b/objects/injections.py @@ -7,7 +7,7 @@ class Injection(object): """Base injection class.""" - __IS_OBJECTS_INJECTION__ = True + __IS_INJECTION__ = True __slots__ = ('name', 'injectable') def __init__(self, name, injectable): @@ -27,18 +27,18 @@ class KwArg(Injection): """Keyword argument injection.""" - __IS_OBJECTS_KWARG_INJECTION__ = True + __IS_KWARG_INJECTION__ = True class Attribute(Injection): """Attribute injection.""" - __IS_OBJECTS_ATTRIBUTE_INJECTION__ = True + __IS_ATTRIBUTE_INJECTION__ = True class Method(Injection): """Method injection.""" - __IS_OBJECTS_METHOD_INJECTION__ = True + __IS_METHOD_INJECTION__ = True diff --git a/objects/providers.py b/objects/providers.py index 16fca49e..99a33350 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -14,7 +14,7 @@ class Provider(object): """Base provider class.""" - __IS_OBJECTS_PROVIDER__ = True + __IS_PROVIDER__ = True __slots__ = ('overridden',) def __init__(self): diff --git a/objects/utils.py b/objects/utils.py index 89319021..392fad96 100644 --- a/objects/utils.py +++ b/objects/utils.py @@ -8,7 +8,7 @@ from .errors import Error def is_provider(instance): """Check if instance is provider instance.""" return (not isinstance(instance, class_types) and - hasattr(instance, '__IS_OBJECTS_PROVIDER__')) + getattr(instance, '__IS_PROVIDER__', False) is True) def ensure_is_provider(instance): @@ -22,7 +22,7 @@ def ensure_is_provider(instance): def is_injection(instance): """Check if instance is injection instance.""" return (not isinstance(instance, class_types) and - hasattr(instance, '__IS_OBJECTS_INJECTION__')) + getattr(instance, '__IS_INJECTION__', False) is True) def ensure_is_injection(instance): @@ -36,16 +36,16 @@ def ensure_is_injection(instance): def is_kwarg_injection(instance): """Check if instance is keyword argument injection instance.""" return (not isinstance(instance, class_types) and - hasattr(instance, '__IS_OBJECTS_KWARG_INJECTION__')) + getattr(instance, '__IS_KWARG_INJECTION__', False) is True) def is_attribute_injection(instance): """Check if instance is attribute injection instance.""" return (not isinstance(instance, class_types) and - hasattr(instance, '__IS_OBJECTS_ATTRIBUTE_INJECTION__')) + getattr(instance, '__IS_ATTRIBUTE_INJECTION__', False) is True) def is_method_injection(instance): """Check if instance is method injection instance.""" return (not isinstance(instance, class_types) and - hasattr(instance, '__IS_OBJECTS_METHOD_INJECTION__')) + getattr(instance, '__IS_METHOD_INJECTION__', False) is True) diff --git a/tests/test_utils.py b/tests/test_utils.py index f4b038ce..3de7e5e7 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -40,6 +40,26 @@ class IsProviderTests(unittest.TestCase): """Test with object.""" self.assertFalse(is_provider(object())) + def test_with_subclass_instance(self): + """Test with subclass of provider instance.""" + class SomeProvider(Provider): + + """Some provider for test.""" + + self.assertTrue(is_provider(SomeProvider())) + + def test_with_class_with_getattr(self): + """Test with class that has __getattr__() method implementation.""" + class SomeClass(object): + + """Some test class with __getattr__() method implementation.""" + + def __getattr__(self, _): + """Test implementation that just returns False.""" + return False + + self.assertFalse(is_provider(SomeClass())) + class EnsureIsProviderTests(unittest.TestCase): From 040aad93f892a2acee326fadbd3f29c1ad57e853 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Wed, 22 Jul 2015 16:42:36 +0300 Subject: [PATCH 70/73] Make all protected attributes `_protected` --- objects/catalog.py | 8 +-- objects/decorators.py | 8 +-- objects/providers.py | 123 +++++++++++++++++++++------------------- tests/test_providers.py | 12 ++-- 4 files changed, 78 insertions(+), 73 deletions(-) diff --git a/objects/catalog.py b/objects/catalog.py index 57c08952..4630a76a 100644 --- a/objects/catalog.py +++ b/objects/catalog.py @@ -33,19 +33,19 @@ class AbstractCatalog(object): providers = dict() - __slots__ = ('__used_providers__',) + __slots__ = ('_used_providers',) def __init__(self, *used_providers): """Initializer.""" - self.__used_providers__ = set(used_providers) + self._used_providers = set(used_providers) def __getattribute__(self, item): """Return providers.""" attribute = super(AbstractCatalog, self).__getattribute__(item) - if item in ('providers', '__used_providers__',): + if item in ('providers', '_used_providers',): return attribute - if attribute not in self.__used_providers__: + if attribute not in self._used_providers: raise Error('Provider \'{0}\' '.format(item) + 'is not listed in dependencies') return attribute diff --git a/objects/decorators.py b/objects/decorators.py index 1846b3ae..fea9d86d 100644 --- a/objects/decorators.py +++ b/objects/decorators.py @@ -24,18 +24,18 @@ def inject(injection): def decorator(callback): """Dependency injection decorator.""" - if hasattr(callback, '__injections__'): - callback.__injections__ += (injection,) + if hasattr(callback, '_injections'): + callback._injections += (injection,) @wraps(callback) def decorated(*args, **kwargs): """Decorated with dependency injection callback.""" - for injection in getattr(decorated, '__injections__'): + for injection in getattr(decorated, '_injections'): if injection.name not in kwargs: kwargs[injection.name] = injection.value return callback(*args, **kwargs) - setattr(decorated, '__injections__', (injection,)) + setattr(decorated, '_injections', (injection,)) return decorated return decorator diff --git a/objects/providers.py b/objects/providers.py index 99a33350..8ef5a46f 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -15,15 +15,15 @@ class Provider(object): """Base provider class.""" __IS_PROVIDER__ = True - __slots__ = ('overridden',) + __slots__ = ('_overridden',) def __init__(self): """Initializer.""" - self.overridden = None + self._overridden = None def __call__(self, *args, **kwargs): """Return provided instance.""" - if self.overridden: + if self._overridden: return self.last_overriding(*args, **kwargs) return self._provide(*args, **kwargs) @@ -42,47 +42,52 @@ class Provider(object): def override(self, provider): """Override provider with another provider.""" - if not self.overridden: - self.overridden = (ensure_is_provider(provider),) + if not self._overridden: + self._overridden = (ensure_is_provider(provider),) else: - self.overridden = self.overridden + (ensure_is_provider(provider),) + self._overridden += (ensure_is_provider(provider),) + + @property + def is_overridden(self): + """Check if provider is overridden by another provider.""" + return bool(self._overridden) @property def last_overriding(self): """Return last overriding provider.""" try: - return self.overridden[-1] + return self._overridden[-1] except (TypeError, IndexError): raise Error('Provider {0} is not overridden'.format(str(self))) def reset_last_overriding(self): """Reset last overriding provider.""" - if not self.overridden: + if not self._overridden: raise Error('Provider {0} is not overridden'.format(str(self))) - self.overridden = self.overridden[:-1] + self._overridden = self._overridden[:-1] def reset_override(self): """Reset all overriding providers.""" - self.overridden = None + self._overridden = None class Delegate(Provider): """Provider's delegate.""" - __slots__ = ('delegated',) + __slots__ = ('_delegated',) def __init__(self, delegated): """Initializer. :type delegated: Provider """ - self.delegated = ensure_is_provider(delegated) + self._delegated = ensure_is_provider(delegated) super(Delegate, self).__init__() def _provide(self, *args, **kwargs): """Return provided instance.""" - return self.delegated + return self._delegated class Factory(Provider): @@ -92,36 +97,36 @@ class Factory(Provider): Factory provider creates new instance of specified class on every call. """ - __slots__ = ('provides', 'kwargs', 'attributes', 'methods') + __slots__ = ('_provides', '_kwargs', '_attributes', '_methods') def __init__(self, provides, *injections): """Initializer.""" if not isinstance(provides, class_types): raise Error('Factory provider expects to get class, ' + 'got {0} instead'.format(str(provides))) - self.provides = provides - self.kwargs = tuple((injection - for injection in injections - if is_kwarg_injection(injection))) - self.attributes = tuple((injection - for injection in injections - if is_attribute_injection(injection))) - self.methods = tuple((injection + self._provides = provides + self._kwargs = tuple((injection for injection in injections - if is_method_injection(injection))) + if is_kwarg_injection(injection))) + self._attributes = tuple((injection + for injection in injections + if is_attribute_injection(injection))) + self._methods = tuple((injection + for injection in injections + if is_method_injection(injection))) super(Factory, self).__init__() def _provide(self, *args, **kwargs): """Return provided instance.""" init_kwargs = dict(((injection.name, injection.value) - for injection in self.kwargs)) + for injection in self._kwargs)) init_kwargs.update(kwargs) - instance = self.provides(*args, **init_kwargs) + instance = self._provides(*args, **init_kwargs) - for attribute in self.attributes: + for attribute in self._attributes: setattr(instance, attribute.name, attribute.value) - for method in self.methods: + for method in self._methods: getattr(instance, method.name)(method.value) return instance @@ -144,23 +149,23 @@ class Singleton(Provider): Singleton provider will create instance once and return it on every call. """ - __slots__ = ('instance', 'factory') + __slots__ = ('_instance', '_factory') def __init__(self, *args, **kwargs): """Initializer.""" - self.instance = None - self.factory = Factory(*args, **kwargs) + self._instance = None + self._factory = Factory(*args, **kwargs) super(Singleton, self).__init__() def _provide(self, *args, **kwargs): """Return provided instance.""" - if not self.instance: - self.instance = self.factory(*args, **kwargs) - return self.instance + if not self._instance: + self._instance = self._factory(*args, **kwargs) + return self._instance def reset(self): """Reset instance.""" - self.instance = None + self._instance = None class ExternalDependency(Provider): @@ -171,26 +176,26 @@ class ExternalDependency(Provider): the client's code, but it's interface is known. """ - __slots__ = ('instance_of',) + __slots__ = ('_instance_of',) def __init__(self, instance_of): """Initializer.""" if not isinstance(instance_of, class_types): raise Error('ExternalDependency provider expects to get class, ' + 'got {0} instead'.format(str(instance_of))) - self.instance_of = instance_of + self._instance_of = instance_of super(ExternalDependency, self).__init__() def __call__(self, *args, **kwargs): """Return provided instance.""" - if not self.overridden: + if not self._overridden: raise Error('Dependency is not defined') instance = self.last_overriding(*args, **kwargs) - if not isinstance(instance, self.instance_of): + if not isinstance(instance, self._instance_of): raise Error('{0} is not an '.format(instance) + - 'instance of {0}'.format(self.instance_of)) + 'instance of {0}'.format(self._instance_of)) return instance @@ -207,16 +212,16 @@ class _StaticProvider(Provider): it got on input. """ - __slots__ = ('provides',) + __slots__ = ('_provides',) def __init__(self, provides): """Initializer.""" - self.provides = provides + self._provides = provides super(_StaticProvider, self).__init__() def _provide(self, *args, **kwargs): """Return provided instance.""" - return self.provides + return self._provides class Class(_StaticProvider): @@ -247,25 +252,25 @@ class Callable(Provider): with some predefined dependency injections. """ - __slots__ = ('callback', 'injections') + __slots__ = ('_callback', '_injections') def __init__(self, callback, *injections): """Initializer.""" if not callable(callback): raise Error('Callable expected, got {0}'.format(str(callback))) - self.callback = callback - self.injections = tuple((injection - for injection in injections - if is_kwarg_injection(injection))) + self._callback = callback + self._injections = tuple((injection + for injection in injections + if is_kwarg_injection(injection))) super(Callable, self).__init__() def _provide(self, *args, **kwargs): """Return provided instance.""" injections = dict(((injection.name, injection.value) - for injection in self.injections)) + for injection in self._injections)) injections.update(kwargs) - return self.callback(*args, **injections) + return self._callback(*args, **injections) class Config(Provider): @@ -277,13 +282,13 @@ class Config(Provider): to create deferred config value provider. """ - __slots__ = ('value',) + __slots__ = ('_value',) def __init__(self, value=None): """Initializer.""" if not value: value = dict() - self.value = value + self._value = value super(Config, self).__init__() def __getattr__(self, item): @@ -292,7 +297,7 @@ class Config(Provider): def _provide(self, paths=None): """Return provided instance.""" - value = self.value + value = self._value if paths: for path in paths: try: @@ -304,7 +309,7 @@ class Config(Provider): def update_from(self, value): """Update current value from another one.""" - self.value.update(value) + self._value.update(value) class _ChildConfig(Provider): @@ -315,19 +320,19 @@ class _ChildConfig(Provider): the current path in the config tree. """ - __slots__ = ('parents', 'root_config') + __slots__ = ('_parents', '_root_config') def __init__(self, parents, root_config): """Initializer.""" - self.parents = parents - self.root_config = root_config + self._parents = parents + self._root_config = root_config super(_ChildConfig, self).__init__() def __getattr__(self, item): """Return instance of deferred config.""" - return _ChildConfig(parents=self.parents + (item,), - root_config=self.root_config) + return _ChildConfig(parents=self._parents + (item,), + root_config=self._root_config) def _provide(self, *args, **kwargs): """Return provided instance.""" - return self.root_config(self.parents) + return self._root_config(self._parents) diff --git a/tests/test_providers.py b/tests/test_providers.py index 65c93676..77843d33 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -44,12 +44,12 @@ class ProviderTests(unittest.TestCase): delegate1 = self.provider.delegate() self.assertIsInstance(delegate1, Delegate) - self.assertIs(delegate1.delegated, self.provider) + self.assertIs(delegate1(), self.provider) delegate2 = self.provider.delegate() self.assertIsInstance(delegate2, Delegate) - self.assertIs(delegate2.delegated, self.provider) + self.assertIs(delegate2(), self.provider) self.assertIsNot(delegate1, delegate2) @@ -57,7 +57,7 @@ class ProviderTests(unittest.TestCase): """Test provider overriding.""" overriding_provider = Provider() self.provider.override(overriding_provider) - self.assertTrue(self.provider.overridden) + self.assertTrue(self.provider.is_overridden) def test_override_with_not_provider(self): """Test provider overriding with not provider instance.""" @@ -98,7 +98,7 @@ class ProviderTests(unittest.TestCase): self.assertIs(self.provider.last_overriding, overriding_provider1) self.provider.reset_last_overriding() - self.assertFalse(self.provider.overridden) + self.assertFalse(self.provider.is_overridden) def test_reset_last_overriding_of_not_overridden_provider(self): """Test resetting of last overriding on not overridden provier.""" @@ -109,12 +109,12 @@ class ProviderTests(unittest.TestCase): overriding_provider = Provider() self.provider.override(overriding_provider) - self.assertTrue(self.provider.overridden) + self.assertTrue(self.provider.is_overridden) self.assertIs(self.provider.last_overriding, overriding_provider) self.provider.reset_override() - self.assertFalse(self.provider.overridden) + self.assertFalse(self.provider.is_overridden) try: self.provider.last_overriding except Error: From 2c2d4f743482f007f1e757d54160230a6da145a5 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Fri, 24 Jul 2015 00:28:52 +0300 Subject: [PATCH 71/73] Removing of Factory restriction to operate with class types only, factory methods are valid now --- objects/providers.py | 8 ++++---- tests/test_providers.py | 8 ++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/objects/providers.py b/objects/providers.py index 8ef5a46f..7857cd4c 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -101,8 +101,8 @@ class Factory(Provider): def __init__(self, provides, *injections): """Initializer.""" - if not isinstance(provides, class_types): - raise Error('Factory provider expects to get class, ' + + if not callable(provides): + raise Error('Factory provider expects to get callable, ' + 'got {0} instead'.format(str(provides))) self._provides = provides self._kwargs = tuple((injection @@ -151,10 +151,10 @@ class Singleton(Provider): __slots__ = ('_instance', '_factory') - def __init__(self, *args, **kwargs): + def __init__(self, provides, *injections): """Initializer.""" self._instance = None - self._factory = Factory(*args, **kwargs) + self._factory = Factory(provides, *injections) super(Singleton, self).__init__() def _provide(self, *args, **kwargs): diff --git a/tests/test_providers.py b/tests/test_providers.py index 77843d33..16c9bf16 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -186,8 +186,12 @@ class FactoryTests(unittest.TestCase): """Test `is_provider` check.""" self.assertTrue(is_provider(Factory(self.Example))) - def test_init_with_not_class(self): - """Test creation of provider with not a class.""" + def test_init_with_callable(self): + """Test creation of provider with a callable.""" + self.assertTrue(Factory(credits)) + + def test_init_with_not_callable(self): + """Test creation of provider with not a callable.""" self.assertRaises(Error, Factory, 123) def test_call(self): From 878f1d49aac36b634b1ad0f14853856dfec8d99e Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Fri, 24 Jul 2015 12:21:27 +0300 Subject: [PATCH 72/73] Removing old examples --- examples/delegate.py | 56 --------------- examples/readme2/instance_providers.py | 24 ------- .../instance_providers_with_injections.py | 45 ------------ examples/readme2/overriding_providers.py | 66 ------------------ examples/singleton_and_factory.py | 68 ------------------- 5 files changed, 259 deletions(-) delete mode 100644 examples/delegate.py delete mode 100644 examples/readme2/instance_providers.py delete mode 100644 examples/readme2/instance_providers_with_injections.py delete mode 100644 examples/readme2/overriding_providers.py delete mode 100644 examples/singleton_and_factory.py diff --git a/examples/delegate.py b/examples/delegate.py deleted file mode 100644 index b54debc6..00000000 --- a/examples/delegate.py +++ /dev/null @@ -1,56 +0,0 @@ -"""Provider delegation example.""" - -from objects.catalog import AbstractCatalog - -from objects.providers import Factory -from objects.providers import Singleton - -from objects.injections import KwArg -from objects.injections import Attribute - -import sqlite3 - - -class ObjectA(object): - - """Example class ObjectA, that has dependency on database.""" - - def __init__(self, db): - """Initializer.""" - self.db = db - - -class ObjectB(object): - - """Example class ObjectB, that has dependency on ObjectA provider.""" - - def __init__(self, a_provider): - """Initializer.""" - self.a_provider = a_provider - - -class Catalog(AbstractCatalog): - - """Catalog of objects providers.""" - - database = Singleton(sqlite3.Connection, - KwArg('database', ':memory:'), - Attribute('row_factory', sqlite3.Row)) - """:type: (objects.Provider) -> sqlite3.Connection""" - - object_a = Factory(ObjectA, - KwArg('db', database)) - """:type: (objects.Provider) -> ObjectA""" - - object_b = Singleton(ObjectB, - KwArg('a_provider', object_a.delegate())) - """:type: (objects.Provider) -> ObjectB""" - - -# Catalog static provides. -b = Catalog.object_b() -a1, a2 = b.a_provider(), b.a_provider() - -# Some asserts. -assert a1 is not a2 -assert a1.db is a2.db is Catalog.database() diff --git a/examples/readme2/instance_providers.py b/examples/readme2/instance_providers.py deleted file mode 100644 index 1be9acb2..00000000 --- a/examples/readme2/instance_providers.py +++ /dev/null @@ -1,24 +0,0 @@ -"""`Factory` and `Singleton` providers example.""" - -from objects.providers import Factory -from objects.providers import Singleton - - -# Factory provider creates new instance of specified class on every call. -object_factory = Factory(object) - -object_1 = object_factory() -object_2 = object_factory() - -assert object_1 is not object_2 -assert isinstance(object_1, object) and isinstance(object_2, object) - -# Singleton provider creates new instance of specified class on first call -# and returns same instance on every next call. -single_object = Singleton(object) - -single_object_1 = single_object() -single_object_2 = single_object() - -assert single_object_1 is single_object_2 -assert isinstance(object_1, object) and isinstance(object_2, object) diff --git a/examples/readme2/instance_providers_with_injections.py b/examples/readme2/instance_providers_with_injections.py deleted file mode 100644 index 45d25859..00000000 --- a/examples/readme2/instance_providers_with_injections.py +++ /dev/null @@ -1,45 +0,0 @@ -"""`Factory` and `Singleton` providers with injections example.""" - -import sqlite3 - -from objects.providers import Singleton -from objects.providers import Factory - -from objects.injections import KwArg -from objects.injections import Attribute - - -class ObjectA(object): - - """ObjectA has dependency on database.""" - - def __init__(self, database): - """Initializer. - - Database dependency need to be injected via init arg.""" - self.database = database - - def get_one(self): - """Select one from database and return it.""" - return self.database.execute('SELECT 1').fetchone()[0] - - -# Database and `ObjectA` providers. -database = Singleton(sqlite3.Connection, - KwArg('database', ':memory:'), - KwArg('timeout', 30), - KwArg('detect_types', True), - KwArg('isolation_level', 'EXCLUSIVE'), - Attribute('row_factory', sqlite3.Row)) - -object_a_factory = Factory(ObjectA, - KwArg('database', database)) - -# Creating several `ObjectA` instances. -object_a_1 = object_a_factory() -object_a_2 = object_a_factory() - -# Making some asserts. -assert object_a_1 is not object_a_2 -assert object_a_1.database is object_a_2.database is database() -assert object_a_1.get_one() == object_a_2.get_one() == 1 diff --git a/examples/readme2/overriding_providers.py b/examples/readme2/overriding_providers.py deleted file mode 100644 index 38361df7..00000000 --- a/examples/readme2/overriding_providers.py +++ /dev/null @@ -1,66 +0,0 @@ -"""Providers overriding example.""" - -import sqlite3 - -from objects.providers import Factory -from objects.providers import Singleton - -from objects.injections import KwArg -from objects.injections import Attribute - - -class ObjectA(object): - - """ObjectA has dependency on database.""" - - def __init__(self, database): - """Initializer. - - Database dependency need to be injected via init arg.""" - self.database = database - - def get_one(self): - """Select one from database and return it.""" - return self.database.execute('SELECT 1') - - -class ObjectAMock(ObjectA): - - """Mock of ObjectA. - - Has no dependency on database. - """ - - def __init__(self): - """Initializer.""" - - def get_one(self): - """Select one from database and return it. - - Mock makes no database queries and always returns two instead of one. - """ - return 2 - - -# Database and `ObjectA` providers. -database = Singleton(sqlite3.Connection, - KwArg('database', ':memory:'), - KwArg('timeout', 30), - KwArg('detect_types', True), - KwArg('isolation_level', 'EXCLUSIVE'), - Attribute('row_factory', sqlite3.Row)) - -object_a_factory = Factory(ObjectA, - KwArg('database', database)) - - -# Overriding `ObjectA` provider with `ObjectAMock` provider. -object_a_factory.override(Factory(ObjectAMock)) - -# Creating several `ObjectA` instances. -object_a_1 = object_a_factory() -object_a_2 = object_a_factory() - -# Making some asserts. -assert object_a_1 is not object_a_2 -assert object_a_1.get_one() == object_a_2.get_one() == 2 diff --git a/examples/singleton_and_factory.py b/examples/singleton_and_factory.py deleted file mode 100644 index 6a8b4f70..00000000 --- a/examples/singleton_and_factory.py +++ /dev/null @@ -1,68 +0,0 @@ -"""Providers delegation example.""" - -from objects.providers import Factory -from objects.providers import Singleton -from objects.providers import Delegate - -from objects.injections import KwArg - - -class User(object): - - """Example class User.""" - - def __init__(self, id, name): - """Initializer. - - :param id: int - :param name: str - :return: - """ - self.id = id - self.name = name - - -class UserService(object): - - """Example class UserService. - - UserService has dependency on users factory. - """ - - def __init__(self, users_factory): - """Initializer. - - :param users_factory: objects.providers.Factory - :return: - """ - self.users_factory = users_factory - - def get_by_id(self, id): - """Return user info by user id.""" - return self.users_factory(id=id, name=self._get_name_from_db(id)) - - def _get_name_from_db(self, id): - """Return user's name from database by his id. - - Main purpose of this method is just to show the fact of retrieving - some user's data from database, so, actually, it simulates work - with database just by merging constant string with provided user's id. - """ - return ''.join(('user', str(id))) - - -# Users factory and UserService provider: -users_factory = Factory(User) -users_service = Singleton(UserService, - KwArg('users_factory', Delegate(users_factory))) - -# Creating several User objects: -user1 = users_service().get_by_id(1) -user2 = users_service().get_by_id(2) - -# Making some asserts: -assert user1.id == 1 -assert user1.name == 'user1' - -assert user2.id == 2 -assert user2.name == 'user2' From 033a97d4da991ec257c4ebfc237690d567b21681 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov <rmogilatov@gmail.com> Date: Fri, 24 Jul 2015 12:23:10 +0300 Subject: [PATCH 73/73] Removing old Factory&Singleton examples --- examples/readme/providers.py | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 examples/readme/providers.py diff --git a/examples/readme/providers.py b/examples/readme/providers.py deleted file mode 100644 index 1d0dff6f..00000000 --- a/examples/readme/providers.py +++ /dev/null @@ -1,22 +0,0 @@ -"""`NewInstance` and `Singleton` providers example.""" - -from objects.providers import NewInstance -from objects.providers import Singleton - - -# NewInstance provider creates new instance of specified class on every call. -new_object = NewInstance(object) - -object_1 = new_object() -object_2 = new_object() - -assert object_1 is not object_2 - -# Singleton provider creates new instance of specified class on first call -# and returns same instance on every next call. -single_object = Singleton(object) - -single_object_1 = single_object() -single_object_2 = single_object() - -assert single_object_1 is single_object_2