Fix side effect in `Container` provider overriding

This commit is contained in:
Roman Mogylatov 2021-01-13 09:11:24 -05:00
parent d9f914dfeb
commit de6c3cda78
3 changed files with 41 additions and 19 deletions

View File

@ -7,6 +7,10 @@ that were made in every particular version.
From version 0.7.6 *Dependency Injector* framework strictly
follows `Semantic versioning`_
Development version
-------------------
- Hotfix for version ``4.8.0``: fix side effect in ``Container`` provider overriding.
4.8.1
-----
- Fix declarative container multi-level inheritance issue.

View File

@ -56797,7 +56797,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_9Container_6override(
* if not hasattr(provider, 'providers'):
* raise Error('Container provider {0} can be overridden only by providers container'.format(self)) # <<<<<<<<<<<<<<
*
* self.__container.override_providers = provider.providers
* self.__container.override_providers(**provider.providers)
*/
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_Error); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 3083, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
@ -56850,18 +56850,36 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_9Container_6override(
/* "dependency_injector/providers.pyx":3085
* raise Error('Container provider {0} can be overridden only by providers container'.format(self))
*
* self.__container.override_providers = provider.providers # <<<<<<<<<<<<<<
* self.__container.override_providers(**provider.providers) # <<<<<<<<<<<<<<
* super().override(provider)
*
*/
__pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_provider, __pyx_n_s_providers); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3085, __pyx_L1_error)
__pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->__pyx___container, __pyx_n_s_override_providers_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3085, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
if (__Pyx_PyObject_SetAttrStr(__pyx_v_self->__pyx___container, __pyx_n_s_override_providers_2, __pyx_t_3) < 0) __PYX_ERR(1, 3085, __pyx_L1_error)
__pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_provider, __pyx_n_s_providers); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 3085, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_5);
if (unlikely(__pyx_t_5 == Py_None)) {
PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType");
__PYX_ERR(1, 3085, __pyx_L1_error)
}
if (likely(PyDict_CheckExact(__pyx_t_5))) {
__pyx_t_4 = PyDict_Copy(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 3085, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
} else {
__pyx_t_4 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 3085, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
}
__pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 3085, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_5);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
/* "dependency_injector/providers.pyx":3086
*
* self.__container.override_providers = provider.providers
* self.__container.override_providers(**provider.providers)
* super().override(provider) # <<<<<<<<<<<<<<
*
* cpdef object _provide(self, tuple args, dict kwargs):
@ -56874,28 +56892,28 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_9Container_6override(
__Pyx_INCREF(((PyObject *)__pyx_v_self));
__Pyx_GIVEREF(((PyObject *)__pyx_v_self));
PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_self));
__pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 3086, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_5);
__pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3086, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_override); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 3086, __pyx_L1_error)
__pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_override); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 3086, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
__pyx_t_5 = NULL;
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_t_3 = NULL;
if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
__pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
if (likely(__pyx_t_5)) {
__pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
if (likely(__pyx_t_3)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
__Pyx_INCREF(__pyx_t_5);
__Pyx_INCREF(__pyx_t_3);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_4, function);
}
}
__pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_v_provider) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_provider);
__Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3086, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__pyx_t_5 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_3, __pyx_v_provider) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_provider);
__Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 3086, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_5);
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
/* "dependency_injector/providers.pyx":3080
* return self.__container

View File

@ -3082,7 +3082,7 @@ cdef class Container(Provider):
if not hasattr(provider, 'providers'):
raise Error('Container provider {0} can be overridden only by providers container'.format(self))
self.__container.override_providers = provider.providers
self.__container.override_providers(**provider.providers)
super().override(provider)
cpdef object _provide(self, tuple args, dict kwargs):