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