12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# mock.py 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Test tools for mocking and patching. 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (C) 2007-2012 Michael Foord & the mock team 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# E-mail: fuzzyman AT voidspace DOT org DOT uk 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# mock 1.0 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# http://www.voidspace.org.uk/python/mock/ 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Released subject to the BSD License 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Please see http://www.voidspace.org.uk/python/license.shtml 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Scripts maintained at http://www.voidspace.org.uk/python/index.shtml 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Comments, suggestions and bug reports welcome. 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__all__ = ( 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'Mock', 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'MagicMock', 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'patch', 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'sentinel', 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'DEFAULT', 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'ANY', 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'call', 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'create_autospec', 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'FILTER_DIR', 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'NonCallableMock', 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'NonCallableMagicMock', 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'mock_open', 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'PropertyMock', 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__version__ = '1.0.1' 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import pprint 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import sys 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try: 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import inspect 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)except ImportError: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # for alternative platforms that 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # may not have inspect 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inspect = None 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) from functools import wraps as original_wraps 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)except ImportError: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Python 2.4 compatibility 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def wraps(original): 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def inner(f): 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f.__name__ = original.__name__ 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f.__doc__ = original.__doc__ 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f.__module__ = original.__module__ 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f.__wrapped__ = original 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return f 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return inner 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)else: 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if sys.version_info[:2] >= (3, 3): 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wraps = original_wraps 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def wraps(func): 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def inner(f): 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f = original_wraps(func)(f) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f.__wrapped__ = func 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return f 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return inner 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try: 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unicode 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)except NameError: 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Python 3 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) basestring = unicode = str 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try: 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)except NameError: 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Python 3 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long = int 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try: 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BaseException 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)except NameError: 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Python 2.4 compatibility 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BaseException = Exception 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try: 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)except NameError: 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def next(obj): 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return obj.next() 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BaseExceptions = (BaseException,) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if 'java' in sys.platform: 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # jython 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import java 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BaseExceptions = (BaseException, java.lang.Throwable) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try: 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _isidentifier = str.isidentifier 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)except AttributeError: 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Python 2.X 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import keyword 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import re 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) regex = re.compile(r'^[a-z_][a-z0-9_]*$', re.I) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _isidentifier(string): 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if string in keyword.kwlist: 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return regex.match(string) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)inPy3k = sys.version_info[0] == 3 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Needed to work around Python 3 bug where use of "super" interferes with 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# defining __class__ as a descriptor 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_super = super 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)self = 'im_self' 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)builtin = '__builtin__' 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if inPy3k: 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self = '__self__' 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builtin = 'builtins' 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FILTER_DIR = True 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _is_instance_mock(obj): 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # can't use isinstance on Mock objects because they override __class__ 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # The base class for all mocks is NonCallableMock 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return issubclass(type(obj), NonCallableMock) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _is_exception(obj): 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ( 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) isinstance(obj, BaseExceptions) or 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) isinstance(obj, ClassTypes) and issubclass(obj, BaseExceptions) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _slotted(object): 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __slots__ = ['a'] 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DescriptorTypes = ( 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(_slotted.a), 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) property, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _getsignature(func, skipfirst, instance=False): 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if inspect is None: 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise ImportError('inspect module not available') 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(func, ClassTypes) and not instance: 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) func = func.__init__ 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skipfirst = True 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif not isinstance(func, FunctionTypes): 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # for classes where instance is True we end up here too 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) func = func.__call__ 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if inPy3k: 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) argspec = inspect.getfullargspec(func) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except TypeError: 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # C function / method, possibly inherited object().__init__ 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) regargs, varargs, varkw, defaults, kwonly, kwonlydef, ann = argspec 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) regargs, varargs, varkwargs, defaults = inspect.getargspec(func) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except TypeError: 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # C function / method, possibly inherited object().__init__ 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # instance methods and classmethods need to lose the self argument 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if getattr(func, self, None) is not None: 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) regargs = regargs[1:] 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if skipfirst: 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # this condition and the above one are never both True - why? 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) regargs = regargs[1:] 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if inPy3k: 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signature = inspect.formatargspec( 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) regargs, varargs, varkw, defaults, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kwonly, kwonlydef, ann, formatvalue=lambda value: "") 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signature = inspect.formatargspec( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) regargs, varargs, varkwargs, defaults, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) formatvalue=lambda value: "") 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return signature[1:-1], func 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _check_signature(func, mock, skipfirst, instance=False): 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not _callable(func): 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = _getsignature(func, skipfirst, instance) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if result is None: 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signature, func = result 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # can't use self because "self" is common as an argument name 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # unfortunately even not in the first place 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src = "lambda _mock_self, %s: None" % signature 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) checksig = eval(src, {}) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _copy_func_details(func, checksig) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(mock)._mock_check_sig = checksig 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _copy_func_details(func, funcopy): 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.__name__ = func.__name__ 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.__doc__ = func.__doc__ 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #funcopy.__dict__.update(func.__dict__) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.__module__ = func.__module__ 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not inPy3k: 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.func_defaults = func.func_defaults 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.__defaults__ = func.__defaults__ 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.__kwdefaults__ = func.__kwdefaults__ 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _callable(obj): 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(obj, ClassTypes): 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return True 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if getattr(obj, '__call__', None) is not None: 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return True 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _is_list(obj): 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # checks for list or tuples 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX badly named! 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type(obj) in (list, tuple) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _instance_callable(obj): 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Given an object, return True if the object is callable. 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) For classes, return True if instances would be callable.""" 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not isinstance(obj, ClassTypes): 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # already an instance 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getattr(obj, '__call__', None) is not None 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) klass = obj 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # uses __bases__ instead of __mro__ so that we work with old style classes 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if klass.__dict__.get('__call__') is not None: 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return True 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for base in klass.__bases__: 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _instance_callable(base): 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return True 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _set_signature(mock, original, instance=False): 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # creates a function with signature (*args, **kwargs) that delegates to a 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # mock. It still does signature checking by calling a lambda with the same 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # signature as the original. 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not _callable(original): 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skipfirst = isinstance(original, ClassTypes) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = _getsignature(original, skipfirst, instance) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if result is None: 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # was a C function (e.g. object().__init__ ) that can't be mocked 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signature, func = result 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src = "lambda %s: None" % signature 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) checksig = eval(src, {}) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _copy_func_details(func, checksig) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = original.__name__ 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not _isidentifier(name): 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = 'funcopy' 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context = {'_checksig_': checksig, 'mock': mock} 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src = """def %s(*args, **kwargs): 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _checksig_(*args, **kwargs) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mock(*args, **kwargs)""" % name 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) exec (src, context) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy = context[name] 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _setup_func(funcopy, mock) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return funcopy 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _setup_func(funcopy, mock): 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.mock = mock 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # can't use isinstance with mocks 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not _is_instance_mock(mock): 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def assert_called_with(*args, **kwargs): 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mock.assert_called_with(*args, **kwargs) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def assert_called_once_with(*args, **kwargs): 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mock.assert_called_once_with(*args, **kwargs) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def assert_has_calls(*args, **kwargs): 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mock.assert_has_calls(*args, **kwargs) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def assert_any_call(*args, **kwargs): 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mock.assert_any_call(*args, **kwargs) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def reset_mock(): 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.method_calls = _CallList() 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.mock_calls = _CallList() 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock.reset_mock() 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = funcopy.return_value 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_instance_mock(ret) and not ret is mock: 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret.reset_mock() 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.called = False 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.call_count = 0 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.call_args = None 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.call_args_list = _CallList() 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.method_calls = _CallList() 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.mock_calls = _CallList() 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.return_value = mock.return_value 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.side_effect = mock.side_effect 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy._mock_children = mock._mock_children 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.assert_called_with = assert_called_with 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.assert_called_once_with = assert_called_once_with 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.assert_has_calls = assert_has_calls 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.assert_any_call = assert_any_call 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) funcopy.reset_mock = reset_mock 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock._mock_delegate = funcopy 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _is_magic(name): 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return '__%s__' % name[2:-2] == name 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _SentinelObject(object): 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "A unique, named, sentinel object." 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, name): 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.name = name 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __repr__(self): 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 'sentinel.%s' % self.name 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _Sentinel(object): 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Access attributes to return a named object, usable as a sentinel.""" 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self): 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._sentinels = {} 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __getattr__(self, name): 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name == '__bases__': 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Without this help(mock) raises an exception 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self._sentinels.setdefault(name, _SentinelObject(name)) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)sentinel = _Sentinel() 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DEFAULT = sentinel.DEFAULT 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_missing = sentinel.MISSING 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_deleted = sentinel.DELETED 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OldStyleClass: 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ClassType = type(OldStyleClass) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _copy(value): 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if type(value) in (dict, list, tuple, set): 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type(value)(value) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ClassTypes = (type,) 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if not inPy3k: 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClassTypes = (type, ClassType) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_allowed_names = set( 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) [ 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'return_value', '_mock_return_value', 'side_effect', 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '_mock_side_effect', '_mock_parent', '_mock_new_parent', 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '_mock_name', '_mock_new_name' 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ] 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _delegating_property(name): 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _allowed_names.add(name) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _the_name = '_mock_' + name 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _get(self, name=name, _the_name=_the_name): 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sig = self._mock_delegate 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if sig is None: 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getattr(self, _the_name) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getattr(sig, name) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _set(self, value, name=name, _the_name=_the_name): 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sig = self._mock_delegate 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if sig is None: 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.__dict__[_the_name] = value 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(sig, name, value) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return property(_get, _set) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _CallList(list): 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __contains__(self, value): 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not isinstance(value, list): 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return list.__contains__(self, value) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) len_value = len(value) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) len_self = len(self) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if len_value > len_self: 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for i in range(0, len_self - len_value + 1): 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sub_list = self[i:i+len_value] 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if sub_list == value: 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return True 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __repr__(self): 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pprint.pformat(list(self)) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _check_and_set_parent(parent, value, name, new_name): 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not _is_instance_mock(value): 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((value._mock_name or value._mock_new_name) or 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (value._mock_parent is not None) or 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (value._mock_new_parent is not None)): 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _parent = parent 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while _parent is not None: 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # setting a mock (value) as a child or return value of itself 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # should not modify the mock 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _parent is value: 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _parent = _parent._mock_new_parent 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if new_name: 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value._mock_new_parent = parent 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value._mock_new_name = new_name 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name: 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value._mock_parent = parent 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value._mock_name = name 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return True 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Base(object): 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _mock_return_value = DEFAULT 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _mock_side_effect = None 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, *args, **kwargs): 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NonCallableMock(Base): 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """A non-callable version of `Mock`""" 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __new__(cls, *args, **kw): 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # every instance has its own class 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # so we can create magic methods on the 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # class without stomping on other mocks 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__}) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance = object.__new__(new) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return instance 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__( 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self, spec=None, wraps=None, name=None, spec_set=None, 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent=None, _spec_state=None, _new_name='', _new_parent=None, 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) **kwargs 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ): 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _new_parent is None: 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent = parent 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__ = self.__dict__ 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_parent'] = parent 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_name'] = name 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_new_name'] = _new_name 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_new_parent'] = _new_parent 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set is not None: 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec = spec_set 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set = True 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_add_spec(spec, spec_set) 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_children'] = {} 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_wraps'] = wraps 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_delegate'] = None 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_called'] = False 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_call_args'] = None 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_call_count'] = 0 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_call_args_list'] = _CallList() 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_mock_calls'] = _CallList() 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['method_calls'] = _CallList() 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if kwargs: 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.configure_mock(**kwargs) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _super(NonCallableMock, self).__init__( 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec, wraps, name, spec_set, parent, 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _spec_state 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def attach_mock(self, mock, attribute): 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Attach a mock as an attribute of this one, replacing its name and 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent. Calls to the attached mock will be recorded in the 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `method_calls` and `mock_calls` attributes of this one.""" 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock._mock_parent = None 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock._mock_new_parent = None 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock._mock_name = '' 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock._mock_new_name = None 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(self, attribute, mock) 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def mock_add_spec(self, spec, spec_set=False): 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Add a spec to a mock. `spec` can either be an object or a 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list of strings. Only attributes on the `spec` can be fetched as 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes from the mock. 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `spec_set` is True then only attributes on the spec can be set.""" 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_add_spec(spec, spec_set) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _mock_add_spec(self, spec, spec_set): 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _spec_class = None 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec is not None and not _is_list(spec): 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(spec, ClassTypes): 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _spec_class = spec 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _spec_class = _get_class(spec) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec = dir(spec) 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__ = self.__dict__ 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_spec_class'] = _spec_class 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_spec_set'] = spec_set 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __dict__['_mock_methods'] = spec 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __get_return_value(self): 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = self._mock_return_value 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self._mock_delegate is not None: 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = self._mock_delegate.return_value 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ret is DEFAULT: 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = self._get_child_mock( 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent=self, _new_name='()' 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.return_value = ret 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ret 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __set_return_value(self, value): 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self._mock_delegate is not None: 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_delegate.return_value = value 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_return_value = value 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _check_and_set_parent(self, value, None, '()') 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __return_value_doc = "The value to be returned when the mock is called." 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return_value = property(__get_return_value, __set_return_value, 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __return_value_doc) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @property 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __class__(self): 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self._spec_class is None: 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type(self) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self._spec_class 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) called = _delegating_property('called') 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) call_count = _delegating_property('call_count') 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) call_args = _delegating_property('call_args') 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) call_args_list = _delegating_property('call_args_list') 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_calls = _delegating_property('mock_calls') 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __get_side_effect(self): 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sig = self._mock_delegate 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if sig is None: 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self._mock_side_effect 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return sig.side_effect 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __set_side_effect(self, value): 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = _try_iter(value) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sig = self._mock_delegate 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if sig is None: 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_side_effect = value 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sig.side_effect = value 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) side_effect = property(__get_side_effect, __set_side_effect) 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def reset_mock(self): 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Restore the mock object to its initial state." 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.called = False 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.call_args = None 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.call_count = 0 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.mock_calls = _CallList() 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.call_args_list = _CallList() 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.method_calls = _CallList() 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for child in self._mock_children.values(): 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(child, _SpecState): 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child.reset_mock() 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = self._mock_return_value 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_instance_mock(ret) and ret is not self: 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret.reset_mock() 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def configure_mock(self, **kwargs): 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Set attributes on the mock through keyword arguments. 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Attributes plus return values and side effects can be set on child 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mocks using standard dot notation and unpacking a dictionary in the 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) method call: 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError} 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) >>> mock.configure_mock(**attrs)""" 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for arg, val in sorted(kwargs.items(), 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # we sort on the number of dots so that 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # attributes are set before we set attributes on 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # attributes 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key=lambda entry: entry[0].count('.')): 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args = arg.split('.') 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final = args.pop() 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) obj = self 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for entry in args: 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) obj = getattr(obj, entry) 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(obj, final, val) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __getattr__(self, name): 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name == '_mock_methods': 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError(name) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif self._mock_methods is not None: 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name not in self._mock_methods or name in _all_magics: 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError("Mock object has no attribute %r" % name) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif _is_magic(name): 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError(name) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = self._mock_children.get(name) 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if result is _deleted: 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError(name) 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif result is None: 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wraps = None 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self._mock_wraps is not None: 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX should we get the attribute without triggering code 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # execution? 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wraps = getattr(self._mock_wraps, name) 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = self._get_child_mock( 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent=self, name=name, wraps=wraps, _new_name=name, 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent=self 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_children[name] = result 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif isinstance(result, _SpecState): 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = create_autospec( 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.spec, result.spec_set, result.instance, 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.parent, result.name 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_children[name] = result 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __repr__(self): 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _name_list = [self._mock_new_name] 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _parent = self._mock_new_parent 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last = self 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dot = '.' 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _name_list == ['()']: 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dot = '' 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seen = set() 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while _parent is not None: 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last = _parent 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _name_list.append(_parent._mock_new_name + dot) 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dot = '.' 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _parent._mock_new_name == '()': 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dot = '' 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _parent = _parent._mock_new_parent 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # use ids here so as not to call __hash__ on the mocks 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if id(_parent) in seen: 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seen.add(id(_parent)) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _name_list = list(reversed(_name_list)) 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _first = last._mock_name or 'mock' 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if len(_name_list) > 1: 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _name_list[1] not in ('()', '().'): 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _first += '.' 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _name_list[0] = _first 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = ''.join(_name_list) 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_string = '' 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name not in ('mock', 'mock.'): 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_string = ' name=%r' % name 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_string = '' 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self._spec_class is not None: 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_string = ' spec=%r' 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self._spec_set: 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_string = ' spec_set=%r' 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_string = spec_string % self._spec_class.__name__ 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "<%s%s%s id='%s'>" % ( 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(self).__name__, 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_string, 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_string, 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id(self) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __dir__(self): 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Filter the output of `dir(mock)` to only useful members. 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) XXXX 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extras = self._mock_methods or [] 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) from_type = dir(type(self)) 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) from_dict = list(self.__dict__) 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if FILTER_DIR: 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) from_type = [e for e in from_type if not e.startswith('_')] 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) from_dict = [e for e in from_dict if not e.startswith('_') or 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _is_magic(e)] 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return sorted(set(extras + from_type + from_dict + 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list(self._mock_children))) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __setattr__(self, name, value): 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name in _allowed_names: 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # property setters go through here 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return object.__setattr__(self, name, value) 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif (self._spec_set and self._mock_methods is not None and 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name not in self._mock_methods and 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name not in self.__dict__): 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError("Mock object has no attribute '%s'" % name) 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif name in _unsupported_magics: 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = 'Attempting to set unsupported magic method %r.' % name 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError(msg) 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif name in _all_magics: 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self._mock_methods is not None and name not in self._mock_methods: 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError("Mock object has no attribute '%s'" % name) 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not _is_instance_mock(value): 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(type(self), name, _get_method(name, value)) 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original = value 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = lambda *args, **kw: original(self, *args, **kw) 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # only set _new_name and not name so that mock_calls is tracked 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # but not method calls 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _check_and_set_parent(self, value, None, name) 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(type(self), name, value) 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_children[name] = value 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif name == '__class__': 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._spec_class = value 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _check_and_set_parent(self, value, name, name): 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_children[name] = value 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return object.__setattr__(self, name, value) 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __delattr__(self, name): 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name in _all_magics and name in type(self).__dict__: 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delattr(type(self), name) 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name not in self.__dict__: 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # for magic methods that are still MagicProxy objects and 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # not set on the instance itself 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name in self.__dict__: 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object.__delattr__(self, name) 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) obj = self._mock_children.get(name, _missing) 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if obj is _deleted: 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError(name) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if obj is not _missing: 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) del self._mock_children[name] 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_children[name] = _deleted 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _format_mock_call_signature(self, args, kwargs): 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = self._mock_name or 'mock' 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _format_call_signature(name, args, kwargs) 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _format_mock_failure_message(self, args, kwargs): 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message = 'Expected call: %s\nActual call: %s' 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_string = self._format_mock_call_signature(args, kwargs) 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) call_args = self.call_args 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if len(call_args) == 3: 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) call_args = call_args[1:] 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actual_string = self._format_mock_call_signature(*call_args) 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return message % (expected_string, actual_string) 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def assert_called_with(_mock_self, *args, **kwargs): 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """assert that the mock was called with the specified arguments. 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Raises an AssertionError if the args and keyword args passed in are 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) different to the last call to the mock.""" 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self = _mock_self 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.call_args is None: 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected = self._format_mock_call_signature(args, kwargs) 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AssertionError('Expected call: %s\nNot called' % (expected,)) 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.call_args != (args, kwargs): 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = self._format_mock_failure_message(args, kwargs) 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AssertionError(msg) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def assert_called_once_with(_mock_self, *args, **kwargs): 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """assert that the mock was called exactly once and with the specified 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arguments.""" 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self = _mock_self 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not self.call_count == 1: 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = ("Expected to be called once. Called %s times." % 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.call_count) 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AssertionError(msg) 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.assert_called_with(*args, **kwargs) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def assert_has_calls(self, calls, any_order=False): 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """assert the mock has been called with the specified calls. 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) The `mock_calls` list is checked for the calls. 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `any_order` is False (the default) then the calls must be 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequential. There can be extra calls before or after the 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) specified calls. 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `any_order` is True then the calls can be in any order, but 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) they must all appear in `mock_calls`.""" 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not any_order: 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if calls not in self.mock_calls: 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AssertionError( 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'Calls not found.\nExpected: %r\n' 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'Actual: %r' % (calls, self.mock_calls) 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) all_calls = list(self.mock_calls) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) not_found = [] 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for kall in calls: 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) all_calls.remove(kall) 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except ValueError: 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) not_found.append(kall) 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not_found: 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AssertionError( 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '%r not all found in call list' % (tuple(not_found),) 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def assert_any_call(self, *args, **kwargs): 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """assert the mock has been called with the specified arguments. 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) The assert passes if the mock has *ever* been called, unlike 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `assert_called_with` and `assert_called_once_with` that only pass if 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the call is the most recent one.""" 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kall = call(*args, **kwargs) 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if kall not in self.call_args_list: 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_string = self._format_mock_call_signature(args, kwargs) 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AssertionError( 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '%s call not found' % expected_string 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _get_child_mock(self, **kw): 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Create the child mocks for attributes and return value. 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) By default child mocks will be the same type as the parent. 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Subclasses of Mock may want to override this to customize the way 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child mocks are made. 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) For non-callable mocks the callable variant will be used (rather than 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) any custom subclass).""" 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _type = type(self) 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not issubclass(_type, CallableMixin): 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if issubclass(_type, NonCallableMagicMock): 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) klass = MagicMock 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif issubclass(_type, NonCallableMock) : 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) klass = Mock 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) klass = _type.__mro__[1] 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return klass(**kw) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _try_iter(obj): 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if obj is None: 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return obj 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_exception(obj): 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return obj 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _callable(obj): 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return obj 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return iter(obj) 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except TypeError: 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX backwards compatibility 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # but this will blow up on first call - so maybe we should fail early? 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return obj 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CallableMixin(Base): 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, spec=None, side_effect=None, return_value=DEFAULT, 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wraps=None, name=None, spec_set=None, parent=None, 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _spec_state=None, _new_name='', _new_parent=None, **kwargs): 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.__dict__['_mock_return_value'] = return_value 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _super(CallableMixin, self).__init__( 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec, wraps, name, spec_set, parent, 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _spec_state, _new_name, _new_parent, **kwargs 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.side_effect = side_effect 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _mock_check_sig(self, *args, **kwargs): 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # stub method that can be replaced with one with a specific signature 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __call__(_mock_self, *args, **kwargs): 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # can't use self in-case a function / method we are mocking uses self 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # in the signature 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _mock_self._mock_check_sig(*args, **kwargs) 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _mock_self._mock_call(*args, **kwargs) 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _mock_call(_mock_self, *args, **kwargs): 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self = _mock_self 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.called = True 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.call_count += 1 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.call_args = _Call((args, kwargs), two=True) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.call_args_list.append(_Call((args, kwargs), two=True)) 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_name = self._mock_new_name 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent = self._mock_new_parent 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.mock_calls.append(_Call(('', args, kwargs))) 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seen = set() 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skip_next_dot = _new_name == '()' 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) do_method_calls = self._mock_parent is not None 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = self._mock_name 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while _new_parent is not None: 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_mock_call = _Call((_new_name, args, kwargs)) 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _new_parent._mock_new_name: 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dot = '.' 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if skip_next_dot: 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dot = '' 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skip_next_dot = False 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _new_parent._mock_new_name == '()': 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skip_next_dot = True 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_name = _new_parent._mock_new_name + dot + _new_name 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if do_method_calls: 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _new_name == name: 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_method_call = this_mock_call 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_method_call = _Call((name, args, kwargs)) 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent.method_calls.append(this_method_call) 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) do_method_calls = _new_parent._mock_parent is not None 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if do_method_calls: 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = _new_parent._mock_name + '.' + name 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent.mock_calls.append(this_mock_call) 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent = _new_parent._mock_new_parent 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # use ids here so as not to call __hash__ on the mocks 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent_id = id(_new_parent) 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _new_parent_id in seen: 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seen.add(_new_parent_id) 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret_val = DEFAULT 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effect = self.side_effect 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if effect is not None: 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_exception(effect): 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise effect 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not _callable(effect): 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = next(effect) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_exception(result): 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise result 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret_val = effect(*args, **kwargs) 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ret_val is DEFAULT: 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret_val = self.return_value 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (self._mock_wraps is not None and 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_return_value is DEFAULT): 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self._mock_wraps(*args, **kwargs) 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ret_val is DEFAULT: 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret_val = self.return_value 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ret_val 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Mock(CallableMixin, NonCallableMock): 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Create a new `Mock` object. `Mock` takes several optional arguments 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) that specify the behaviour of the Mock object: 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * `spec`: This can be either a list of strings or an existing object (a 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class or instance) that acts as the specification for the mock object. If 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) you pass in an object then a list of strings is formed by calling dir on 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the object (excluding unsupported magic attributes and methods). Accessing 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) any attribute not in this list will raise an `AttributeError`. 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `spec` is an object (rather than a list of strings) then 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `mock.__class__` returns the class of the spec object. This allows mocks 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to pass `isinstance` tests. 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * `spec_set`: A stricter variant of `spec`. If used, attempting to *set* 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) or get an attribute on the mock that isn't on the object passed as 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `spec_set` will raise an `AttributeError`. 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * `side_effect`: A function to be called whenever the Mock is called. See 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the `side_effect` attribute. Useful for raising exceptions or 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dynamically changing return values. The function is called with the same 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arguments as the mock, and unless it returns `DEFAULT`, the return 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value of this function is used as the return value. 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Alternatively `side_effect` can be an exception class or instance. In 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this case the exception will be raised when the mock is called. 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `side_effect` is an iterable then each call to the mock will return 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the next value from the iterable. If any of the members of the iterable 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) are exceptions they will be raised instead of returned. 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * `return_value`: The value returned when the mock is called. By default 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this is a new Mock (created on first access). See the 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `return_value` attribute. 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * `wraps`: Item for the mock object to wrap. If `wraps` is not None then 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) calling the Mock will pass the call through to the wrapped object 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (returning the real result). Attribute access on the mock will return a 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock object that wraps the corresponding attribute of the wrapped object 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (so attempting to access an attribute that doesn't exist will raise an 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `AttributeError`). 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If the mock has an explicit `return_value` set then calls are not passed 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to the wrapped object and the `return_value` is returned instead. 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * `name`: If the mock has a name then it will be used in the repr of the 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock. This can be useful for debugging. The name is propagated to child 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mocks. 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mocks can also be called with arbitrary keyword arguments. These will be 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) used to set attributes on the mock after it is created. 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _dot_lookup(thing, comp, import_path): 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getattr(thing, comp) 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __import__(import_path) 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getattr(thing, comp) 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _importer(target): 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) components = target.split('.') 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import_path = components.pop(0) 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thing = __import__(import_path) 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for comp in components: 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import_path += ".%s" % comp 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thing = _dot_lookup(thing, comp, import_path) 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return thing 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _is_started(patcher): 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX horrible 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return hasattr(patcher, 'is_local') 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _patch(object): 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attribute_name = None 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _active_patches = set() 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__( 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self, getter, attribute, new, spec, create, 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set, autospec, new_callable, kwargs 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ): 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if new_callable is not None: 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if new is not DEFAULT: 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise ValueError( 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Cannot use 'new' and 'new_callable' together" 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if autospec is not None: 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise ValueError( 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Cannot use 'autospec' and 'new_callable' together" 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.getter = getter 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.attribute = attribute 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.new = new 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.new_callable = new_callable 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.spec = spec 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.create = create 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.has_local = False 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.spec_set = spec_set 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.autospec = autospec 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.kwargs = kwargs 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.additional_patchers = [] 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def copy(self): 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patcher = _patch( 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.getter, self.attribute, self.new, self.spec, 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.create, self.spec_set, 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.autospec, self.new_callable, self.kwargs 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patcher.attribute_name = self.attribute_name 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patcher.additional_patchers = [ 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) p.copy() for p in self.additional_patchers 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ] 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return patcher 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __call__(self, func): 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(func, ClassTypes): 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.decorate_class(func) 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.decorate_callable(func) 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def decorate_class(self, klass): 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for attr in dir(klass): 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not attr.startswith(patch.TEST_PREFIX): 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attr_value = getattr(klass, attr) 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not hasattr(attr_value, "__call__"): 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patcher = self.copy() 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(klass, attr, patcher(attr_value)) 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return klass 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def decorate_callable(self, func): 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if hasattr(func, 'patchings'): 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) func.patchings.append(self) 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return func 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @wraps(func) 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def patched(*args, **keywargs): 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # don't use a with here (backwards compatability with Python 2.4) 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_args = [] 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entered_patchers = [] 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # can't use try...except...finally because of Python 2.4 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # compatibility 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) exc_info = tuple() 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for patching in patched.patchings: 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arg = patching.__enter__() 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entered_patchers.append(patching) 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if patching.attribute_name is not None: 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keywargs.update(arg) 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif patching.new is DEFAULT: 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_args.append(arg) 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args += tuple(extra_args) 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return func(*args, **keywargs) 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except: 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (patching not in entered_patchers and 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _is_started(patching)): 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # the patcher may have been started, but an exception 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # raised whilst entering one of its additional_patchers 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entered_patchers.append(patching) 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Pass the exception to __exit__ 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) exc_info = sys.exc_info() 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # re-raise the exception 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finally: 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for patching in reversed(entered_patchers): 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patching.__exit__(*exc_info) 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patched.patchings = [self] 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if hasattr(func, 'func_code'): 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # not in Python 3 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patched.compat_co_firstlineno = getattr( 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) func, "compat_co_firstlineno", 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) func.func_code.co_firstlineno 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return patched 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def get_original(self): 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target = self.getter() 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = self.attribute 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original = DEFAULT 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local = False 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original = target.__dict__[name] 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except (AttributeError, KeyError): 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original = getattr(target, name, DEFAULT) 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local = True 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not self.create and original is DEFAULT: 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise AttributeError( 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "%s does not have the attribute %r" % (target, name) 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return original, local 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __enter__(self): 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Perform the patch.""" 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new, spec, spec_set = self.new, self.spec, self.spec_set 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autospec, kwargs = self.autospec, self.kwargs 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_callable = self.new_callable 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.target = self.getter() 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # normalise False to None 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec is False: 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec = None 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set is False: 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set = None 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if autospec is False: 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autospec = None 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec is not None and autospec is not None: 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise TypeError("Can't specify spec and autospec") 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((spec is not None or autospec is not None) and 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set not in (True, None)): 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise TypeError("Can't provide explicit spec_set *and* spec or autospec") 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original, local = self.get_original() 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if new is DEFAULT and autospec is None: 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inherit = False 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec is True: 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # set spec to the object we are replacing 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec = original 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set is True: 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set = original 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec = None 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif spec is not None: 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set is True: 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set = spec 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec = None 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif spec_set is True: 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set = original 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec is not None or spec_set is not None: 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if original is DEFAULT: 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise TypeError("Can't use 'spec' with create=True") 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(original, ClassTypes): 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # If we're patching out a class and there is a spec 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inherit = True 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Klass = MagicMock 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs = {} 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if new_callable is not None: 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Klass = new_callable 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif spec is not None or spec_set is not None: 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_spec = spec 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set is not None: 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_spec = spec_set 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_list(this_spec): 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) not_callable = '__call__' not in this_spec 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) not_callable = not _callable(this_spec) 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not_callable: 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Klass = NonCallableMagicMock 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec is not None: 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs['spec'] = spec 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set is not None: 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs['spec_set'] = spec_set 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # add a name to mocks 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (isinstance(Klass, type) and 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) issubclass(Klass, NonCallableMock) and self.attribute): 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs['name'] = self.attribute 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs.update(kwargs) 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new = Klass(**_kwargs) 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if inherit and _is_instance_mock(new): 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # we can only tell if the instance should be callable if the 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # spec is not a list 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_spec = spec 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set is not None: 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_spec = spec_set 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (not _is_list(this_spec) and not 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _instance_callable(this_spec)): 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Klass = NonCallableMagicMock 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs.pop('name') 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new.return_value = Klass(_new_parent=new, _new_name='()', 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) **_kwargs) 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif autospec is not None: 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # spec is ignored, new *must* be default, spec_set is treated 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # as a boolean. Should we check spec is not None and that spec_set 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # is a bool? 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if new is not DEFAULT: 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise TypeError( 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "autospec creates the mock for you. Can't specify " 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "autospec and new." 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if original is DEFAULT: 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise TypeError("Can't use 'autospec' with create=True") 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set = bool(spec_set) 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if autospec is True: 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autospec = original 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new = create_autospec(autospec, spec_set=spec_set, 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _name=self.attribute, **kwargs) 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif kwargs: 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # can't set keyword args when we aren't creating the mock 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX If new is a Mock we could call new.configure_mock(**kwargs) 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise TypeError("Can't pass kwargs to a mock we aren't creating") 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_attr = new 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.temp_original = original 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.is_local = local 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(self.target, self.attribute, new_attr) 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.attribute_name is not None: 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_args = {} 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.new is DEFAULT: 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_args[self.attribute_name] = new 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for patching in self.additional_patchers: 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arg = patching.__enter__() 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if patching.new is DEFAULT: 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_args.update(arg) 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extra_args 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __exit__(self, *exc_info): 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Undo the patch.""" 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not _is_started(self): 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise RuntimeError('stop called on unstarted patcher') 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.is_local and self.temp_original is not DEFAULT: 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(self.target, self.attribute, self.temp_original) 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delattr(self.target, self.attribute) 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not self.create and not hasattr(self.target, self.attribute): 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # needed for proxy objects like django settings 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(self.target, self.attribute, self.temp_original) 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) del self.temp_original 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) del self.is_local 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) del self.target 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for patcher in reversed(self.additional_patchers): 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_started(patcher): 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patcher.__exit__(*exc_info) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def start(self): 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Activate a patch, returning any created mock.""" 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = self.__enter__() 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._active_patches.add(self) 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def stop(self): 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Stop an active patch.""" 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._active_patches.discard(self) 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.__exit__() 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _get_target(target): 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target, attribute = target.rsplit('.', 1) 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except (TypeError, ValueError): 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise TypeError("Need a valid target to patch. You supplied: %r" % 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (target,)) 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter = lambda: _importer(target) 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getter, attribute 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _patch_object( 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target, attribute, new=DEFAULT, spec=None, 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create=False, spec_set=None, autospec=None, 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_callable=None, **kwargs 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ): 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patch.object(target, attribute, new=DEFAULT, spec=None, create=False, 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set=None, autospec=None, new_callable=None, **kwargs) 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patch the named member (`attribute`) on an object (`target`) with a mock 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object. 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch.object` can be used as a decorator, class decorator or a context 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager. Arguments `new`, `spec`, `create`, `spec_set`, 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `autospec` and `new_callable` have the same meaning as for `patch`. Like 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch`, `patch.object` takes arbitrary keyword arguments for configuring 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the mock object it creates. 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) When used as a class decorator `patch.object` honours `patch.TEST_PREFIX` 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for choosing which methods to wrap. 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter = lambda: target 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _patch( 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter, attribute, new, spec, create, 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set, autospec, new_callable, kwargs 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _patch_multiple(target, spec=None, create=False, spec_set=None, 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autospec=None, new_callable=None, **kwargs): 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Perform multiple patches in a single call. It takes the object to be 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patched (either as an object or a string to fetch the object by importing) 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) and keyword arguments for the patches:: 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'): 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ... 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Use `DEFAULT` as the value if you want `patch.multiple` to create 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mocks for you. In this case the created mocks are passed into a decorated 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function by keyword, and a dictionary is returned when `patch.multiple` is 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) used as a context manager. 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch.multiple` can be used as a decorator, class decorator or a context 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager. The arguments `spec`, `spec_set`, `create`, 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `autospec` and `new_callable` have the same meaning as for `patch`. These 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arguments will be applied to *all* patches done by `patch.multiple`. 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX` 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for choosing which methods to wrap. 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if type(target) in (unicode, str): 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter = lambda: _importer(target) 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter = lambda: target 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not kwargs: 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise ValueError( 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'Must supply at least one keyword argument with patch.multiple' 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # need to wrap in a list for python 3, where items is a view 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items = list(kwargs.items()) 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attribute, new = items[0] 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patcher = _patch( 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter, attribute, new, spec, create, spec_set, 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autospec, new_callable, {} 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patcher.attribute_name = attribute 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for attribute, new in items[1:]: 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_patcher = _patch( 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter, attribute, new, spec, create, spec_set, 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autospec, new_callable, {} 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this_patcher.attribute_name = attribute 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patcher.additional_patchers.append(this_patcher) 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return patcher 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def patch( 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target, new=DEFAULT, spec=None, create=False, 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set=None, autospec=None, new_callable=None, **kwargs 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ): 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch` acts as a function decorator, class decorator or a context 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager. Inside the body of the function or with statement, the `target` 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is patched with a `new` object. When the function/with statement exits 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the patch is undone. 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `new` is omitted, then the target is replaced with a 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `MagicMock`. If `patch` is used as a decorator and `new` is 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) omitted, the created mock is passed in as an extra argument to the 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decorated function. If `patch` is used as a context manager the created 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock is returned by the context manager. 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `target` should be a string in the form `'package.module.ClassName'`. The 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `target` is imported and the specified object replaced with the `new` 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object, so the `target` must be importable from the environment you are 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) calling `patch` from. The target is imported when the decorated function 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is executed, not at decoration time. 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) The `spec` and `spec_set` keyword arguments are passed to the `MagicMock` 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if patch is creating one for you. 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) In addition you can pass `spec=True` or `spec_set=True`, which causes 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patch to pass in the object being mocked as the spec/spec_set object. 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `new_callable` allows you to specify a different class, or callable object, 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) that will be called to create the `new` object. By default `MagicMock` is 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) used. 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A more powerful form of `spec` is `autospec`. If you set `autospec=True` 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) then the mock with be created with a spec from the object being replaced. 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) All attributes of the mock will also have the spec of the corresponding 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attribute of the object being replaced. Methods and functions being 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mocked will have their arguments checked and will raise a `TypeError` if 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) they are called with the wrong signature. For mocks replacing a class, 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) their return value (the 'instance') will have the same spec as the class. 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Instead of `autospec=True` you can pass `autospec=some_object` to use an 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arbitrary object as the spec instead of the one being replaced. 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) By default `patch` will fail to replace attributes that don't exist. If 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) you pass in `create=True`, and the attribute doesn't exist, patch will 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create the attribute for you when the patched function is called, and 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete it again afterwards. This is useful for writing tests against 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes that your production code creates at runtime. It is off by by 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default because it can be dangerous. With it switched on you can write 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) passing tests against APIs that don't actually exist! 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Patch can be used as a `TestCase` class decorator. It works by 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decorating each test method in the class. This reduces the boilerplate 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) code when your test methods share a common patchings set. `patch` finds 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tests by looking for method names that start with `patch.TEST_PREFIX`. 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) By default this is `test`, which matches the way `unittest` finds tests. 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) You can specify an alternative prefix by setting `patch.TEST_PREFIX`. 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Patch can be used as a context manager, with the with statement. Here the 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patching applies to the indented block after the with statement. If you 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use "as" then the patched object will be bound to the name after the 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "as"; very useful if `patch` is creating a mock object for you. 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch` takes arbitrary keyword arguments. These will be passed to 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the `Mock` (or `new_callable`) on construction. 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) available for alternate use-cases. 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter, attribute = _get_target(target) 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _patch( 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getter, attribute, new, spec, create, 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec_set, autospec, new_callable, kwargs 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ) 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _patch_dict(object): 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Patch a dictionary, or dictionary like object, and restore the dictionary 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to its original state after the test. 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `in_dict` can be a dictionary or a mapping like container. If it is a 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mapping then it must at least support getting, setting and deleting items 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plus iterating over keys. 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `in_dict` can also be a string specifying the name of the dictionary, which 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) will then be fetched by importing it. 15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `values` can be a dictionary of values to set in the dictionary. `values` 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) can also be an iterable of `(key, value)` pairs. 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `clear` is True then the dictionary will be cleared before the new 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) values are set. 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch.dict` can also be called with arbitrary keyword arguments to set 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) values in the dictionary:: 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()): 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ... 15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch.dict` can be used as a context manager, decorator or class 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decorator. When used as a class decorator `patch.dict` honours 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `patch.TEST_PREFIX` for choosing which methods to wrap. 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, in_dict, values=(), clear=False, **kwargs): 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(in_dict, basestring): 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_dict = _importer(in_dict) 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.in_dict = in_dict 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # support any argument supported by dict(...) constructor 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.values = dict(values) 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.values.update(kwargs) 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.clear = clear 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._original = None 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __call__(self, f): 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(f, ClassTypes): 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.decorate_class(f) 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @wraps(f) 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _inner(*args, **kw): 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._patch_dict() 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return f(*args, **kw) 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finally: 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._unpatch_dict() 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _inner 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def decorate_class(self, klass): 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for attr in dir(klass): 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attr_value = getattr(klass, attr) 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (attr.startswith(patch.TEST_PREFIX) and 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hasattr(attr_value, "__call__")): 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decorator = _patch_dict(self.in_dict, self.values, self.clear) 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decorated = decorator(attr_value) 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(klass, attr, decorated) 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return klass 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __enter__(self): 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Patch the dict.""" 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._patch_dict() 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _patch_dict(self): 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) values = self.values 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_dict = self.in_dict 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clear = self.clear 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original = in_dict.copy() 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # dict like object with no copy method 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # must support iteration over keys 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original = {} 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for key in in_dict: 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original[key] = in_dict[key] 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._original = original 16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if clear: 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _clear_dict(in_dict) 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_dict.update(values) 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # dict like object with no update method 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for key in values: 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_dict[key] = values[key] 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _unpatch_dict(self): 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_dict = self.in_dict 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original = self._original 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _clear_dict(in_dict) 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_dict.update(original) 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for key in original: 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_dict[key] = original[key] 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __exit__(self, *args): 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Unpatch the dict.""" 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._unpatch_dict() 16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start = __enter__ 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stop = __exit__ 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _clear_dict(in_dict): 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_dict.clear() 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keys = list(in_dict) 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for key in keys: 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) del in_dict[key] 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _patch_stopall(): 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Stop all active patches.""" 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for patch in list(_patch._active_patches): 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patch.stop() 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)patch.object = _patch_object 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)patch.dict = _patch_dict 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)patch.multiple = _patch_multiple 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)patch.stopall = _patch_stopall 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)patch.TEST_PREFIX = 'test' 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)magic_methods = ( 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "lt le gt ge eq ne " 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "getitem setitem delitem " 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "len contains iter " 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "hash str sizeof " 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "enter exit " 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "divmod neg pos abs invert " 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "complex int float index " 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "trunc floor ceil " 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)) 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)numerics = "add sub mul div floordiv mod lshift rshift and xor or pow " 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)inplace = ' '.join('i%s' % n for n in numerics.split()) 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)right = ' '.join('r%s' % n for n in numerics.split()) 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extra = '' 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if inPy3k: 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra = 'bool next ' 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)else: 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra = 'unicode long nonzero oct hex truediv rtruediv ' 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# not including __prepare__, __instancecheck__, __subclasscheck__ 17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# (as they are metaclass methods) 17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# __del__ is not supported at all as it causes problems if it exists 17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_non_defaults = set('__%s__' % method for method in [ 17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'cmp', 'getslice', 'setslice', 'coerce', 'subclasses', 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'format', 'get', 'set', 'delete', 'reversed', 17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'missing', 'reduce', 'reduce_ex', 'getinitargs', 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'getnewargs', 'getstate', 'setstate', 'getformat', 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'setformat', 'repr', 'dir' 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)]) 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _get_method(name, func): 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Turns a callable object (like a mock) into a real function" 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def method(self, *args, **kw): 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return func(self, *args, **kw) 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) method.__name__ = name 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return method 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_magics = set( 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__%s__' % method for method in 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' '.join([magic_methods, numerics, inplace, right, extra]).split() 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)) 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_all_magics = _magics | _non_defaults 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_unsupported_magics = set([ 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__getattr__', '__setattr__', 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__init__', '__new__', '__prepare__' 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__instancecheck__', '__subclasscheck__', 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__del__' 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)]) 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_calculate_return_value = { 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__hash__': lambda self: object.__hash__(self), 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__str__': lambda self: object.__str__(self), 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__sizeof__': lambda self: object.__sizeof__(self), 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__unicode__': lambda self: unicode(object.__str__(self)), 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_return_values = { 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__lt__': NotImplemented, 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__gt__': NotImplemented, 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__le__': NotImplemented, 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__ge__': NotImplemented, 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__int__': 1, 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__contains__': False, 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__len__': 0, 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__exit__': False, 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__complex__': 1j, 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__float__': 1.0, 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__bool__': True, 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__nonzero__': True, 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__oct__': '1', 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__hex__': '0x1', 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__long__': long(1), 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__index__': 1, 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _get_eq(self): 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __eq__(other): 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret_val = self.__eq__._mock_return_value 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ret_val is not DEFAULT: 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ret_val 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self is other 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return __eq__ 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _get_ne(self): 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __ne__(other): 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.__ne__._mock_return_value is not DEFAULT: 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return DEFAULT 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self is not other 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return __ne__ 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _get_iter(self): 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __iter__(): 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret_val = self.__iter__._mock_return_value 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ret_val is DEFAULT: 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return iter([]) 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # if ret_val was already an iterator, then calling iter on it should 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # return the iterator unchanged 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return iter(ret_val) 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return __iter__ 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_side_effect_methods = { 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__eq__': _get_eq, 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__ne__': _get_ne, 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '__iter__': _get_iter, 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _set_return_value(mock, method, name): 18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fixed = _return_values.get(name, DEFAULT) 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if fixed is not DEFAULT: 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) method.return_value = fixed 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return_calulator = _calculate_return_value.get(name) 18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if return_calulator is not None: 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return_value = return_calulator(mock) 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX why do we return AttributeError here? 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # set it as a side_effect instead? 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return_value = AttributeError(name) 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) method.return_value = return_value 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) side_effector = _side_effect_methods.get(name) 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if side_effector is not None: 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) method.side_effect = side_effector(mock) 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MagicMixin(object): 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, *args, **kw): 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _super(MagicMixin, self).__init__(*args, **kw) 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_set_magics() 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _mock_set_magics(self): 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) these_magics = _magics 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self._mock_methods is not None: 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) these_magics = _magics.intersection(self._mock_methods) 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remove_magics = set() 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remove_magics = _magics - these_magics 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for entry in remove_magics: 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if entry in type(self).__dict__: 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # remove unneeded magic methods 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delattr(self, entry) 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # don't overwrite existing attributes if called a second time 18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) these_magics = these_magics - set(type(self).__dict__) 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _type = type(self) 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for entry in these_magics: 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(_type, entry, MagicProxy(entry, self)) 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NonCallableMagicMock(MagicMixin, NonCallableMock): 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """A version of `MagicMock` that isn't callable.""" 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def mock_add_spec(self, spec, spec_set=False): 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Add a spec to a mock. `spec` can either be an object or a 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list of strings. Only attributes on the `spec` can be fetched as 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes from the mock. 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `spec_set` is True then only attributes on the spec can be set.""" 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_add_spec(spec, spec_set) 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_set_magics() 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MagicMock(MagicMixin, Mock): 18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MagicMock is a subclass of Mock with default implementations 18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) of most of the magic methods. You can use MagicMock without having to 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) configure the magic methods yourself. 18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If you use the `spec` or `spec_set` arguments then *only* magic 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) methods that exist in the spec will be created. 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Attributes and the return value of a `MagicMock` will also be `MagicMocks`. 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def mock_add_spec(self, spec, spec_set=False): 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Add a spec to a mock. `spec` can either be an object or a 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list of strings. Only attributes on the `spec` can be fetched as 19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes from the mock. 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `spec_set` is True then only attributes on the spec can be set.""" 19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_add_spec(spec, spec_set) 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._mock_set_magics() 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MagicProxy(object): 19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, name, parent): 19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.name = name 19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.parent = parent 19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __call__(self, *args, **kwargs): 19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m = self.create_mock() 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return m(*args, **kwargs) 19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def create_mock(self): 19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = self.name 19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent = self.parent 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m = parent._get_child_mock(name=entry, _new_name=entry, 19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent=parent) 19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(parent, entry, m) 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _set_return_value(parent, m, entry) 19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return m 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __get__(self, obj, _type=None): 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.create_mock() 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _ANY(object): 19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "A helper object that compares equal to everything." 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __eq__(self, other): 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return True 19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __ne__(self, other): 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __repr__(self): 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return '<ANY>' 19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ANY = _ANY() 19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _format_call_signature(name, args, kwargs): 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message = '%s(%%s)' % name 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) formatted_args = '' 19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args_string = ', '.join([repr(arg) for arg in args]) 19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kwargs_string = ', '.join([ 19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '%s=%r' % (key, value) for key, value in kwargs.items() 19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ]) 19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if args_string: 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) formatted_args = args_string 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if kwargs_string: 19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if formatted_args: 19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) formatted_args += ', ' 19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) formatted_args += kwargs_string 19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return message % formatted_args 19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _Call(tuple): 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A tuple for holding the results of a call to a mock, either in the form 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `(args, kwargs)` or `(name, args, kwargs)`. 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If args or kwargs are empty then a call tuple will compare equal to 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) a tuple without those values. This makes comparisons less verbose:: 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _Call(('name', (), {})) == ('name',) 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _Call(('name', (1,), {})) == ('name', (1,)) 19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _Call(((), {'a': 'b'})) == ({'a': 'b'},) 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) The `_Call` object provides a useful shortcut for comparing with call:: 19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _Call(((1, 2), {'a': 3})) == call(1, 2, a=3) 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3) 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If the _Call has no name then it will match any name. 19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __new__(cls, value=(), name=None, parent=None, two=False, 19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) from_kall=True): 19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = '' 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args = () 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kwargs = {} 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _len = len(value) 19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _len == 3: 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name, args, kwargs = value 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif _len == 2: 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first, second = value 19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(first, basestring): 19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = first 20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(second, tuple): 20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args = second 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kwargs = second 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args, kwargs = first, second 20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif _len == 1: 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value, = value 20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(value, basestring): 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = value 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif isinstance(value, tuple): 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args = value 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kwargs = value 20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if two: 20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tuple.__new__(cls, (args, kwargs)) 20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tuple.__new__(cls, (name, args, kwargs)) 20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, value=(), name=None, parent=None, two=False, 20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) from_kall=True): 20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.name = name 20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.parent = parent 20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.from_kall = from_kall 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __eq__(self, other): 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if other is ANY: 20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return True 20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) len_other = len(other) 20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except TypeError: 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self_name = '' 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if len(self) == 2: 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self_args, self_kwargs = self 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self_name, self_args, self_kwargs = self 20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_name = '' 20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if len_other == 0: 20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_args, other_kwargs = (), {} 20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif len_other == 3: 20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_name, other_args, other_kwargs = other 20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif len_other == 1: 20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value, = other 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(value, tuple): 20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_args = value 20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_kwargs = {} 20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif isinstance(value, basestring): 20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_name = value 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_args, other_kwargs = (), {} 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_args = () 20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_kwargs = value 20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # len 2 20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # could be (name, args) or (name, kwargs) or (args, kwargs) 20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first, second = other 20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(first, basestring): 20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_name = first 20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(second, tuple): 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_args, other_kwargs = second, {} 20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_args, other_kwargs = (), second 20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_args, other_kwargs = first, second 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self_name and other_name != self_name: 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # this order is important for ANY to work! 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (other_args, other_kwargs) == (self_args, self_kwargs) 20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __ne__(self, other): 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return not self.__eq__(other) 20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __call__(self, *args, **kwargs): 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.name is None: 20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _Call(('', args, kwargs), name='()') 20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = self.name + '()' 20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _Call((self.name, args, kwargs), name=name, parent=self) 20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __getattr__(self, attr): 20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.name is None: 20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _Call(name=attr, from_kall=False) 20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = '%s.%s' % (self.name, attr) 20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _Call(name=name, parent=self, from_kall=False) 20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __repr__(self): 20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not self.from_kall: 20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = self.name or 'call' 21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if name.startswith('()'): 21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = 'call%s' % name 21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return name 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if len(self) == 2: 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = 'call' 21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args, kwargs = self 21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name, args, kwargs = self 21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not name: 21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = 'call' 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif not name.startswith('()'): 21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = 'call.%s' % name 21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = 'call%s' % name 21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _format_call_signature(name, args, kwargs) 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def call_list(self): 21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """For a call object that represents multiple calls, `call_list` 21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) returns a list of all the intermediate calls as well as the 21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final call.""" 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vals = [] 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thing = self 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while thing is not None: 21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if thing.from_kall: 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vals.append(thing) 21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thing = thing.parent 21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _CallList(reversed(vals)) 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)call = _Call(from_kall=False) 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def create_autospec(spec, spec_set=False, instance=False, _parent=None, 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _name=None, **kwargs): 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Create a mock object using another object as a spec. Attributes on the 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock will use the corresponding attribute on the `spec` object as their 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec. 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Functions or methods being mocked will have their arguments checked 21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to check that they are called with the correct signature. 21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If `spec_set` is True then attempting to set attributes that don't exist 21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on the spec object will raise an `AttributeError`. 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) If a class is used as a spec then the return value of the mock (the 21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance of the class) will have the same spec. You can use a class as the 21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec for an instance object by passing `instance=True`. The returned mock 21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) will only be callable if instances of the mock are callable. 21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `create_autospec` also takes arbitrary keyword arguments that are passed to 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the constructor of the created mock.""" 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_list(spec): 21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # can't pass a list instance to the mock constructor as it will be 21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # interpreted as a list of strings 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec = type(spec) 21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_type = isinstance(spec, ClassTypes) 21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs = {'spec': spec} 21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set: 21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs = {'spec_set': spec} 21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif spec is None: 21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # None we mock with a normal mock without a spec 21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs = {} 21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs.update(kwargs) 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Klass = MagicMock 21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if type(spec) in DescriptorTypes: 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # descriptors don't have a spec 21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # because we don't know what type they return 21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _kwargs = {} 21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif not _callable(spec): 21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Klass = NonCallableMagicMock 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif is_type and instance and not _instance_callable(spec): 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Klass = NonCallableMagicMock 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_name = _name 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _parent is None: 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # for a top level object no _new_name should be set 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_name = '' 21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name, 21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name=_name, **_kwargs) 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(spec, FunctionTypes): 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # should only happen at the top level because we don't 21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # recurse for functions 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock = _set_signature(mock, spec) 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _check_signature(spec, mock, is_type, instance) 21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _parent is not None and not instance: 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _parent._mock_children[_name] = mock 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if is_type and not instance and 'return_value' not in kwargs: 21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock.return_value = create_autospec(spec, spec_set, instance=True, 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _name='()', _parent=mock) 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for entry in dir(spec): 22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if _is_magic(entry): 22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # MagicMock already does the useful magic methods for us 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue 22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(spec, FunctionTypes) and entry in FunctionAttributes: 22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # allow a mock to actually be a function 22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue 22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX do we need a better way of getting attributes without 22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # triggering code execution (?) Probably not - we need the actual 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # object to mock it so we would rather trigger a property than mock 22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # the property descriptor. Likewise we want to mock out dynamically 22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # provided attributes. 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX what about attributes that raise exceptions other than 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # AttributeError on being fetched? 22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # we could be resilient against it, or catch and propagate the 22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # exception when the attribute is fetched from the mock 22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original = getattr(spec, entry) 22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue 22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kwargs = {'spec': original} 22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if spec_set: 22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kwargs = {'spec_set': original} 22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not isinstance(original, FunctionTypes): 22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new = _SpecState(original, spec_set, mock, entry, instance) 22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock._mock_children[entry] = new 22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent = mock 22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(spec, FunctionTypes): 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent = mock.mock 22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new = MagicMock(parent=parent, name=entry, _new_name=entry, 22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _new_parent=parent, **kwargs) 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock._mock_children[entry] = new 22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skipfirst = _must_skip(spec, entry, is_type) 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _check_signature(original, new, skipfirst=skipfirst) 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # so functions created with _set_signature become instance attributes, 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # *plus* their underlying mock exists in _mock_children of the parent 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # mock. Adding to _mock_children may be unnecessary where we are also 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # setting as an instance attribute? 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(new, FunctionTypes): 22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setattr(mock, entry, new) 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mock 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _must_skip(spec, entry, is_type): 22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not isinstance(spec, ClassTypes): 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if entry in getattr(spec, '__dict__', {}): 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # instance attribute - shouldn't skip 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spec = spec.__class__ 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not hasattr(spec, '__mro__'): 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # old style class: can't have descriptors anyway 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return is_type 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for klass in spec.__mro__: 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = klass.__dict__.get(entry, DEFAULT) 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if result is DEFAULT: 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if isinstance(result, (staticmethod, classmethod)): 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return False 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return is_type 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # shouldn't get here unless function is a dynamically provided attribute 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # XXXX untested behaviour 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return is_type 22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _get_class(obj): 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try: 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return obj.__class__ 22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) except AttributeError: 22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # in Python 2, _sre.SRE_Pattern objects have no __class__ 22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type(obj) 22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class _SpecState(object): 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, spec, spec_set=False, parent=None, 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name=None, ids=None, instance=False): 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.spec = spec 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.ids = ids 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.spec_set = spec_set 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.parent = parent 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.instance = instance 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.name = name 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FunctionTypes = ( 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # python function 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(create_autospec), 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # instance method 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(ANY.__eq__), 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # unbound method 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(_ANY.__eq__), 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)) 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FunctionAttributes = set([ 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'func_closure', 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'func_code', 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'func_defaults', 23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'func_dict', 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'func_doc', 23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'func_globals', 23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'func_name', 23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)]) 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)file_spec = None 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def mock_open(mock=None, read_data=''): 23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A helper function to create a mock to replace the use of `open`. It works 23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for `open` called directly or used as a context manager. 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) The `mock` argument is the mock object to configure. If `None` (the 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default) then a `MagicMock` will be created for you, with the API limited 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to methods or attributes available on standard file handles. 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `read_data` is a string for the `read` method of the file handle to return. 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) This is an empty string by default. 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) global file_spec 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if file_spec is None: 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # set on first use 23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if inPy3k: 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) import _io 23362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO)))) 23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_spec = file 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if mock is None: 23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock = MagicMock(name='open', spec=open) 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handle = MagicMock(spec=file_spec) 23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handle.write.return_value = None 23452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handle.__enter__.return_value = handle 23462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handle.read.return_value = read_data 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock.return_value = handle 23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mock 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PropertyMock(Mock): 23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A mock intended to be used as a property, or other descriptor, on a class. 23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) `PropertyMock` provides `__get__` and `__set__` methods so you can specify 23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) a return value when it is fetched. 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Fetching a `PropertyMock` instance from an object calls the mock, with 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) no args. Setting it calls the mock with the value being set. 23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _get_child_mock(self, **kwargs): 23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MagicMock(**kwargs) 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __get__(self, obj, obj_type): 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self() 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __set__(self, obj, val): 23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self(val) 2368