From e1009373bc9fc74bfc2c1c2071bce3546087e949 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Tue, 31 Mar 2015 12:37:16 +0300 Subject: [PATCH] Adding injections example --- README.md | 52 +++++++++++++++++++++++++++++++++-- examples/readme/injections.py | 45 ++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 examples/readme/injections.py diff --git a/README.md b/README.md index bdfd5026..d565d466 100644 --- a/README.md +++ b/README.md @@ -73,12 +73,60 @@ arguments, other are using attributes or methods to be initialized. Injection, in terms of `Objects`, is an instruction how to provide dependency for the particular object. -Every Python object could be an injection value. Special case is a `Objects` -provider as an injection value. In such case, injection value is a result of +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). Injections are used by providers. +```python +"""`KwArg` and `Attribute` 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 +assert object_a_1.get_one() == object_a_2.get_one() == 1 +``` + ### Catalogs Catalogs are named set of providers. diff --git a/examples/readme/injections.py b/examples/readme/injections.py new file mode 100644 index 00000000..52590a7e --- /dev/null +++ b/examples/readme/injections.py @@ -0,0 +1,45 @@ +"""`KwArg` and `Attribute` 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 +assert object_a_1.get_one() == object_a_2.get_one() == 1