Add more tests

This commit is contained in:
Roman Mogylatov 2020-10-23 17:05:40 -04:00
parent 45d04d8e6e
commit 2d3aa72cbd
3 changed files with 358 additions and 175 deletions

View File

@ -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__.<locals>.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

View File

@ -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)
return issubclass(instance, resources.Resource)

View File

@ -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)