Add sketch

This commit is contained in:
Roman Mogylatov 2020-08-19 21:06:38 -04:00
parent 50a9dda192
commit 68eed5db33
2 changed files with 9527 additions and 3285 deletions

File diff suppressed because it is too large Load Diff

View File

@ -324,6 +324,10 @@ cdef class Object(Provider):
"""
return self.__str__()
@property
def provided(self):
return ProvidedAttributes(self)
cpdef object _provide(self, tuple args, dict kwargs):
"""Return provided instance.
@ -769,6 +773,10 @@ cdef class Callable(Provider):
"""Return wrapped callable."""
return self.__provides
@property
def provided(self):
return ProvidedAttributes(self)
@property
def args(self):
"""Return positional argument injections."""
@ -1599,6 +1607,10 @@ cdef class Factory(Provider):
"""Return provided type."""
return self.__instantiator.provides
@property
def provided(self):
return ProvidedAttributes(self)
@property
def args(self):
"""Return positional argument injections."""
@ -1932,6 +1944,10 @@ cdef class BaseSingleton(Provider):
"""Return provided type."""
return self.__instantiator.cls
@property
def provided(self):
return ProvidedAttributes(self)
@property
def args(self):
"""Return positional argument injections."""
@ -2360,6 +2376,10 @@ cdef class List(Provider):
"""
return represent_provider(provider=self, provides=list(self.args))
@property
def provided(self):
return ProvidedAttributes(self)
@property
def args(self):
"""Return positional argument injections."""
@ -2537,6 +2557,10 @@ cdef class Selector(Provider):
address=hex(id(self)),
)
@property
def provided(self):
return ProvidedAttributes(self)
@property
def providers(self):
"""Return providers."""
@ -2555,6 +2579,118 @@ cdef class Selector(Provider):
return self.__providers[selector_value](*args, **kwargs)
class ProvidedAttributes(Provider):
def __init__(self, provider):
self._provider = provider
super().__init__()
def __repr__(self):
return f'ProvidedAttributes({self._provider})'
def __deepcopy__(self, memo=None):
return self.__class__(deepcopy(self._provider, memo))
def __getattr__(self, item):
return AttributeGetter(self, item)
def __getitem__(self, item):
return ItemGetter(self, item)
def call(self, *args, **kwargs):
return MethodCaller(self, *args, **kwargs)
def _provide(self, args, kwargs):
return self._provider(*args, **kwargs)
class AttributeGetter(Provider):
def __init__(self, provider, attribute):
self._provider = provider
self._attribute = attribute
super().__init__()
def __repr__(self):
return f'AttributeGetter({self._attribute})'
def __deepcopy__(self, memo=None):
return self.__class__(deepcopy(self._provider, memo), self._attribute)
def __getattr__(self, item):
return AttributeGetter(self, item)
def __getitem__(self, item):
return ItemGetter(self, item)
def call(self, *args, **kwargs):
return MethodCaller(self, *args, **kwargs)
def _provide(self, args, kwargs):
provided = self._provider(*args, **kwargs)
return getattr(provided, self._attribute)
class ItemGetter(Provider):
def __init__(self, provider, item):
self._provider = provider
self._item = item
super().__init__()
def __repr__(self):
return f'ItemGetter({self._item})'
def __deepcopy__(self, memo=None):
return self.__class__(deepcopy(self._provider, memo), self._item)
def __getattr__(self, item):
return AttributeGetter(self, item)
def __getitem__(self, item):
return ItemGetter(self, item)
def call(self, *args, **kwargs):
return MethodCaller(self, *args, **kwargs)
def _provide(self, args, kwargs):
provided = self._provider(*args, **kwargs)
return provided[self._item]
class MethodCaller(Provider):
def __init__(self, provider, *args, **kwargs):
self._provider = provider
self._args = args
self._kwargs = kwargs
super().__init__()
def __repr__(self):
return f'MethodCaller({self._provider})'
def __deepcopy__(self, memo=None):
return self.__class__(
deepcopy(self._provider, memo),
*deepcopy(self._args, memo),
**deepcopy(self._kwargs, memo),
)
def __getattr__(self, item):
return AttributeGetter(self, item)
def __getitem__(self, item):
return ItemGetter(self, item)
def call(self, *args, **kwargs):
return MethodCaller(self, *args, **kwargs)
def _provide(self, args, kwargs):
provided = self._provider(*args, **kwargs)
# TODO: add proper handling of injections
return provided(*self._args, **self._kwargs)
cdef class Injection(object):
"""Abstract injection class."""