in testslide/lib.py [0:0]
def _validate_argument_type(expected_type: Type, name: str, value: Any) -> None:
if "~" in str(expected_type):
# this means that we have a TypeVar type, and those require
# checking all the types of all the params as a whole, but we
# don't have a good way of getting right now
# TODO: #165
return
original_check_type = typeguard.check_type
original_qualified_name = typeguard.qualified_name
def wrapped_qualified_name(obj: object) -> str:
"""Needed to be able to show the useful qualified name for mock specs"""
if isinstance(obj, WrappedMock):
return obj.get_qualified_name()
return original_qualified_name(obj)
def wrapped_check_type(
argname: str,
inner_value: Any,
inner_expected_type: Type,
*args: Any,
globals: Optional[Dict[str, Any]] = None,
locals: Optional[Dict[str, Any]] = None,
**kwargs: Any,
) -> None:
if _is_a_mock(inner_value):
inner_type = _extract_mock_template(inner_value)
if inner_type is None:
return
# Ugly hack to make mock objects not be subclass of Mock
inner_value = WrappedMock(spec=inner_type)
# typeguard only checks the previous caller stack, so in order to be
# able to do forward type references we have to extract the caller
# stack ourselves.
if kwargs.get("memo") is None and globals is None and locals is None:
globals, locals = _get_caller_vars()
return original_check_type(
argname,
inner_value,
inner_expected_type,
*args,
globals=globals,
locals=locals,
**kwargs,
)
with unittest.mock.patch.object(
typeguard, "check_type", new=wrapped_check_type
), unittest.mock.patch.object(
typeguard, "qualified_name", new=wrapped_qualified_name
):
try:
typeguard.check_type(name, value, expected_type)
except TypeError as type_error:
raise TypeCheckError(str(type_error))