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