_magic_methods = ['__subclasscheck__', '__hex__', '__rmul__',
'__float__', '__idiv__', '__setattr__', '__div__', '__invert__',
'__nonzero__', '__rshift__',
'__eq__', '__pos__', '__round__',
'__rand__', '__or__', '__complex__', '__divmod__',
'__len__', '__reversed__', '__copy__', '__reduce__',
'__deepcopy__', '__rdivmod__', '__rrshift__', '__ifloordiv__',
'__hash__', '__iand__', '__xor__', '__isub__', '__oct__',
'__ceil__', '__imod__', '__add__', '__truediv__',
'__unicode__', '__le__', '__delitem__', '__sizeof__', '__sub__',
'__ne__', '__pow__', '__bytes__', '__mul__',
'__itruediv__', '__bool__', '__iter__', '__abs__',
'__gt__', '__iadd__', '__enter__',
'__floordiv__', '__call__', '__neg__',
'__and__', '__ixor__', '__getitem__', '__exit__', '__cmp__',
'__getstate__', '__index__', '__contains__', '__floor__', '__lt__', '__getattr__',
'__mod__', '__trunc__', '__delattr__', '__instancecheck__', '__setitem__', '__ipow__',
'__ilshift__', '__long__', '__irshift__', '__imul__',
'__lshift__', '__dir__', '__ge__', '__int__', '__ior__']
class MockedObject:
_name: str
def __new__(cls, *args, **kwargs):
# _suppress_err is set by us in the mocked module impl, so that we can
# construct instances of MockedObject to hand out to people looking up
# module attributes.
# Any other attempt to construct a MockedOject instance (say, in the
# unpickling process) should give an error.
if not kwargs.get("_suppress_err"):
raise NotImplementedError(f"Object '{cls._name}' was mocked out during packaging "
f"but it is being used in '__new__'. If this error is "
"happening during 'load_pickle', please ensure that your "
"pickled object doesn't contain any mocked objects.")
# Otherwise, this is just a regular object creation
# (e.g. `x = MockedObject("foo")`), so pass it through normally.
return super().__new__(cls)
def __init__(self, name: str, _suppress_err: bool):
self.__dict__['_name'] = name
def __repr__(self):
return f"MockedObject({self._name})"
def install_method(method_name):
def _not_implemented(self, *args, **kwargs):
raise NotImplementedError(f"Object '{self._name}' was mocked out during packaging but it is being used in {method_name}")
setattr(MockedObject, method_name, _not_implemented)
for method_name in _magic_methods:
install_method(method_name)