Add FactoryAggregate provider implementation

This commit is contained in:
Roman Mogylatov 2017-10-12 19:43:22 -07:00
parent 81ac0f903b
commit bbc909f2fa
4 changed files with 4200 additions and 9140 deletions

View File

@ -1349,7 +1349,7 @@ static struct __pyx_vtabstruct_19dependency_injector_9providers_FactoryDelegate
struct __pyx_vtabstruct_19dependency_injector_9providers_FactoryAggregate { struct __pyx_vtabstruct_19dependency_injector_9providers_FactoryAggregate {
struct __pyx_vtabstruct_19dependency_injector_9providers_Provider __pyx_base; struct __pyx_vtabstruct_19dependency_injector_9providers_Provider __pyx_base;
PyObject *(*__pyx___get_factory)(struct __pyx_obj_19dependency_injector_9providers_FactoryAggregate *, PyObject *); struct __pyx_obj_19dependency_injector_9providers_Factory *(*__pyx___get_factory)(struct __pyx_obj_19dependency_injector_9providers_FactoryAggregate *, PyObject *);
}; };
static struct __pyx_vtabstruct_19dependency_injector_9providers_FactoryAggregate *__pyx_vtabptr_19dependency_injector_9providers_FactoryAggregate; static struct __pyx_vtabstruct_19dependency_injector_9providers_FactoryAggregate *__pyx_vtabptr_19dependency_injector_9providers_FactoryAggregate;

File diff suppressed because it is too large Load Diff

View File

@ -96,7 +96,7 @@ cdef class FactoryDelegate(Delegate):
cdef class FactoryAggregate(Provider): cdef class FactoryAggregate(Provider):
cdef dict __factories cdef dict __factories
cdef object __get_factory(self, str factory_name) cdef Factory __get_factory(self, str factory_name)
# Singleton providers # Singleton providers

View File

@ -1115,7 +1115,7 @@ cdef class FactoryDelegate(Delegate):
cdef class FactoryAggregate(Provider): cdef class FactoryAggregate(Provider):
"""Aggregate of factory providers. """Factory providers aggregate.
:py:class:`FactoryAggregate` is an aggregate of :py:class:`Factory` :py:class:`FactoryAggregate` is an aggregate of :py:class:`Factory`
providers. providers.
@ -1123,11 +1123,9 @@ cdef class FactoryAggregate(Provider):
:py:class:`FactoryAggregate` is a delegated provider, meaning that it is :py:class:`FactoryAggregate` is a delegated provider, meaning that it is
injected "as is". injected "as is".
Also, while :py:class:`FactoryAggregate` is a sort of container for other All aggregated factories could be retrieved as a read-only
factories, it is not callable and it does not support overriding. dictionary :py:attr:`FactoryAggregate.factories` or just as an attribute of
:py:class:`FactoryAggregate`.
However, all aggregated factories could be retrieved as an attributes and
could be used without any limitations.
""" """
__IS_DELEGATED__ = True __IS_DELEGATED__ = True
@ -1146,36 +1144,29 @@ cdef class FactoryAggregate(Provider):
self.__factories = factories self.__factories = factories
super(FactoryAggregate, self).__init__() super(FactoryAggregate, self).__init__()
def __call__(self): def __call__(self, factory_name, *args, **kwargs):
"""Return provided object. """Create new object using factory with provided name.
Callable interface implementation. Callable interface implementation.
""" """
raise Error('{0} is not callable'.format(self.__class__)) return self.__get_factory(factory_name)(*args, **kwargs)
def __getattr__(self, factory_name): def __getattr__(self, factory_name):
"""Return factory by factory name.""" """Return aggregated factory."""
return self.__get_factory(factory_name) return self.__get_factory(factory_name)
def __str__(self):
"""Return string representation of provider.
:rtype: str
"""
return represent_provider(provider=self, provides=self.factories)
@property @property
def factories(self): def factories(self):
"""Return dictionary of factories, read-only.""" """Return dictionary of factories, read-only."""
return self.__factories return self.__factories
def create(self, factory_name, *args, **kwargs):
"""Create object using factory that is associated with provided name.
:param factory_name: Name of factory.
:type factory_name: str
:param args: Tuple of positional argument injections.
:type args: tuple[object]
:param kwargs: Dictionary of context keyword argument injections.
:type kwargs: dict[str, object]
"""
return self.__get_factory(factory_name)(*args, **kwargs)
def override(self, _): def override(self, _):
"""Override provider with another provider. """Override provider with another provider.
@ -1187,14 +1178,15 @@ cdef class FactoryAggregate(Provider):
:return: Overriding context. :return: Overriding context.
:rtype: :py:class:`OverridingContext` :rtype: :py:class:`OverridingContext`
""" """
raise Error('{0} can not be overridden'.format(self.__class__)) raise Error(
'{0} providers could not be overridden'.format(self.__class__))
cdef object __get_factory(self, str factory_name): cdef Factory __get_factory(self, str factory_name):
if factory_name not in self.__factories: if factory_name not in self.__factories:
raise NoSuchProviderError( raise NoSuchProviderError(
'{0} does not contain factory with name {1}'.format( '{0} does not contain factory with name {1}'.format(
self, factory_name)) self, factory_name))
return self.__factories[factory_name] return <Factory> self.__factories[factory_name]
cdef class BaseSingleton(Provider): cdef class BaseSingleton(Provider):