Renaming NewInstance provider to Factory provider

This commit is contained in:
Roman Mogilatov 2015-05-14 11:35:41 +03:00
parent 405c579f7e
commit c824eae566
5 changed files with 55 additions and 43 deletions

View File

@ -7,7 +7,7 @@ from .catalog import AbstractCatalog
from .providers import Provider from .providers import Provider
from .providers import Delegate from .providers import Delegate
from .providers import NewInstance from .providers import Factory
from .providers import Singleton from .providers import Singleton
from .providers import ExternalDependency from .providers import ExternalDependency
from .providers import Class from .providers import Class
@ -32,7 +32,7 @@ __all__ = ('AbstractCatalog',
# Providers # Providers
'Provider', 'Provider',
'Delegate', 'Delegate',
'NewInstance', 'Factory',
'Singleton', 'Singleton',
'ExternalDependency', 'ExternalDependency',
'Class', 'Class',

View File

@ -69,11 +69,11 @@ class Delegate(Provider):
return self.delegated 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') __slots__ = ('provides', 'kwargs', 'attributes', 'methods')
@ -81,7 +81,7 @@ class NewInstance(Provider):
def __init__(self, provides, *injections): def __init__(self, provides, *injections):
"""Initializer.""" """Initializer."""
if not isinstance(provides, class_types): 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))) 'got {0} instead'.format(str(provides)))
self.provides = provides self.provides = provides
self.kwargs = tuple((injection self.kwargs = tuple((injection
@ -93,7 +93,7 @@ class NewInstance(Provider):
self.methods = tuple((injection self.methods = tuple((injection
for injection in injections for injection in injections
if is_method_injection(injection))) if is_method_injection(injection)))
super(NewInstance, self).__init__() super(Factory, self).__init__()
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
"""Return provided instance.""" """Return provided instance."""
@ -114,24 +114,35 @@ class NewInstance(Provider):
return instance 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.
Singleton provider will create instance once and return it on every call. Singleton provider will create instance once and return it on every call.
""" """
__slots__ = ('instance',) __slots__ = ('instance', 'factory')
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
"""Initializer.""" """Initializer."""
self.instance = None self.instance = None
super(Singleton, self).__init__(*args, **kwargs) self.factory = Factory(*args, **kwargs)
super(Singleton, self).__init__()
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
"""Return provided instance.""" """Return provided instance."""
if not self.instance: if not self.instance:
self.instance = super(Singleton, self).__call__(*args, **kwargs) self.instance = self.factory(*args, **kwargs)
return self.instance return self.instance
def reset(self): def reset(self):

View File

@ -7,7 +7,7 @@ from objects.decorators import inject
from objects.catalog import AbstractCatalog from objects.catalog import AbstractCatalog
from objects.providers import NewInstance from objects.providers import Factory
from objects.providers import Object from objects.providers import Object
from objects.providers import Value from objects.providers import Value
@ -40,14 +40,15 @@ class OverrideTests(unittest.TestCase):
self.assertEqual(self.Catalog.obj(), 1) self.assertEqual(self.Catalog.obj(), 1)
self.assertEqual(self.Catalog.another_obj(), 2) self.assertEqual(self.Catalog.another_obj(), 2)
class InjectTests(unittest.TestCase): class InjectTests(unittest.TestCase):
"""Inject decorator test cases.""" """Inject decorator test cases."""
def test_decorated(self): def test_decorated(self):
"""Test `inject()` decorated callback.""" """Test `inject()` decorated callback."""
provider1 = NewInstance(object) provider1 = Factory(object)
provider2 = NewInstance(list) provider2 = Factory(list)
@inject(KwArg('a', provider1)) @inject(KwArg('a', provider1))
@inject(KwArg('b', provider2)) @inject(KwArg('b', provider2))
@ -67,8 +68,8 @@ class InjectTests(unittest.TestCase):
def test_decorated_kwargs_priority(self): def test_decorated_kwargs_priority(self):
"""Test `inject()` decorated callback kwargs priority.""" """Test `inject()` decorated callback kwargs priority."""
provider1 = NewInstance(object) provider1 = Factory(object)
provider2 = NewInstance(list) provider2 = Factory(list)
object_a = object() object_a = object()
@inject(KwArg('a', provider1)) @inject(KwArg('a', provider1))
@ -90,7 +91,7 @@ class InjectTests(unittest.TestCase):
def test_decorated_with_args(self): def test_decorated_with_args(self):
"""Test `inject()` decorated callback with args.""" """Test `inject()` decorated callback with args."""
provider = NewInstance(list) provider = Factory(list)
object_a = object() object_a = object()
@inject(KwArg('b', provider)) @inject(KwArg('b', provider))

View File

@ -7,7 +7,7 @@ from objects.injections import KwArg
from objects.injections import Attribute from objects.injections import Attribute
from objects.injections import Method from objects.injections import Method
from objects.providers import NewInstance from objects.providers import Factory
class InjectionTests(unittest.TestCase): class InjectionTests(unittest.TestCase):
@ -27,7 +27,7 @@ class InjectionTests(unittest.TestCase):
def test_value_with_provider_injectable(self): def test_value_with_provider_injectable(self):
"""Test Injection value property with provider.""" """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) self.assertIsInstance(injection.value, object)

View File

@ -4,7 +4,7 @@ import unittest2 as unittest
from objects.providers import Provider from objects.providers import Provider
from objects.providers import Delegate from objects.providers import Delegate
from objects.providers import NewInstance from objects.providers import Factory
from objects.providers import Singleton from objects.providers import Singleton
from objects.providers import ExternalDependency from objects.providers import ExternalDependency
from objects.providers import Class from objects.providers import Class
@ -130,13 +130,13 @@ class DelegateTests(unittest.TestCase):
self.assertIs(delegated2, self.delegated) self.assertIs(delegated2, self.delegated)
class NewInstanceTests(unittest.TestCase): class FactoryTests(unittest.TestCase):
"""NewInstance test cases.""" """Factory test cases."""
class Example(object): class Example(object):
"""Example class for NewInstance provider tests.""" """Example class for Factory provider tests."""
def __init__(self, init_arg1=None, init_arg2=None): def __init__(self, init_arg1=None, init_arg2=None):
"""Initializer. """Initializer.
@ -164,15 +164,15 @@ class NewInstanceTests(unittest.TestCase):
def test_is_provider(self): def test_is_provider(self):
"""Test `is_provider` check.""" """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): def test_init_with_not_class(self):
"""Test creation of provider with not a class.""" """Test creation of provider with not a class."""
self.assertRaises(Error, NewInstance, 123) self.assertRaises(Error, Factory, 123)
def test_call(self): def test_call(self):
"""Test creation of new instances.""" """Test creation of new instances."""
provider = NewInstance(self.Example) provider = Factory(self.Example)
instance1 = provider() instance1 = provider()
instance2 = provider() instance2 = provider()
@ -182,7 +182,7 @@ class NewInstanceTests(unittest.TestCase):
def test_call_with_init_args(self): def test_call_with_init_args(self):
"""Test creation of new instances with init args injections.""" """Test creation of new instances with init args injections."""
provider = NewInstance(self.Example, provider = Factory(self.Example,
KwArg('init_arg1', 'i1'), KwArg('init_arg1', 'i1'),
KwArg('init_arg2', 'i2')) KwArg('init_arg2', 'i2'))
@ -201,7 +201,7 @@ class NewInstanceTests(unittest.TestCase):
def test_call_with_attributes(self): def test_call_with_attributes(self):
"""Test creation of new instances with attribute injections.""" """Test creation of new instances with attribute injections."""
provider = NewInstance(self.Example, provider = Factory(self.Example,
Attribute('attribute1', 'a1'), Attribute('attribute1', 'a1'),
Attribute('attribute2', 'a2')) Attribute('attribute2', 'a2'))
@ -220,7 +220,7 @@ class NewInstanceTests(unittest.TestCase):
def test_call_with_methods(self): def test_call_with_methods(self):
"""Test creation of new instances with method injections.""" """Test creation of new instances with method injections."""
provider = NewInstance(self.Example, provider = Factory(self.Example,
Method('method1', 'm1'), Method('method1', 'm1'),
Method('method2', 'm2')) Method('method2', 'm2'))
@ -239,7 +239,7 @@ class NewInstanceTests(unittest.TestCase):
def test_call_with_context_args(self): def test_call_with_context_args(self):
"""Test creation of new instances with context args.""" """Test creation of new instances with context args."""
provider = NewInstance(self.Example) provider = Factory(self.Example)
instance = provider(11, 22) instance = provider(11, 22)
self.assertEqual(instance.init_arg1, 11) self.assertEqual(instance.init_arg1, 11)
@ -247,7 +247,7 @@ class NewInstanceTests(unittest.TestCase):
def test_call_with_context_kwargs(self): def test_call_with_context_kwargs(self):
"""Test creation of new instances with context kwargs.""" """Test creation of new instances with context kwargs."""
provider = NewInstance(self.Example, provider = Factory(self.Example,
KwArg('init_arg1', 1)) KwArg('init_arg1', 1))
instance1 = provider(init_arg2=22) instance1 = provider(init_arg2=22)
@ -260,9 +260,9 @@ class NewInstanceTests(unittest.TestCase):
def test_call_overridden(self): def test_call_overridden(self):
"""Test creation of new instances on overridden provider.""" """Test creation of new instances on overridden provider."""
provider = NewInstance(self.Example) provider = Factory(self.Example)
overriding_provider1 = NewInstance(dict) overriding_provider1 = Factory(dict)
overriding_provider2 = NewInstance(list) overriding_provider2 = Factory(list)
provider.override(overriding_provider1) provider.override(overriding_provider1)
provider.override(overriding_provider2) provider.override(overriding_provider2)
@ -323,12 +323,12 @@ class ExternalDependencyTests(unittest.TestCase):
def test_call_overridden(self): def test_call_overridden(self):
"""Test call of overridden external dependency.""" """Test call of overridden external dependency."""
self.provider.override(NewInstance(list)) self.provider.override(Factory(list))
self.assertIsInstance(self.provider(), list) self.assertIsInstance(self.provider(), list)
def test_call_overridden_but_not_instance_of(self): def test_call_overridden_but_not_instance_of(self):
"""Test call of overridden external dependency, but not instance of.""" """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) self.assertRaises(Error, self.provider)
def test_call_not_overridden(self): def test_call_not_overridden(self):