diff --git a/src/dependency_injector/providers.c b/src/dependency_injector/providers.c index 98bbe05a..8696fc62 100644 --- a/src/dependency_injector/providers.c +++ b/src/dependency_injector/providers.c @@ -3214,7 +3214,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_8Provider_2__call__(s * Callable interface implementation. * """ * if self.__last_overriding is not None: # <<<<<<<<<<<<<< - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * return self._provide(args, kwargs) */ __pyx_t_1 = (((PyObject *)__pyx_v_self->__pyx___last_overriding) != Py_None); @@ -3224,12 +3224,12 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_8Provider_2__call__(s /* "dependency_injector/providers.pyx":99 * """ * if self.__last_overriding is not None: - * return self.__last_overriding._provide(args, kwargs) # <<<<<<<<<<<<<< + * return self.__last_overriding(*args, **kwargs) # <<<<<<<<<<<<<< * return self._provide(args, kwargs) * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((struct __pyx_vtabstruct_19dependency_injector_9providers_Provider *)__pyx_v_self->__pyx___last_overriding->__pyx_vtab)->_provide(__pyx_v_self->__pyx___last_overriding, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 99, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_self->__pyx___last_overriding), __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 99, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; @@ -3239,14 +3239,14 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_8Provider_2__call__(s * Callable interface implementation. * """ * if self.__last_overriding is not None: # <<<<<<<<<<<<<< - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * return self._provide(args, kwargs) */ } /* "dependency_injector/providers.pyx":100 * if self.__last_overriding is not None: - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * return self._provide(args, kwargs) # <<<<<<<<<<<<<< * * def __deepcopy__(self, memo): @@ -7940,8 +7940,12 @@ static PyObject *__pyx_pw_19dependency_injector_9providers_18ExternalDependency_ __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 1))) return NULL; - __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL; - __Pyx_GOTREF(__pyx_v_kwargs); + if (unlikely(__pyx_kwds)) { + __pyx_v_kwargs = PyDict_Copy(__pyx_kwds); if (unlikely(!__pyx_v_kwargs)) return NULL; + __Pyx_GOTREF(__pyx_v_kwargs); + } else { + __pyx_v_kwargs = NULL; + } __Pyx_INCREF(__pyx_args); __pyx_v_args = __pyx_args; __pyx_r = __pyx_pf_19dependency_injector_9providers_18ExternalDependency_4__call__(((struct __pyx_obj_19dependency_injector_9providers_ExternalDependency *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs); @@ -7985,7 +7989,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_18ExternalDependency_ * if self.__last_overriding is None: * raise Error('Dependency is not defined') # <<<<<<<<<<<<<< * - * instance = self.__last_overriding._provide(args, kwargs) + * instance = self.__last_overriding(*args, **kwargs) */ __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_Error); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 354, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -8008,17 +8012,17 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_18ExternalDependency_ /* "dependency_injector/providers.pyx":356 * raise Error('Dependency is not defined') * - * instance = self.__last_overriding._provide(args, kwargs) # <<<<<<<<<<<<<< + * instance = self.__last_overriding(*args, **kwargs) # <<<<<<<<<<<<<< * * if not isinstance(instance, self.instance_of): */ - __pyx_t_4 = ((struct __pyx_vtabstruct_19dependency_injector_9providers_Provider *)__pyx_v_self->__pyx_base.__pyx___last_overriding->__pyx_vtab)->_provide(__pyx_v_self->__pyx_base.__pyx___last_overriding, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 356, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_self->__pyx_base.__pyx___last_overriding), __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 356, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_v_instance = __pyx_t_4; __pyx_t_4 = 0; /* "dependency_injector/providers.pyx":358 - * instance = self.__last_overriding._provide(args, kwargs) + * instance = self.__last_overriding(*args, **kwargs) * * if not isinstance(instance, self.instance_of): # <<<<<<<<<<<<<< * raise Error('{0} is not an '.format(instance) + @@ -8206,7 +8210,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_18ExternalDependency_ __PYX_ERR(1, 359, __pyx_L1_error) /* "dependency_injector/providers.pyx":358 - * instance = self.__last_overriding._provide(args, kwargs) + * instance = self.__last_overriding(*args, **kwargs) * * if not isinstance(instance, self.instance_of): # <<<<<<<<<<<<<< * raise Error('{0} is not an '.format(instance) + @@ -12215,8 +12219,12 @@ static PyObject *__pyx_pw_19dependency_injector_9providers_16AbstractCallable_1_ __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 1))) return NULL; - __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL; - __Pyx_GOTREF(__pyx_v_kwargs); + if (unlikely(__pyx_kwds)) { + __pyx_v_kwargs = PyDict_Copy(__pyx_kwds); if (unlikely(!__pyx_v_kwargs)) return NULL; + __Pyx_GOTREF(__pyx_v_kwargs); + } else { + __pyx_v_kwargs = NULL; + } __Pyx_INCREF(__pyx_args); __pyx_v_args = __pyx_args; __pyx_r = __pyx_pf_19dependency_injector_9providers_16AbstractCallable___call__(((struct __pyx_obj_19dependency_injector_9providers_AbstractCallable *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs); @@ -12246,7 +12254,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_16AbstractCallable___ * """ * if self.__last_overriding is None: # <<<<<<<<<<<<<< * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) */ __pyx_t_1 = (((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding) == Py_None); __pyx_t_2 = (__pyx_t_1 != 0); @@ -12256,7 +12264,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_16AbstractCallable___ * """ * if self.__last_overriding is None: * raise Error('{0} must be overridden before calling'.format(self)) # <<<<<<<<<<<<<< - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * */ __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_Error); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 636, __pyx_L1_error) @@ -12361,19 +12369,19 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_16AbstractCallable___ * """ * if self.__last_overriding is None: # <<<<<<<<<<<<<< * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) */ } /* "dependency_injector/providers.pyx":637 * if self.__last_overriding is None: * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) # <<<<<<<<<<<<<< + * return self.__last_overriding(*args, **kwargs) # <<<<<<<<<<<<<< * * def override(self, provider): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((struct __pyx_vtabstruct_19dependency_injector_9providers_Provider *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding->__pyx_vtab)->_provide(__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 637, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding), __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 637, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; @@ -12404,7 +12412,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_16AbstractCallable___ } /* "dependency_injector/providers.pyx":639 - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * * def override(self, provider): # <<<<<<<<<<<<<< * """Override provider with another provider. @@ -12643,7 +12651,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_16AbstractCallable_2o goto __pyx_L0; /* "dependency_injector/providers.pyx":639 - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * * def override(self, provider): # <<<<<<<<<<<<<< * """Override provider with another provider. @@ -19092,8 +19100,12 @@ static PyObject *__pyx_pw_19dependency_injector_9providers_15AbstractFactory_1__ __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 1))) return NULL; - __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL; - __Pyx_GOTREF(__pyx_v_kwargs); + if (unlikely(__pyx_kwds)) { + __pyx_v_kwargs = PyDict_Copy(__pyx_kwds); if (unlikely(!__pyx_v_kwargs)) return NULL; + __Pyx_GOTREF(__pyx_v_kwargs); + } else { + __pyx_v_kwargs = NULL; + } __Pyx_INCREF(__pyx_args); __pyx_v_args = __pyx_args; __pyx_r = __pyx_pf_19dependency_injector_9providers_15AbstractFactory___call__(((struct __pyx_obj_19dependency_injector_9providers_AbstractFactory *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs); @@ -19123,7 +19135,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_15AbstractFactory___c * """ * if self.__last_overriding is None: # <<<<<<<<<<<<<< * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) */ __pyx_t_1 = (((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding) == Py_None); __pyx_t_2 = (__pyx_t_1 != 0); @@ -19133,7 +19145,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_15AbstractFactory___c * """ * if self.__last_overriding is None: * raise Error('{0} must be overridden before calling'.format(self)) # <<<<<<<<<<<<<< - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * */ __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_Error); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1078, __pyx_L1_error) @@ -19238,19 +19250,19 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_15AbstractFactory___c * """ * if self.__last_overriding is None: # <<<<<<<<<<<<<< * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) */ } /* "dependency_injector/providers.pyx":1079 * if self.__last_overriding is None: * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) # <<<<<<<<<<<<<< + * return self.__last_overriding(*args, **kwargs) # <<<<<<<<<<<<<< * * def override(self, provider): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((struct __pyx_vtabstruct_19dependency_injector_9providers_Provider *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding->__pyx_vtab)->_provide(__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1079, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding), __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1079, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; @@ -19281,7 +19293,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_15AbstractFactory___c } /* "dependency_injector/providers.pyx":1081 - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * * def override(self, provider): # <<<<<<<<<<<<<< * """Override provider with another provider. @@ -19520,7 +19532,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_15AbstractFactory_2ov goto __pyx_L0; /* "dependency_injector/providers.pyx":1081 - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * * def override(self, provider): # <<<<<<<<<<<<<< * """Override provider with another provider. @@ -28109,8 +28121,12 @@ static PyObject *__pyx_pw_19dependency_injector_9providers_17AbstractSingleton_1 __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 1))) return NULL; - __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL; - __Pyx_GOTREF(__pyx_v_kwargs); + if (unlikely(__pyx_kwds)) { + __pyx_v_kwargs = PyDict_Copy(__pyx_kwds); if (unlikely(!__pyx_v_kwargs)) return NULL; + __Pyx_GOTREF(__pyx_v_kwargs); + } else { + __pyx_v_kwargs = NULL; + } __Pyx_INCREF(__pyx_args); __pyx_v_args = __pyx_args; __pyx_r = __pyx_pf_19dependency_injector_9providers_17AbstractSingleton___call__(((struct __pyx_obj_19dependency_injector_9providers_AbstractSingleton *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs); @@ -28140,7 +28156,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_17AbstractSingleton__ * """ * if self.__last_overriding is None: # <<<<<<<<<<<<<< * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) */ __pyx_t_1 = (((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding) == Py_None); __pyx_t_2 = (__pyx_t_1 != 0); @@ -28150,7 +28166,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_17AbstractSingleton__ * """ * if self.__last_overriding is None: * raise Error('{0} must be overridden before calling'.format(self)) # <<<<<<<<<<<<<< - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * */ __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_Error); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1608, __pyx_L1_error) @@ -28255,19 +28271,19 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_17AbstractSingleton__ * """ * if self.__last_overriding is None: # <<<<<<<<<<<<<< * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) */ } /* "dependency_injector/providers.pyx":1609 * if self.__last_overriding is None: * raise Error('{0} must be overridden before calling'.format(self)) - * return self.__last_overriding._provide(args, kwargs) # <<<<<<<<<<<<<< + * return self.__last_overriding(*args, **kwargs) # <<<<<<<<<<<<<< * * def override(self, provider): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((struct __pyx_vtabstruct_19dependency_injector_9providers_Provider *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding->__pyx_vtab)->_provide(__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1609, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx___last_overriding), __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1609, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; @@ -28298,7 +28314,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_17AbstractSingleton__ } /* "dependency_injector/providers.pyx":1611 - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * * def override(self, provider): # <<<<<<<<<<<<<< * """Override provider with another provider. @@ -28537,7 +28553,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_17AbstractSingleton_2 goto __pyx_L0; /* "dependency_injector/providers.pyx":1611 - * return self.__last_overriding._provide(args, kwargs) + * return self.__last_overriding(*args, **kwargs) * * def override(self, provider): # <<<<<<<<<<<<<< * """Override provider with another provider. @@ -51397,7 +51413,7 @@ static int __Pyx_InitCachedConstants(void) { * if self.__last_overriding is None: * raise Error('Dependency is not defined') # <<<<<<<<<<<<<< * - * instance = self.__last_overriding._provide(args, kwargs) + * instance = self.__last_overriding(*args, **kwargs) */ __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_Dependency_is_not_defined); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 354, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); diff --git a/src/dependency_injector/providers.pyx b/src/dependency_injector/providers.pyx index 7f1f1743..3cedc395 100644 --- a/src/dependency_injector/providers.pyx +++ b/src/dependency_injector/providers.pyx @@ -96,7 +96,7 @@ cdef class Provider(object): Callable interface implementation. """ if self.__last_overriding is not None: - return self.__last_overriding._provide(args, kwargs) + return self.__last_overriding(*args, **kwargs) return self._provide(args, kwargs) def __deepcopy__(self, memo): @@ -353,7 +353,7 @@ cdef class ExternalDependency(Provider): if self.__last_overriding is None: raise Error('Dependency is not defined') - instance = self.__last_overriding._provide(args, kwargs) + instance = self.__last_overriding(*args, **kwargs) if not isinstance(instance, self.instance_of): raise Error('{0} is not an '.format(instance) + @@ -634,7 +634,7 @@ cdef class AbstractCallable(Callable): """ if self.__last_overriding is None: raise Error('{0} must be overridden before calling'.format(self)) - return self.__last_overriding._provide(args, kwargs) + return self.__last_overriding(*args, **kwargs) def override(self, provider): """Override provider with another provider. @@ -1076,7 +1076,7 @@ cdef class AbstractFactory(Factory): """ if self.__last_overriding is None: raise Error('{0} must be overridden before calling'.format(self)) - return self.__last_overriding._provide(args, kwargs) + return self.__last_overriding(*args, **kwargs) def override(self, provider): """Override provider with another provider. @@ -1606,7 +1606,7 @@ cdef class AbstractSingleton(BaseSingleton): """ if self.__last_overriding is None: raise Error('{0} must be overridden before calling'.format(self)) - return self.__last_overriding._provide(args, kwargs) + return self.__last_overriding(*args, **kwargs) def override(self, provider): """Override provider with another provider. diff --git a/tests/unit/providers/test_base.py b/tests/unit/providers/test_base.py index 50b2f7f8..61f270e7 100644 --- a/tests/unit/providers/test_base.py +++ b/tests/unit/providers/test_base.py @@ -51,6 +51,15 @@ class ProviderTests(unittest.TestCase): self.assertTrue(self.provider.overridden) self.assertIs(self.provider.last_overriding, overriding_provider) + def test_double_override(self): + overriding_provider1 = providers.Object(1) + overriding_provider2 = providers.Object(2) + + self.provider.override(overriding_provider1) + overriding_provider1.override(overriding_provider2) + + self.assertEqual(self.provider(), overriding_provider2()) + def test_overriding_context(self): overriding_provider = providers.Provider() with self.provider.override(overriding_provider):