Beispiel #1
0
    def test_if_get_or_default_returns_default_when_no_object_for_given_key(self):
        locator = ObjectLocator()

        ret1 = locator.get_or_default(TEST_CLASS_1_NAME, 'default')

        assert isinstance(ret1, str)
        assert ret1 == 'default'
Beispiel #2
0
 def __init__(self, name='', locator=None):
     if locator is not None:
         if not isinstance(locator, LocatorBase):
             raise TypeError('locator must be instance of class derived from %s' % LocatorBase.__class__.__name__)
         self._locator = locator
     else:
         self._locator = ObjectLocator()
     self._name = name
Beispiel #3
0
    def test_if_get_or_default_returns_default_when_no_object_for_given_key(
            self):
        locator = ObjectLocator()

        ret1 = locator.get_or_default(TEST_CLASS_1_NAME, 'default')

        assert isinstance(ret1, str)
        assert ret1 == 'default'
Beispiel #4
0
    def test_if_locator_returns_keys_for_registered_objects(self):
        locator = ObjectLocator()
        locator.register('key', 'value')

        keys = locator.get_keys()

        assert 'key' in keys
        assert len(keys) == 1
Beispiel #5
0
    def test_if_locator_returns_keys_for_registered_objects(self):
        locator = ObjectLocator()
        locator.register('key', 'value')

        keys = locator.get_keys()

        assert 'key' in keys
        assert len(keys) == 1
Beispiel #6
0
    def test_if_is_registered_returns_true_for_registered_providers(self):
        locator = ObjectLocator()
        test_object = TestClass1()

        locator.register(TEST_CLASS_1_NAME, test_object)

        assert locator.is_key_registered(TEST_CLASS_1_NAME)
        assert not locator.is_key_registered(test_object)
Beispiel #7
0
    def test_if_registering_duplicate_entry_raises_exception(self):
        locator = ObjectLocator()
        test_object = TestClass1()

        locator.register(TEST_CLASS_1_NAME, test_object)

        with pytest.raises(KeyError):
            locator.register(TEST_CLASS_1_NAME, test_object)
Beispiel #8
0
    def test_if_registered_object_is_resolved_by_key(self):
        localtor = ObjectLocator()
        test_object = TestClass1()

        localtor.register(TEST_CLASS_1_NAME, test_object)
        instance = localtor.locate(TEST_CLASS_1_NAME)

        assert instance is not None
        assert test_object is instance
Beispiel #9
0
    def test_if_class_can_be_used_as_key(self):
        locator = ObjectLocator()
        test_object = TestClass1()

        locator.register(TestClass1, test_object)
        instance = locator.locate(TestClass1)

        assert instance is not None
        assert isinstance(instance, TestClass1)
Beispiel #10
0
    def test_if_registered_object_is_resolved_by_key(self):
        localtor = ObjectLocator()
        test_object = TestClass1()

        localtor.register(TEST_CLASS_1_NAME, test_object)
        instance = localtor.locate(TEST_CLASS_1_NAME)

        assert instance is not None
        assert test_object is instance
Beispiel #11
0
    def test_if_class_can_be_used_as_key(self):
        locator = ObjectLocator()
        test_object = TestClass1()

        locator.register(TestClass1, test_object)
        instance = locator.locate(TestClass1)

        assert instance is not None
        assert isinstance(instance, TestClass1)
Beispiel #12
0
    def test_if_get_or_default_returns_registered_object(self):
        locator = ObjectLocator()
        test_object = TestClass1()

        locator.register(TEST_CLASS_1_NAME, test_object)

        ret1 = locator.get_or_default(TEST_CLASS_1_NAME, 'default')

        assert isinstance(ret1, TestClass1)
        assert ret1 is test_object
Beispiel #13
0
    def test_if_get_or_default_returns_registered_object(self):
        locator = ObjectLocator()
        test_object = TestClass1()

        locator.register(TEST_CLASS_1_NAME, test_object)

        ret1 = locator.get_or_default(TEST_CLASS_1_NAME, 'default')

        assert isinstance(ret1, TestClass1)
        assert ret1 is test_object
