mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-14 18:40:52 +03:00
Implement lazy initialization and improve copying for ProvidedInstance provider
This commit is contained in:
parent
bb473ab91e
commit
cec342c1e4
|
@ -1389,12 +1389,12 @@ struct __pyx_obj_19dependency_injector_9providers_Selector {
|
|||
* # Provided instance
|
||||
*
|
||||
* cdef class ProvidedInstance(Provider): # <<<<<<<<<<<<<<
|
||||
* cdef Provider __provider
|
||||
* cdef object __provides
|
||||
*
|
||||
*/
|
||||
struct __pyx_obj_19dependency_injector_9providers_ProvidedInstance {
|
||||
struct __pyx_obj_19dependency_injector_9providers_Provider __pyx_base;
|
||||
struct __pyx_obj_19dependency_injector_9providers_Provider *__pyx___provider;
|
||||
PyObject *__pyx___provides;
|
||||
};
|
||||
|
||||
|
||||
|
@ -2144,7 +2144,7 @@ static struct __pyx_vtabstruct_19dependency_injector_9providers_Selector *__pyx_
|
|||
* # Provided instance
|
||||
*
|
||||
* cdef class ProvidedInstance(Provider): # <<<<<<<<<<<<<<
|
||||
* cdef Provider __provider
|
||||
* cdef object __provides
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -235,7 +235,7 @@ cdef class Selector(Provider):
|
|||
# Provided instance
|
||||
|
||||
cdef class ProvidedInstance(Provider):
|
||||
cdef Provider __provider
|
||||
cdef object __provides
|
||||
|
||||
cpdef object _provide(self, tuple args, dict kwargs)
|
||||
|
||||
|
|
|
@ -423,10 +423,13 @@ class ProvidedInstanceFluentInterface:
|
|||
def __getattr__(self, item: Any) -> AttributeGetter: ...
|
||||
def __getitem__(self, item: Any) -> ItemGetter: ...
|
||||
def call(self, *args: Injection, **kwargs: Injection) -> MethodCaller: ...
|
||||
@property
|
||||
def provides(self) -> Optional[Provider]: ...
|
||||
def set_provides(self, provides: Optional[Provider]) -> ProvidedInstanceFluentInterface: ...
|
||||
|
||||
|
||||
class ProvidedInstance(Provider, ProvidedInstanceFluentInterface):
|
||||
def __init__(self, provider: Provider) -> None: ...
|
||||
def __init__(self, provides: Optional[Provider] = None) -> None: ...
|
||||
|
||||
|
||||
class AttributeGetter(Provider, ProvidedInstanceFluentInterface):
|
||||
|
|
|
@ -3886,23 +3886,22 @@ cdef class ProvidedInstance(Provider):
|
|||
- :py:class:`Dependency`
|
||||
"""
|
||||
|
||||
def __init__(self, provider):
|
||||
self.__provider = provider
|
||||
def __init__(self, provides=None):
|
||||
self.__provides = None
|
||||
self.set_provides(provides)
|
||||
super().__init__()
|
||||
|
||||
def __repr__(self):
|
||||
return f'{self.__class__.__name__}(\'{self.__provider}\')'
|
||||
return f'{self.__class__.__name__}(\'{self.__provides}\')'
|
||||
|
||||
def __deepcopy__(self, memo=None):
|
||||
cdef ProvidedInstance copied
|
||||
|
||||
copied = memo.get(id(self))
|
||||
if copied is not None:
|
||||
return copied
|
||||
|
||||
return self.__class__(
|
||||
deepcopy(self.__provider, memo),
|
||||
)
|
||||
copied = _memorized_duplicate(self, memo)
|
||||
copied.set_provides(_copy_if_provider(self.provides, memo))
|
||||
return copied
|
||||
|
||||
def __getattr__(self, item):
|
||||
return AttributeGetter(self, item)
|
||||
|
@ -3912,8 +3911,13 @@ cdef class ProvidedInstance(Provider):
|
|||
|
||||
@property
|
||||
def provides(self):
|
||||
"""Return provider."""
|
||||
return self.__provider
|
||||
"""Return provider's provides."""
|
||||
return self.__provides
|
||||
|
||||
def set_provides(self, provides):
|
||||
"""Set provider's provides."""
|
||||
self.__provides = provides
|
||||
return self
|
||||
|
||||
def call(self, *args, **kwargs):
|
||||
return MethodCaller(self, *args, **kwargs)
|
||||
|
@ -3921,11 +3925,12 @@ cdef class ProvidedInstance(Provider):
|
|||
@property
|
||||
def related(self):
|
||||
"""Return related providers generator."""
|
||||
yield self.__provider
|
||||
if is_provider(self.provides):
|
||||
yield self.provides
|
||||
yield from super().related
|
||||
|
||||
cpdef object _provide(self, tuple args, dict kwargs):
|
||||
return self.__provider(*args, **kwargs)
|
||||
return self.__provides(*args, **kwargs)
|
||||
|
||||
|
||||
cdef class AttributeGetter(Provider):
|
||||
|
|
|
@ -69,6 +69,16 @@ class ProvidedInstanceTests(unittest.TestCase):
|
|||
def setUp(self):
|
||||
self.container = Container()
|
||||
|
||||
def test_lazy_init(self):
|
||||
provides = providers.Object(object())
|
||||
provider = providers.ProvidedInstance()
|
||||
provider.set_provides(provides)
|
||||
self.assertIs(provider.provides, provides)
|
||||
|
||||
def test_set_provides_returns_self(self):
|
||||
provider = providers.ProvidedInstance()
|
||||
self.assertIs(provider.set_provides(providers.Provider()), provider)
|
||||
|
||||
def test_is_provider(self):
|
||||
self.assertTrue(providers.is_provider(self.container.service.provided))
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user