From 039e211a09e2bcd3af3fbd6333b7a0c8827c5b2a Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Mon, 23 Feb 2015 00:16:27 +0200 Subject: [PATCH] 0.4.1 adding provider delegate --- VERSION | 2 +- examples/delegate.py | 52 ++++++++++++++++++++++++++++++++++++++++++++ objects/providers.py | 6 +++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 examples/delegate.py diff --git a/VERSION b/VERSION index 9e11b32f..267577d4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.1 +0.4.1 diff --git a/examples/delegate.py b/examples/delegate.py new file mode 100644 index 00000000..426952a6 --- /dev/null +++ b/examples/delegate.py @@ -0,0 +1,52 @@ +""" +Example of providers delegate. +""" + +from objects import AbstractCatalog +from objects.providers import Singleton +from objects.providers import NewInstance +from objects.injections import InitArg +from objects.injections import Attribute + + +import sqlite3 + + +# Some example classes. +class ObjectA(object): + def __init__(self, db): + self.db = db + + +class ObjectB(object): + def __init__(self, a_factory): + self.a_factory = a_factory + + +# Catalog of objects providers. +class Catalog(AbstractCatalog): + """ + Objects catalog. + """ + + database = Singleton(sqlite3.Connection, + InitArg('database', ':memory:'), + Attribute('row_factory', sqlite3.Row)) + """ :type: (objects.Provider) -> sqlite3.Connection """ + + object_a = NewInstance(ObjectA, + InitArg('db', database)) + """ :type: (objects.Provider) -> ObjectA """ + + object_b = Singleton(ObjectB, + InitArg('a_factory', object_a.delegate())) + """ :type: (objects.Provider) -> ObjectB """ + + +# Catalog static provides. +b = Catalog.object_b() +a1, a2 = b.a_factory(), b.a_factory() + +# Some asserts. +assert a1 is not a2 +assert a1.db is a2.db is Catalog.database() diff --git a/objects/providers.py b/objects/providers.py index abbf75da..7f415d6f 100644 --- a/objects/providers.py +++ b/objects/providers.py @@ -32,6 +32,12 @@ class Provider(object): """ self.__overridden_by__.append(provider) + def delegate(self): + """ + Returns provider delegate. + """ + return lambda *args, **kwargs: self.__call__(*args, **kwargs) + def prepare_injections(injections): """