Beispiel #14
0
class SimpleContainer(object):
    def __init__(self, name='', locator=None):
        if locator is not None:
            if not isinstance(locator, LocatorBase):
                raise TypeError('locator must be instance of class derived from %s' % LocatorBase.__class__.__name__)
            self._locator = locator
        else:
            self._locator = ObjectLocator()
        self._name = name

    def register_object(self, key, obj):
        provider = providers.ObjectProvider(obj)
        self._register_provider_for_key(key, provider)

    def register_callable(self, key, callable_object, lifetime=InstanceLifetime.NewInstancePerCall):
        if lifetime == InstanceLifetime.NewInstancePerCall:
            provider = providers.NewInstancesProvider(callable_object)
        elif lifetime == InstanceLifetime.SingletonEager:
            provider = providers.EagerSingleInstanceProvider(callable_object)
        elif lifetime == InstanceLifetime.SingletonLazy:
            provider = providers.LazySingleInstanceProvider(callable_object)
        else:
            raise TypeError('Unsuported instance lifetime.')

        self._register_provider_for_key(key, provider)

    def register_callable_with_deps(self, key, callable_object, lifetime=InstanceLifetime.NewInstancePerCall):
        if lifetime == InstanceLifetime.NewInstancePerCall:
            provider = providers.NewInstancesWithDepsProvider(callable_object, self)
        elif lifetime == InstanceLifetime.SingletonEager:
            provider = providers.EagerSingleInstanceWithDepsProvider(callable_object, self)
        elif lifetime == InstanceLifetime.SingletonLazy:
            provider = providers.LazySingleInstanceWithDepsProvider(callable_object, self)
        else:
            raise TypeError('Unsuported instance lifetime.')

        self._register_provider_for_key(key, provider)

    def get(self, key):
        return self._resolve(key)

    def build(self, cls):
        provider = providers.NewInstancesWithDepsProvider(cls, self)
        return provider.get()

    @property
    def name(self):
        return self._name

    def _resolve(self, key):
        return self._locator.get(key).get()

    def _register_provider_for_key(self, id, provider):
        self._locator.register(id, provider)
Beispiel #15
0
    def test_registering_class(self):
        locator = ObjectLocator()
        container_class = self.get_container()
        container = container_class(locator=locator)
        container.register_callable(TEST_CLASS_1_NAME, TestClass1)

        ret1 = locator.is_key_registered(TEST_CLASS_1_NAME)
        assert ret1 is True

        ret2 = container.resolve(TEST_CLASS_1_NAME)
        ret3 = container.resolve(TEST_CLASS_1_NAME)

        assert isinstance(ret2, TestClass1)
        assert ret2 is not ret3
Beispiel #16
0
    def test_registering_class(self):
        locator = ObjectLocator()
        container_class = self.get_container()
        container = container_class(locator=locator)
        container.register_callable(TEST_CLASS_1_NAME, TestClass1)

        ret1 = locator.is_key_registered(TEST_CLASS_1_NAME)
        assert ret1 is True

        ret2 = container.resolve(TEST_CLASS_1_NAME)
        ret3 = container.resolve(TEST_CLASS_1_NAME)

        assert isinstance(ret2, TestClass1)
        assert ret2 is not ret3
Beispiel #17
0
    def __init__(self, name='', locator=None):
        """
        Raises TypeError when locator object is not derived from LocatorBase class.

        :param name: Name for a container.
        :param locator: Locator instance that will be used for storing objects in the container.
        """
        if locator is not None:
            if not isinstance(locator, LocatorBase):
                raise TypeError(
                    'locator must be instance of class derived from %s' %
                    LocatorBase.__class__.__name__)
            self._locator = locator
        else:
            self._locator = ObjectLocator()
        self._name = name
Beispiel #18
0
    def test_registering_singleton(self):
        locator = ObjectLocator()
        container_class = self.get_container()
        container = container_class()
        container._locator = locator
        container.register_callable(TEST_CLASS_1_NAME,
                                    TestClass1,
                                    lifetime=InstanceLifetime.SingletonLazy)

        ret1 = locator.is_key_registered(TEST_CLASS_1_NAME)
        assert ret1 is True

        ret2 = container.get(TEST_CLASS_1_NAME)
        ret3 = container.get(TEST_CLASS_1_NAME)

        assert isinstance(ret2, TestClass1)
        assert id(ret2) == id(ret3)
