Fix issue #319 resulting in configuration.reset_override() not working properly

This commit is contained in:
Roman Mogylatov 2020-11-05 10:16:39 -05:00
parent e847c357a6
commit 18ef566aae
3 changed files with 59 additions and 41 deletions

View File

@ -27926,7 +27926,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_13Configuration_14set
* :rtype: :py:class:`OverridingContext` * :rtype: :py:class:`OverridingContext`
* """ * """
* keys = selector.split('.') # <<<<<<<<<<<<<< * keys = selector.split('.') # <<<<<<<<<<<<<<
* original_value = current_value = self.__call__() * original_value = current_value = deepcopy(self.__call__())
* *
*/ */
__pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_selector, __pyx_n_s_split); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1388, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_selector, __pyx_n_s_split); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1388, __pyx_L1_error)
@ -27952,7 +27952,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_13Configuration_14set
/* "dependency_injector/providers.pyx":1389 /* "dependency_injector/providers.pyx":1389
* """ * """
* keys = selector.split('.') * keys = selector.split('.')
* original_value = current_value = self.__call__() # <<<<<<<<<<<<<< * original_value = current_value = deepcopy(self.__call__()) # <<<<<<<<<<<<<<
* *
* while len(keys) > 0: * while len(keys) > 0:
*/ */
@ -27973,14 +27973,17 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_13Configuration_14set
if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1389, __pyx_L1_error) if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1389, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_1);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__Pyx_INCREF(__pyx_t_1); __pyx_t_2 = __pyx_f_19dependency_injector_9providers_deepcopy(__pyx_t_1, 0, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1389, __pyx_L1_error)
__pyx_v_original_value = __pyx_t_1; __Pyx_GOTREF(__pyx_t_2);
__Pyx_INCREF(__pyx_t_1);
__pyx_v_current_value = __pyx_t_1;
__Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
__Pyx_INCREF(__pyx_t_2);
__pyx_v_original_value = __pyx_t_2;
__Pyx_INCREF(__pyx_t_2);
__pyx_v_current_value = __pyx_t_2;
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* "dependency_injector/providers.pyx":1391 /* "dependency_injector/providers.pyx":1391
* original_value = current_value = self.__call__() * original_value = current_value = deepcopy(self.__call__())
* *
* while len(keys) > 0: # <<<<<<<<<<<<<< * while len(keys) > 0: # <<<<<<<<<<<<<<
* key = keys.pop(0) * key = keys.pop(0)
@ -27998,10 +28001,10 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_13Configuration_14set
* if len(keys) == 0: * if len(keys) == 0:
* current_value[key] = value * current_value[key] = value
*/ */
__pyx_t_1 = __Pyx_PyObject_PopIndex(__pyx_v_keys, __pyx_int_0, 0, 1, Py_ssize_t, PyInt_FromSsize_t); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1392, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_PopIndex(__pyx_v_keys, __pyx_int_0, 0, 1, Py_ssize_t, PyInt_FromSsize_t); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1392, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_2);
__Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_1); __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_2);
__pyx_t_1 = 0; __pyx_t_2 = 0;
/* "dependency_injector/providers.pyx":1393 /* "dependency_injector/providers.pyx":1393
* while len(keys) > 0: * while len(keys) > 0:
@ -28048,37 +28051,37 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_13Configuration_14set
* current_value[key] = temp_value * current_value[key] = temp_value
* current_value = temp_value * current_value = temp_value
*/ */
__pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_current_value, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1396, __pyx_L1_error) __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_current_value, __pyx_n_s_get); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1396, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2); __Pyx_GOTREF(__pyx_t_1);
__pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1396, __pyx_L1_error) __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1396, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_3);
__pyx_t_6 = NULL; __pyx_t_6 = NULL;
__pyx_t_7 = 0; __pyx_t_7 = 0;
if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) {
__pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
if (likely(__pyx_t_6)) { if (likely(__pyx_t_6)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
__Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(__pyx_t_6);
__Pyx_INCREF(function); __Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_2, function); __Pyx_DECREF_SET(__pyx_t_1, function);
__pyx_t_7 = 1; __pyx_t_7 = 1;
} }
} }
#if CYTHON_FAST_PYCALL #if CYTHON_FAST_PYCALL
if (PyFunction_Check(__pyx_t_2)) { if (PyFunction_Check(__pyx_t_1)) {
PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_key, __pyx_t_3}; PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_key, __pyx_t_3};
__pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1396, __pyx_L1_error) __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1396, __pyx_L1_error)
__Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_2);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
} else } else
#endif #endif
#if CYTHON_FAST_PYCCALL #if CYTHON_FAST_PYCCALL
if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) {
PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_key, __pyx_t_3}; PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_key, __pyx_t_3};
__pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1396, __pyx_L1_error) __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1396, __pyx_L1_error)
__Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_2);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
} else } else
#endif #endif
@ -28094,13 +28097,13 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_13Configuration_14set
__Pyx_GIVEREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_3);
PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_3); PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_3);
__pyx_t_3 = 0; __pyx_t_3 = 0;
__pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1396, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1396, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_2);
__Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
} }
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
__Pyx_XDECREF_SET(__pyx_v_temp_value, __pyx_t_1); __Pyx_XDECREF_SET(__pyx_v_temp_value, __pyx_t_2);
__pyx_t_1 = 0; __pyx_t_2 = 0;
/* "dependency_injector/providers.pyx":1397 /* "dependency_injector/providers.pyx":1397
* break * break
@ -28131,25 +28134,25 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_13Configuration_14set
* def override(self, provider): * def override(self, provider):
*/ */
__Pyx_XDECREF(__pyx_r); __Pyx_XDECREF(__pyx_r);
__pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_override); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1400, __pyx_L1_error) __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_override); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1400, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2); __Pyx_GOTREF(__pyx_t_1);
__pyx_t_8 = NULL; __pyx_t_8 = NULL;
if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) {
__pyx_t_8 = PyMethod_GET_SELF(__pyx_t_2); __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_1);
if (likely(__pyx_t_8)) { if (likely(__pyx_t_8)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
__Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(__pyx_t_8);
__Pyx_INCREF(function); __Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_2, function); __Pyx_DECREF_SET(__pyx_t_1, function);
} }
} }
__pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_8, __pyx_v_original_value) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_original_value); __pyx_t_2 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_8, __pyx_v_original_value) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_original_value);
__Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1400, __pyx_L1_error) if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1400, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_2);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
__pyx_r = __pyx_t_1; __pyx_r = __pyx_t_2;
__pyx_t_1 = 0; __pyx_t_2 = 0;
goto __pyx_L0; goto __pyx_L0;
/* "dependency_injector/providers.pyx":1376 /* "dependency_injector/providers.pyx":1376

View File

@ -1386,7 +1386,7 @@ cdef class Configuration(Object):
:rtype: :py:class:`OverridingContext` :rtype: :py:class:`OverridingContext`
""" """
keys = selector.split('.') keys = selector.split('.')
original_value = current_value = self.__call__() original_value = current_value = deepcopy(self.__call__())
while len(keys) > 0: while len(keys) > 0:
key = keys.pop(0) key = keys.pop(0)

View File

@ -110,6 +110,21 @@ class ConfigTests(unittest.TestCase):
self.assertEqual(abc(), 1) self.assertEqual(abc(), 1)
self.assertEqual(abd(), 2) self.assertEqual(abd(), 2)
def test_configuration_option_override_and_reset_override(self):
# Bug: https://github.com/ets-labs/python-dependency-injector/issues/319
self.config.from_dict({'a': {'b': {'c': 1}}})
self.assertEqual(self.config.a.b.c(), 1)
with self.config.set('a.b.c', 'xxx'):
self.assertEqual(self.config.a.b.c(), 'xxx')
self.assertEqual(self.config.a.b.c(), 1)
with self.config.a.b.c.override('yyy'):
self.assertEqual(self.config.a.b.c(), 'yyy')
self.assertEqual(self.config.a.b.c(), 1)
def test_providers_with_already_overridden_value(self): def test_providers_with_already_overridden_value(self):
self.config.override({'a': {'b': {'c': 1, 'd': 2}}}) self.config.override({'a': {'b': {'c': 1, 'd': 2}}})