14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# mock.py 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# Test tools for mocking and patching. 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# Copyright (C) 2007-2012 Michael Foord & the mock team 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# E-mail: fuzzyman AT voidspace DOT org DOT uk 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# mock 1.0 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# http://www.voidspace.org.uk/python/mock/ 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# Released subject to the BSD License 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# Please see http://www.voidspace.org.uk/python/license.shtml 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# Scripts maintained at http://www.voidspace.org.uk/python/index.shtml 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# Comments, suggestions and bug reports welcome. 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann__all__ = ( 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'Mock', 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'MagicMock', 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'patch', 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'sentinel', 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'DEFAULT', 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'ANY', 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'call', 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'create_autospec', 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'FILTER_DIR', 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'NonCallableMock', 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'NonCallableMagicMock', 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'mock_open', 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'PropertyMock', 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann) 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann__version__ = '1.0.1' 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannimport pprint 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannimport sys 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntry: 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann import inspect 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannexcept ImportError: 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # for alternative platforms that 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # may not have inspect 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann inspect = None 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntry: 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann from functools import wraps as original_wraps 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannexcept ImportError: 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # Python 2.4 compatibility 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def wraps(original): 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def inner(f): 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann f.__name__ = original.__name__ 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann f.__doc__ = original.__doc__ 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann f.__module__ = original.__module__ 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann f.__wrapped__ = original 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return f 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return inner 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannelse: 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if sys.version_info[:2] >= (3, 3): 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wraps = original_wraps 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def wraps(func): 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def inner(f): 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann f = original_wraps(func)(f) 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann f.__wrapped__ = func 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return f 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return inner 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntry: 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unicode 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannexcept NameError: 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # Python 3 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann basestring = unicode = str 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntry: 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann long 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannexcept NameError: 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # Python 3 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann long = int 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntry: 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann BaseException 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannexcept NameError: 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # Python 2.4 compatibility 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann BaseException = Exception 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntry: 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann next 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannexcept NameError: 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def next(obj): 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj.next() 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannBaseExceptions = (BaseException,) 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannif 'java' in sys.platform: 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # jython 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann import java 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann BaseExceptions = (BaseException, java.lang.Throwable) 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntry: 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _isidentifier = str.isidentifier 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannexcept AttributeError: 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # Python 2.X 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann import keyword 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann import re 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann regex = re.compile(r'^[a-z_][a-z0-9_]*$', re.I) 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _isidentifier(string): 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if string in keyword.kwlist: 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return regex.match(string) 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmanninPy3k = sys.version_info[0] == 3 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# Needed to work around Python 3 bug where use of "super" interferes with 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# defining __class__ as a descriptor 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_super = super 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannself = 'im_self' 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbuiltin = '__builtin__' 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannif inPy3k: 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self = '__self__' 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann builtin = 'builtins' 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFILTER_DIR = True 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _is_instance_mock(obj): 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # can't use isinstance on Mock objects because they override __class__ 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # The base class for all mocks is NonCallableMock 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return issubclass(type(obj), NonCallableMock) 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _is_exception(obj): 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ( 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann isinstance(obj, BaseExceptions) or 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann isinstance(obj, ClassTypes) and issubclass(obj, BaseExceptions) 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _slotted(object): 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __slots__ = ['a'] 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannDescriptorTypes = ( 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann type(_slotted.a), 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann property, 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann) 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _getsignature(func, skipfirst, instance=False): 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if inspect is None: 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise ImportError('inspect module not available') 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(func, ClassTypes) and not instance: 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann func = func.__init__ 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann skipfirst = True 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif not isinstance(func, FunctionTypes): 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # for classes where instance is True we end up here too 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann func = func.__call__ 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if inPy3k: 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argspec = inspect.getfullargspec(func) 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except TypeError: 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # C function / method, possibly inherited object().__init__ 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann regargs, varargs, varkw, defaults, kwonly, kwonlydef, ann = argspec 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann regargs, varargs, varkwargs, defaults = inspect.getargspec(func) 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except TypeError: 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # C function / method, possibly inherited object().__init__ 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # instance methods and classmethods need to lose the self argument 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if getattr(func, self, None) is not None: 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann regargs = regargs[1:] 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if skipfirst: 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # this condition and the above one are never both True - why? 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann regargs = regargs[1:] 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if inPy3k: 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann signature = inspect.formatargspec( 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann regargs, varargs, varkw, defaults, 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann kwonly, kwonlydef, ann, formatvalue=lambda value: "") 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann signature = inspect.formatargspec( 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann regargs, varargs, varkwargs, defaults, 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formatvalue=lambda value: "") 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return signature[1:-1], func 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _check_signature(func, mock, skipfirst, instance=False): 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not _callable(func): 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result = _getsignature(func, skipfirst, instance) 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if result is None: 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann signature, func = result 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # can't use self because "self" is common as an argument name 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # unfortunately even not in the first place 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src = "lambda _mock_self, %s: None" % signature 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann checksig = eval(src, {}) 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _copy_func_details(func, checksig) 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann type(mock)._mock_check_sig = checksig 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _copy_func_details(func, funcopy): 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.__name__ = func.__name__ 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.__doc__ = func.__doc__ 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann #funcopy.__dict__.update(func.__dict__) 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.__module__ = func.__module__ 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not inPy3k: 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.func_defaults = func.func_defaults 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.__defaults__ = func.__defaults__ 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.__kwdefaults__ = func.__kwdefaults__ 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _callable(obj): 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(obj, ClassTypes): 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return True 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if getattr(obj, '__call__', None) is not None: 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return True 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _is_list(obj): 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # checks for list or tuples 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX badly named! 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return type(obj) in (list, tuple) 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _instance_callable(obj): 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Given an object, return True if the object is callable. 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann For classes, return True if instances would be callable.""" 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not isinstance(obj, ClassTypes): 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # already an instance 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return getattr(obj, '__call__', None) is not None 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann klass = obj 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # uses __bases__ instead of __mro__ so that we work with old style classes 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if klass.__dict__.get('__call__') is not None: 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return True 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for base in klass.__bases__: 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _instance_callable(base): 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return True 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _set_signature(mock, original, instance=False): 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # creates a function with signature (*args, **kwargs) that delegates to a 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # mock. It still does signature checking by calling a lambda with the same 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # signature as the original. 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not _callable(original): 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann skipfirst = isinstance(original, ClassTypes) 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result = _getsignature(original, skipfirst, instance) 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if result is None: 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # was a C function (e.g. object().__init__ ) that can't be mocked 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann signature, func = result 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src = "lambda %s: None" % signature 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann checksig = eval(src, {}) 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _copy_func_details(func, checksig) 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = original.__name__ 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not _isidentifier(name): 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = 'funcopy' 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context = {'_checksig_': checksig, 'mock': mock} 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src = """def %s(*args, **kwargs): 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _checksig_(*args, **kwargs) 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mock(*args, **kwargs)""" % name 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann exec (src, context) 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy = context[name] 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _setup_func(funcopy, mock) 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return funcopy 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _setup_func(funcopy, mock): 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.mock = mock 2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # can't use isinstance with mocks 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not _is_instance_mock(mock): 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def assert_called_with(*args, **kwargs): 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mock.assert_called_with(*args, **kwargs) 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def assert_called_once_with(*args, **kwargs): 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mock.assert_called_once_with(*args, **kwargs) 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def assert_has_calls(*args, **kwargs): 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mock.assert_has_calls(*args, **kwargs) 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def assert_any_call(*args, **kwargs): 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mock.assert_any_call(*args, **kwargs) 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def reset_mock(): 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.method_calls = _CallList() 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.mock_calls = _CallList() 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock.reset_mock() 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = funcopy.return_value 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_instance_mock(ret) and not ret is mock: 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret.reset_mock() 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.called = False 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.call_count = 0 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.call_args = None 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.call_args_list = _CallList() 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.method_calls = _CallList() 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.mock_calls = _CallList() 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.return_value = mock.return_value 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.side_effect = mock.side_effect 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy._mock_children = mock._mock_children 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.assert_called_with = assert_called_with 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.assert_called_once_with = assert_called_once_with 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.assert_has_calls = assert_has_calls 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.assert_any_call = assert_any_call 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann funcopy.reset_mock = reset_mock 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock._mock_delegate = funcopy 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _is_magic(name): 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return '__%s__' % name[2:-2] == name 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _SentinelObject(object): 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "A unique, named, sentinel object." 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self, name): 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.name = name 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __repr__(self): 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 'sentinel.%s' % self.name 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _Sentinel(object): 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Access attributes to return a named object, usable as a sentinel.""" 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self): 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._sentinels = {} 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __getattr__(self, name): 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name == '__bases__': 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # Without this help(mock) raises an exception 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self._sentinels.setdefault(name, _SentinelObject(name)) 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannsentinel = _Sentinel() 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannDEFAULT = sentinel.DEFAULT 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_missing = sentinel.MISSING 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_deleted = sentinel.DELETED 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass OldStyleClass: 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pass 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannClassType = type(OldStyleClass) 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _copy(value): 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if type(value) in (dict, list, tuple, set): 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return type(value)(value) 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return value 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannClassTypes = (type,) 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannif not inPy3k: 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ClassTypes = (type, ClassType) 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_allowed_names = set( 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann [ 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'return_value', '_mock_return_value', 'side_effect', 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '_mock_side_effect', '_mock_parent', '_mock_new_parent', 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '_mock_name', '_mock_new_name' 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ] 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann) 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _delegating_property(name): 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _allowed_names.add(name) 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _the_name = '_mock_' + name 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _get(self, name=name, _the_name=_the_name): 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sig = self._mock_delegate 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if sig is None: 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return getattr(self, _the_name) 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return getattr(sig, name) 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _set(self, value, name=name, _the_name=_the_name): 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sig = self._mock_delegate 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if sig is None: 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.__dict__[_the_name] = value 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(sig, name, value) 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return property(_get, _set) 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _CallList(list): 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __contains__(self, value): 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not isinstance(value, list): 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return list.__contains__(self, value) 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann len_value = len(value) 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann len_self = len(self) 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if len_value > len_self: 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for i in range(0, len_self - len_value + 1): 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sub_list = self[i:i+len_value] 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if sub_list == value: 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return True 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __repr__(self): 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pprint.pformat(list(self)) 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _check_and_set_parent(parent, value, name, new_name): 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not _is_instance_mock(value): 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((value._mock_name or value._mock_new_name) or 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (value._mock_parent is not None) or 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (value._mock_new_parent is not None)): 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _parent = parent 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while _parent is not None: 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # setting a mock (value) as a child or return value of itself 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # should not modify the mock 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _parent is value: 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _parent = _parent._mock_new_parent 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if new_name: 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value._mock_new_parent = parent 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value._mock_new_name = new_name 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name: 4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value._mock_parent = parent 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value._mock_name = name 4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return True 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass Base(object): 4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _mock_return_value = DEFAULT 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _mock_side_effect = None 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self, *args, **kwargs): 4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pass 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass NonCallableMock(Base): 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """A non-callable version of `Mock`""" 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __new__(cls, *args, **kw): 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # every instance has its own class 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # so we can create magic methods on the 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # class without stomping on other mocks 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__}) 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann instance = object.__new__(new) 4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return instance 4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__( 4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self, spec=None, wraps=None, name=None, spec_set=None, 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent=None, _spec_state=None, _new_name='', _new_parent=None, 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann **kwargs 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ): 4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _new_parent is None: 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent = parent 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__ = self.__dict__ 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_parent'] = parent 4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_name'] = name 4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_new_name'] = _new_name 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_new_parent'] = _new_parent 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set is not None: 4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec = spec_set 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set = True 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_add_spec(spec, spec_set) 4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_children'] = {} 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_wraps'] = wraps 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_delegate'] = None 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_called'] = False 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_call_args'] = None 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_call_count'] = 0 5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_call_args_list'] = _CallList() 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_mock_calls'] = _CallList() 5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['method_calls'] = _CallList() 5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if kwargs: 5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.configure_mock(**kwargs) 5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _super(NonCallableMock, self).__init__( 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec, wraps, name, spec_set, parent, 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _spec_state 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def attach_mock(self, mock, attribute): 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Attach a mock as an attribute of this one, replacing its name and 5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent. Calls to the attached mock will be recorded in the 5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `method_calls` and `mock_calls` attributes of this one.""" 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock._mock_parent = None 5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock._mock_new_parent = None 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock._mock_name = '' 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock._mock_new_name = None 5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(self, attribute, mock) 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def mock_add_spec(self, spec, spec_set=False): 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Add a spec to a mock. `spec` can either be an object or a 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann list of strings. Only attributes on the `spec` can be fetched as 5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attributes from the mock. 5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `spec_set` is True then only attributes on the spec can be set.""" 5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_add_spec(spec, spec_set) 5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _mock_add_spec(self, spec, spec_set): 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _spec_class = None 5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec is not None and not _is_list(spec): 5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(spec, ClassTypes): 5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _spec_class = spec 5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _spec_class = _get_class(spec) 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec = dir(spec) 5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__ = self.__dict__ 5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_spec_class'] = _spec_class 5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_spec_set'] = spec_set 5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __dict__['_mock_methods'] = spec 5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __get_return_value(self): 5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = self._mock_return_value 5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self._mock_delegate is not None: 5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = self._mock_delegate.return_value 5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ret is DEFAULT: 5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = self._get_child_mock( 5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent=self, _new_name='()' 5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.return_value = ret 5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret 5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __set_return_value(self, value): 5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self._mock_delegate is not None: 5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_delegate.return_value = value 5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_return_value = value 5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _check_and_set_parent(self, value, None, '()') 5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __return_value_doc = "The value to be returned when the mock is called." 5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return_value = property(__get_return_value, __set_return_value, 5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __return_value_doc) 5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann @property 5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __class__(self): 5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self._spec_class is None: 5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return type(self) 5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self._spec_class 5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann called = _delegating_property('called') 5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann call_count = _delegating_property('call_count') 5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann call_args = _delegating_property('call_args') 5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann call_args_list = _delegating_property('call_args_list') 5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock_calls = _delegating_property('mock_calls') 5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __get_side_effect(self): 5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sig = self._mock_delegate 5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if sig is None: 5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self._mock_side_effect 5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return sig.side_effect 6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __set_side_effect(self, value): 6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value = _try_iter(value) 6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sig = self._mock_delegate 6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if sig is None: 6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_side_effect = value 6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sig.side_effect = value 6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann side_effect = property(__get_side_effect, __set_side_effect) 6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def reset_mock(self): 6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "Restore the mock object to its initial state." 6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.called = False 6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.call_args = None 6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.call_count = 0 6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.mock_calls = _CallList() 6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.call_args_list = _CallList() 6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.method_calls = _CallList() 6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for child in self._mock_children.values(): 6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(child, _SpecState): 6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue 6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann child.reset_mock() 6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = self._mock_return_value 6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_instance_mock(ret) and ret is not self: 6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret.reset_mock() 6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def configure_mock(self, **kwargs): 6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Set attributes on the mock through keyword arguments. 6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Attributes plus return values and side effects can be set on child 6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mocks using standard dot notation and unpacking a dictionary in the 6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann method call: 6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError} 6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann >>> mock.configure_mock(**attrs)""" 6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for arg, val in sorted(kwargs.items(), 6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # we sort on the number of dots so that 6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # attributes are set before we set attributes on 6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # attributes 6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann key=lambda entry: entry[0].count('.')): 6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args = arg.split('.') 6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann final = args.pop() 6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann obj = self 6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for entry in args: 6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann obj = getattr(obj, entry) 6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(obj, final, val) 6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __getattr__(self, name): 6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name == '_mock_methods': 6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError(name) 6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif self._mock_methods is not None: 6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name not in self._mock_methods or name in _all_magics: 6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError("Mock object has no attribute %r" % name) 6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif _is_magic(name): 6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError(name) 6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result = self._mock_children.get(name) 6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if result is _deleted: 6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError(name) 6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif result is None: 6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wraps = None 6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self._mock_wraps is not None: 6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX should we get the attribute without triggering code 6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # execution? 6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wraps = getattr(self._mock_wraps, name) 6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result = self._get_child_mock( 6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent=self, name=name, wraps=wraps, _new_name=name, 6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent=self 6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_children[name] = result 6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif isinstance(result, _SpecState): 6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result = create_autospec( 6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result.spec, result.spec_set, result.instance, 6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result.parent, result.name 6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_children[name] = result 6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return result 6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __repr__(self): 6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _name_list = [self._mock_new_name] 6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _parent = self._mock_new_parent 6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann last = self 6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dot = '.' 6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _name_list == ['()']: 6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dot = '' 6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann seen = set() 6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while _parent is not None: 6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann last = _parent 6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _name_list.append(_parent._mock_new_name + dot) 7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dot = '.' 7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _parent._mock_new_name == '()': 7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dot = '' 7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _parent = _parent._mock_new_parent 7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # use ids here so as not to call __hash__ on the mocks 7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if id(_parent) in seen: 7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break 7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann seen.add(id(_parent)) 7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _name_list = list(reversed(_name_list)) 7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _first = last._mock_name or 'mock' 7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if len(_name_list) > 1: 7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _name_list[1] not in ('()', '().'): 7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _first += '.' 7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _name_list[0] = _first 7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = ''.join(_name_list) 7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name_string = '' 7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name not in ('mock', 'mock.'): 7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name_string = ' name=%r' % name 7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_string = '' 7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self._spec_class is not None: 7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_string = ' spec=%r' 7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self._spec_set: 7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_string = ' spec_set=%r' 7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_string = spec_string % self._spec_class.__name__ 7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return "<%s%s%s id='%s'>" % ( 7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann type(self).__name__, 7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name_string, 7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_string, 7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann id(self) 7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __dir__(self): 7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Filter the output of `dir(mock)` to only useful members. 7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XXXX 7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann extras = self._mock_methods or [] 7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann from_type = dir(type(self)) 7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann from_dict = list(self.__dict__) 7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if FILTER_DIR: 7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann from_type = [e for e in from_type if not e.startswith('_')] 7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann from_dict = [e for e in from_dict if not e.startswith('_') or 7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _is_magic(e)] 7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return sorted(set(extras + from_type + from_dict + 7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann list(self._mock_children))) 7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __setattr__(self, name, value): 7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name in _allowed_names: 7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # property setters go through here 7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return object.__setattr__(self, name, value) 7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif (self._spec_set and self._mock_methods is not None and 7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name not in self._mock_methods and 7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name not in self.__dict__): 7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError("Mock object has no attribute '%s'" % name) 7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif name in _unsupported_magics: 7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann msg = 'Attempting to set unsupported magic method %r.' % name 7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError(msg) 7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif name in _all_magics: 7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self._mock_methods is not None and name not in self._mock_methods: 7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError("Mock object has no attribute '%s'" % name) 7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not _is_instance_mock(value): 7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(type(self), name, _get_method(name, value)) 7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original = value 7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value = lambda *args, **kw: original(self, *args, **kw) 7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # only set _new_name and not name so that mock_calls is tracked 7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # but not method calls 7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _check_and_set_parent(self, value, None, name) 7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(type(self), name, value) 7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_children[name] = value 7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif name == '__class__': 7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._spec_class = value 7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _check_and_set_parent(self, value, name, name): 7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_children[name] = value 7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return object.__setattr__(self, name, value) 7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __delattr__(self, name): 7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name in _all_magics and name in type(self).__dict__: 7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delattr(type(self), name) 7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name not in self.__dict__: 7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # for magic methods that are still MagicProxy objects and 7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # not set on the instance itself 7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name in self.__dict__: 7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann object.__delattr__(self, name) 7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann obj = self._mock_children.get(name, _missing) 8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if obj is _deleted: 8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError(name) 8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if obj is not _missing: 8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann del self._mock_children[name] 8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_children[name] = _deleted 8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _format_mock_call_signature(self, args, kwargs): 8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = self._mock_name or 'mock' 8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _format_call_signature(name, args, kwargs) 8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _format_mock_failure_message(self, args, kwargs): 8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann message = 'Expected call: %s\nActual call: %s' 8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann expected_string = self._format_mock_call_signature(args, kwargs) 8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann call_args = self.call_args 8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if len(call_args) == 3: 8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann call_args = call_args[1:] 8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann actual_string = self._format_mock_call_signature(*call_args) 8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return message % (expected_string, actual_string) 8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def assert_called_with(_mock_self, *args, **kwargs): 8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """assert that the mock was called with the specified arguments. 8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Raises an AssertionError if the args and keyword args passed in are 8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann different to the last call to the mock.""" 8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self = _mock_self 8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self.call_args is None: 8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann expected = self._format_mock_call_signature(args, kwargs) 8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AssertionError('Expected call: %s\nNot called' % (expected,)) 8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self.call_args != (args, kwargs): 8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann msg = self._format_mock_failure_message(args, kwargs) 8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AssertionError(msg) 8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def assert_called_once_with(_mock_self, *args, **kwargs): 8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """assert that the mock was called exactly once and with the specified 8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arguments.""" 8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self = _mock_self 8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not self.call_count == 1: 8434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann msg = ("Expected to be called once. Called %s times." % 8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.call_count) 8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AssertionError(msg) 8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self.assert_called_with(*args, **kwargs) 8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def assert_has_calls(self, calls, any_order=False): 8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """assert the mock has been called with the specified calls. 8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann The `mock_calls` list is checked for the calls. 8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `any_order` is False (the default) then the calls must be 8544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sequential. There can be extra calls before or after the 8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann specified calls. 8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `any_order` is True then the calls can be in any order, but 8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann they must all appear in `mock_calls`.""" 8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not any_order: 8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if calls not in self.mock_calls: 8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AssertionError( 8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'Calls not found.\nExpected: %r\n' 8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'Actual: %r' % (calls, self.mock_calls) 8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann all_calls = list(self.mock_calls) 8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann not_found = [] 8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for kall in calls: 8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann all_calls.remove(kall) 8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except ValueError: 8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann not_found.append(kall) 8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not_found: 8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AssertionError( 8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '%r not all found in call list' % (tuple(not_found),) 8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def assert_any_call(self, *args, **kwargs): 8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """assert the mock has been called with the specified arguments. 8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann The assert passes if the mock has *ever* been called, unlike 8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `assert_called_with` and `assert_called_once_with` that only pass if 8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann the call is the most recent one.""" 8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann kall = call(*args, **kwargs) 8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if kall not in self.call_args_list: 8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann expected_string = self._format_mock_call_signature(args, kwargs) 8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AssertionError( 8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '%s call not found' % expected_string 8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _get_child_mock(self, **kw): 8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Create the child mocks for attributes and return value. 8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann By default child mocks will be the same type as the parent. 8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Subclasses of Mock may want to override this to customize the way 8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann child mocks are made. 9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann For non-callable mocks the callable variant will be used (rather than 9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann any custom subclass).""" 9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _type = type(self) 9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not issubclass(_type, CallableMixin): 9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if issubclass(_type, NonCallableMagicMock): 9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann klass = MagicMock 9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif issubclass(_type, NonCallableMock) : 9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann klass = Mock 9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann klass = _type.__mro__[1] 9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return klass(**kw) 9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _try_iter(obj): 9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if obj is None: 9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj 9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_exception(obj): 9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj 9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _callable(obj): 9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj 9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iter(obj) 9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except TypeError: 9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX backwards compatibility 9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # but this will blow up on first call - so maybe we should fail early? 9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj 9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CallableMixin(Base): 9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self, spec=None, side_effect=None, return_value=DEFAULT, 9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wraps=None, name=None, spec_set=None, parent=None, 9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _spec_state=None, _new_name='', _new_parent=None, **kwargs): 9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.__dict__['_mock_return_value'] = return_value 9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _super(CallableMixin, self).__init__( 9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec, wraps, name, spec_set, parent, 9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _spec_state, _new_name, _new_parent, **kwargs 9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.side_effect = side_effect 9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _mock_check_sig(self, *args, **kwargs): 9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # stub method that can be replaced with one with a specific signature 9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pass 9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __call__(_mock_self, *args, **kwargs): 9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # can't use self in-case a function / method we are mocking uses self 9534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # in the signature 9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _mock_self._mock_check_sig(*args, **kwargs) 9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _mock_self._mock_call(*args, **kwargs) 9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _mock_call(_mock_self, *args, **kwargs): 9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self = _mock_self 9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.called = True 9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.call_count += 1 9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.call_args = _Call((args, kwargs), two=True) 9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.call_args_list.append(_Call((args, kwargs), two=True)) 9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_name = self._mock_new_name 9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent = self._mock_new_parent 9674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.mock_calls.append(_Call(('', args, kwargs))) 9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann seen = set() 9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann skip_next_dot = _new_name == '()' 9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann do_method_calls = self._mock_parent is not None 9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = self._mock_name 9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while _new_parent is not None: 9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_mock_call = _Call((_new_name, args, kwargs)) 9754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _new_parent._mock_new_name: 9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dot = '.' 9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if skip_next_dot: 9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dot = '' 9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann skip_next_dot = False 9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _new_parent._mock_new_name == '()': 9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann skip_next_dot = True 9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_name = _new_parent._mock_new_name + dot + _new_name 9854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if do_method_calls: 9874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _new_name == name: 9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_method_call = this_mock_call 9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_method_call = _Call((name, args, kwargs)) 9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent.method_calls.append(this_method_call) 9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann do_method_calls = _new_parent._mock_parent is not None 9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if do_method_calls: 9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = _new_parent._mock_name + '.' + name 9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent.mock_calls.append(this_mock_call) 9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent = _new_parent._mock_new_parent 9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # use ids here so as not to call __hash__ on the mocks 10014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent_id = id(_new_parent) 10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _new_parent_id in seen: 10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break 10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann seen.add(_new_parent_id) 10054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret_val = DEFAULT 10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann effect = self.side_effect 10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if effect is not None: 10094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_exception(effect): 10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise effect 10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not _callable(effect): 10134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result = next(effect) 10144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_exception(result): 10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise result 10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return result 10174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret_val = effect(*args, **kwargs) 10194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ret_val is DEFAULT: 10204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret_val = self.return_value 10214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (self._mock_wraps is not None and 10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_return_value is DEFAULT): 10244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self._mock_wraps(*args, **kwargs) 10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ret_val is DEFAULT: 10264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret_val = self.return_value 10274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret_val 10284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass Mock(CallableMixin, NonCallableMock): 10324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 10334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Create a new `Mock` object. `Mock` takes several optional arguments 10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann that specify the behaviour of the Mock object: 10354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * `spec`: This can be either a list of strings or an existing object (a 10374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann class or instance) that acts as the specification for the mock object. If 10384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann you pass in an object then a list of strings is formed by calling dir on 10394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann the object (excluding unsupported magic attributes and methods). Accessing 10404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann any attribute not in this list will raise an `AttributeError`. 10414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `spec` is an object (rather than a list of strings) then 10434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `mock.__class__` returns the class of the spec object. This allows mocks 10444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann to pass `isinstance` tests. 10454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * `spec_set`: A stricter variant of `spec`. If used, attempting to *set* 10474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann or get an attribute on the mock that isn't on the object passed as 10484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `spec_set` will raise an `AttributeError`. 10494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * `side_effect`: A function to be called whenever the Mock is called. See 10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann the `side_effect` attribute. Useful for raising exceptions or 10524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dynamically changing return values. The function is called with the same 10534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arguments as the mock, and unless it returns `DEFAULT`, the return 10544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value of this function is used as the return value. 10554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Alternatively `side_effect` can be an exception class or instance. In 10574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this case the exception will be raised when the mock is called. 10584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `side_effect` is an iterable then each call to the mock will return 10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann the next value from the iterable. If any of the members of the iterable 10614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann are exceptions they will be raised instead of returned. 10624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * `return_value`: The value returned when the mock is called. By default 10644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this is a new Mock (created on first access). See the 10654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `return_value` attribute. 10664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * `wraps`: Item for the mock object to wrap. If `wraps` is not None then 10684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann calling the Mock will pass the call through to the wrapped object 10694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (returning the real result). Attribute access on the mock will return a 10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Mock object that wraps the corresponding attribute of the wrapped object 10714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (so attempting to access an attribute that doesn't exist will raise an 10724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `AttributeError`). 10734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If the mock has an explicit `return_value` set then calls are not passed 10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann to the wrapped object and the `return_value` is returned instead. 10764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * `name`: If the mock has a name then it will be used in the repr of the 10784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock. This can be useful for debugging. The name is propagated to child 10794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mocks. 10804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Mocks can also be called with arbitrary keyword arguments. These will be 10824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann used to set attributes on the mock after it is created. 10834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 10844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _dot_lookup(thing, comp, import_path): 10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 10894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return getattr(thing, comp) 10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann __import__(import_path) 10924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return getattr(thing, comp) 10934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _importer(target): 10964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann components = target.split('.') 10974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann import_path = components.pop(0) 10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann thing = __import__(import_path) 10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for comp in components: 11014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann import_path += ".%s" % comp 11024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann thing = _dot_lookup(thing, comp, import_path) 11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return thing 11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _is_started(patcher): 11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX horrible 11084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return hasattr(patcher, 'is_local') 11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _patch(object): 11124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attribute_name = None 11144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _active_patches = set() 11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__( 11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self, getter, attribute, new, spec, create, 11184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set, autospec, new_callable, kwargs 11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ): 11204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if new_callable is not None: 11214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if new is not DEFAULT: 11224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise ValueError( 11234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "Cannot use 'new' and 'new_callable' together" 11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if autospec is not None: 11264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise ValueError( 11274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "Cannot use 'autospec' and 'new_callable' together" 11284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 11294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.getter = getter 11314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.attribute = attribute 11324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.new = new 11334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.new_callable = new_callable 11344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.spec = spec 11354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.create = create 11364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.has_local = False 11374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.spec_set = spec_set 11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.autospec = autospec 11394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.kwargs = kwargs 11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.additional_patchers = [] 11414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def copy(self): 11444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patcher = _patch( 11454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.getter, self.attribute, self.new, self.spec, 11464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.create, self.spec_set, 11474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.autospec, self.new_callable, self.kwargs 11484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 11494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patcher.attribute_name = self.attribute_name 11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patcher.additional_patchers = [ 11514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p.copy() for p in self.additional_patchers 11524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ] 11534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return patcher 11544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __call__(self, func): 11574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(func, ClassTypes): 11584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self.decorate_class(func) 11594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self.decorate_callable(func) 11604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def decorate_class(self, klass): 11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for attr in dir(klass): 11644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not attr.startswith(patch.TEST_PREFIX): 11654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue 11664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attr_value = getattr(klass, attr) 11684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not hasattr(attr_value, "__call__"): 11694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue 11704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patcher = self.copy() 11724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(klass, attr, patcher(attr_value)) 11734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return klass 11744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def decorate_callable(self, func): 11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if hasattr(func, 'patchings'): 11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann func.patchings.append(self) 11794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return func 11804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann @wraps(func) 11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def patched(*args, **keywargs): 11834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # don't use a with here (backwards compatability with Python 2.4) 11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann extra_args = [] 11854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann entered_patchers = [] 11864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # can't use try...except...finally because of Python 2.4 11884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # compatibility 11894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann exc_info = tuple() 11904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for patching in patched.patchings: 11934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg = patching.__enter__() 11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann entered_patchers.append(patching) 11954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if patching.attribute_name is not None: 11964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann keywargs.update(arg) 11974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif patching.new is DEFAULT: 11984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann extra_args.append(arg) 11994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args += tuple(extra_args) 12014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return func(*args, **keywargs) 12024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except: 12034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (patching not in entered_patchers and 12044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _is_started(patching)): 12054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # the patcher may have been started, but an exception 12064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # raised whilst entering one of its additional_patchers 12074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann entered_patchers.append(patching) 12084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # Pass the exception to __exit__ 12094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann exc_info = sys.exc_info() 12104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # re-raise the exception 12114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise 12124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann finally: 12134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for patching in reversed(entered_patchers): 12144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patching.__exit__(*exc_info) 12154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patched.patchings = [self] 12174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if hasattr(func, 'func_code'): 12184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # not in Python 3 12194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patched.compat_co_firstlineno = getattr( 12204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann func, "compat_co_firstlineno", 12214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann func.func_code.co_firstlineno 12224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 12234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return patched 12244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def get_original(self): 12274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann target = self.getter() 12284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = self.attribute 12294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original = DEFAULT 12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann local = False 12324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 12344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original = target.__dict__[name] 12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except (AttributeError, KeyError): 12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original = getattr(target, name, DEFAULT) 12374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 12384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann local = True 12394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not self.create and original is DEFAULT: 12414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise AttributeError( 12424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "%s does not have the attribute %r" % (target, name) 12434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 12444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return original, local 12454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __enter__(self): 12484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Perform the patch.""" 12494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new, spec, spec_set = self.new, self.spec, self.spec_set 12504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann autospec, kwargs = self.autospec, self.kwargs 12514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_callable = self.new_callable 12524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.target = self.getter() 12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # normalise False to None 12554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec is False: 12564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec = None 12574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set is False: 12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set = None 12594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if autospec is False: 12604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann autospec = None 12614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec is not None and autospec is not None: 12634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise TypeError("Can't specify spec and autospec") 12644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((spec is not None or autospec is not None) and 12654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set not in (True, None)): 12664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise TypeError("Can't provide explicit spec_set *and* spec or autospec") 12674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original, local = self.get_original() 12694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if new is DEFAULT and autospec is None: 12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann inherit = False 12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec is True: 12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # set spec to the object we are replacing 12744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec = original 12754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set is True: 12764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set = original 12774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec = None 12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif spec is not None: 12794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set is True: 12804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set = spec 12814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec = None 12824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif spec_set is True: 12834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set = original 12844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec is not None or spec_set is not None: 12864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if original is DEFAULT: 12874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise TypeError("Can't use 'spec' with create=True") 12884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(original, ClassTypes): 12894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # If we're patching out a class and there is a spec 12904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann inherit = True 12914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Klass = MagicMock 12934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs = {} 12944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if new_callable is not None: 12954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Klass = new_callable 12964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif spec is not None or spec_set is not None: 12974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_spec = spec 12984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set is not None: 12994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_spec = spec_set 13004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_list(this_spec): 13014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann not_callable = '__call__' not in this_spec 13024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 13034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann not_callable = not _callable(this_spec) 13044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not_callable: 13054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Klass = NonCallableMagicMock 13064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec is not None: 13084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs['spec'] = spec 13094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set is not None: 13104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs['spec_set'] = spec_set 13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # add a name to mocks 13134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (isinstance(Klass, type) and 13144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann issubclass(Klass, NonCallableMock) and self.attribute): 13154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs['name'] = self.attribute 13164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs.update(kwargs) 13184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new = Klass(**_kwargs) 13194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if inherit and _is_instance_mock(new): 13214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # we can only tell if the instance should be callable if the 13224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # spec is not a list 13234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_spec = spec 13244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set is not None: 13254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_spec = spec_set 13264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (not _is_list(this_spec) and not 13274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _instance_callable(this_spec)): 13284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Klass = NonCallableMagicMock 13294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs.pop('name') 13314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new.return_value = Klass(_new_parent=new, _new_name='()', 13324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann **_kwargs) 13334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif autospec is not None: 13344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # spec is ignored, new *must* be default, spec_set is treated 13354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # as a boolean. Should we check spec is not None and that spec_set 13364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # is a bool? 13374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if new is not DEFAULT: 13384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise TypeError( 13394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "autospec creates the mock for you. Can't specify " 13404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "autospec and new." 13414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 13424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if original is DEFAULT: 13434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise TypeError("Can't use 'autospec' with create=True") 13444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set = bool(spec_set) 13454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if autospec is True: 13464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann autospec = original 13474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new = create_autospec(autospec, spec_set=spec_set, 13494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _name=self.attribute, **kwargs) 13504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif kwargs: 13514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # can't set keyword args when we aren't creating the mock 13524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX If new is a Mock we could call new.configure_mock(**kwargs) 13534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise TypeError("Can't pass kwargs to a mock we aren't creating") 13544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_attr = new 13564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.temp_original = original 13584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.is_local = local 13594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(self.target, self.attribute, new_attr) 13604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self.attribute_name is not None: 13614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann extra_args = {} 13624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self.new is DEFAULT: 13634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann extra_args[self.attribute_name] = new 13644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for patching in self.additional_patchers: 13654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg = patching.__enter__() 13664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if patching.new is DEFAULT: 13674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann extra_args.update(arg) 13684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return extra_args 13694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return new 13714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __exit__(self, *exc_info): 13744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Undo the patch.""" 13754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not _is_started(self): 13764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise RuntimeError('stop called on unstarted patcher') 13774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self.is_local and self.temp_original is not DEFAULT: 13794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(self.target, self.attribute, self.temp_original) 13804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 13814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delattr(self.target, self.attribute) 13824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not self.create and not hasattr(self.target, self.attribute): 13834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # needed for proxy objects like django settings 13844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(self.target, self.attribute, self.temp_original) 13854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann del self.temp_original 13874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann del self.is_local 13884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann del self.target 13894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for patcher in reversed(self.additional_patchers): 13904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_started(patcher): 13914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patcher.__exit__(*exc_info) 13924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def start(self): 13954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Activate a patch, returning any created mock.""" 13964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result = self.__enter__() 13974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._active_patches.add(self) 13984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return result 13994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def stop(self): 14024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Stop an active patch.""" 14034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._active_patches.discard(self) 14044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self.__exit__() 14054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _get_target(target): 14094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 14104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann target, attribute = target.rsplit('.', 1) 14114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except (TypeError, ValueError): 14124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise TypeError("Need a valid target to patch. You supplied: %r" % 14134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (target,)) 14144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter = lambda: _importer(target) 14154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return getter, attribute 14164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _patch_object( 14194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann target, attribute, new=DEFAULT, spec=None, 14204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann create=False, spec_set=None, autospec=None, 14214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_callable=None, **kwargs 14224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ): 14234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 14244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patch.object(target, attribute, new=DEFAULT, spec=None, create=False, 14254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set=None, autospec=None, new_callable=None, **kwargs) 14264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patch the named member (`attribute`) on an object (`target`) with a mock 14284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann object. 14294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch.object` can be used as a decorator, class decorator or a context 14314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann manager. Arguments `new`, `spec`, `create`, `spec_set`, 14324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `autospec` and `new_callable` have the same meaning as for `patch`. Like 14334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch`, `patch.object` takes arbitrary keyword arguments for configuring 14344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann the mock object it creates. 14354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann When used as a class decorator `patch.object` honours `patch.TEST_PREFIX` 14374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for choosing which methods to wrap. 14384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 14394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter = lambda: target 14404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _patch( 14414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter, attribute, new, spec, create, 14424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set, autospec, new_callable, kwargs 14434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 14444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _patch_multiple(target, spec=None, create=False, spec_set=None, 14474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann autospec=None, new_callable=None, **kwargs): 14484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Perform multiple patches in a single call. It takes the object to be 14494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patched (either as an object or a string to fetch the object by importing) 14504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann and keyword arguments for the patches:: 14514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'): 14534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ... 14544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Use `DEFAULT` as the value if you want `patch.multiple` to create 14564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mocks for you. In this case the created mocks are passed into a decorated 14574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann function by keyword, and a dictionary is returned when `patch.multiple` is 14584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann used as a context manager. 14594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch.multiple` can be used as a decorator, class decorator or a context 14614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann manager. The arguments `spec`, `spec_set`, `create`, 14624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `autospec` and `new_callable` have the same meaning as for `patch`. These 14634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arguments will be applied to *all* patches done by `patch.multiple`. 14644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX` 14664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for choosing which methods to wrap. 14674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 14684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if type(target) in (unicode, str): 14694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter = lambda: _importer(target) 14704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 14714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter = lambda: target 14724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not kwargs: 14744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann raise ValueError( 14754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'Must supply at least one keyword argument with patch.multiple' 14764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 14774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # need to wrap in a list for python 3, where items is a view 14784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann items = list(kwargs.items()) 14794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attribute, new = items[0] 14804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patcher = _patch( 14814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter, attribute, new, spec, create, spec_set, 14824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann autospec, new_callable, {} 14834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 14844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patcher.attribute_name = attribute 14854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for attribute, new in items[1:]: 14864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_patcher = _patch( 14874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter, attribute, new, spec, create, spec_set, 14884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann autospec, new_callable, {} 14894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 14904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann this_patcher.attribute_name = attribute 14914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patcher.additional_patchers.append(this_patcher) 14924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return patcher 14934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef patch( 14964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann target, new=DEFAULT, spec=None, create=False, 14974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set=None, autospec=None, new_callable=None, **kwargs 14984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ): 14994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 15004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch` acts as a function decorator, class decorator or a context 15014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann manager. Inside the body of the function or with statement, the `target` 15024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann is patched with a `new` object. When the function/with statement exits 15034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann the patch is undone. 15044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `new` is omitted, then the target is replaced with a 15064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `MagicMock`. If `patch` is used as a decorator and `new` is 15074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann omitted, the created mock is passed in as an extra argument to the 15084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decorated function. If `patch` is used as a context manager the created 15094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock is returned by the context manager. 15104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `target` should be a string in the form `'package.module.ClassName'`. The 15124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `target` is imported and the specified object replaced with the `new` 15134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann object, so the `target` must be importable from the environment you are 15144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann calling `patch` from. The target is imported when the decorated function 15154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann is executed, not at decoration time. 15164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann The `spec` and `spec_set` keyword arguments are passed to the `MagicMock` 15184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if patch is creating one for you. 15194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann In addition you can pass `spec=True` or `spec_set=True`, which causes 15214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patch to pass in the object being mocked as the spec/spec_set object. 15224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `new_callable` allows you to specify a different class, or callable object, 15244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann that will be called to create the `new` object. By default `MagicMock` is 15254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann used. 15264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann A more powerful form of `spec` is `autospec`. If you set `autospec=True` 15284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann then the mock with be created with a spec from the object being replaced. 15294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann All attributes of the mock will also have the spec of the corresponding 15304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attribute of the object being replaced. Methods and functions being 15314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mocked will have their arguments checked and will raise a `TypeError` if 15324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann they are called with the wrong signature. For mocks replacing a class, 15334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann their return value (the 'instance') will have the same spec as the class. 15344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Instead of `autospec=True` you can pass `autospec=some_object` to use an 15364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arbitrary object as the spec instead of the one being replaced. 15374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann By default `patch` will fail to replace attributes that don't exist. If 15394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann you pass in `create=True`, and the attribute doesn't exist, patch will 15404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann create the attribute for you when the patched function is called, and 15414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delete it again afterwards. This is useful for writing tests against 15424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attributes that your production code creates at runtime. It is off by by 15434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default because it can be dangerous. With it switched on you can write 15444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann passing tests against APIs that don't actually exist! 15454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Patch can be used as a `TestCase` class decorator. It works by 15474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decorating each test method in the class. This reduces the boilerplate 15484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann code when your test methods share a common patchings set. `patch` finds 15494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tests by looking for method names that start with `patch.TEST_PREFIX`. 15504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann By default this is `test`, which matches the way `unittest` finds tests. 15514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann You can specify an alternative prefix by setting `patch.TEST_PREFIX`. 15524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Patch can be used as a context manager, with the with statement. Here the 15544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patching applies to the indented block after the with statement. If you 15554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann use "as" then the patched object will be bound to the name after the 15564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "as"; very useful if `patch` is creating a mock object for you. 15574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch` takes arbitrary keyword arguments. These will be passed to 15594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann the `Mock` (or `new_callable`) on construction. 15604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are 15624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann available for alternate use-cases. 15634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 15644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter, attribute = _get_target(target) 15654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _patch( 15664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann getter, attribute, new, spec, create, 15674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec_set, autospec, new_callable, kwargs 15684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ) 15694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _patch_dict(object): 15724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 15734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Patch a dictionary, or dictionary like object, and restore the dictionary 15744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann to its original state after the test. 15754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `in_dict` can be a dictionary or a mapping like container. If it is a 15774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mapping then it must at least support getting, setting and deleting items 15784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann plus iterating over keys. 15794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `in_dict` can also be a string specifying the name of the dictionary, which 15814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann will then be fetched by importing it. 15824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `values` can be a dictionary of values to set in the dictionary. `values` 15844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann can also be an iterable of `(key, value)` pairs. 15854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `clear` is True then the dictionary will be cleared before the new 15874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values are set. 15884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch.dict` can also be called with arbitrary keyword arguments to set 15904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values in the dictionary:: 15914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()): 15934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ... 15944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch.dict` can be used as a context manager, decorator or class 15964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decorator. When used as a class decorator `patch.dict` honours 15974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `patch.TEST_PREFIX` for choosing which methods to wrap. 15984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 15994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self, in_dict, values=(), clear=False, **kwargs): 16014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(in_dict, basestring): 16024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann in_dict = _importer(in_dict) 16034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.in_dict = in_dict 16044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # support any argument supported by dict(...) constructor 16054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.values = dict(values) 16064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.values.update(kwargs) 16074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.clear = clear 16084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._original = None 16094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __call__(self, f): 16124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(f, ClassTypes): 16134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self.decorate_class(f) 16144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann @wraps(f) 16154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _inner(*args, **kw): 16164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._patch_dict() 16174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 16184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return f(*args, **kw) 16194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann finally: 16204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._unpatch_dict() 16214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _inner 16234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def decorate_class(self, klass): 16264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for attr in dir(klass): 16274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attr_value = getattr(klass, attr) 16284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (attr.startswith(patch.TEST_PREFIX) and 16294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann hasattr(attr_value, "__call__")): 16304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decorator = _patch_dict(self.in_dict, self.values, self.clear) 16314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decorated = decorator(attr_value) 16324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(klass, attr, decorated) 16334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return klass 16344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __enter__(self): 16374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Patch the dict.""" 16384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._patch_dict() 16394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _patch_dict(self): 16424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values = self.values 16434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann in_dict = self.in_dict 16444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann clear = self.clear 16454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 16474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original = in_dict.copy() 16484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 16494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # dict like object with no copy method 16504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # must support iteration over keys 16514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original = {} 16524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for key in in_dict: 16534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original[key] = in_dict[key] 16544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._original = original 16554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if clear: 16574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _clear_dict(in_dict) 16584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 16604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann in_dict.update(values) 16614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 16624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # dict like object with no update method 16634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for key in values: 16644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann in_dict[key] = values[key] 16654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _unpatch_dict(self): 16684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann in_dict = self.in_dict 16694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original = self._original 16704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _clear_dict(in_dict) 16724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 16744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann in_dict.update(original) 16754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 16764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for key in original: 16774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann in_dict[key] = original[key] 16784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __exit__(self, *args): 16814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Unpatch the dict.""" 16824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._unpatch_dict() 16834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 16844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann start = __enter__ 16864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stop = __exit__ 16874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _clear_dict(in_dict): 16904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 16914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann in_dict.clear() 16924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 16934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann keys = list(in_dict) 16944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for key in keys: 16954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann del in_dict[key] 16964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _patch_stopall(): 16994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Stop all active patches.""" 17004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for patch in list(_patch._active_patches): 17014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patch.stop() 17024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpatch.object = _patch_object 17054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpatch.dict = _patch_dict 17064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpatch.multiple = _patch_multiple 17074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpatch.stopall = _patch_stopall 17084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpatch.TEST_PREFIX = 'test' 17094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannmagic_methods = ( 17114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "lt le gt ge eq ne " 17124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "getitem setitem delitem " 17134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "len contains iter " 17144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "hash str sizeof " 17154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "enter exit " 17164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "divmod neg pos abs invert " 17174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "complex int float index " 17184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "trunc floor ceil " 17194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann) 17204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnumerics = "add sub mul div floordiv mod lshift rshift and xor or pow " 17224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninplace = ' '.join('i%s' % n for n in numerics.split()) 17234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannright = ' '.join('r%s' % n for n in numerics.split()) 17244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannextra = '' 17254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannif inPy3k: 17264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann extra = 'bool next ' 17274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannelse: 17284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann extra = 'unicode long nonzero oct hex truediv rtruediv ' 17294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# not including __prepare__, __instancecheck__, __subclasscheck__ 17314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# (as they are metaclass methods) 17324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann# __del__ is not supported at all as it causes problems if it exists 17334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_non_defaults = set('__%s__' % method for method in [ 17354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'cmp', 'getslice', 'setslice', 'coerce', 'subclasses', 17364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'format', 'get', 'set', 'delete', 'reversed', 17374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'missing', 'reduce', 'reduce_ex', 'getinitargs', 17384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'getnewargs', 'getstate', 'setstate', 'getformat', 17394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'setformat', 'repr', 'dir' 17404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann]) 17414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _get_method(name, func): 17444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "Turns a callable object (like a mock) into a real function" 17454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def method(self, *args, **kw): 17464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return func(self, *args, **kw) 17474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann method.__name__ = name 17484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return method 17494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_magics = set( 17524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__%s__' % method for method in 17534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ' '.join([magic_methods, numerics, inplace, right, extra]).split() 17544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann) 17554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_all_magics = _magics | _non_defaults 17574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_unsupported_magics = set([ 17594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__getattr__', '__setattr__', 17604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__init__', '__new__', '__prepare__' 17614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__instancecheck__', '__subclasscheck__', 17624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__del__' 17634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann]) 17644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_calculate_return_value = { 17664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__hash__': lambda self: object.__hash__(self), 17674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__str__': lambda self: object.__str__(self), 17684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__sizeof__': lambda self: object.__sizeof__(self), 17694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__unicode__': lambda self: unicode(object.__str__(self)), 17704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 17714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_return_values = { 17734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__lt__': NotImplemented, 17744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__gt__': NotImplemented, 17754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__le__': NotImplemented, 17764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__ge__': NotImplemented, 17774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__int__': 1, 17784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__contains__': False, 17794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__len__': 0, 17804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__exit__': False, 17814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__complex__': 1j, 17824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__float__': 1.0, 17834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__bool__': True, 17844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__nonzero__': True, 17854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__oct__': '1', 17864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__hex__': '0x1', 17874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__long__': long(1), 17884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__index__': 1, 17894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 17904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _get_eq(self): 17934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __eq__(other): 17944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret_val = self.__eq__._mock_return_value 17954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ret_val is not DEFAULT: 17964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret_val 17974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self is other 17984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return __eq__ 17994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _get_ne(self): 18014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __ne__(other): 18024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self.__ne__._mock_return_value is not DEFAULT: 18034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return DEFAULT 18044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self is not other 18054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return __ne__ 18064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _get_iter(self): 18084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __iter__(): 18094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret_val = self.__iter__._mock_return_value 18104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ret_val is DEFAULT: 18114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iter([]) 18124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # if ret_val was already an iterator, then calling iter on it should 18134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # return the iterator unchanged 18144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iter(ret_val) 18154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return __iter__ 18164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann_side_effect_methods = { 18184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__eq__': _get_eq, 18194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__ne__': _get_ne, 18204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '__iter__': _get_iter, 18214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 18224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _set_return_value(mock, method, name): 18264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fixed = _return_values.get(name, DEFAULT) 18274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if fixed is not DEFAULT: 18284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann method.return_value = fixed 18294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 18304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return_calulator = _calculate_return_value.get(name) 18324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if return_calulator is not None: 18334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 18344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return_value = return_calulator(mock) 18354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 18364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX why do we return AttributeError here? 18374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # set it as a side_effect instead? 18384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return_value = AttributeError(name) 18394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann method.return_value = return_value 18404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 18414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann side_effector = _side_effect_methods.get(name) 18434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if side_effector is not None: 18444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann method.side_effect = side_effector(mock) 18454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass MagicMixin(object): 18494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self, *args, **kw): 18504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _super(MagicMixin, self).__init__(*args, **kw) 18514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_set_magics() 18524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _mock_set_magics(self): 18554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann these_magics = _magics 18564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self._mock_methods is not None: 18584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann these_magics = _magics.intersection(self._mock_methods) 18594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann remove_magics = set() 18614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann remove_magics = _magics - these_magics 18624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for entry in remove_magics: 18644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if entry in type(self).__dict__: 18654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # remove unneeded magic methods 18664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delattr(self, entry) 18674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # don't overwrite existing attributes if called a second time 18694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann these_magics = these_magics - set(type(self).__dict__) 18704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _type = type(self) 18724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for entry in these_magics: 18734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(_type, entry, MagicProxy(entry, self)) 18744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass NonCallableMagicMock(MagicMixin, NonCallableMock): 18784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """A version of `MagicMock` that isn't callable.""" 18794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def mock_add_spec(self, spec, spec_set=False): 18804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Add a spec to a mock. `spec` can either be an object or a 18814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann list of strings. Only attributes on the `spec` can be fetched as 18824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attributes from the mock. 18834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `spec_set` is True then only attributes on the spec can be set.""" 18854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_add_spec(spec, spec_set) 18864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_set_magics() 18874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass MagicMock(MagicMixin, Mock): 18914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 18924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann MagicMock is a subclass of Mock with default implementations 18934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann of most of the magic methods. You can use MagicMock without having to 18944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann configure the magic methods yourself. 18954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If you use the `spec` or `spec_set` arguments then *only* magic 18974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann methods that exist in the spec will be created. 18984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Attributes and the return value of a `MagicMock` will also be `MagicMocks`. 19004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 19014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def mock_add_spec(self, spec, spec_set=False): 19024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Add a spec to a mock. `spec` can either be an object or a 19034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann list of strings. Only attributes on the `spec` can be fetched as 19044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann attributes from the mock. 19054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `spec_set` is True then only attributes on the spec can be set.""" 19074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_add_spec(spec, spec_set) 19084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self._mock_set_magics() 19094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass MagicProxy(object): 19134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self, name, parent): 19144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.name = name 19154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.parent = parent 19164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __call__(self, *args, **kwargs): 19184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m = self.create_mock() 19194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m(*args, **kwargs) 19204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def create_mock(self): 19224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann entry = self.name 19234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent = self.parent 19244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m = parent._get_child_mock(name=entry, _new_name=entry, 19254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent=parent) 19264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(parent, entry, m) 19274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _set_return_value(parent, m, entry) 19284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m 19294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __get__(self, obj, _type=None): 19314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self.create_mock() 19324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _ANY(object): 19364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "A helper object that compares equal to everything." 19374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __eq__(self, other): 19394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return True 19404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __ne__(self, other): 19424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 19434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __repr__(self): 19454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return '<ANY>' 19464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannANY = _ANY() 19484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _format_call_signature(name, args, kwargs): 19524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann message = '%s(%%s)' % name 19534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formatted_args = '' 19544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args_string = ', '.join([repr(arg) for arg in args]) 19554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann kwargs_string = ', '.join([ 19564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann '%s=%r' % (key, value) for key, value in kwargs.items() 19574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ]) 19584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if args_string: 19594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formatted_args = args_string 19604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if kwargs_string: 19614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if formatted_args: 19624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formatted_args += ', ' 19634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formatted_args += kwargs_string 19644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return message % formatted_args 19664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _Call(tuple): 19704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 19714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann A tuple for holding the results of a call to a mock, either in the form 19724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `(args, kwargs)` or `(name, args, kwargs)`. 19734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If args or kwargs are empty then a call tuple will compare equal to 19754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann a tuple without those values. This makes comparisons less verbose:: 19764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _Call(('name', (), {})) == ('name',) 19784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _Call(('name', (1,), {})) == ('name', (1,)) 19794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _Call(((), {'a': 'b'})) == ({'a': 'b'},) 19804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann The `_Call` object provides a useful shortcut for comparing with call:: 19824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _Call(((1, 2), {'a': 3})) == call(1, 2, a=3) 19844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3) 19854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If the _Call has no name then it will match any name. 19874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 19884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __new__(cls, value=(), name=None, parent=None, two=False, 19894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann from_kall=True): 19904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = '' 19914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args = () 19924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann kwargs = {} 19934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _len = len(value) 19944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _len == 3: 19954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name, args, kwargs = value 19964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif _len == 2: 19974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann first, second = value 19984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(first, basestring): 19994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = first 20004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(second, tuple): 20014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args = second 20024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 20034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann kwargs = second 20044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 20054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args, kwargs = first, second 20064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif _len == 1: 20074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value, = value 20084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(value, basestring): 20094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = value 20104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif isinstance(value, tuple): 20114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args = value 20124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 20134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann kwargs = value 20144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if two: 20164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return tuple.__new__(cls, (args, kwargs)) 20174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return tuple.__new__(cls, (name, args, kwargs)) 20194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self, value=(), name=None, parent=None, two=False, 20224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann from_kall=True): 20234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.name = name 20244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.parent = parent 20254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.from_kall = from_kall 20264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __eq__(self, other): 20294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if other is ANY: 20304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return True 20314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 20324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann len_other = len(other) 20334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except TypeError: 20344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 20354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self_name = '' 20374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if len(self) == 2: 20384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self_args, self_kwargs = self 20394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 20404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self_name, self_args, self_kwargs = self 20414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_name = '' 20434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if len_other == 0: 20444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_args, other_kwargs = (), {} 20454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif len_other == 3: 20464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_name, other_args, other_kwargs = other 20474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif len_other == 1: 20484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann value, = other 20494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(value, tuple): 20504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_args = value 20514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_kwargs = {} 20524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif isinstance(value, basestring): 20534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_name = value 20544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_args, other_kwargs = (), {} 20554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 20564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_args = () 20574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_kwargs = value 20584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 20594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # len 2 20604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # could be (name, args) or (name, kwargs) or (args, kwargs) 20614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann first, second = other 20624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(first, basestring): 20634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_name = first 20644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(second, tuple): 20654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_args, other_kwargs = second, {} 20664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 20674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_args, other_kwargs = (), second 20684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 20694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann other_args, other_kwargs = first, second 20704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self_name and other_name != self_name: 20724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 20734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # this order is important for ANY to work! 20754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (other_args, other_kwargs) == (self_args, self_kwargs) 20764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __ne__(self, other): 20794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return not self.__eq__(other) 20804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __call__(self, *args, **kwargs): 20834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self.name is None: 20844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _Call(('', args, kwargs), name='()') 20854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = self.name + '()' 20874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _Call((self.name, args, kwargs), name=name, parent=self) 20884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __getattr__(self, attr): 20914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if self.name is None: 20924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _Call(name=attr, from_kall=False) 20934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = '%s.%s' % (self.name, attr) 20944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _Call(name=name, parent=self, from_kall=False) 20954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __repr__(self): 20984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not self.from_kall: 20994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = self.name or 'call' 21004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if name.startswith('()'): 21014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = 'call%s' % name 21024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return name 21034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if len(self) == 2: 21054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = 'call' 21064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args, kwargs = self 21074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 21084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name, args, kwargs = self 21094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not name: 21104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = 'call' 21114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif not name.startswith('()'): 21124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = 'call.%s' % name 21134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 21144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name = 'call%s' % name 21154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _format_call_signature(name, args, kwargs) 21164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def call_list(self): 21194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """For a call object that represents multiple calls, `call_list` 21204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann returns a list of all the intermediate calls as well as the 21214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann final call.""" 21224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals = [] 21234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann thing = self 21244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while thing is not None: 21254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if thing.from_kall: 21264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals.append(thing) 21274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann thing = thing.parent 21284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return _CallList(reversed(vals)) 21294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanncall = _Call(from_kall=False) 21324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef create_autospec(spec, spec_set=False, instance=False, _parent=None, 21364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _name=None, **kwargs): 21374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """Create a mock object using another object as a spec. Attributes on the 21384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock will use the corresponding attribute on the `spec` object as their 21394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec. 21404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Functions or methods being mocked will have their arguments checked 21424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann to check that they are called with the correct signature. 21434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If `spec_set` is True then attempting to set attributes that don't exist 21454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann on the spec object will raise an `AttributeError`. 21464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann If a class is used as a spec then the return value of the mock (the 21484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann instance of the class) will have the same spec. You can use a class as the 21494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec for an instance object by passing `instance=True`. The returned mock 21504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann will only be callable if instances of the mock are callable. 21514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `create_autospec` also takes arbitrary keyword arguments that are passed to 21534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann the constructor of the created mock.""" 21544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_list(spec): 21554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # can't pass a list instance to the mock constructor as it will be 21564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # interpreted as a list of strings 21574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec = type(spec) 21584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann is_type = isinstance(spec, ClassTypes) 21604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs = {'spec': spec} 21624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set: 21634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs = {'spec_set': spec} 21644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif spec is None: 21654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # None we mock with a normal mock without a spec 21664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs = {} 21674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs.update(kwargs) 21694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Klass = MagicMock 21714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if type(spec) in DescriptorTypes: 21724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # descriptors don't have a spec 21734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # because we don't know what type they return 21744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _kwargs = {} 21754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif not _callable(spec): 21764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Klass = NonCallableMagicMock 21774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elif is_type and instance and not _instance_callable(spec): 21784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Klass = NonCallableMagicMock 21794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_name = _name 21814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _parent is None: 21824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # for a top level object no _new_name should be set 21834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_name = '' 21844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name, 21864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name=_name, **_kwargs) 21874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(spec, FunctionTypes): 21894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # should only happen at the top level because we don't 21904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # recurse for functions 21914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock = _set_signature(mock, spec) 21924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 21934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _check_signature(spec, mock, is_type, instance) 21944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _parent is not None and not instance: 21964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _parent._mock_children[_name] = mock 21974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if is_type and not instance and 'return_value' not in kwargs: 21994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock.return_value = create_autospec(spec, spec_set, instance=True, 22004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _name='()', _parent=mock) 22014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for entry in dir(spec): 22034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if _is_magic(entry): 22044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # MagicMock already does the useful magic methods for us 22054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue 22064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(spec, FunctionTypes) and entry in FunctionAttributes: 22084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # allow a mock to actually be a function 22094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue 22104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX do we need a better way of getting attributes without 22124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # triggering code execution (?) Probably not - we need the actual 22134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # object to mock it so we would rather trigger a property than mock 22144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # the property descriptor. Likewise we want to mock out dynamically 22154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # provided attributes. 22164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX what about attributes that raise exceptions other than 22174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # AttributeError on being fetched? 22184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # we could be resilient against it, or catch and propagate the 22194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # exception when the attribute is fetched from the mock 22204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 22214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann original = getattr(spec, entry) 22224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 22234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue 22244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann kwargs = {'spec': original} 22264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if spec_set: 22274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann kwargs = {'spec_set': original} 22284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not isinstance(original, FunctionTypes): 22304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new = _SpecState(original, spec_set, mock, entry, instance) 22314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock._mock_children[entry] = new 22324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 22334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent = mock 22344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(spec, FunctionTypes): 22354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parent = mock.mock 22364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new = MagicMock(parent=parent, name=entry, _new_name=entry, 22384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _new_parent=parent, **kwargs) 22394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock._mock_children[entry] = new 22404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann skipfirst = _must_skip(spec, entry, is_type) 22414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _check_signature(original, new, skipfirst=skipfirst) 22424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # so functions created with _set_signature become instance attributes, 22444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # *plus* their underlying mock exists in _mock_children of the parent 22454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # mock. Adding to _mock_children may be unnecessary where we are also 22464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # setting as an instance attribute? 22474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(new, FunctionTypes): 22484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann setattr(mock, entry, new) 22494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mock 22514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _must_skip(spec, entry, is_type): 22544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not isinstance(spec, ClassTypes): 22554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if entry in getattr(spec, '__dict__', {}): 22564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # instance attribute - shouldn't skip 22574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 22584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann spec = spec.__class__ 22594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if not hasattr(spec, '__mro__'): 22604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # old style class: can't have descriptors anyway 22614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return is_type 22624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for klass in spec.__mro__: 22644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result = klass.__dict__.get(entry, DEFAULT) 22654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if result is DEFAULT: 22664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue 22674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if isinstance(result, (staticmethod, classmethod)): 22684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return False 22694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return is_type 22704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # shouldn't get here unless function is a dynamically provided attribute 22724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # XXXX untested behaviour 22734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return is_type 22744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef _get_class(obj): 22774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann try: 22784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj.__class__ 22794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann except AttributeError: 22804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # in Python 2, _sre.SRE_Pattern objects have no __class__ 22814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return type(obj) 22824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass _SpecState(object): 22854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __init__(self, spec, spec_set=False, parent=None, 22874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name=None, ids=None, instance=False): 22884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.spec = spec 22894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.ids = ids 22904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.spec_set = spec_set 22914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.parent = parent 22924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.instance = instance 22934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self.name = name 22944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFunctionTypes = ( 22974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # python function 22984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann type(create_autospec), 22994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # instance method 23004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann type(ANY.__eq__), 23014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # unbound method 23024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann type(_ANY.__eq__), 23034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann) 23044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFunctionAttributes = set([ 23064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'func_closure', 23074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'func_code', 23084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'func_defaults', 23094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'func_dict', 23104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'func_doc', 23114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'func_globals', 23124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 'func_name', 23134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann]) 23144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannfile_spec = None 23174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanndef mock_open(mock=None, read_data=''): 23204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 23214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann A helper function to create a mock to replace the use of `open`. It works 23224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for `open` called directly or used as a context manager. 23234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann The `mock` argument is the mock object to configure. If `None` (the 23254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default) then a `MagicMock` will be created for you, with the API limited 23264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann to methods or attributes available on standard file handles. 23274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `read_data` is a string for the `read` method of the file handle to return. 23294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann This is an empty string by default. 23304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 23314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann global file_spec 23324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if file_spec is None: 23334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann # set on first use 23344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if inPy3k: 23354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann import _io 23364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO)))) 23374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else: 23384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann file_spec = file 23394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if mock is None: 23414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock = MagicMock(name='open', spec=open) 23424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann handle = MagicMock(spec=file_spec) 23444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann handle.write.return_value = None 23454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann handle.__enter__.return_value = handle 23464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann handle.read.return_value = read_data 23474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mock.return_value = handle 23494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mock 23504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass PropertyMock(Mock): 23534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 23544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann A mock intended to be used as a property, or other descriptor, on a class. 23554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann `PropertyMock` provides `__get__` and `__set__` methods so you can specify 23564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann a return value when it is fetched. 23574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Fetching a `PropertyMock` instance from an object calls the mock, with 23594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann no args. Setting it calls the mock with the value being set. 23604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann """ 23614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def _get_child_mock(self, **kwargs): 23624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return MagicMock(**kwargs) 23634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __get__(self, obj, obj_type): 23654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return self() 23664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann def __set__(self, obj, val): 23674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann self(val) 2368