Beispiel #19
0
    def test_registering_function_as_object(self):
        locator = ObjectLocator()
        container_class = self.get_container()
        container = container_class()
        container._locator = locator
        container.register_object(TEST_FUNC_1_NAME, TestFunc1)

        ret1 = container.get(TEST_FUNC_1_NAME)
        assert ret1 is not None
        assert isinstance(ret1, type(TestFunc1))
Beispiel #20
0
    def test_if_is_registered_returns_true_for_registered_providers(self):
        locator = ObjectLocator()
        test_object = TestClass1()

        locator.register(TEST_CLASS_1_NAME, test_object)

        assert locator.is_key_registered(TEST_CLASS_1_NAME)
        assert not locator.is_key_registered(test_object)
Beispiel #21
0
    def test_if_registering_duplicate_entry_raises_exception(self):
        locator = ObjectLocator()
        test_object = TestClass1()

        locator.register(TEST_CLASS_1_NAME, test_object)

        with pytest.raises(KeyError):
            locator.register(TEST_CLASS_1_NAME, test_object)
Beispiel #22
0
    def __init__(self, name='', locator=None):
        """
        Raises TypeError when locator object is not derived from LocatorBase class.

        :param name: Name for a container.
        :param locator: Locator instance that will be used for storing objects in the container.
        """
        if locator is not None:
            if not isinstance(locator, LocatorBase):
                raise TypeError('locator must be instance of class derived from %s' % LocatorBase.__class__.__name__)
            self._locator = locator
        else:
            self._locator = ObjectLocator()
        self._name = name
Beispiel #23
0
    def test_if_resolving_unregistered_object_raises_exception(self):
        locator = ObjectLocator()

        with pytest.raises(KeyError):
            locator.locate(TEST_CLASS_1_NAME)
Beispiel #24
0
class SimpleContainer(object):
    """
    a
    """

    def __init__(self, name='', locator=None):
        """
        Raises TypeError when locator object is not derived from LocatorBase class.

        :param name: Name for a container.
        :param locator: Locator instance that will be used for storing objects in the container.
        """
        if locator is not None:
            if not isinstance(locator, LocatorBase):
                raise TypeError('locator must be instance of class derived from %s' % LocatorBase.__class__.__name__)
            self._locator = locator
        else:
            self._locator = ObjectLocator()
        self._name = name

    def register_object(self, key, obj):
        """
        Registers object for a given key.

        :param key: Key under which the object will be registered
        :param obj: Object
        """
        provider = providers.ObjectProvider(obj)
        self._register_provider_for_key(key, provider)

    def register_callable(self, key, callable_object, lifetime=InstanceLifetime.NewInstancePerCall):
        """
        Registers a callable object that will be used to create a new instance of an object that will be returned upon
        calling the get_instance() method.

        Based on the lifetime parameter, either the callable will be stored, and called whenever object is needed, or
        the callable will be called on registering, and the returned object will be stored.

        :param key:
        :param callable_object: Callable object that will be used to create new object.
        :param lifetime: Specified lifetime of an object that is produced by callable.
        :return:
        """
        if lifetime == InstanceLifetime.NewInstancePerCall:
            provider = providers.NewInstancesProvider(callable_object)
        elif lifetime == InstanceLifetime.Singleton:
            provider = providers.LazySingleInstanceProvider(callable_object)
        else:
            raise TypeError('Unsupported instance lifetime.')

        self._register_provider_for_key(key, provider)

    def register_callable_with_deps(self, key, callable_object, lifetime=InstanceLifetime.NewInstancePerCall):
        if lifetime == InstanceLifetime.NewInstancePerCall:
            provider = providers.NewInstancesWithDepsProvider(callable_object, self)
        elif lifetime == InstanceLifetime.Singleton:
            provider = providers.LazySingleInstanceWithDepsProvider(callable_object, self)
        else:
            raise TypeError('Unsupported instance lifetime.')

        self._register_provider_for_key(key, provider)

    def resolve(self, key, context=None):
        """
        Return instance based on what was registered for a given key.

        :param key: Key under which the object or callable was registered.
        :return: Instance related to that key.
        """
        return self._resolve(key, context)

    def build(self, cls, context=None):
        """
        Build a new instance of class cls injecting dependencies of an object from objects registered in the container.

        :param cls: Class of which object to build.
        :return:
        """
        provider = providers.NewInstancesWithDepsProvider(cls, self)
        return provider.get_instance(context)

    @property
    def name(self):
        """
        The name of the container.

        :return: str with the name of the container.
        """
        return self._name

    def get_keys(self):
        """
        Get all keys registered in that container.

        :return: List of all keys registered in that container.
        """
        return self._locator.get_keys()

    def _resolve(self, key, context=None):
        if context:
            try:
                item = context[key]
            except KeyError:
                pass
            else:
                return item

        instance_provider = self._locator.locate(key)
        return instance_provider.get_instance(context)

    def _register_provider_for_key(self, id, provider):
        self._locator.register(id, provider)
