Implement traversal for all providers

This commit is contained in:
Roman Mogylatov 2021-01-30 07:58:18 -05:00
parent 90c6759975
commit 0d4b9574e6
2 changed files with 8141 additions and 3837 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1484,7 +1484,9 @@ cdef class ConfigurationOption(Provider):
@property
def providers_traversal(self):
"""Return providers traversal generator."""
# TODO: revise
yield from filter(is_provider, self.__name)
yield from [self.__root]
yield from self.__children.values()
yield from super().providers_traversal
def _is_strict_mode_enabled(self):
@ -1808,6 +1810,12 @@ cdef class Configuration(Object):
self.override(value)
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield from self.__children.values()
yield from super().providers_traversal
def _is_strict_mode_enabled(self):
return self.__strict
@ -2195,6 +2203,12 @@ cdef class FactoryAggregate(Provider):
raise Error(
'{0} providers could not be overridden'.format(self.__class__))
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield from self.__factories.values()
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
try:
factory_name = args[0]
@ -2368,6 +2382,12 @@ cdef class BaseSingleton(Provider):
"""
raise NotImplementedError()
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield self.__instantiator
yield from super().providers_traversal
def _async_init_instance(self, future_result, result):
try:
instance = result.result()
@ -2795,6 +2815,12 @@ cdef class List(Provider):
self.__args_len = len(self.__args)
return self
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield from filter(is_provider, self.args)
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
"""Return result of provided callable's call."""
return list(__provide_positional_args(args, self.__args, self.__args_len))
@ -2907,6 +2933,12 @@ cdef class Dict(Provider):
self.__kwargs_len = len(self.__kwargs)
return self
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield from filter(is_provider, self.kwargs.values())
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
"""Return result of provided callable's call."""
return __provide_keyword_args(kwargs, self.__kwargs, self.__kwargs_len)
@ -3075,6 +3107,14 @@ cdef class Resource(Provider):
result.set_result(None)
return result
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield from filter(is_provider, [self.__initializer])
yield from filter(is_provider, self.args)
yield from filter(is_provider, self.kwargs.values())
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
if self.__initialized:
return self.__resource
@ -3300,6 +3340,12 @@ cdef class Container(Provider):
declarative container initialization."""
self.__container.override_providers(**self.__overriding_providers)
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield from self.providers.values()
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
"""Return single instance."""
return self.__container
@ -3389,6 +3435,13 @@ cdef class Selector(Provider):
"""Return providers."""
return dict(self.__providers)
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield from filter(is_provider, [self.__selector])
yield from self.providers.values()
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
"""Return single instance."""
selector_value = self.__selector()
@ -3465,6 +3518,12 @@ cdef class ProvidedInstance(Provider):
def call(self, *args, **kwargs):
return MethodCaller(self, *args, **kwargs)
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield self.__provider
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
return self.__provider(*args, **kwargs)
@ -3514,6 +3573,12 @@ cdef class AttributeGetter(Provider):
def call(self, *args, **kwargs):
return MethodCaller(self, *args, **kwargs)
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield self.__provider
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
provided = self.__provider(*args, **kwargs)
if __isawaitable(provided):
@ -3574,6 +3639,12 @@ cdef class ItemGetter(Provider):
def call(self, *args, **kwargs):
return MethodCaller(self, *args, **kwargs)
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield self.__provider
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
provided = self.__provider(*args, **kwargs)
if __isawaitable(provided):
@ -3666,6 +3737,14 @@ cdef class MethodCaller(Provider):
def call(self, *args, **kwargs):
return MethodCaller(self, *args, **kwargs)
@property
def providers_traversal(self):
"""Return providers traversal generator."""
yield self.__provider
yield from filter(is_provider, self.args)
yield from filter(is_provider, self.kwargs.values())
yield from super().providers_traversal
cpdef object _provide(self, tuple args, dict kwargs):
call = self.__provider()
if __isawaitable(call):