mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-11-22 09:36:48 +03:00
231 Fix object provider copies provided object issue (#233)
* Add test that reproduces the issue * Fix the issue * Add a note about fix in changelog
This commit is contained in:
parent
e48af3212e
commit
7e61412b8a
|
@ -7,6 +7,13 @@ that were made in every particular version.
|
||||||
From version 0.7.6 *Dependency Injector* framework strictly
|
From version 0.7.6 *Dependency Injector* framework strictly
|
||||||
follows `Semantic versioning`_
|
follows `Semantic versioning`_
|
||||||
|
|
||||||
|
Development version
|
||||||
|
-------------------
|
||||||
|
+ Fix issue causing creation of a copy of provided object by ``Object`` provider when it was a
|
||||||
|
part of ``DeclarativeContainer`` and this container was instantiated (thanks to
|
||||||
|
`davidcim <https://github.com/davidcim>`_, issue details are
|
||||||
|
`here <https://github.com/ets-labs/python-dependency-injector/issues/231>`_).
|
||||||
|
|
||||||
3.14.10
|
3.14.10
|
||||||
------
|
------
|
||||||
+ Make spelling fix for the list of contributors.
|
+ Make spelling fix for the list of contributors.
|
||||||
|
|
|
@ -6355,7 +6355,6 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_6Object_2__deepcopy__
|
||||||
PyObject *__pyx_t_4 = NULL;
|
PyObject *__pyx_t_4 = NULL;
|
||||||
int __pyx_t_5;
|
int __pyx_t_5;
|
||||||
int __pyx_t_6;
|
int __pyx_t_6;
|
||||||
struct __pyx_opt_args_19dependency_injector_9providers_deepcopy __pyx_t_7;
|
|
||||||
__Pyx_RefNannySetupContext("__deepcopy__", 0);
|
__Pyx_RefNannySetupContext("__deepcopy__", 0);
|
||||||
|
|
||||||
/* "dependency_injector/providers.pyx":256
|
/* "dependency_injector/providers.pyx":256
|
||||||
|
@ -6404,7 +6403,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_6Object_2__deepcopy__
|
||||||
* if copied is not None:
|
* if copied is not None:
|
||||||
* return copied # <<<<<<<<<<<<<<
|
* return copied # <<<<<<<<<<<<<<
|
||||||
*
|
*
|
||||||
* copied = self.__class__(deepcopy(self.__provides, memo))
|
* copied = self.__class__(self.__provides)
|
||||||
*/
|
*/
|
||||||
__Pyx_XDECREF(__pyx_r);
|
__Pyx_XDECREF(__pyx_r);
|
||||||
__Pyx_INCREF(__pyx_v_copied);
|
__Pyx_INCREF(__pyx_v_copied);
|
||||||
|
@ -6423,20 +6422,12 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_6Object_2__deepcopy__
|
||||||
/* "dependency_injector/providers.pyx":260
|
/* "dependency_injector/providers.pyx":260
|
||||||
* return copied
|
* return copied
|
||||||
*
|
*
|
||||||
* copied = self.__class__(deepcopy(self.__provides, memo)) # <<<<<<<<<<<<<<
|
* copied = self.__class__(self.__provides) # <<<<<<<<<<<<<<
|
||||||
*
|
*
|
||||||
* self._copy_overridings(copied, memo)
|
* self._copy_overridings(copied, memo)
|
||||||
*/
|
*/
|
||||||
__pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 260, __pyx_L1_error)
|
__pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 260, __pyx_L1_error)
|
||||||
__Pyx_GOTREF(__pyx_t_2);
|
__Pyx_GOTREF(__pyx_t_2);
|
||||||
__pyx_t_3 = __pyx_v_self->__pyx___provides;
|
|
||||||
__Pyx_INCREF(__pyx_t_3);
|
|
||||||
if (!(likely(PyDict_CheckExact(__pyx_v_memo))||((__pyx_v_memo) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_memo)->tp_name), 0))) __PYX_ERR(1, 260, __pyx_L1_error)
|
|
||||||
__pyx_t_7.__pyx_n = 1;
|
|
||||||
__pyx_t_7.memo = ((PyObject*)__pyx_v_memo);
|
|
||||||
__pyx_t_4 = __pyx_f_19dependency_injector_9providers_deepcopy(__pyx_t_3, 0, &__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 260, __pyx_L1_error)
|
|
||||||
__Pyx_GOTREF(__pyx_t_4);
|
|
||||||
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
|
|
||||||
__pyx_t_3 = NULL;
|
__pyx_t_3 = NULL;
|
||||||
if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
|
if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
|
||||||
__pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
|
__pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
|
||||||
|
@ -6447,9 +6438,8 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_6Object_2__deepcopy__
|
||||||
__Pyx_DECREF_SET(__pyx_t_2, function);
|
__Pyx_DECREF_SET(__pyx_t_2, function);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4);
|
__pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_self->__pyx___provides) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_self->__pyx___provides);
|
||||||
__Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
|
__Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
|
||||||
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
|
|
||||||
if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 260, __pyx_L1_error)
|
if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 260, __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;
|
||||||
|
@ -6457,7 +6447,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_6Object_2__deepcopy__
|
||||||
__pyx_t_1 = 0;
|
__pyx_t_1 = 0;
|
||||||
|
|
||||||
/* "dependency_injector/providers.pyx":262
|
/* "dependency_injector/providers.pyx":262
|
||||||
* copied = self.__class__(deepcopy(self.__provides, memo))
|
* copied = self.__class__(self.__provides)
|
||||||
*
|
*
|
||||||
* self._copy_overridings(copied, memo) # <<<<<<<<<<<<<<
|
* self._copy_overridings(copied, memo) # <<<<<<<<<<<<<<
|
||||||
*
|
*
|
||||||
|
|
|
@ -257,7 +257,7 @@ cdef class Object(Provider):
|
||||||
if copied is not None:
|
if copied is not None:
|
||||||
return copied
|
return copied
|
||||||
|
|
||||||
copied = self.__class__(deepcopy(self.__provides, memo))
|
copied = self.__class__(self.__provides)
|
||||||
|
|
||||||
self._copy_overridings(copied, memo)
|
self._copy_overridings(copied, memo)
|
||||||
|
|
||||||
|
|
|
@ -193,6 +193,17 @@ class ObjectProviderTests(unittest.TestCase):
|
||||||
self.assertIsNot(overriding_provider, overriding_provider_copy)
|
self.assertIsNot(overriding_provider, overriding_provider_copy)
|
||||||
self.assertIsInstance(overriding_provider_copy, providers.Provider)
|
self.assertIsInstance(overriding_provider_copy, providers.Provider)
|
||||||
|
|
||||||
|
def test_deepcopy_doesnt_copy_provided_object(self):
|
||||||
|
# Fixes bug #231
|
||||||
|
# Details: https://github.com/ets-labs/python-dependency-injector/issues/231
|
||||||
|
some_object = object()
|
||||||
|
provider = providers.Object(some_object)
|
||||||
|
|
||||||
|
provider_copy = providers.deepcopy(provider)
|
||||||
|
|
||||||
|
self.assertIs(provider(), some_object)
|
||||||
|
self.assertIs(provider_copy(), some_object)
|
||||||
|
|
||||||
def test_repr(self):
|
def test_repr(self):
|
||||||
some_object = object()
|
some_object = object()
|
||||||
provider = providers.Object(some_object)
|
provider = providers.Object(some_object)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user