Beispiel #25
0
class SimpleContainer(object):
    """
    a
    """
    def __init__(self, name='', locator=None):
        """
        Raises TypeError when locator object is not derived from LocatorBase class.

        :param name: Name for a container.
        :param locator: Locator instance that will be used for storing objects in the container.
        """
        if locator is not None:
            if not isinstance(locator, LocatorBase):
                raise TypeError(
                    'locator must be instance of class derived from %s' %
                    LocatorBase.__class__.__name__)
            self._locator = locator
        else:
            self._locator = ObjectLocator()
        self._name = name

    def register_object(self, key, obj):
        """
        Registers object for a given key.

        :param key: Key under which the object will be registered
        :param obj: Object
        """
        provider = providers.ObjectProvider(obj)
        self._register_provider_for_key(key, provider)

    def register_callable(self,
                          key,
                          callable_object,
                          lifetime=InstanceLifetime.NewInstancePerCall):
        """
        Registers a callable object that will be used to create a new instance of an object that will be returned upon
        calling the get_instance() method.

        Based on the lifetime parameter, either the callable will be stored, and called whenever object is needed, or
        the callable will be called on registering, and the returned object will be stored.

        :param key:
        :param callable_object: Callable object that will be used to create new object.
        :param lifetime: Specified lifetime of an object that is produced by callable.
        :return:
        """
        if lifetime == InstanceLifetime.NewInstancePerCall:
            provider = providers.NewInstancesProvider(callable_object)
        elif lifetime == InstanceLifetime.Singleton:
            provider = providers.LazySingleInstanceProvider(callable_object)
        else:
            raise TypeError('Unsupported instance lifetime.')

        self._register_provider_for_key(key, provider)

    def register_callable_with_deps(
            self,
            key,
            callable_object,
            lifetime=InstanceLifetime.NewInstancePerCall):
        if lifetime == InstanceLifetime.NewInstancePerCall:
            provider = providers.NewInstancesWithDepsProvider(
                callable_object, self)
        elif lifetime == InstanceLifetime.Singleton:
            provider = providers.LazySingleInstanceWithDepsProvider(
                callable_object, self)
        else:
            raise TypeError('Unsupported instance lifetime.')

        self._register_provider_for_key(key, provider)

    def resolve(self, key, context=None):
        """
        Return instance based on what was registered for a given key.

        :param key: Key under which the object or callable was registered.
        :return: Instance related to that key.
        """
        return self._resolve(key, context)

    def build(self, cls, context=None):
        """
        Build a new instance of class cls injecting dependencies of an object from objects registered in the container.

        :param cls: Class of which object to build.
        :return:
        """
        provider = providers.NewInstancesWithDepsProvider(cls, self)
        return provider.get_instance(context)

    @property
    def name(self):
        """
        The name of the container.

        :return: str with the name of the container.
        """
        return self._name

    def get_keys(self):
        """
        Get all keys registered in that container.

        :return: List of all keys registered in that container.
        """
        return self._locator.get_keys()

    def _resolve(self, key, context=None):
        if context:
            try:
                item = context[key]
            except KeyError:
                pass
            else:
                return item

        instance_provider = self._locator.locate(key)
        return instance_provider.get_instance(context)

    def _register_provider_for_key(self, id, provider):
        self._locator.register(id, provider)
Beispiel #26
0
    def test_if_resolving_unregistered_object_raises_exception(self):
        locator = ObjectLocator()

        with pytest.raises(KeyError):
            locator.locate(TEST_CLASS_1_NAME)