From 2d3aa72cbdddfcd7de0a72fd43e9a31bc1c81941 Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Fri, 23 Oct 2020 17:05:40 -0400 Subject: [PATCH] Add more tests --- src/dependency_injector/providers.c | 125 ++++--- src/dependency_injector/providers.pyx | 8 +- tests/unit/providers/test_resource_py3.py | 400 +++++++++++++++------- 3 files changed, 358 insertions(+), 175 deletions(-) diff --git a/src/dependency_injector/providers.c b/src/dependency_injector/providers.c index 37aac677..3d628089 100644 --- a/src/dependency_injector/providers.c +++ b/src/dependency_injector/providers.c @@ -3302,7 +3302,6 @@ static const char __pyx_k_config_file[] = "config_file"; static const char __pyx_k_initialized[] = ", initialized="; static const char __pyx_k_initializer[] = "initializer"; static const char __pyx_k_instance_of[] = "instance_of"; -static const char __pyx_k_is_resource[] = "_is_resource"; static const char __pyx_k_merge_dicts[] = "merge_dicts"; static const char __pyx_k_reset_cache[] = "reset_cache"; static const char __pyx_k_ConfigParser[] = "ConfigParser"; @@ -3382,6 +3381,7 @@ static const char __pyx_k_iscoroutinefunction[] = "iscoroutinefunction"; static const char __pyx_k_isgeneratorfunction[] = "isgeneratorfunction"; static const char __pyx_k_pyx_unpickle_Object[] = "__pyx_unpickle_Object"; static const char __pyx_k_ThreadLocalSingleton[] = "ThreadLocalSingleton"; +static const char __pyx_k_is_resource_subclass[] = "_is_resource_subclass"; static const char __pyx_k_override_providers_2[] = "override_providers"; static const char __pyx_k_pyx_unpickle_Factory[] = "__pyx_unpickle_Factory"; static const char __pyx_k_str___locals_genexpr[] = "__str__..genexpr"; @@ -3709,7 +3709,7 @@ static PyObject *__pyx_kp_s_instance_of_0; static PyObject *__pyx_n_s_interpolation; static PyObject *__pyx_n_s_is_coroutine; static PyObject *__pyx_n_s_is_coroutine_marker; -static PyObject *__pyx_n_s_is_resource; +static PyObject *__pyx_n_s_is_resource_subclass; static PyObject *__pyx_n_s_iscoroutinefunction; static PyObject *__pyx_n_s_isgeneratorfunction; static PyObject *__pyx_n_s_item; @@ -4221,7 +4221,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_16represent_provider( static PyObject *__pyx_pf_19dependency_injector_9providers_18deepcopy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_instance, PyObject *__pyx_v_memo); /* proto */ static PyObject *__pyx_pf_19dependency_injector_9providers_20__add_sys_streams(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_memo); /* proto */ static PyObject *__pyx_pf_19dependency_injector_9providers_22merge_dicts(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_dict1, PyObject *__pyx_v_dict2); /* proto */ -static PyObject *__pyx_pf_19dependency_injector_9providers_24_is_resource(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_instance); /* proto */ +static PyObject *__pyx_pf_19dependency_injector_9providers_24_is_resource_subclass(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_instance); /* proto */ static PyObject *__pyx_pf_19dependency_injector_9providers_27__pyx_unpickle_Provider(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_pf_19dependency_injector_9providers_29__pyx_unpickle_Object(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_pf_19dependency_injector_9providers_31__pyx_unpickle_Delegate(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ @@ -48539,7 +48539,7 @@ static PyObject *__pyx_f_19dependency_injector_9providers_8Resource__provide(str * if self.__initialized: * return self.__resource # <<<<<<<<<<<<<< * - * if _is_resource(self.__initializer): + * if _is_resource_subclass(self.__initializer): */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->__pyx___resource); @@ -48558,11 +48558,11 @@ static PyObject *__pyx_f_19dependency_injector_9providers_8Resource__provide(str /* "dependency_injector/providers.pyx":2709 * return self.__resource * - * if _is_resource(self.__initializer): # <<<<<<<<<<<<<< + * if _is_resource_subclass(self.__initializer): # <<<<<<<<<<<<<< * initializer = self.__initializer() * self.__resource = __call( */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_is_resource); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 2709, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_is_resource_subclass); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 2709, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -48585,7 +48585,7 @@ static PyObject *__pyx_f_19dependency_injector_9providers_8Resource__provide(str /* "dependency_injector/providers.pyx":2710 * - * if _is_resource(self.__initializer): + * if _is_resource_subclass(self.__initializer): * initializer = self.__initializer() # <<<<<<<<<<<<<< * self.__resource = __call( * initializer.init, @@ -48640,7 +48640,7 @@ static PyObject *__pyx_f_19dependency_injector_9providers_8Resource__provide(str __Pyx_INCREF(__pyx_t_3); /* "dependency_injector/providers.pyx":2711 - * if _is_resource(self.__initializer): + * if _is_resource_subclass(self.__initializer): * initializer = self.__initializer() * self.__resource = __call( # <<<<<<<<<<<<<< * initializer.init, @@ -48675,7 +48675,7 @@ static PyObject *__pyx_f_19dependency_injector_9providers_8Resource__provide(str /* "dependency_injector/providers.pyx":2709 * return self.__resource * - * if _is_resource(self.__initializer): # <<<<<<<<<<<<<< + * if _is_resource_subclass(self.__initializer): # <<<<<<<<<<<<<< * initializer = self.__initializer() * self.__resource = __call( */ @@ -62780,43 +62780,44 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_22merge_dicts(CYTHON_ /* "dependency_injector/providers.pyx":3362 * * - * def _is_resource(instance): # <<<<<<<<<<<<<< + * def _is_resource_subclass(instance): # <<<<<<<<<<<<<< * if sys.version_info < (3, 5): * return False */ /* Python wrapper */ -static PyObject *__pyx_pw_19dependency_injector_9providers_25_is_resource(PyObject *__pyx_self, PyObject *__pyx_v_instance); /*proto*/ -static PyMethodDef __pyx_mdef_19dependency_injector_9providers_25_is_resource = {"_is_resource", (PyCFunction)__pyx_pw_19dependency_injector_9providers_25_is_resource, METH_O, 0}; -static PyObject *__pyx_pw_19dependency_injector_9providers_25_is_resource(PyObject *__pyx_self, PyObject *__pyx_v_instance) { +static PyObject *__pyx_pw_19dependency_injector_9providers_25_is_resource_subclass(PyObject *__pyx_self, PyObject *__pyx_v_instance); /*proto*/ +static PyMethodDef __pyx_mdef_19dependency_injector_9providers_25_is_resource_subclass = {"_is_resource_subclass", (PyCFunction)__pyx_pw_19dependency_injector_9providers_25_is_resource_subclass, METH_O, 0}; +static PyObject *__pyx_pw_19dependency_injector_9providers_25_is_resource_subclass(PyObject *__pyx_self, PyObject *__pyx_v_instance) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("_is_resource (wrapper)", 0); - __pyx_r = __pyx_pf_19dependency_injector_9providers_24_is_resource(__pyx_self, ((PyObject *)__pyx_v_instance)); + __Pyx_RefNannySetupContext("_is_resource_subclass (wrapper)", 0); + __pyx_r = __pyx_pf_19dependency_injector_9providers_24_is_resource_subclass(__pyx_self, ((PyObject *)__pyx_v_instance)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_19dependency_injector_9providers_24_is_resource(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_instance) { +static PyObject *__pyx_pf_19dependency_injector_9providers_24_is_resource_subclass(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_instance) { PyObject *__pyx_v_resources = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; + int __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_is_resource", 0); + __Pyx_RefNannySetupContext("_is_resource_subclass", 0); /* "dependency_injector/providers.pyx":3363 * - * def _is_resource(instance): + * def _is_resource_subclass(instance): * if sys.version_info < (3, 5): # <<<<<<<<<<<<<< * return False - * from . import resources + * if not isinstance(instance, CLASS_TYPES): */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_sys); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3363, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); @@ -62830,11 +62831,11 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_24_is_resource(CYTHON if (__pyx_t_3) { /* "dependency_injector/providers.pyx":3364 - * def _is_resource(instance): + * def _is_resource_subclass(instance): * if sys.version_info < (3, 5): * return False # <<<<<<<<<<<<<< - * from . import resources - * return isinstance(instance, resources.Resource) + * if not isinstance(instance, CLASS_TYPES): + * return */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(Py_False); @@ -62843,45 +62844,79 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_24_is_resource(CYTHON /* "dependency_injector/providers.pyx":3363 * - * def _is_resource(instance): + * def _is_resource_subclass(instance): * if sys.version_info < (3, 5): # <<<<<<<<<<<<<< * return False - * from . import resources + * if not isinstance(instance, CLASS_TYPES): */ } /* "dependency_injector/providers.pyx":3365 * if sys.version_info < (3, 5): * return False - * from . import resources # <<<<<<<<<<<<<< - * return isinstance(instance, resources.Resource) + * if not isinstance(instance, CLASS_TYPES): # <<<<<<<<<<<<<< + * return + * from . import resources */ - __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3365, __pyx_L1_error) + __pyx_t_1 = __pyx_v_19dependency_injector_9providers_CLASS_TYPES; + __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = PyObject_IsInstance(__pyx_v_instance, __pyx_t_1); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 3365, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = ((!(__pyx_t_3 != 0)) != 0); + if (__pyx_t_4) { + + /* "dependency_injector/providers.pyx":3366 + * return False + * if not isinstance(instance, CLASS_TYPES): + * return # <<<<<<<<<<<<<< + * from . import resources + * return issubclass(instance, resources.Resource) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "dependency_injector/providers.pyx":3365 + * if sys.version_info < (3, 5): + * return False + * if not isinstance(instance, CLASS_TYPES): # <<<<<<<<<<<<<< + * return + * from . import resources + */ + } + + /* "dependency_injector/providers.pyx":3367 + * if not isinstance(instance, CLASS_TYPES): + * return + * from . import resources # <<<<<<<<<<<<<< + * return issubclass(instance, resources.Resource) + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3367, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_resources); __Pyx_GIVEREF(__pyx_n_s_resources); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_resources); - __pyx_t_2 = __Pyx_Import(__pyx_kp_s__13, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3365, __pyx_L1_error) + __pyx_t_2 = __Pyx_Import(__pyx_kp_s__13, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3367, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_resources); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3365, __pyx_L1_error) + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_resources); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3367, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_1); __pyx_v_resources = __pyx_t_1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "dependency_injector/providers.pyx":3366 - * return False + /* "dependency_injector/providers.pyx":3368 + * return * from . import resources - * return isinstance(instance, resources.Resource) # <<<<<<<<<<<<<< + * return issubclass(instance, resources.Resource) # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_resources, __pyx_n_s_Resource); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3366, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_resources, __pyx_n_s_Resource); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3368, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyObject_IsInstance(__pyx_v_instance, __pyx_t_2); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 3366, __pyx_L1_error) + __pyx_t_4 = PyObject_IsSubclass(__pyx_v_instance, __pyx_t_2); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 3368, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3366, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3368, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; @@ -62890,7 +62925,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_24_is_resource(CYTHON /* "dependency_injector/providers.pyx":3362 * * - * def _is_resource(instance): # <<<<<<<<<<<<<< + * def _is_resource_subclass(instance): # <<<<<<<<<<<<<< * if sys.version_info < (3, 5): * return False */ @@ -62899,7 +62934,7 @@ static PyObject *__pyx_pf_19dependency_injector_9providers_24_is_resource(CYTHON __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("dependency_injector.providers._is_resource", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("dependency_injector.providers._is_resource_subclass", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_resources); @@ -90225,7 +90260,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_interpolation, __pyx_k_interpolation, sizeof(__pyx_k_interpolation), 0, 0, 1, 1}, {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, {&__pyx_n_s_is_coroutine_marker, __pyx_k_is_coroutine_marker, sizeof(__pyx_k_is_coroutine_marker), 0, 0, 1, 1}, - {&__pyx_n_s_is_resource, __pyx_k_is_resource, sizeof(__pyx_k_is_resource), 0, 0, 1, 1}, + {&__pyx_n_s_is_resource_subclass, __pyx_k_is_resource_subclass, sizeof(__pyx_k_is_resource_subclass), 0, 0, 1, 1}, {&__pyx_n_s_iscoroutinefunction, __pyx_k_iscoroutinefunction, sizeof(__pyx_k_iscoroutinefunction), 0, 0, 1, 1}, {&__pyx_n_s_isgeneratorfunction, __pyx_k_isgeneratorfunction, sizeof(__pyx_k_isgeneratorfunction), 0, 0, 1, 1}, {&__pyx_n_s_item, __pyx_k_item, sizeof(__pyx_k_item), 0, 0, 1, 1}, @@ -90440,10 +90475,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { /* "dependency_injector/providers.pyx":3363 * - * def _is_resource(instance): + * def _is_resource_subclass(instance): * if sys.version_info < (3, 5): # <<<<<<<<<<<<<< * return False - * from . import resources + * if not isinstance(instance, CLASS_TYPES): */ __pyx_tuple__14 = PyTuple_Pack(2, __pyx_int_3, __pyx_int_5); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 3363, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__14); @@ -90546,14 +90581,14 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { /* "dependency_injector/providers.pyx":3362 * * - * def _is_resource(instance): # <<<<<<<<<<<<<< + * def _is_resource_subclass(instance): # <<<<<<<<<<<<<< * if sys.version_info < (3, 5): * return False */ __pyx_tuple__30 = PyTuple_Pack(2, __pyx_n_s_instance, __pyx_n_s_resources); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(1, 3362, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__30); __Pyx_GIVEREF(__pyx_tuple__30); - __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_dependency_injector_provider, __pyx_n_s_is_resource, 3362, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(1, 3362, __pyx_L1_error) + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_dependency_injector_provider, __pyx_n_s_is_resource_subclass, 3362, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(1, 3362, __pyx_L1_error) /* "(tree fragment)":1 * def __pyx_unpickle_Provider(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< @@ -93343,13 +93378,13 @@ if (!__Pyx_RefNanny) { /* "dependency_injector/providers.pyx":3362 * * - * def _is_resource(instance): # <<<<<<<<<<<<<< + * def _is_resource_subclass(instance): # <<<<<<<<<<<<<< * if sys.version_info < (3, 5): * return False */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_19dependency_injector_9providers_25_is_resource, NULL, __pyx_n_s_dependency_injector_providers); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3362, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_19dependency_injector_9providers_25_is_resource_subclass, NULL, __pyx_n_s_dependency_injector_providers); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3362, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_resource, __pyx_t_1) < 0) __PYX_ERR(1, 3362, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_resource_subclass, __pyx_t_1) < 0) __PYX_ERR(1, 3362, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":1 diff --git a/src/dependency_injector/providers.pyx b/src/dependency_injector/providers.pyx index 7df29dff..332be899 100644 --- a/src/dependency_injector/providers.pyx +++ b/src/dependency_injector/providers.pyx @@ -2706,7 +2706,7 @@ cdef class Resource(Provider): if self.__initialized: return self.__resource - if _is_resource(self.__initializer): + if _is_resource_subclass(self.__initializer): initializer = self.__initializer() self.__resource = __call( initializer.init, @@ -3359,8 +3359,10 @@ def merge_dicts(dict1, dict2): return result -def _is_resource(instance): +def _is_resource_subclass(instance): if sys.version_info < (3, 5): return False + if not isinstance(instance, CLASS_TYPES): + return from . import resources - return isinstance(instance, resources.Resource) \ No newline at end of file + return issubclass(instance, resources.Resource) \ No newline at end of file diff --git a/tests/unit/providers/test_resource_py3.py b/tests/unit/providers/test_resource_py3.py index 271b0679..194c5aa5 100644 --- a/tests/unit/providers/test_resource_py3.py +++ b/tests/unit/providers/test_resource_py3.py @@ -4,17 +4,13 @@ import sys import unittest2 as unittest -from dependency_injector import providers +from dependency_injector import providers, resources, errors def init_fn(*args, **kwargs): return args, kwargs -def init_fn_return_none(*args, **kwargs): - return None - - class ResourceTests(unittest.TestCase): def test_is_provider(self): @@ -26,129 +22,279 @@ class ResourceTests(unittest.TestCase): # Initialization and shutdown # Injection - # Initializer: function - # Initializer: generator - # Initializer: base class - # Args - # Kwargs - # Overridden - # Deepcopy - # Repr + # + Initializer: function + # + Initializer: generator + # + Initializer: base class + # - Initializer: unknown type + # + Init() and shutdown() methods + # + Initialized + # + Args + # + Kwargs + # + Overridden + # + Deepcopy + # + Deepcopy initialized + # + Repr + + def test_init_function(self): + def _init(): + _init.counter += 1 + _init.counter = 0 + + provider = providers.Resource(_init) + + result1 = provider() + self.assertIsNone(result1) + self.assertEqual(_init.counter, 1) + + result2 = provider() + self.assertIsNone(result2) + self.assertEqual(_init.counter, 1) + + provider.shutdown() + + def test_init_generator(self): + def _init(): + _init.init_counter += 1 + yield + _init.shutdown_counter += 1 + + _init.init_counter = 0 + _init.shutdown_counter = 0 + + provider = providers.Resource(_init) + + result1 = provider() + self.assertIsNone(result1) + self.assertEqual(_init.init_counter, 1) + self.assertEqual(_init.shutdown_counter, 0) + + provider.shutdown() + self.assertEqual(_init.init_counter, 1) + self.assertEqual(_init.shutdown_counter, 1) + + result2 = provider() + self.assertIsNone(result2) + self.assertEqual(_init.init_counter, 2) + self.assertEqual(_init.shutdown_counter, 1) + + provider.shutdown() + self.assertEqual(_init.init_counter, 2) + self.assertEqual(_init.shutdown_counter, 2) + + def test_init_class(self): + class TestResource(resources.Resource): + init_counter = 0 + shutdown_counter = 0 + + def init(self): + self.__class__.init_counter += 1 + + def shutdown(self, _): + self.__class__.shutdown_counter += 1 + + provider = providers.Resource(TestResource) + + result1 = provider() + self.assertIsNone(result1) + self.assertEqual(TestResource.init_counter, 1) + self.assertEqual(TestResource.shutdown_counter, 0) + + provider.shutdown() + self.assertEqual(TestResource.init_counter, 1) + self.assertEqual(TestResource.shutdown_counter, 1) + + result2 = provider() + self.assertIsNone(result2) + self.assertEqual(TestResource.init_counter, 2) + self.assertEqual(TestResource.shutdown_counter, 1) + + provider.shutdown() + self.assertEqual(TestResource.init_counter, 2) + self.assertEqual(TestResource.shutdown_counter, 2) + + def test_init_and_shutdown(self): + def _init(): + _init.init_counter += 1 + yield + _init.shutdown_counter += 1 + + _init.init_counter = 0 + _init.shutdown_counter = 0 + + provider = providers.Resource(_init) + + result1 = provider.init() + self.assertIsNone(result1) + self.assertEqual(_init.init_counter, 1) + self.assertEqual(_init.shutdown_counter, 0) + + provider.shutdown() + self.assertEqual(_init.init_counter, 1) + self.assertEqual(_init.shutdown_counter, 1) + + result2 = provider.init() + self.assertIsNone(result2) + self.assertEqual(_init.init_counter, 2) + self.assertEqual(_init.shutdown_counter, 1) + + provider.shutdown() + self.assertEqual(_init.init_counter, 2) + self.assertEqual(_init.shutdown_counter, 2) + + def test_initialized(self): + provider = providers.Resource(init_fn) + self.assertFalse(provider.initialized) + + provider.init() + self.assertTrue(provider.initialized) + + provider.shutdown() + self.assertFalse(provider.initialized) + + def test_call_with_context_args(self): + provider = providers.Resource(init_fn, 'i1', 'i2') + self.assertEqual(provider('i3', i4=4), (('i1', 'i2', 'i3'), {'i4': 4})) + + def test_fluent_interface(self): + provider = providers.Resource(init_fn) \ + .add_args(1, 2) \ + .add_kwargs(a3=3, a4=4) + + self.assertEqual(provider(), ((1, 2), {'a3': 3, 'a4': 4})) + + def test_set_args(self): + provider = providers.Resource(init_fn) \ + .add_args(1, 2) \ + .set_args(3, 4) + self.assertEqual(provider.args, tuple([3, 4])) + + def test_clear_args(self): + provider = providers.Resource(init_fn) \ + .add_args(1, 2) \ + .clear_args() + self.assertEqual(provider.args, tuple()) + + def test_set_kwargs(self): + provider = providers.Resource(init_fn) \ + .add_kwargs(a1='i1', a2='i2') \ + .set_kwargs(a3='i3', a4='i4') + self.assertEqual(provider.kwargs, {'a3': 'i3', 'a4': 'i4'}) + + def test_clear_kwargs(self): + provider = providers.Resource(init_fn) \ + .add_kwargs(a1='i1', a2='i2') \ + .clear_kwargs() + self.assertEqual(provider.kwargs, {}) + + def test_call_overridden(self): + provider = providers.Resource(init_fn, 1) + overriding_provider1 = providers.Resource(init_fn, 2) + overriding_provider2 = providers.Resource(init_fn, 3) + + provider.override(overriding_provider1) + provider.override(overriding_provider2) + + instance1 = provider() + instance2 = provider() + + self.assertIs(instance1, instance2) + self.assertEqual(instance1, ((3,), {})) + self.assertEqual(instance2, ((3,), {})) + + def test_deepcopy(self): + provider = providers.Resource(init_fn, 1, 2, a3=3, a4=4) + + provider_copy = providers.deepcopy(provider) + + self.assertIsNot(provider, provider_copy) + self.assertEqual(provider.args, provider_copy.args) + self.assertEqual(provider.kwargs, provider_copy.kwargs) + self.assertIsInstance(provider, providers.Resource) + + def test_deepcopy_initialized(self): + provider = providers.Resource(init_fn) + provider.init() + + with self.assertRaises(errors.Error): + providers.deepcopy(provider) + + def test_deepcopy_from_memo(self): + provider = providers.Resource(init_fn) + provider_copy_memo = providers.Resource(init_fn) + + provider_copy = providers.deepcopy( + provider, + memo={id(provider): provider_copy_memo}, + ) + + self.assertIs(provider_copy, provider_copy_memo) + + def test_deepcopy_args(self): + provider = providers.Resource(init_fn) + dependent_provider1 = providers.Factory(list) + dependent_provider2 = providers.Factory(dict) + + provider.add_args(dependent_provider1, dependent_provider2) + + provider_copy = providers.deepcopy(provider) + dependent_provider_copy1 = provider_copy.args[0] + dependent_provider_copy2 = provider_copy.args[1] + + self.assertNotEqual(provider.args, provider_copy.args) + + self.assertIs(dependent_provider1.cls, dependent_provider_copy1.cls) + self.assertIsNot(dependent_provider1, dependent_provider_copy1) + + self.assertIs(dependent_provider2.cls, dependent_provider_copy2.cls) + self.assertIsNot(dependent_provider2, dependent_provider_copy2) + + def test_deepcopy_kwargs(self): + provider = providers.Resource(init_fn) + dependent_provider1 = providers.Factory(list) + dependent_provider2 = providers.Factory(dict) + + provider.add_kwargs(d1=dependent_provider1, d2=dependent_provider2) + + provider_copy = providers.deepcopy(provider) + dependent_provider_copy1 = provider_copy.kwargs['d1'] + dependent_provider_copy2 = provider_copy.kwargs['d2'] + + self.assertNotEqual(provider.kwargs, provider_copy.kwargs) + + self.assertIs(dependent_provider1.cls, dependent_provider_copy1.cls) + self.assertIsNot(dependent_provider1, dependent_provider_copy1) + + self.assertIs(dependent_provider2.cls, dependent_provider_copy2.cls) + self.assertIsNot(dependent_provider2, dependent_provider_copy2) + + def test_deepcopy_overridden(self): + provider = providers.Resource(init_fn) + object_provider = providers.Object(object()) + + provider.override(object_provider) + + provider_copy = providers.deepcopy(provider) + object_provider_copy = provider_copy.overridden[0] + + self.assertIsNot(provider, provider_copy) + self.assertEqual(provider.args, provider_copy.args) + self.assertIsInstance(provider, providers.Resource) + + self.assertIsNot(object_provider, object_provider_copy) + self.assertIsInstance(object_provider_copy, providers.Object) + + def test_deepcopy_with_sys_streams(self): + provider = providers.Resource(init_fn) + provider.add_args(sys.stdin, sys.stdout, sys.stderr) + + provider_copy = providers.deepcopy(provider) + + self.assertIsNot(provider, provider_copy) + self.assertIsInstance(provider_copy, providers.Resource) + self.assertIs(provider.args[0], sys.stdin) + self.assertIs(provider.args[1], sys.stdout) + self.assertIs(provider.args[2], sys.stderr) - # def test_call_with_init_positional_args(self): - # provider = providers.List('i1', 'i2') - # - # list1 = provider() - # list2 = provider() - # - # self.assertEqual(list1, ['i1', 'i2']) - # self.assertEqual(list2, ['i1', 'i2']) - # - # self.assertIsNot(list1, list2) - # - # def test_call_with_context_args(self): - # provider = providers.List('i1', 'i2') - # - # self.assertEqual(provider('i3', 'i4'), ['i1', 'i2', 'i3', 'i4']) - # - # def test_fluent_interface(self): - # provider = providers.List() \ - # .add_args(1, 2) - # - # self.assertEqual(provider(), [1, 2]) - # - # def test_set_args(self): - # provider = providers.List() \ - # .add_args(1, 2) \ - # .set_args(3, 4) - # self.assertEqual(provider.args, tuple([3, 4])) - # - # def test_clear_args(self): - # provider = providers.List() \ - # .add_args(1, 2) \ - # .clear_args() - # self.assertEqual(provider.args, tuple()) - # - # def test_call_overridden(self): - # provider = providers.List(1, 2) - # overriding_provider1 = providers.List(2, 3) - # overriding_provider2 = providers.List(3, 4) - # - # provider.override(overriding_provider1) - # provider.override(overriding_provider2) - # - # instance1 = provider() - # instance2 = provider() - # - # self.assertIsNot(instance1, instance2) - # self.assertEqual(instance1, [3, 4]) - # self.assertEqual(instance2, [3, 4]) - # - # def test_deepcopy(self): - # provider = providers.List(1, 2) - # - # provider_copy = providers.deepcopy(provider) - # - # self.assertIsNot(provider, provider_copy) - # self.assertEqual(provider.args, provider_copy.args) - # self.assertIsInstance(provider, providers.List) - # - # def test_deepcopy_from_memo(self): - # provider = providers.List(1, 2) - # provider_copy_memo = providers.List(1, 2) - # - # provider_copy = providers.deepcopy( - # provider, memo={id(provider): provider_copy_memo}) - # - # self.assertIs(provider_copy, provider_copy_memo) - # - # def test_deepcopy_args(self): - # provider = providers.List() - # dependent_provider1 = providers.Factory(list) - # dependent_provider2 = providers.Factory(dict) - # - # provider.add_args(dependent_provider1, dependent_provider2) - # - # provider_copy = providers.deepcopy(provider) - # dependent_provider_copy1 = provider_copy.args[0] - # dependent_provider_copy2 = provider_copy.args[1] - # - # self.assertNotEqual(provider.args, provider_copy.args) - # - # self.assertIs(dependent_provider1.cls, dependent_provider_copy1.cls) - # self.assertIsNot(dependent_provider1, dependent_provider_copy1) - # - # self.assertIs(dependent_provider2.cls, dependent_provider_copy2.cls) - # self.assertIsNot(dependent_provider2, dependent_provider_copy2) - # - # def test_deepcopy_overridden(self): - # provider = providers.List() - # object_provider = providers.Object(object()) - # - # provider.override(object_provider) - # - # provider_copy = providers.deepcopy(provider) - # object_provider_copy = provider_copy.overridden[0] - # - # self.assertIsNot(provider, provider_copy) - # self.assertEqual(provider.args, provider_copy.args) - # self.assertIsInstance(provider, providers.List) - # - # self.assertIsNot(object_provider, object_provider_copy) - # self.assertIsInstance(object_provider_copy, providers.Object) - # - # def test_deepcopy_with_sys_streams(self): - # provider = providers.List() - # provider.add_args(sys.stdin, sys.stdout, sys.stderr) - # - # provider_copy = providers.deepcopy(provider) - # - # self.assertIsNot(provider, provider_copy) - # self.assertIsInstance(provider_copy, providers.List) - # self.assertIs(provider.args[0], sys.stdin) - # self.assertIs(provider.args[1], sys.stdout) - # self.assertIs(provider.args[2], sys.stderr) - # def test_repr(self): provider = providers.Resource(init_fn)