1cef7893435aa41160dd1255c43cb8498279738ccChris Craik# mock.py
2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Test tools for mocking and patching.
3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright (C) 2007-2012 Michael Foord & the mock team
4cef7893435aa41160dd1255c43cb8498279738ccChris Craik# E-mail: fuzzyman AT voidspace DOT org DOT uk
5cef7893435aa41160dd1255c43cb8498279738ccChris Craik
6cef7893435aa41160dd1255c43cb8498279738ccChris Craik# mock 1.0
7cef7893435aa41160dd1255c43cb8498279738ccChris Craik# http://www.voidspace.org.uk/python/mock/
8cef7893435aa41160dd1255c43cb8498279738ccChris Craik
9cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Released subject to the BSD License
10cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Please see http://www.voidspace.org.uk/python/license.shtml
11cef7893435aa41160dd1255c43cb8498279738ccChris Craik
12cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Scripts maintained at http://www.voidspace.org.uk/python/index.shtml
13cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Comments, suggestions and bug reports welcome.
14cef7893435aa41160dd1255c43cb8498279738ccChris Craik
15cef7893435aa41160dd1255c43cb8498279738ccChris Craik
16cef7893435aa41160dd1255c43cb8498279738ccChris Craik__all__ = (
17cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'Mock',
18cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'MagicMock',
19cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'patch',
20cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'sentinel',
21cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'DEFAULT',
22cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'ANY',
23cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'call',
24cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'create_autospec',
25cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'FILTER_DIR',
26cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'NonCallableMock',
27cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'NonCallableMagicMock',
28cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'mock_open',
29cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'PropertyMock',
30cef7893435aa41160dd1255c43cb8498279738ccChris Craik)
31cef7893435aa41160dd1255c43cb8498279738ccChris Craik
32cef7893435aa41160dd1255c43cb8498279738ccChris Craik
33cef7893435aa41160dd1255c43cb8498279738ccChris Craik__version__ = '1.0.1'
34cef7893435aa41160dd1255c43cb8498279738ccChris Craik
35cef7893435aa41160dd1255c43cb8498279738ccChris Craik
36cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport pprint
37cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport sys
38cef7893435aa41160dd1255c43cb8498279738ccChris Craik
39cef7893435aa41160dd1255c43cb8498279738ccChris Craiktry:
40cef7893435aa41160dd1255c43cb8498279738ccChris Craik    import inspect
41cef7893435aa41160dd1255c43cb8498279738ccChris Craikexcept ImportError:
42cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # for alternative platforms that
43cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # may not have inspect
44cef7893435aa41160dd1255c43cb8498279738ccChris Craik    inspect = None
45cef7893435aa41160dd1255c43cb8498279738ccChris Craik
46cef7893435aa41160dd1255c43cb8498279738ccChris Craiktry:
47cef7893435aa41160dd1255c43cb8498279738ccChris Craik    from functools import wraps as original_wraps
48cef7893435aa41160dd1255c43cb8498279738ccChris Craikexcept ImportError:
49cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Python 2.4 compatibility
50cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def wraps(original):
51cef7893435aa41160dd1255c43cb8498279738ccChris Craik        def inner(f):
52cef7893435aa41160dd1255c43cb8498279738ccChris Craik            f.__name__ = original.__name__
53cef7893435aa41160dd1255c43cb8498279738ccChris Craik            f.__doc__ = original.__doc__
54cef7893435aa41160dd1255c43cb8498279738ccChris Craik            f.__module__ = original.__module__
55cef7893435aa41160dd1255c43cb8498279738ccChris Craik            f.__wrapped__ = original
56cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return f
57cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return inner
58cef7893435aa41160dd1255c43cb8498279738ccChris Craikelse:
59cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if sys.version_info[:2] >= (3, 3):
60cef7893435aa41160dd1255c43cb8498279738ccChris Craik        wraps = original_wraps
61cef7893435aa41160dd1255c43cb8498279738ccChris Craik    else:
62cef7893435aa41160dd1255c43cb8498279738ccChris Craik        def wraps(func):
63cef7893435aa41160dd1255c43cb8498279738ccChris Craik            def inner(f):
64cef7893435aa41160dd1255c43cb8498279738ccChris Craik                f = original_wraps(func)(f)
65cef7893435aa41160dd1255c43cb8498279738ccChris Craik                f.__wrapped__ = func
66cef7893435aa41160dd1255c43cb8498279738ccChris Craik                return f
67cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return inner
68cef7893435aa41160dd1255c43cb8498279738ccChris Craik
69cef7893435aa41160dd1255c43cb8498279738ccChris Craiktry:
70cef7893435aa41160dd1255c43cb8498279738ccChris Craik    unicode
71cef7893435aa41160dd1255c43cb8498279738ccChris Craikexcept NameError:
72cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Python 3
73cef7893435aa41160dd1255c43cb8498279738ccChris Craik    basestring = unicode = str
74cef7893435aa41160dd1255c43cb8498279738ccChris Craik
75cef7893435aa41160dd1255c43cb8498279738ccChris Craiktry:
76cef7893435aa41160dd1255c43cb8498279738ccChris Craik    long
77cef7893435aa41160dd1255c43cb8498279738ccChris Craikexcept NameError:
78cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Python 3
79cef7893435aa41160dd1255c43cb8498279738ccChris Craik    long = int
80cef7893435aa41160dd1255c43cb8498279738ccChris Craik
81cef7893435aa41160dd1255c43cb8498279738ccChris Craiktry:
82cef7893435aa41160dd1255c43cb8498279738ccChris Craik    BaseException
83cef7893435aa41160dd1255c43cb8498279738ccChris Craikexcept NameError:
84cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Python 2.4 compatibility
85cef7893435aa41160dd1255c43cb8498279738ccChris Craik    BaseException = Exception
86cef7893435aa41160dd1255c43cb8498279738ccChris Craik
87cef7893435aa41160dd1255c43cb8498279738ccChris Craiktry:
88cef7893435aa41160dd1255c43cb8498279738ccChris Craik    next
89cef7893435aa41160dd1255c43cb8498279738ccChris Craikexcept NameError:
90cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def next(obj):
91cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return obj.next()
92cef7893435aa41160dd1255c43cb8498279738ccChris Craik
93cef7893435aa41160dd1255c43cb8498279738ccChris Craik
94cef7893435aa41160dd1255c43cb8498279738ccChris CraikBaseExceptions = (BaseException,)
95cef7893435aa41160dd1255c43cb8498279738ccChris Craikif 'java' in sys.platform:
96cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # jython
97cef7893435aa41160dd1255c43cb8498279738ccChris Craik    import java
98cef7893435aa41160dd1255c43cb8498279738ccChris Craik    BaseExceptions = (BaseException, java.lang.Throwable)
99cef7893435aa41160dd1255c43cb8498279738ccChris Craik
100cef7893435aa41160dd1255c43cb8498279738ccChris Craiktry:
101cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _isidentifier = str.isidentifier
102cef7893435aa41160dd1255c43cb8498279738ccChris Craikexcept AttributeError:
103cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Python 2.X
104cef7893435aa41160dd1255c43cb8498279738ccChris Craik    import keyword
105cef7893435aa41160dd1255c43cb8498279738ccChris Craik    import re
106cef7893435aa41160dd1255c43cb8498279738ccChris Craik    regex = re.compile(r'^[a-z_][a-z0-9_]*$', re.I)
107cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _isidentifier(string):
108cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if string in keyword.kwlist:
109cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return False
110cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return regex.match(string)
111cef7893435aa41160dd1255c43cb8498279738ccChris Craik
112cef7893435aa41160dd1255c43cb8498279738ccChris Craik
113cef7893435aa41160dd1255c43cb8498279738ccChris CraikinPy3k = sys.version_info[0] == 3
114cef7893435aa41160dd1255c43cb8498279738ccChris Craik
115cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Needed to work around Python 3 bug where use of "super" interferes with
116cef7893435aa41160dd1255c43cb8498279738ccChris Craik# defining __class__ as a descriptor
117cef7893435aa41160dd1255c43cb8498279738ccChris Craik_super = super
118cef7893435aa41160dd1255c43cb8498279738ccChris Craik
119cef7893435aa41160dd1255c43cb8498279738ccChris Craikself = 'im_self'
120cef7893435aa41160dd1255c43cb8498279738ccChris Craikbuiltin = '__builtin__'
121cef7893435aa41160dd1255c43cb8498279738ccChris Craikif inPy3k:
122cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self = '__self__'
123cef7893435aa41160dd1255c43cb8498279738ccChris Craik    builtin = 'builtins'
124cef7893435aa41160dd1255c43cb8498279738ccChris Craik
125cef7893435aa41160dd1255c43cb8498279738ccChris CraikFILTER_DIR = True
126cef7893435aa41160dd1255c43cb8498279738ccChris Craik
127cef7893435aa41160dd1255c43cb8498279738ccChris Craik
128cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _is_instance_mock(obj):
129cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # can't use isinstance on Mock objects because they override __class__
130cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # The base class for all mocks is NonCallableMock
131cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return issubclass(type(obj), NonCallableMock)
132cef7893435aa41160dd1255c43cb8498279738ccChris Craik
133cef7893435aa41160dd1255c43cb8498279738ccChris Craik
134cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _is_exception(obj):
135cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return (
136cef7893435aa41160dd1255c43cb8498279738ccChris Craik        isinstance(obj, BaseExceptions) or
137cef7893435aa41160dd1255c43cb8498279738ccChris Craik        isinstance(obj, ClassTypes) and issubclass(obj, BaseExceptions)
138cef7893435aa41160dd1255c43cb8498279738ccChris Craik    )
139cef7893435aa41160dd1255c43cb8498279738ccChris Craik
140cef7893435aa41160dd1255c43cb8498279738ccChris Craik
141cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _slotted(object):
142cef7893435aa41160dd1255c43cb8498279738ccChris Craik    __slots__ = ['a']
143cef7893435aa41160dd1255c43cb8498279738ccChris Craik
144cef7893435aa41160dd1255c43cb8498279738ccChris Craik
145cef7893435aa41160dd1255c43cb8498279738ccChris CraikDescriptorTypes = (
146cef7893435aa41160dd1255c43cb8498279738ccChris Craik    type(_slotted.a),
147cef7893435aa41160dd1255c43cb8498279738ccChris Craik    property,
148cef7893435aa41160dd1255c43cb8498279738ccChris Craik)
149cef7893435aa41160dd1255c43cb8498279738ccChris Craik
150cef7893435aa41160dd1255c43cb8498279738ccChris Craik
151cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _getsignature(func, skipfirst, instance=False):
152cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if inspect is None:
153cef7893435aa41160dd1255c43cb8498279738ccChris Craik        raise ImportError('inspect module not available')
154cef7893435aa41160dd1255c43cb8498279738ccChris Craik
155cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if isinstance(func, ClassTypes) and not instance:
156cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
157cef7893435aa41160dd1255c43cb8498279738ccChris Craik            func = func.__init__
158cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except AttributeError:
159cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return
160cef7893435aa41160dd1255c43cb8498279738ccChris Craik        skipfirst = True
161cef7893435aa41160dd1255c43cb8498279738ccChris Craik    elif not isinstance(func, FunctionTypes):
162cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # for classes where instance is True we end up here too
163cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
164cef7893435aa41160dd1255c43cb8498279738ccChris Craik            func = func.__call__
165cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except AttributeError:
166cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return
167cef7893435aa41160dd1255c43cb8498279738ccChris Craik
168cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if inPy3k:
169cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
170cef7893435aa41160dd1255c43cb8498279738ccChris Craik            argspec = inspect.getfullargspec(func)
171cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except TypeError:
172cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # C function / method, possibly inherited object().__init__
173cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return
174cef7893435aa41160dd1255c43cb8498279738ccChris Craik        regargs, varargs, varkw, defaults, kwonly, kwonlydef, ann = argspec
175cef7893435aa41160dd1255c43cb8498279738ccChris Craik    else:
176cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
177cef7893435aa41160dd1255c43cb8498279738ccChris Craik            regargs, varargs, varkwargs, defaults = inspect.getargspec(func)
178cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except TypeError:
179cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # C function / method, possibly inherited object().__init__
180cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return
181cef7893435aa41160dd1255c43cb8498279738ccChris Craik
182cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # instance methods and classmethods need to lose the self argument
183cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if getattr(func, self, None) is not None:
184cef7893435aa41160dd1255c43cb8498279738ccChris Craik        regargs = regargs[1:]
185cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if skipfirst:
186cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # this condition and the above one are never both True - why?
187cef7893435aa41160dd1255c43cb8498279738ccChris Craik        regargs = regargs[1:]
188cef7893435aa41160dd1255c43cb8498279738ccChris Craik
189cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if inPy3k:
190cef7893435aa41160dd1255c43cb8498279738ccChris Craik        signature = inspect.formatargspec(
191cef7893435aa41160dd1255c43cb8498279738ccChris Craik            regargs, varargs, varkw, defaults,
192cef7893435aa41160dd1255c43cb8498279738ccChris Craik            kwonly, kwonlydef, ann, formatvalue=lambda value: "")
193cef7893435aa41160dd1255c43cb8498279738ccChris Craik    else:
194cef7893435aa41160dd1255c43cb8498279738ccChris Craik        signature = inspect.formatargspec(
195cef7893435aa41160dd1255c43cb8498279738ccChris Craik            regargs, varargs, varkwargs, defaults,
196cef7893435aa41160dd1255c43cb8498279738ccChris Craik            formatvalue=lambda value: "")
197cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return signature[1:-1], func
198cef7893435aa41160dd1255c43cb8498279738ccChris Craik
199cef7893435aa41160dd1255c43cb8498279738ccChris Craik
200cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _check_signature(func, mock, skipfirst, instance=False):
201cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not _callable(func):
202cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return
203cef7893435aa41160dd1255c43cb8498279738ccChris Craik
204cef7893435aa41160dd1255c43cb8498279738ccChris Craik    result = _getsignature(func, skipfirst, instance)
205cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if result is None:
206cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return
207cef7893435aa41160dd1255c43cb8498279738ccChris Craik    signature, func = result
208cef7893435aa41160dd1255c43cb8498279738ccChris Craik
209cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # can't use self because "self" is common as an argument name
210cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # unfortunately even not in the first place
211cef7893435aa41160dd1255c43cb8498279738ccChris Craik    src = "lambda _mock_self, %s: None" % signature
212cef7893435aa41160dd1255c43cb8498279738ccChris Craik    checksig = eval(src, {})
213cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _copy_func_details(func, checksig)
214cef7893435aa41160dd1255c43cb8498279738ccChris Craik    type(mock)._mock_check_sig = checksig
215cef7893435aa41160dd1255c43cb8498279738ccChris Craik
216cef7893435aa41160dd1255c43cb8498279738ccChris Craik
217cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _copy_func_details(func, funcopy):
218cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.__name__ = func.__name__
219cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.__doc__ = func.__doc__
220cef7893435aa41160dd1255c43cb8498279738ccChris Craik    #funcopy.__dict__.update(func.__dict__)
221cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.__module__ = func.__module__
222cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not inPy3k:
223cef7893435aa41160dd1255c43cb8498279738ccChris Craik        funcopy.func_defaults = func.func_defaults
224cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return
225cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.__defaults__ = func.__defaults__
226cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.__kwdefaults__ = func.__kwdefaults__
227cef7893435aa41160dd1255c43cb8498279738ccChris Craik
228cef7893435aa41160dd1255c43cb8498279738ccChris Craik
229cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _callable(obj):
230cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if isinstance(obj, ClassTypes):
231cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return True
232cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if getattr(obj, '__call__', None) is not None:
233cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return True
234cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return False
235cef7893435aa41160dd1255c43cb8498279738ccChris Craik
236cef7893435aa41160dd1255c43cb8498279738ccChris Craik
237cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _is_list(obj):
238cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # checks for list or tuples
239cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # XXXX badly named!
240cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return type(obj) in (list, tuple)
241cef7893435aa41160dd1255c43cb8498279738ccChris Craik
242cef7893435aa41160dd1255c43cb8498279738ccChris Craik
243cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _instance_callable(obj):
244cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """Given an object, return True if the object is callable.
245cef7893435aa41160dd1255c43cb8498279738ccChris Craik    For classes, return True if instances would be callable."""
246cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not isinstance(obj, ClassTypes):
247cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # already an instance
248cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return getattr(obj, '__call__', None) is not None
249cef7893435aa41160dd1255c43cb8498279738ccChris Craik
250cef7893435aa41160dd1255c43cb8498279738ccChris Craik    klass = obj
251cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # uses __bases__ instead of __mro__ so that we work with old style classes
252cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if klass.__dict__.get('__call__') is not None:
253cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return True
254cef7893435aa41160dd1255c43cb8498279738ccChris Craik
255cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for base in klass.__bases__:
256cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if _instance_callable(base):
257cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return True
258cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return False
259cef7893435aa41160dd1255c43cb8498279738ccChris Craik
260cef7893435aa41160dd1255c43cb8498279738ccChris Craik
261cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _set_signature(mock, original, instance=False):
262cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # creates a function with signature (*args, **kwargs) that delegates to a
263cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # mock. It still does signature checking by calling a lambda with the same
264cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # signature as the original.
265cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not _callable(original):
266cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return
267cef7893435aa41160dd1255c43cb8498279738ccChris Craik
268cef7893435aa41160dd1255c43cb8498279738ccChris Craik    skipfirst = isinstance(original, ClassTypes)
269cef7893435aa41160dd1255c43cb8498279738ccChris Craik    result = _getsignature(original, skipfirst, instance)
270cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if result is None:
271cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # was a C function (e.g. object().__init__ ) that can't be mocked
272cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return
273cef7893435aa41160dd1255c43cb8498279738ccChris Craik
274cef7893435aa41160dd1255c43cb8498279738ccChris Craik    signature, func = result
275cef7893435aa41160dd1255c43cb8498279738ccChris Craik
276cef7893435aa41160dd1255c43cb8498279738ccChris Craik    src = "lambda %s: None" % signature
277cef7893435aa41160dd1255c43cb8498279738ccChris Craik    checksig = eval(src, {})
278cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _copy_func_details(func, checksig)
279cef7893435aa41160dd1255c43cb8498279738ccChris Craik
280cef7893435aa41160dd1255c43cb8498279738ccChris Craik    name = original.__name__
281cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not _isidentifier(name):
282cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name = 'funcopy'
283cef7893435aa41160dd1255c43cb8498279738ccChris Craik    context = {'_checksig_': checksig, 'mock': mock}
284cef7893435aa41160dd1255c43cb8498279738ccChris Craik    src = """def %s(*args, **kwargs):
285cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _checksig_(*args, **kwargs)
286cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return mock(*args, **kwargs)""" % name
287cef7893435aa41160dd1255c43cb8498279738ccChris Craik    exec (src, context)
288cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy = context[name]
289cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _setup_func(funcopy, mock)
290cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return funcopy
291cef7893435aa41160dd1255c43cb8498279738ccChris Craik
292cef7893435aa41160dd1255c43cb8498279738ccChris Craik
293cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _setup_func(funcopy, mock):
294cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.mock = mock
295cef7893435aa41160dd1255c43cb8498279738ccChris Craik
296cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # can't use isinstance with mocks
297cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not _is_instance_mock(mock):
298cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return
299cef7893435aa41160dd1255c43cb8498279738ccChris Craik
300cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def assert_called_with(*args, **kwargs):
301cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return mock.assert_called_with(*args, **kwargs)
302cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def assert_called_once_with(*args, **kwargs):
303cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return mock.assert_called_once_with(*args, **kwargs)
304cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def assert_has_calls(*args, **kwargs):
305cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return mock.assert_has_calls(*args, **kwargs)
306cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def assert_any_call(*args, **kwargs):
307cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return mock.assert_any_call(*args, **kwargs)
308cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def reset_mock():
309cef7893435aa41160dd1255c43cb8498279738ccChris Craik        funcopy.method_calls = _CallList()
310cef7893435aa41160dd1255c43cb8498279738ccChris Craik        funcopy.mock_calls = _CallList()
311cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock.reset_mock()
312cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ret = funcopy.return_value
313cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if _is_instance_mock(ret) and not ret is mock:
314cef7893435aa41160dd1255c43cb8498279738ccChris Craik            ret.reset_mock()
315cef7893435aa41160dd1255c43cb8498279738ccChris Craik
316cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.called = False
317cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.call_count = 0
318cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.call_args = None
319cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.call_args_list = _CallList()
320cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.method_calls = _CallList()
321cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.mock_calls = _CallList()
322cef7893435aa41160dd1255c43cb8498279738ccChris Craik
323cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.return_value = mock.return_value
324cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.side_effect = mock.side_effect
325cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy._mock_children = mock._mock_children
326cef7893435aa41160dd1255c43cb8498279738ccChris Craik
327cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.assert_called_with = assert_called_with
328cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.assert_called_once_with = assert_called_once_with
329cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.assert_has_calls = assert_has_calls
330cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.assert_any_call = assert_any_call
331cef7893435aa41160dd1255c43cb8498279738ccChris Craik    funcopy.reset_mock = reset_mock
332cef7893435aa41160dd1255c43cb8498279738ccChris Craik
333cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mock._mock_delegate = funcopy
334cef7893435aa41160dd1255c43cb8498279738ccChris Craik
335cef7893435aa41160dd1255c43cb8498279738ccChris Craik
336cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _is_magic(name):
337cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return '__%s__' % name[2:-2] == name
338cef7893435aa41160dd1255c43cb8498279738ccChris Craik
339cef7893435aa41160dd1255c43cb8498279738ccChris Craik
340cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _SentinelObject(object):
341cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "A unique, named, sentinel object."
342cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self, name):
343cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.name = name
344cef7893435aa41160dd1255c43cb8498279738ccChris Craik
345cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __repr__(self):
346cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return 'sentinel.%s' % self.name
347cef7893435aa41160dd1255c43cb8498279738ccChris Craik
348cef7893435aa41160dd1255c43cb8498279738ccChris Craik
349cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _Sentinel(object):
350cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """Access attributes to return a named object, usable as a sentinel."""
351cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self):
352cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._sentinels = {}
353cef7893435aa41160dd1255c43cb8498279738ccChris Craik
354cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __getattr__(self, name):
355cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if name == '__bases__':
356cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # Without this help(mock) raises an exception
357cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AttributeError
358cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self._sentinels.setdefault(name, _SentinelObject(name))
359cef7893435aa41160dd1255c43cb8498279738ccChris Craik
360cef7893435aa41160dd1255c43cb8498279738ccChris Craik
361cef7893435aa41160dd1255c43cb8498279738ccChris Craiksentinel = _Sentinel()
362cef7893435aa41160dd1255c43cb8498279738ccChris Craik
363cef7893435aa41160dd1255c43cb8498279738ccChris CraikDEFAULT = sentinel.DEFAULT
364cef7893435aa41160dd1255c43cb8498279738ccChris Craik_missing = sentinel.MISSING
365cef7893435aa41160dd1255c43cb8498279738ccChris Craik_deleted = sentinel.DELETED
366cef7893435aa41160dd1255c43cb8498279738ccChris Craik
367cef7893435aa41160dd1255c43cb8498279738ccChris Craik
368cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass OldStyleClass:
369cef7893435aa41160dd1255c43cb8498279738ccChris Craik    pass
370cef7893435aa41160dd1255c43cb8498279738ccChris CraikClassType = type(OldStyleClass)
371cef7893435aa41160dd1255c43cb8498279738ccChris Craik
372cef7893435aa41160dd1255c43cb8498279738ccChris Craik
373cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _copy(value):
374cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if type(value) in (dict, list, tuple, set):
375cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return type(value)(value)
376cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return value
377cef7893435aa41160dd1255c43cb8498279738ccChris Craik
378cef7893435aa41160dd1255c43cb8498279738ccChris Craik
379cef7893435aa41160dd1255c43cb8498279738ccChris CraikClassTypes = (type,)
380cef7893435aa41160dd1255c43cb8498279738ccChris Craikif not inPy3k:
381cef7893435aa41160dd1255c43cb8498279738ccChris Craik    ClassTypes = (type, ClassType)
382cef7893435aa41160dd1255c43cb8498279738ccChris Craik
383cef7893435aa41160dd1255c43cb8498279738ccChris Craik_allowed_names = set(
384cef7893435aa41160dd1255c43cb8498279738ccChris Craik    [
385cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'return_value', '_mock_return_value', 'side_effect',
386cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '_mock_side_effect', '_mock_parent', '_mock_new_parent',
387cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '_mock_name', '_mock_new_name'
388cef7893435aa41160dd1255c43cb8498279738ccChris Craik    ]
389cef7893435aa41160dd1255c43cb8498279738ccChris Craik)
390cef7893435aa41160dd1255c43cb8498279738ccChris Craik
391cef7893435aa41160dd1255c43cb8498279738ccChris Craik
392cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _delegating_property(name):
393cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _allowed_names.add(name)
394cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _the_name = '_mock_' + name
395cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _get(self, name=name, _the_name=_the_name):
396cef7893435aa41160dd1255c43cb8498279738ccChris Craik        sig = self._mock_delegate
397cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if sig is None:
398cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return getattr(self, _the_name)
399cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return getattr(sig, name)
400cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _set(self, value, name=name, _the_name=_the_name):
401cef7893435aa41160dd1255c43cb8498279738ccChris Craik        sig = self._mock_delegate
402cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if sig is None:
403cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self.__dict__[_the_name] = value
404cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
405cef7893435aa41160dd1255c43cb8498279738ccChris Craik            setattr(sig, name, value)
406cef7893435aa41160dd1255c43cb8498279738ccChris Craik
407cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return property(_get, _set)
408cef7893435aa41160dd1255c43cb8498279738ccChris Craik
409cef7893435aa41160dd1255c43cb8498279738ccChris Craik
410cef7893435aa41160dd1255c43cb8498279738ccChris Craik
411cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _CallList(list):
412cef7893435aa41160dd1255c43cb8498279738ccChris Craik
413cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __contains__(self, value):
414cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not isinstance(value, list):
415cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return list.__contains__(self, value)
416cef7893435aa41160dd1255c43cb8498279738ccChris Craik        len_value = len(value)
417cef7893435aa41160dd1255c43cb8498279738ccChris Craik        len_self = len(self)
418cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if len_value > len_self:
419cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return False
420cef7893435aa41160dd1255c43cb8498279738ccChris Craik
421cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for i in range(0, len_self - len_value + 1):
422cef7893435aa41160dd1255c43cb8498279738ccChris Craik            sub_list = self[i:i+len_value]
423cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if sub_list == value:
424cef7893435aa41160dd1255c43cb8498279738ccChris Craik                return True
425cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return False
426cef7893435aa41160dd1255c43cb8498279738ccChris Craik
427cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __repr__(self):
428cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return pprint.pformat(list(self))
429cef7893435aa41160dd1255c43cb8498279738ccChris Craik
430cef7893435aa41160dd1255c43cb8498279738ccChris Craik
431cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _check_and_set_parent(parent, value, name, new_name):
432cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not _is_instance_mock(value):
433cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return False
434cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if ((value._mock_name or value._mock_new_name) or
435cef7893435aa41160dd1255c43cb8498279738ccChris Craik        (value._mock_parent is not None) or
436cef7893435aa41160dd1255c43cb8498279738ccChris Craik        (value._mock_new_parent is not None)):
437cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return False
438cef7893435aa41160dd1255c43cb8498279738ccChris Craik
439cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _parent = parent
440cef7893435aa41160dd1255c43cb8498279738ccChris Craik    while _parent is not None:
441cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # setting a mock (value) as a child or return value of itself
442cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # should not modify the mock
443cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if _parent is value:
444cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return False
445cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _parent = _parent._mock_new_parent
446cef7893435aa41160dd1255c43cb8498279738ccChris Craik
447cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if new_name:
448cef7893435aa41160dd1255c43cb8498279738ccChris Craik        value._mock_new_parent = parent
449cef7893435aa41160dd1255c43cb8498279738ccChris Craik        value._mock_new_name = new_name
450cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if name:
451cef7893435aa41160dd1255c43cb8498279738ccChris Craik        value._mock_parent = parent
452cef7893435aa41160dd1255c43cb8498279738ccChris Craik        value._mock_name = name
453cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return True
454cef7893435aa41160dd1255c43cb8498279738ccChris Craik
455cef7893435aa41160dd1255c43cb8498279738ccChris Craik
456cef7893435aa41160dd1255c43cb8498279738ccChris Craik
457cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass Base(object):
458cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _mock_return_value = DEFAULT
459cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _mock_side_effect = None
460cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self, *args, **kwargs):
461cef7893435aa41160dd1255c43cb8498279738ccChris Craik        pass
462cef7893435aa41160dd1255c43cb8498279738ccChris Craik
463cef7893435aa41160dd1255c43cb8498279738ccChris Craik
464cef7893435aa41160dd1255c43cb8498279738ccChris Craik
465cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass NonCallableMock(Base):
466cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """A non-callable version of `Mock`"""
467cef7893435aa41160dd1255c43cb8498279738ccChris Craik
468cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __new__(cls, *args, **kw):
469cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # every instance has its own class
470cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # so we can create magic methods on the
471cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # class without stomping on other mocks
472cef7893435aa41160dd1255c43cb8498279738ccChris Craik        new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__})
473cef7893435aa41160dd1255c43cb8498279738ccChris Craik        instance = object.__new__(new)
474cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return instance
475cef7893435aa41160dd1255c43cb8498279738ccChris Craik
476cef7893435aa41160dd1255c43cb8498279738ccChris Craik
477cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(
478cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self, spec=None, wraps=None, name=None, spec_set=None,
479cef7893435aa41160dd1255c43cb8498279738ccChris Craik            parent=None, _spec_state=None, _new_name='', _new_parent=None,
480cef7893435aa41160dd1255c43cb8498279738ccChris Craik            **kwargs
481cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ):
482cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if _new_parent is None:
483cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _new_parent = parent
484cef7893435aa41160dd1255c43cb8498279738ccChris Craik
485cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__ = self.__dict__
486cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_parent'] = parent
487cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_name'] = name
488cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_new_name'] = _new_name
489cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_new_parent'] = _new_parent
490cef7893435aa41160dd1255c43cb8498279738ccChris Craik
491cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if spec_set is not None:
492cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec = spec_set
493cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec_set = True
494cef7893435aa41160dd1255c43cb8498279738ccChris Craik
495cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._mock_add_spec(spec, spec_set)
496cef7893435aa41160dd1255c43cb8498279738ccChris Craik
497cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_children'] = {}
498cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_wraps'] = wraps
499cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_delegate'] = None
500cef7893435aa41160dd1255c43cb8498279738ccChris Craik
501cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_called'] = False
502cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_call_args'] = None
503cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_call_count'] = 0
504cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_call_args_list'] = _CallList()
505cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_mock_calls'] = _CallList()
506cef7893435aa41160dd1255c43cb8498279738ccChris Craik
507cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['method_calls'] = _CallList()
508cef7893435aa41160dd1255c43cb8498279738ccChris Craik
509cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if kwargs:
510cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self.configure_mock(**kwargs)
511cef7893435aa41160dd1255c43cb8498279738ccChris Craik
512cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _super(NonCallableMock, self).__init__(
513cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec, wraps, name, spec_set, parent,
514cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _spec_state
515cef7893435aa41160dd1255c43cb8498279738ccChris Craik        )
516cef7893435aa41160dd1255c43cb8498279738ccChris Craik
517cef7893435aa41160dd1255c43cb8498279738ccChris Craik
518cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def attach_mock(self, mock, attribute):
519cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """
520cef7893435aa41160dd1255c43cb8498279738ccChris Craik        Attach a mock as an attribute of this one, replacing its name and
521cef7893435aa41160dd1255c43cb8498279738ccChris Craik        parent. Calls to the attached mock will be recorded in the
522cef7893435aa41160dd1255c43cb8498279738ccChris Craik        `method_calls` and `mock_calls` attributes of this one."""
523cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock._mock_parent = None
524cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock._mock_new_parent = None
525cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock._mock_name = ''
526cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock._mock_new_name = None
527cef7893435aa41160dd1255c43cb8498279738ccChris Craik
528cef7893435aa41160dd1255c43cb8498279738ccChris Craik        setattr(self, attribute, mock)
529cef7893435aa41160dd1255c43cb8498279738ccChris Craik
530cef7893435aa41160dd1255c43cb8498279738ccChris Craik
531cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def mock_add_spec(self, spec, spec_set=False):
532cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Add a spec to a mock. `spec` can either be an object or a
533cef7893435aa41160dd1255c43cb8498279738ccChris Craik        list of strings. Only attributes on the `spec` can be fetched as
534cef7893435aa41160dd1255c43cb8498279738ccChris Craik        attributes from the mock.
535cef7893435aa41160dd1255c43cb8498279738ccChris Craik
536cef7893435aa41160dd1255c43cb8498279738ccChris Craik        If `spec_set` is True then only attributes on the spec can be set."""
537cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._mock_add_spec(spec, spec_set)
538cef7893435aa41160dd1255c43cb8498279738ccChris Craik
539cef7893435aa41160dd1255c43cb8498279738ccChris Craik
540cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _mock_add_spec(self, spec, spec_set):
541cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _spec_class = None
542cef7893435aa41160dd1255c43cb8498279738ccChris Craik
543cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if spec is not None and not _is_list(spec):
544cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if isinstance(spec, ClassTypes):
545cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _spec_class = spec
546cef7893435aa41160dd1255c43cb8498279738ccChris Craik            else:
547cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _spec_class = _get_class(spec)
548cef7893435aa41160dd1255c43cb8498279738ccChris Craik
549cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec = dir(spec)
550cef7893435aa41160dd1255c43cb8498279738ccChris Craik
551cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__ = self.__dict__
552cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_spec_class'] = _spec_class
553cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_spec_set'] = spec_set
554cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __dict__['_mock_methods'] = spec
555cef7893435aa41160dd1255c43cb8498279738ccChris Craik
556cef7893435aa41160dd1255c43cb8498279738ccChris Craik
557cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __get_return_value(self):
558cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ret = self._mock_return_value
559cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self._mock_delegate is not None:
560cef7893435aa41160dd1255c43cb8498279738ccChris Craik            ret = self._mock_delegate.return_value
561cef7893435aa41160dd1255c43cb8498279738ccChris Craik
562cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if ret is DEFAULT:
563cef7893435aa41160dd1255c43cb8498279738ccChris Craik            ret = self._get_child_mock(
564cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _new_parent=self, _new_name='()'
565cef7893435aa41160dd1255c43cb8498279738ccChris Craik            )
566cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self.return_value = ret
567cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return ret
568cef7893435aa41160dd1255c43cb8498279738ccChris Craik
569cef7893435aa41160dd1255c43cb8498279738ccChris Craik
570cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __set_return_value(self, value):
571cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self._mock_delegate is not None:
572cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self._mock_delegate.return_value = value
573cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
574cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self._mock_return_value = value
575cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _check_and_set_parent(self, value, None, '()')
576cef7893435aa41160dd1255c43cb8498279738ccChris Craik
577cef7893435aa41160dd1255c43cb8498279738ccChris Craik    __return_value_doc = "The value to be returned when the mock is called."
578cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return_value = property(__get_return_value, __set_return_value,
579cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            __return_value_doc)
580cef7893435aa41160dd1255c43cb8498279738ccChris Craik
581cef7893435aa41160dd1255c43cb8498279738ccChris Craik
582cef7893435aa41160dd1255c43cb8498279738ccChris Craik    @property
583cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __class__(self):
584cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self._spec_class is None:
585cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return type(self)
586cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self._spec_class
587cef7893435aa41160dd1255c43cb8498279738ccChris Craik
588cef7893435aa41160dd1255c43cb8498279738ccChris Craik    called = _delegating_property('called')
589cef7893435aa41160dd1255c43cb8498279738ccChris Craik    call_count = _delegating_property('call_count')
590cef7893435aa41160dd1255c43cb8498279738ccChris Craik    call_args = _delegating_property('call_args')
591cef7893435aa41160dd1255c43cb8498279738ccChris Craik    call_args_list = _delegating_property('call_args_list')
592cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mock_calls = _delegating_property('mock_calls')
593cef7893435aa41160dd1255c43cb8498279738ccChris Craik
594cef7893435aa41160dd1255c43cb8498279738ccChris Craik
595cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __get_side_effect(self):
596cef7893435aa41160dd1255c43cb8498279738ccChris Craik        sig = self._mock_delegate
597cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if sig is None:
598cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return self._mock_side_effect
599cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return sig.side_effect
600cef7893435aa41160dd1255c43cb8498279738ccChris Craik
601cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __set_side_effect(self, value):
602cef7893435aa41160dd1255c43cb8498279738ccChris Craik        value = _try_iter(value)
603cef7893435aa41160dd1255c43cb8498279738ccChris Craik        sig = self._mock_delegate
604cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if sig is None:
605cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self._mock_side_effect = value
606cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
607cef7893435aa41160dd1255c43cb8498279738ccChris Craik            sig.side_effect = value
608cef7893435aa41160dd1255c43cb8498279738ccChris Craik
609cef7893435aa41160dd1255c43cb8498279738ccChris Craik    side_effect = property(__get_side_effect, __set_side_effect)
610cef7893435aa41160dd1255c43cb8498279738ccChris Craik
611cef7893435aa41160dd1255c43cb8498279738ccChris Craik
612cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def reset_mock(self):
613cef7893435aa41160dd1255c43cb8498279738ccChris Craik        "Restore the mock object to its initial state."
614cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.called = False
615cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.call_args = None
616cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.call_count = 0
617cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.mock_calls = _CallList()
618cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.call_args_list = _CallList()
619cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.method_calls = _CallList()
620cef7893435aa41160dd1255c43cb8498279738ccChris Craik
621cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for child in self._mock_children.values():
622cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if isinstance(child, _SpecState):
623cef7893435aa41160dd1255c43cb8498279738ccChris Craik                continue
624cef7893435aa41160dd1255c43cb8498279738ccChris Craik            child.reset_mock()
625cef7893435aa41160dd1255c43cb8498279738ccChris Craik
626cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ret = self._mock_return_value
627cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if _is_instance_mock(ret) and ret is not self:
628cef7893435aa41160dd1255c43cb8498279738ccChris Craik            ret.reset_mock()
629cef7893435aa41160dd1255c43cb8498279738ccChris Craik
630cef7893435aa41160dd1255c43cb8498279738ccChris Craik
631cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def configure_mock(self, **kwargs):
632cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Set attributes on the mock through keyword arguments.
633cef7893435aa41160dd1255c43cb8498279738ccChris Craik
634cef7893435aa41160dd1255c43cb8498279738ccChris Craik        Attributes plus return values and side effects can be set on child
635cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mocks using standard dot notation and unpacking a dictionary in the
636cef7893435aa41160dd1255c43cb8498279738ccChris Craik        method call:
637cef7893435aa41160dd1255c43cb8498279738ccChris Craik
638cef7893435aa41160dd1255c43cb8498279738ccChris Craik        >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
639cef7893435aa41160dd1255c43cb8498279738ccChris Craik        >>> mock.configure_mock(**attrs)"""
640cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for arg, val in sorted(kwargs.items(),
641cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               # we sort on the number of dots so that
642cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               # attributes are set before we set attributes on
643cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               # attributes
644cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               key=lambda entry: entry[0].count('.')):
645cef7893435aa41160dd1255c43cb8498279738ccChris Craik            args = arg.split('.')
646cef7893435aa41160dd1255c43cb8498279738ccChris Craik            final = args.pop()
647cef7893435aa41160dd1255c43cb8498279738ccChris Craik            obj = self
648cef7893435aa41160dd1255c43cb8498279738ccChris Craik            for entry in args:
649cef7893435aa41160dd1255c43cb8498279738ccChris Craik                obj = getattr(obj, entry)
650cef7893435aa41160dd1255c43cb8498279738ccChris Craik            setattr(obj, final, val)
651cef7893435aa41160dd1255c43cb8498279738ccChris Craik
652cef7893435aa41160dd1255c43cb8498279738ccChris Craik
653cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __getattr__(self, name):
654cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if name == '_mock_methods':
655cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AttributeError(name)
656cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif self._mock_methods is not None:
657cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if name not in self._mock_methods or name in _all_magics:
658cef7893435aa41160dd1255c43cb8498279738ccChris Craik                raise AttributeError("Mock object has no attribute %r" % name)
659cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif _is_magic(name):
660cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AttributeError(name)
661cef7893435aa41160dd1255c43cb8498279738ccChris Craik
662cef7893435aa41160dd1255c43cb8498279738ccChris Craik        result = self._mock_children.get(name)
663cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if result is _deleted:
664cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AttributeError(name)
665cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif result is None:
666cef7893435aa41160dd1255c43cb8498279738ccChris Craik            wraps = None
667cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if self._mock_wraps is not None:
668cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # XXXX should we get the attribute without triggering code
669cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # execution?
670cef7893435aa41160dd1255c43cb8498279738ccChris Craik                wraps = getattr(self._mock_wraps, name)
671cef7893435aa41160dd1255c43cb8498279738ccChris Craik
672cef7893435aa41160dd1255c43cb8498279738ccChris Craik            result = self._get_child_mock(
673cef7893435aa41160dd1255c43cb8498279738ccChris Craik                parent=self, name=name, wraps=wraps, _new_name=name,
674cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _new_parent=self
675cef7893435aa41160dd1255c43cb8498279738ccChris Craik            )
676cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self._mock_children[name]  = result
677cef7893435aa41160dd1255c43cb8498279738ccChris Craik
678cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif isinstance(result, _SpecState):
679cef7893435aa41160dd1255c43cb8498279738ccChris Craik            result = create_autospec(
680cef7893435aa41160dd1255c43cb8498279738ccChris Craik                result.spec, result.spec_set, result.instance,
681cef7893435aa41160dd1255c43cb8498279738ccChris Craik                result.parent, result.name
682cef7893435aa41160dd1255c43cb8498279738ccChris Craik            )
683cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self._mock_children[name]  = result
684cef7893435aa41160dd1255c43cb8498279738ccChris Craik
685cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return result
686cef7893435aa41160dd1255c43cb8498279738ccChris Craik
687cef7893435aa41160dd1255c43cb8498279738ccChris Craik
688cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __repr__(self):
689cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _name_list = [self._mock_new_name]
690cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _parent = self._mock_new_parent
691cef7893435aa41160dd1255c43cb8498279738ccChris Craik        last = self
692cef7893435aa41160dd1255c43cb8498279738ccChris Craik
693cef7893435aa41160dd1255c43cb8498279738ccChris Craik        dot = '.'
694cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if _name_list == ['()']:
695cef7893435aa41160dd1255c43cb8498279738ccChris Craik            dot = ''
696cef7893435aa41160dd1255c43cb8498279738ccChris Craik        seen = set()
697cef7893435aa41160dd1255c43cb8498279738ccChris Craik        while _parent is not None:
698cef7893435aa41160dd1255c43cb8498279738ccChris Craik            last = _parent
699cef7893435aa41160dd1255c43cb8498279738ccChris Craik
700cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _name_list.append(_parent._mock_new_name + dot)
701cef7893435aa41160dd1255c43cb8498279738ccChris Craik            dot = '.'
702cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if _parent._mock_new_name == '()':
703cef7893435aa41160dd1255c43cb8498279738ccChris Craik                dot = ''
704cef7893435aa41160dd1255c43cb8498279738ccChris Craik
705cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _parent = _parent._mock_new_parent
706cef7893435aa41160dd1255c43cb8498279738ccChris Craik
707cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # use ids here so as not to call __hash__ on the mocks
708cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if id(_parent) in seen:
709cef7893435aa41160dd1255c43cb8498279738ccChris Craik                break
710cef7893435aa41160dd1255c43cb8498279738ccChris Craik            seen.add(id(_parent))
711cef7893435aa41160dd1255c43cb8498279738ccChris Craik
712cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _name_list = list(reversed(_name_list))
713cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _first = last._mock_name or 'mock'
714cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if len(_name_list) > 1:
715cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if _name_list[1] not in ('()', '().'):
716cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _first += '.'
717cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _name_list[0] = _first
718cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name = ''.join(_name_list)
719cef7893435aa41160dd1255c43cb8498279738ccChris Craik
720cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name_string = ''
721cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if name not in ('mock', 'mock.'):
722cef7893435aa41160dd1255c43cb8498279738ccChris Craik            name_string = ' name=%r' % name
723cef7893435aa41160dd1255c43cb8498279738ccChris Craik
724cef7893435aa41160dd1255c43cb8498279738ccChris Craik        spec_string = ''
725cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self._spec_class is not None:
726cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec_string = ' spec=%r'
727cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if self._spec_set:
728cef7893435aa41160dd1255c43cb8498279738ccChris Craik                spec_string = ' spec_set=%r'
729cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec_string = spec_string % self._spec_class.__name__
730cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return "<%s%s%s id='%s'>" % (
731cef7893435aa41160dd1255c43cb8498279738ccChris Craik            type(self).__name__,
732cef7893435aa41160dd1255c43cb8498279738ccChris Craik            name_string,
733cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec_string,
734cef7893435aa41160dd1255c43cb8498279738ccChris Craik            id(self)
735cef7893435aa41160dd1255c43cb8498279738ccChris Craik        )
736cef7893435aa41160dd1255c43cb8498279738ccChris Craik
737cef7893435aa41160dd1255c43cb8498279738ccChris Craik
738cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __dir__(self):
739cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Filter the output of `dir(mock)` to only useful members.
740cef7893435aa41160dd1255c43cb8498279738ccChris Craik        XXXX
741cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """
742cef7893435aa41160dd1255c43cb8498279738ccChris Craik        extras = self._mock_methods or []
743cef7893435aa41160dd1255c43cb8498279738ccChris Craik        from_type = dir(type(self))
744cef7893435aa41160dd1255c43cb8498279738ccChris Craik        from_dict = list(self.__dict__)
745cef7893435aa41160dd1255c43cb8498279738ccChris Craik
746cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if FILTER_DIR:
747cef7893435aa41160dd1255c43cb8498279738ccChris Craik            from_type = [e for e in from_type if not e.startswith('_')]
748cef7893435aa41160dd1255c43cb8498279738ccChris Craik            from_dict = [e for e in from_dict if not e.startswith('_') or
749cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         _is_magic(e)]
750cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return sorted(set(extras + from_type + from_dict +
751cef7893435aa41160dd1255c43cb8498279738ccChris Craik                          list(self._mock_children)))
752cef7893435aa41160dd1255c43cb8498279738ccChris Craik
753cef7893435aa41160dd1255c43cb8498279738ccChris Craik
754cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __setattr__(self, name, value):
755cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if name in _allowed_names:
756cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # property setters go through here
757cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return object.__setattr__(self, name, value)
758cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif (self._spec_set and self._mock_methods is not None and
759cef7893435aa41160dd1255c43cb8498279738ccChris Craik            name not in self._mock_methods and
760cef7893435aa41160dd1255c43cb8498279738ccChris Craik            name not in self.__dict__):
761cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AttributeError("Mock object has no attribute '%s'" % name)
762cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif name in _unsupported_magics:
763cef7893435aa41160dd1255c43cb8498279738ccChris Craik            msg = 'Attempting to set unsupported magic method %r.' % name
764cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AttributeError(msg)
765cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif name in _all_magics:
766cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if self._mock_methods is not None and name not in self._mock_methods:
767cef7893435aa41160dd1255c43cb8498279738ccChris Craik                raise AttributeError("Mock object has no attribute '%s'" % name)
768cef7893435aa41160dd1255c43cb8498279738ccChris Craik
769cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if not _is_instance_mock(value):
770cef7893435aa41160dd1255c43cb8498279738ccChris Craik                setattr(type(self), name, _get_method(name, value))
771cef7893435aa41160dd1255c43cb8498279738ccChris Craik                original = value
772cef7893435aa41160dd1255c43cb8498279738ccChris Craik                value = lambda *args, **kw: original(self, *args, **kw)
773cef7893435aa41160dd1255c43cb8498279738ccChris Craik            else:
774cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # only set _new_name and not name so that mock_calls is tracked
775cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # but not method calls
776cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _check_and_set_parent(self, value, None, name)
777cef7893435aa41160dd1255c43cb8498279738ccChris Craik                setattr(type(self), name, value)
778cef7893435aa41160dd1255c43cb8498279738ccChris Craik                self._mock_children[name] = value
779cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif name == '__class__':
780cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self._spec_class = value
781cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return
782cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
783cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if _check_and_set_parent(self, value, name, name):
784cef7893435aa41160dd1255c43cb8498279738ccChris Craik                self._mock_children[name] = value
785cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return object.__setattr__(self, name, value)
786cef7893435aa41160dd1255c43cb8498279738ccChris Craik
787cef7893435aa41160dd1255c43cb8498279738ccChris Craik
788cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __delattr__(self, name):
789cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if name in _all_magics and name in type(self).__dict__:
790cef7893435aa41160dd1255c43cb8498279738ccChris Craik            delattr(type(self), name)
791cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if name not in self.__dict__:
792cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # for magic methods that are still MagicProxy objects and
793cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # not set on the instance itself
794cef7893435aa41160dd1255c43cb8498279738ccChris Craik                return
795cef7893435aa41160dd1255c43cb8498279738ccChris Craik
796cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if name in self.__dict__:
797cef7893435aa41160dd1255c43cb8498279738ccChris Craik            object.__delattr__(self, name)
798cef7893435aa41160dd1255c43cb8498279738ccChris Craik
799cef7893435aa41160dd1255c43cb8498279738ccChris Craik        obj = self._mock_children.get(name, _missing)
800cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if obj is _deleted:
801cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AttributeError(name)
802cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if obj is not _missing:
803cef7893435aa41160dd1255c43cb8498279738ccChris Craik            del self._mock_children[name]
804cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._mock_children[name] = _deleted
805cef7893435aa41160dd1255c43cb8498279738ccChris Craik
806cef7893435aa41160dd1255c43cb8498279738ccChris Craik
807cef7893435aa41160dd1255c43cb8498279738ccChris Craik
808cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _format_mock_call_signature(self, args, kwargs):
809cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name = self._mock_name or 'mock'
810cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return _format_call_signature(name, args, kwargs)
811cef7893435aa41160dd1255c43cb8498279738ccChris Craik
812cef7893435aa41160dd1255c43cb8498279738ccChris Craik
813cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _format_mock_failure_message(self, args, kwargs):
814cef7893435aa41160dd1255c43cb8498279738ccChris Craik        message = 'Expected call: %s\nActual call: %s'
815cef7893435aa41160dd1255c43cb8498279738ccChris Craik        expected_string = self._format_mock_call_signature(args, kwargs)
816cef7893435aa41160dd1255c43cb8498279738ccChris Craik        call_args = self.call_args
817cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if len(call_args) == 3:
818cef7893435aa41160dd1255c43cb8498279738ccChris Craik            call_args = call_args[1:]
819cef7893435aa41160dd1255c43cb8498279738ccChris Craik        actual_string = self._format_mock_call_signature(*call_args)
820cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return message % (expected_string, actual_string)
821cef7893435aa41160dd1255c43cb8498279738ccChris Craik
822cef7893435aa41160dd1255c43cb8498279738ccChris Craik
823cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def assert_called_with(_mock_self, *args, **kwargs):
824cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """assert that the mock was called with the specified arguments.
825cef7893435aa41160dd1255c43cb8498279738ccChris Craik
826cef7893435aa41160dd1255c43cb8498279738ccChris Craik        Raises an AssertionError if the args and keyword args passed in are
827cef7893435aa41160dd1255c43cb8498279738ccChris Craik        different to the last call to the mock."""
828cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self = _mock_self
829cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self.call_args is None:
830cef7893435aa41160dd1255c43cb8498279738ccChris Craik            expected = self._format_mock_call_signature(args, kwargs)
831cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AssertionError('Expected call: %s\nNot called' % (expected,))
832cef7893435aa41160dd1255c43cb8498279738ccChris Craik
833cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self.call_args != (args, kwargs):
834cef7893435aa41160dd1255c43cb8498279738ccChris Craik            msg = self._format_mock_failure_message(args, kwargs)
835cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AssertionError(msg)
836cef7893435aa41160dd1255c43cb8498279738ccChris Craik
837cef7893435aa41160dd1255c43cb8498279738ccChris Craik
838cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def assert_called_once_with(_mock_self, *args, **kwargs):
839cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """assert that the mock was called exactly once and with the specified
840cef7893435aa41160dd1255c43cb8498279738ccChris Craik        arguments."""
841cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self = _mock_self
842cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not self.call_count == 1:
843cef7893435aa41160dd1255c43cb8498279738ccChris Craik            msg = ("Expected to be called once. Called %s times." %
844cef7893435aa41160dd1255c43cb8498279738ccChris Craik                   self.call_count)
845cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AssertionError(msg)
846cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self.assert_called_with(*args, **kwargs)
847cef7893435aa41160dd1255c43cb8498279738ccChris Craik
848cef7893435aa41160dd1255c43cb8498279738ccChris Craik
849cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def assert_has_calls(self, calls, any_order=False):
850cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """assert the mock has been called with the specified calls.
851cef7893435aa41160dd1255c43cb8498279738ccChris Craik        The `mock_calls` list is checked for the calls.
852cef7893435aa41160dd1255c43cb8498279738ccChris Craik
853cef7893435aa41160dd1255c43cb8498279738ccChris Craik        If `any_order` is False (the default) then the calls must be
854cef7893435aa41160dd1255c43cb8498279738ccChris Craik        sequential. There can be extra calls before or after the
855cef7893435aa41160dd1255c43cb8498279738ccChris Craik        specified calls.
856cef7893435aa41160dd1255c43cb8498279738ccChris Craik
857cef7893435aa41160dd1255c43cb8498279738ccChris Craik        If `any_order` is True then the calls can be in any order, but
858cef7893435aa41160dd1255c43cb8498279738ccChris Craik        they must all appear in `mock_calls`."""
859cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not any_order:
860cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if calls not in self.mock_calls:
861cef7893435aa41160dd1255c43cb8498279738ccChris Craik                raise AssertionError(
862cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'Calls not found.\nExpected: %r\n'
863cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'Actual: %r' % (calls, self.mock_calls)
864cef7893435aa41160dd1255c43cb8498279738ccChris Craik                )
865cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return
866cef7893435aa41160dd1255c43cb8498279738ccChris Craik
867cef7893435aa41160dd1255c43cb8498279738ccChris Craik        all_calls = list(self.mock_calls)
868cef7893435aa41160dd1255c43cb8498279738ccChris Craik
869cef7893435aa41160dd1255c43cb8498279738ccChris Craik        not_found = []
870cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for kall in calls:
871cef7893435aa41160dd1255c43cb8498279738ccChris Craik            try:
872cef7893435aa41160dd1255c43cb8498279738ccChris Craik                all_calls.remove(kall)
873cef7893435aa41160dd1255c43cb8498279738ccChris Craik            except ValueError:
874cef7893435aa41160dd1255c43cb8498279738ccChris Craik                not_found.append(kall)
875cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not_found:
876cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AssertionError(
877cef7893435aa41160dd1255c43cb8498279738ccChris Craik                '%r not all found in call list' % (tuple(not_found),)
878cef7893435aa41160dd1255c43cb8498279738ccChris Craik            )
879cef7893435aa41160dd1255c43cb8498279738ccChris Craik
880cef7893435aa41160dd1255c43cb8498279738ccChris Craik
881cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def assert_any_call(self, *args, **kwargs):
882cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """assert the mock has been called with the specified arguments.
883cef7893435aa41160dd1255c43cb8498279738ccChris Craik
884cef7893435aa41160dd1255c43cb8498279738ccChris Craik        The assert passes if the mock has *ever* been called, unlike
885cef7893435aa41160dd1255c43cb8498279738ccChris Craik        `assert_called_with` and `assert_called_once_with` that only pass if
886cef7893435aa41160dd1255c43cb8498279738ccChris Craik        the call is the most recent one."""
887cef7893435aa41160dd1255c43cb8498279738ccChris Craik        kall = call(*args, **kwargs)
888cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if kall not in self.call_args_list:
889cef7893435aa41160dd1255c43cb8498279738ccChris Craik            expected_string = self._format_mock_call_signature(args, kwargs)
890cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AssertionError(
891cef7893435aa41160dd1255c43cb8498279738ccChris Craik                '%s call not found' % expected_string
892cef7893435aa41160dd1255c43cb8498279738ccChris Craik            )
893cef7893435aa41160dd1255c43cb8498279738ccChris Craik
894cef7893435aa41160dd1255c43cb8498279738ccChris Craik
895cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _get_child_mock(self, **kw):
896cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Create the child mocks for attributes and return value.
897cef7893435aa41160dd1255c43cb8498279738ccChris Craik        By default child mocks will be the same type as the parent.
898cef7893435aa41160dd1255c43cb8498279738ccChris Craik        Subclasses of Mock may want to override this to customize the way
899cef7893435aa41160dd1255c43cb8498279738ccChris Craik        child mocks are made.
900cef7893435aa41160dd1255c43cb8498279738ccChris Craik
901cef7893435aa41160dd1255c43cb8498279738ccChris Craik        For non-callable mocks the callable variant will be used (rather than
902cef7893435aa41160dd1255c43cb8498279738ccChris Craik        any custom subclass)."""
903cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _type = type(self)
904cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not issubclass(_type, CallableMixin):
905cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if issubclass(_type, NonCallableMagicMock):
906cef7893435aa41160dd1255c43cb8498279738ccChris Craik                klass = MagicMock
907cef7893435aa41160dd1255c43cb8498279738ccChris Craik            elif issubclass(_type, NonCallableMock) :
908cef7893435aa41160dd1255c43cb8498279738ccChris Craik                klass = Mock
909cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
910cef7893435aa41160dd1255c43cb8498279738ccChris Craik            klass = _type.__mro__[1]
911cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return klass(**kw)
912cef7893435aa41160dd1255c43cb8498279738ccChris Craik
913cef7893435aa41160dd1255c43cb8498279738ccChris Craik
914cef7893435aa41160dd1255c43cb8498279738ccChris Craik
915cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _try_iter(obj):
916cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if obj is None:
917cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return obj
918cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if _is_exception(obj):
919cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return obj
920cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if _callable(obj):
921cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return obj
922cef7893435aa41160dd1255c43cb8498279738ccChris Craik    try:
923cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return iter(obj)
924cef7893435aa41160dd1255c43cb8498279738ccChris Craik    except TypeError:
925cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # XXXX backwards compatibility
926cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # but this will blow up on first call - so maybe we should fail early?
927cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return obj
928cef7893435aa41160dd1255c43cb8498279738ccChris Craik
929cef7893435aa41160dd1255c43cb8498279738ccChris Craik
930cef7893435aa41160dd1255c43cb8498279738ccChris Craik
931cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass CallableMixin(Base):
932cef7893435aa41160dd1255c43cb8498279738ccChris Craik
933cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,
934cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 wraps=None, name=None, spec_set=None, parent=None,
935cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 _spec_state=None, _new_name='', _new_parent=None, **kwargs):
936cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.__dict__['_mock_return_value'] = return_value
937cef7893435aa41160dd1255c43cb8498279738ccChris Craik
938cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _super(CallableMixin, self).__init__(
939cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec, wraps, name, spec_set, parent,
940cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _spec_state, _new_name, _new_parent, **kwargs
941cef7893435aa41160dd1255c43cb8498279738ccChris Craik        )
942cef7893435aa41160dd1255c43cb8498279738ccChris Craik
943cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.side_effect = side_effect
944cef7893435aa41160dd1255c43cb8498279738ccChris Craik
945cef7893435aa41160dd1255c43cb8498279738ccChris Craik
946cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _mock_check_sig(self, *args, **kwargs):
947cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # stub method that can be replaced with one with a specific signature
948cef7893435aa41160dd1255c43cb8498279738ccChris Craik        pass
949cef7893435aa41160dd1255c43cb8498279738ccChris Craik
950cef7893435aa41160dd1255c43cb8498279738ccChris Craik
951cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __call__(_mock_self, *args, **kwargs):
952cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # can't use self in-case a function / method we are mocking uses self
953cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # in the signature
954cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _mock_self._mock_check_sig(*args, **kwargs)
955cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return _mock_self._mock_call(*args, **kwargs)
956cef7893435aa41160dd1255c43cb8498279738ccChris Craik
957cef7893435aa41160dd1255c43cb8498279738ccChris Craik
958cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _mock_call(_mock_self, *args, **kwargs):
959cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self = _mock_self
960cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.called = True
961cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.call_count += 1
962cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.call_args = _Call((args, kwargs), two=True)
963cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.call_args_list.append(_Call((args, kwargs), two=True))
964cef7893435aa41160dd1255c43cb8498279738ccChris Craik
965cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _new_name = self._mock_new_name
966cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _new_parent = self._mock_new_parent
967cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.mock_calls.append(_Call(('', args, kwargs)))
968cef7893435aa41160dd1255c43cb8498279738ccChris Craik
969cef7893435aa41160dd1255c43cb8498279738ccChris Craik        seen = set()
970cef7893435aa41160dd1255c43cb8498279738ccChris Craik        skip_next_dot = _new_name == '()'
971cef7893435aa41160dd1255c43cb8498279738ccChris Craik        do_method_calls = self._mock_parent is not None
972cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name = self._mock_name
973cef7893435aa41160dd1255c43cb8498279738ccChris Craik        while _new_parent is not None:
974cef7893435aa41160dd1255c43cb8498279738ccChris Craik            this_mock_call = _Call((_new_name, args, kwargs))
975cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if _new_parent._mock_new_name:
976cef7893435aa41160dd1255c43cb8498279738ccChris Craik                dot = '.'
977cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if skip_next_dot:
978cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    dot = ''
979cef7893435aa41160dd1255c43cb8498279738ccChris Craik
980cef7893435aa41160dd1255c43cb8498279738ccChris Craik                skip_next_dot = False
981cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if _new_parent._mock_new_name == '()':
982cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    skip_next_dot = True
983cef7893435aa41160dd1255c43cb8498279738ccChris Craik
984cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _new_name = _new_parent._mock_new_name + dot + _new_name
985cef7893435aa41160dd1255c43cb8498279738ccChris Craik
986cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if do_method_calls:
987cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if _new_name == name:
988cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    this_method_call = this_mock_call
989cef7893435aa41160dd1255c43cb8498279738ccChris Craik                else:
990cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    this_method_call = _Call((name, args, kwargs))
991cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _new_parent.method_calls.append(this_method_call)
992cef7893435aa41160dd1255c43cb8498279738ccChris Craik
993cef7893435aa41160dd1255c43cb8498279738ccChris Craik                do_method_calls = _new_parent._mock_parent is not None
994cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if do_method_calls:
995cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    name = _new_parent._mock_name + '.' + name
996cef7893435aa41160dd1255c43cb8498279738ccChris Craik
997cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _new_parent.mock_calls.append(this_mock_call)
998cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _new_parent = _new_parent._mock_new_parent
999cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1000cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # use ids here so as not to call __hash__ on the mocks
1001cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _new_parent_id = id(_new_parent)
1002cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if _new_parent_id in seen:
1003cef7893435aa41160dd1255c43cb8498279738ccChris Craik                break
1004cef7893435aa41160dd1255c43cb8498279738ccChris Craik            seen.add(_new_parent_id)
1005cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1006cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ret_val = DEFAULT
1007cef7893435aa41160dd1255c43cb8498279738ccChris Craik        effect = self.side_effect
1008cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if effect is not None:
1009cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if _is_exception(effect):
1010cef7893435aa41160dd1255c43cb8498279738ccChris Craik                raise effect
1011cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1012cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if not _callable(effect):
1013cef7893435aa41160dd1255c43cb8498279738ccChris Craik                result = next(effect)
1014cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if _is_exception(result):
1015cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    raise result
1016cef7893435aa41160dd1255c43cb8498279738ccChris Craik                return result
1017cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1018cef7893435aa41160dd1255c43cb8498279738ccChris Craik            ret_val = effect(*args, **kwargs)
1019cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if ret_val is DEFAULT:
1020cef7893435aa41160dd1255c43cb8498279738ccChris Craik                ret_val = self.return_value
1021cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1022cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if (self._mock_wraps is not None and
1023cef7893435aa41160dd1255c43cb8498279738ccChris Craik             self._mock_return_value is DEFAULT):
1024cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return self._mock_wraps(*args, **kwargs)
1025cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if ret_val is DEFAULT:
1026cef7893435aa41160dd1255c43cb8498279738ccChris Craik            ret_val = self.return_value
1027cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return ret_val
1028cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1029cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1030cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1031cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass Mock(CallableMixin, NonCallableMock):
1032cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1033cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Create a new `Mock` object. `Mock` takes several optional arguments
1034cef7893435aa41160dd1255c43cb8498279738ccChris Craik    that specify the behaviour of the Mock object:
1035cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1036cef7893435aa41160dd1255c43cb8498279738ccChris Craik    * `spec`: This can be either a list of strings or an existing object (a
1037cef7893435aa41160dd1255c43cb8498279738ccChris Craik      class or instance) that acts as the specification for the mock object. If
1038cef7893435aa41160dd1255c43cb8498279738ccChris Craik      you pass in an object then a list of strings is formed by calling dir on
1039cef7893435aa41160dd1255c43cb8498279738ccChris Craik      the object (excluding unsupported magic attributes and methods). Accessing
1040cef7893435aa41160dd1255c43cb8498279738ccChris Craik      any attribute not in this list will raise an `AttributeError`.
1041cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1042cef7893435aa41160dd1255c43cb8498279738ccChris Craik      If `spec` is an object (rather than a list of strings) then
1043cef7893435aa41160dd1255c43cb8498279738ccChris Craik      `mock.__class__` returns the class of the spec object. This allows mocks
1044cef7893435aa41160dd1255c43cb8498279738ccChris Craik      to pass `isinstance` tests.
1045cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1046cef7893435aa41160dd1255c43cb8498279738ccChris Craik    * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
1047cef7893435aa41160dd1255c43cb8498279738ccChris Craik      or get an attribute on the mock that isn't on the object passed as
1048cef7893435aa41160dd1255c43cb8498279738ccChris Craik      `spec_set` will raise an `AttributeError`.
1049cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1050cef7893435aa41160dd1255c43cb8498279738ccChris Craik    * `side_effect`: A function to be called whenever the Mock is called. See
1051cef7893435aa41160dd1255c43cb8498279738ccChris Craik      the `side_effect` attribute. Useful for raising exceptions or
1052cef7893435aa41160dd1255c43cb8498279738ccChris Craik      dynamically changing return values. The function is called with the same
1053cef7893435aa41160dd1255c43cb8498279738ccChris Craik      arguments as the mock, and unless it returns `DEFAULT`, the return
1054cef7893435aa41160dd1255c43cb8498279738ccChris Craik      value of this function is used as the return value.
1055cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1056cef7893435aa41160dd1255c43cb8498279738ccChris Craik      Alternatively `side_effect` can be an exception class or instance. In
1057cef7893435aa41160dd1255c43cb8498279738ccChris Craik      this case the exception will be raised when the mock is called.
1058cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1059cef7893435aa41160dd1255c43cb8498279738ccChris Craik      If `side_effect` is an iterable then each call to the mock will return
1060cef7893435aa41160dd1255c43cb8498279738ccChris Craik      the next value from the iterable. If any of the members of the iterable
1061cef7893435aa41160dd1255c43cb8498279738ccChris Craik      are exceptions they will be raised instead of returned.
1062cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1063cef7893435aa41160dd1255c43cb8498279738ccChris Craik    * `return_value`: The value returned when the mock is called. By default
1064cef7893435aa41160dd1255c43cb8498279738ccChris Craik      this is a new Mock (created on first access). See the
1065cef7893435aa41160dd1255c43cb8498279738ccChris Craik      `return_value` attribute.
1066cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1067cef7893435aa41160dd1255c43cb8498279738ccChris Craik    * `wraps`: Item for the mock object to wrap. If `wraps` is not None then
1068cef7893435aa41160dd1255c43cb8498279738ccChris Craik      calling the Mock will pass the call through to the wrapped object
1069cef7893435aa41160dd1255c43cb8498279738ccChris Craik      (returning the real result). Attribute access on the mock will return a
1070cef7893435aa41160dd1255c43cb8498279738ccChris Craik      Mock object that wraps the corresponding attribute of the wrapped object
1071cef7893435aa41160dd1255c43cb8498279738ccChris Craik      (so attempting to access an attribute that doesn't exist will raise an
1072cef7893435aa41160dd1255c43cb8498279738ccChris Craik      `AttributeError`).
1073cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1074cef7893435aa41160dd1255c43cb8498279738ccChris Craik      If the mock has an explicit `return_value` set then calls are not passed
1075cef7893435aa41160dd1255c43cb8498279738ccChris Craik      to the wrapped object and the `return_value` is returned instead.
1076cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1077cef7893435aa41160dd1255c43cb8498279738ccChris Craik    * `name`: If the mock has a name then it will be used in the repr of the
1078cef7893435aa41160dd1255c43cb8498279738ccChris Craik      mock. This can be useful for debugging. The name is propagated to child
1079cef7893435aa41160dd1255c43cb8498279738ccChris Craik      mocks.
1080cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1081cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Mocks can also be called with arbitrary keyword arguments. These will be
1082cef7893435aa41160dd1255c43cb8498279738ccChris Craik    used to set attributes on the mock after it is created.
1083cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1084cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1085cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1086cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1087cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _dot_lookup(thing, comp, import_path):
1088cef7893435aa41160dd1255c43cb8498279738ccChris Craik    try:
1089cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return getattr(thing, comp)
1090cef7893435aa41160dd1255c43cb8498279738ccChris Craik    except AttributeError:
1091cef7893435aa41160dd1255c43cb8498279738ccChris Craik        __import__(import_path)
1092cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return getattr(thing, comp)
1093cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1094cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1095cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _importer(target):
1096cef7893435aa41160dd1255c43cb8498279738ccChris Craik    components = target.split('.')
1097cef7893435aa41160dd1255c43cb8498279738ccChris Craik    import_path = components.pop(0)
1098cef7893435aa41160dd1255c43cb8498279738ccChris Craik    thing = __import__(import_path)
1099cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1100cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for comp in components:
1101cef7893435aa41160dd1255c43cb8498279738ccChris Craik        import_path += ".%s" % comp
1102cef7893435aa41160dd1255c43cb8498279738ccChris Craik        thing = _dot_lookup(thing, comp, import_path)
1103cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return thing
1104cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1105cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1106cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _is_started(patcher):
1107cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # XXXX horrible
1108cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return hasattr(patcher, 'is_local')
1109cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1110cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1111cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _patch(object):
1112cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1113cef7893435aa41160dd1255c43cb8498279738ccChris Craik    attribute_name = None
1114cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _active_patches = set()
1115cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1116cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(
1117cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self, getter, attribute, new, spec, create,
1118cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec_set, autospec, new_callable, kwargs
1119cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ):
1120cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if new_callable is not None:
1121cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if new is not DEFAULT:
1122cef7893435aa41160dd1255c43cb8498279738ccChris Craik                raise ValueError(
1123cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    "Cannot use 'new' and 'new_callable' together"
1124cef7893435aa41160dd1255c43cb8498279738ccChris Craik                )
1125cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if autospec is not None:
1126cef7893435aa41160dd1255c43cb8498279738ccChris Craik                raise ValueError(
1127cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    "Cannot use 'autospec' and 'new_callable' together"
1128cef7893435aa41160dd1255c43cb8498279738ccChris Craik                )
1129cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1130cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.getter = getter
1131cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.attribute = attribute
1132cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.new = new
1133cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.new_callable = new_callable
1134cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.spec = spec
1135cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.create = create
1136cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.has_local = False
1137cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.spec_set = spec_set
1138cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.autospec = autospec
1139cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.kwargs = kwargs
1140cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.additional_patchers = []
1141cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1142cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1143cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def copy(self):
1144cef7893435aa41160dd1255c43cb8498279738ccChris Craik        patcher = _patch(
1145cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self.getter, self.attribute, self.new, self.spec,
1146cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self.create, self.spec_set,
1147cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self.autospec, self.new_callable, self.kwargs
1148cef7893435aa41160dd1255c43cb8498279738ccChris Craik        )
1149cef7893435aa41160dd1255c43cb8498279738ccChris Craik        patcher.attribute_name = self.attribute_name
1150cef7893435aa41160dd1255c43cb8498279738ccChris Craik        patcher.additional_patchers = [
1151cef7893435aa41160dd1255c43cb8498279738ccChris Craik            p.copy() for p in self.additional_patchers
1152cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ]
1153cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return patcher
1154cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1155cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1156cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __call__(self, func):
1157cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if isinstance(func, ClassTypes):
1158cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return self.decorate_class(func)
1159cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self.decorate_callable(func)
1160cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1161cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1162cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def decorate_class(self, klass):
1163cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for attr in dir(klass):
1164cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if not attr.startswith(patch.TEST_PREFIX):
1165cef7893435aa41160dd1255c43cb8498279738ccChris Craik                continue
1166cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1167cef7893435aa41160dd1255c43cb8498279738ccChris Craik            attr_value = getattr(klass, attr)
1168cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if not hasattr(attr_value, "__call__"):
1169cef7893435aa41160dd1255c43cb8498279738ccChris Craik                continue
1170cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1171cef7893435aa41160dd1255c43cb8498279738ccChris Craik            patcher = self.copy()
1172cef7893435aa41160dd1255c43cb8498279738ccChris Craik            setattr(klass, attr, patcher(attr_value))
1173cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return klass
1174cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1175cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1176cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def decorate_callable(self, func):
1177cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if hasattr(func, 'patchings'):
1178cef7893435aa41160dd1255c43cb8498279738ccChris Craik            func.patchings.append(self)
1179cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return func
1180cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1181cef7893435aa41160dd1255c43cb8498279738ccChris Craik        @wraps(func)
1182cef7893435aa41160dd1255c43cb8498279738ccChris Craik        def patched(*args, **keywargs):
1183cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # don't use a with here (backwards compatability with Python 2.4)
1184cef7893435aa41160dd1255c43cb8498279738ccChris Craik            extra_args = []
1185cef7893435aa41160dd1255c43cb8498279738ccChris Craik            entered_patchers = []
1186cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1187cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # can't use try...except...finally because of Python 2.4
1188cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # compatibility
1189cef7893435aa41160dd1255c43cb8498279738ccChris Craik            exc_info = tuple()
1190cef7893435aa41160dd1255c43cb8498279738ccChris Craik            try:
1191cef7893435aa41160dd1255c43cb8498279738ccChris Craik                try:
1192cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    for patching in patched.patchings:
1193cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        arg = patching.__enter__()
1194cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        entered_patchers.append(patching)
1195cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        if patching.attribute_name is not None:
1196cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            keywargs.update(arg)
1197cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        elif patching.new is DEFAULT:
1198cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            extra_args.append(arg)
1199cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1200cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    args += tuple(extra_args)
1201cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    return func(*args, **keywargs)
1202cef7893435aa41160dd1255c43cb8498279738ccChris Craik                except:
1203cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    if (patching not in entered_patchers and
1204cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        _is_started(patching)):
1205cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        # the patcher may have been started, but an exception
1206cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        # raised whilst entering one of its additional_patchers
1207cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        entered_patchers.append(patching)
1208cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    # Pass the exception to __exit__
1209cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    exc_info = sys.exc_info()
1210cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    # re-raise the exception
1211cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    raise
1212cef7893435aa41160dd1255c43cb8498279738ccChris Craik            finally:
1213cef7893435aa41160dd1255c43cb8498279738ccChris Craik                for patching in reversed(entered_patchers):
1214cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    patching.__exit__(*exc_info)
1215cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1216cef7893435aa41160dd1255c43cb8498279738ccChris Craik        patched.patchings = [self]
1217cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if hasattr(func, 'func_code'):
1218cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # not in Python 3
1219cef7893435aa41160dd1255c43cb8498279738ccChris Craik            patched.compat_co_firstlineno = getattr(
1220cef7893435aa41160dd1255c43cb8498279738ccChris Craik                func, "compat_co_firstlineno",
1221cef7893435aa41160dd1255c43cb8498279738ccChris Craik                func.func_code.co_firstlineno
1222cef7893435aa41160dd1255c43cb8498279738ccChris Craik            )
1223cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return patched
1224cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1225cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1226cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def get_original(self):
1227cef7893435aa41160dd1255c43cb8498279738ccChris Craik        target = self.getter()
1228cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name = self.attribute
1229cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1230cef7893435aa41160dd1255c43cb8498279738ccChris Craik        original = DEFAULT
1231cef7893435aa41160dd1255c43cb8498279738ccChris Craik        local = False
1232cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1233cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
1234cef7893435aa41160dd1255c43cb8498279738ccChris Craik            original = target.__dict__[name]
1235cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except (AttributeError, KeyError):
1236cef7893435aa41160dd1255c43cb8498279738ccChris Craik            original = getattr(target, name, DEFAULT)
1237cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
1238cef7893435aa41160dd1255c43cb8498279738ccChris Craik            local = True
1239cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1240cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not self.create and original is DEFAULT:
1241cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise AttributeError(
1242cef7893435aa41160dd1255c43cb8498279738ccChris Craik                "%s does not have the attribute %r" % (target, name)
1243cef7893435aa41160dd1255c43cb8498279738ccChris Craik            )
1244cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return original, local
1245cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1246cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1247cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __enter__(self):
1248cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Perform the patch."""
1249cef7893435aa41160dd1255c43cb8498279738ccChris Craik        new, spec, spec_set = self.new, self.spec, self.spec_set
1250cef7893435aa41160dd1255c43cb8498279738ccChris Craik        autospec, kwargs = self.autospec, self.kwargs
1251cef7893435aa41160dd1255c43cb8498279738ccChris Craik        new_callable = self.new_callable
1252cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.target = self.getter()
1253cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1254cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # normalise False to None
1255cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if spec is False:
1256cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec = None
1257cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if spec_set is False:
1258cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec_set = None
1259cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if autospec is False:
1260cef7893435aa41160dd1255c43cb8498279738ccChris Craik            autospec = None
1261cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1262cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if spec is not None and autospec is not None:
1263cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise TypeError("Can't specify spec and autospec")
1264cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if ((spec is not None or autospec is not None) and
1265cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec_set not in (True, None)):
1266cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise TypeError("Can't provide explicit spec_set *and* spec or autospec")
1267cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1268cef7893435aa41160dd1255c43cb8498279738ccChris Craik        original, local = self.get_original()
1269cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1270cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if new is DEFAULT and autospec is None:
1271cef7893435aa41160dd1255c43cb8498279738ccChris Craik            inherit = False
1272cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if spec is True:
1273cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # set spec to the object we are replacing
1274cef7893435aa41160dd1255c43cb8498279738ccChris Craik                spec = original
1275cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if spec_set is True:
1276cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    spec_set = original
1277cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    spec = None
1278cef7893435aa41160dd1255c43cb8498279738ccChris Craik            elif spec is not None:
1279cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if spec_set is True:
1280cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    spec_set = spec
1281cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    spec = None
1282cef7893435aa41160dd1255c43cb8498279738ccChris Craik            elif spec_set is True:
1283cef7893435aa41160dd1255c43cb8498279738ccChris Craik                spec_set = original
1284cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1285cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if spec is not None or spec_set is not None:
1286cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if original is DEFAULT:
1287cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    raise TypeError("Can't use 'spec' with create=True")
1288cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if isinstance(original, ClassTypes):
1289cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    # If we're patching out a class and there is a spec
1290cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    inherit = True
1291cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1292cef7893435aa41160dd1255c43cb8498279738ccChris Craik            Klass = MagicMock
1293cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _kwargs = {}
1294cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if new_callable is not None:
1295cef7893435aa41160dd1255c43cb8498279738ccChris Craik                Klass = new_callable
1296cef7893435aa41160dd1255c43cb8498279738ccChris Craik            elif spec is not None or spec_set is not None:
1297cef7893435aa41160dd1255c43cb8498279738ccChris Craik                this_spec = spec
1298cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if spec_set is not None:
1299cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    this_spec = spec_set
1300cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if _is_list(this_spec):
1301cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    not_callable = '__call__' not in this_spec
1302cef7893435aa41160dd1255c43cb8498279738ccChris Craik                else:
1303cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    not_callable = not _callable(this_spec)
1304cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if not_callable:
1305cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    Klass = NonCallableMagicMock
1306cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1307cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if spec is not None:
1308cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _kwargs['spec'] = spec
1309cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if spec_set is not None:
1310cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _kwargs['spec_set'] = spec_set
1311cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1312cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # add a name to mocks
1313cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if (isinstance(Klass, type) and
1314cef7893435aa41160dd1255c43cb8498279738ccChris Craik                issubclass(Klass, NonCallableMock) and self.attribute):
1315cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _kwargs['name'] = self.attribute
1316cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1317cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _kwargs.update(kwargs)
1318cef7893435aa41160dd1255c43cb8498279738ccChris Craik            new = Klass(**_kwargs)
1319cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1320cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if inherit and _is_instance_mock(new):
1321cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # we can only tell if the instance should be callable if the
1322cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # spec is not a list
1323cef7893435aa41160dd1255c43cb8498279738ccChris Craik                this_spec = spec
1324cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if spec_set is not None:
1325cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    this_spec = spec_set
1326cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if (not _is_list(this_spec) and not
1327cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    _instance_callable(this_spec)):
1328cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    Klass = NonCallableMagicMock
1329cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1330cef7893435aa41160dd1255c43cb8498279738ccChris Craik                _kwargs.pop('name')
1331cef7893435aa41160dd1255c43cb8498279738ccChris Craik                new.return_value = Klass(_new_parent=new, _new_name='()',
1332cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         **_kwargs)
1333cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif autospec is not None:
1334cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # spec is ignored, new *must* be default, spec_set is treated
1335cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # as a boolean. Should we check spec is not None and that spec_set
1336cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # is a bool?
1337cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if new is not DEFAULT:
1338cef7893435aa41160dd1255c43cb8498279738ccChris Craik                raise TypeError(
1339cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    "autospec creates the mock for you. Can't specify "
1340cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    "autospec and new."
1341cef7893435aa41160dd1255c43cb8498279738ccChris Craik                )
1342cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if original is DEFAULT:
1343cef7893435aa41160dd1255c43cb8498279738ccChris Craik                raise TypeError("Can't use 'autospec' with create=True")
1344cef7893435aa41160dd1255c43cb8498279738ccChris Craik            spec_set = bool(spec_set)
1345cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if autospec is True:
1346cef7893435aa41160dd1255c43cb8498279738ccChris Craik                autospec = original
1347cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1348cef7893435aa41160dd1255c43cb8498279738ccChris Craik            new = create_autospec(autospec, spec_set=spec_set,
1349cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                  _name=self.attribute, **kwargs)
1350cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif kwargs:
1351cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # can't set keyword args when we aren't creating the mock
1352cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # XXXX If new is a Mock we could call new.configure_mock(**kwargs)
1353cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise TypeError("Can't pass kwargs to a mock we aren't creating")
1354cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1355cef7893435aa41160dd1255c43cb8498279738ccChris Craik        new_attr = new
1356cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1357cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.temp_original = original
1358cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.is_local = local
1359cef7893435aa41160dd1255c43cb8498279738ccChris Craik        setattr(self.target, self.attribute, new_attr)
1360cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self.attribute_name is not None:
1361cef7893435aa41160dd1255c43cb8498279738ccChris Craik            extra_args = {}
1362cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if self.new is DEFAULT:
1363cef7893435aa41160dd1255c43cb8498279738ccChris Craik                extra_args[self.attribute_name] =  new
1364cef7893435aa41160dd1255c43cb8498279738ccChris Craik            for patching in self.additional_patchers:
1365cef7893435aa41160dd1255c43cb8498279738ccChris Craik                arg = patching.__enter__()
1366cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if patching.new is DEFAULT:
1367cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    extra_args.update(arg)
1368cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return extra_args
1369cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1370cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return new
1371cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1372cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1373cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __exit__(self, *exc_info):
1374cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Undo the patch."""
1375cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not _is_started(self):
1376cef7893435aa41160dd1255c43cb8498279738ccChris Craik            raise RuntimeError('stop called on unstarted patcher')
1377cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1378cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self.is_local and self.temp_original is not DEFAULT:
1379cef7893435aa41160dd1255c43cb8498279738ccChris Craik            setattr(self.target, self.attribute, self.temp_original)
1380cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
1381cef7893435aa41160dd1255c43cb8498279738ccChris Craik            delattr(self.target, self.attribute)
1382cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if not self.create and not hasattr(self.target, self.attribute):
1383cef7893435aa41160dd1255c43cb8498279738ccChris Craik                # needed for proxy objects like django settings
1384cef7893435aa41160dd1255c43cb8498279738ccChris Craik                setattr(self.target, self.attribute, self.temp_original)
1385cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1386cef7893435aa41160dd1255c43cb8498279738ccChris Craik        del self.temp_original
1387cef7893435aa41160dd1255c43cb8498279738ccChris Craik        del self.is_local
1388cef7893435aa41160dd1255c43cb8498279738ccChris Craik        del self.target
1389cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for patcher in reversed(self.additional_patchers):
1390cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if _is_started(patcher):
1391cef7893435aa41160dd1255c43cb8498279738ccChris Craik                patcher.__exit__(*exc_info)
1392cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1393cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1394cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def start(self):
1395cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Activate a patch, returning any created mock."""
1396cef7893435aa41160dd1255c43cb8498279738ccChris Craik        result = self.__enter__()
1397cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._active_patches.add(self)
1398cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return result
1399cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1400cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1401cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def stop(self):
1402cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Stop an active patch."""
1403cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._active_patches.discard(self)
1404cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self.__exit__()
1405cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1406cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1407cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1408cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _get_target(target):
1409cef7893435aa41160dd1255c43cb8498279738ccChris Craik    try:
1410cef7893435aa41160dd1255c43cb8498279738ccChris Craik        target, attribute = target.rsplit('.', 1)
1411cef7893435aa41160dd1255c43cb8498279738ccChris Craik    except (TypeError, ValueError):
1412cef7893435aa41160dd1255c43cb8498279738ccChris Craik        raise TypeError("Need a valid target to patch. You supplied: %r" %
1413cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        (target,))
1414cef7893435aa41160dd1255c43cb8498279738ccChris Craik    getter = lambda: _importer(target)
1415cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return getter, attribute
1416cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1417cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1418cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _patch_object(
1419cef7893435aa41160dd1255c43cb8498279738ccChris Craik        target, attribute, new=DEFAULT, spec=None,
1420cef7893435aa41160dd1255c43cb8498279738ccChris Craik        create=False, spec_set=None, autospec=None,
1421cef7893435aa41160dd1255c43cb8498279738ccChris Craik        new_callable=None, **kwargs
1422cef7893435aa41160dd1255c43cb8498279738ccChris Craik    ):
1423cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1424cef7893435aa41160dd1255c43cb8498279738ccChris Craik    patch.object(target, attribute, new=DEFAULT, spec=None, create=False,
1425cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 spec_set=None, autospec=None, new_callable=None, **kwargs)
1426cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1427cef7893435aa41160dd1255c43cb8498279738ccChris Craik    patch the named member (`attribute`) on an object (`target`) with a mock
1428cef7893435aa41160dd1255c43cb8498279738ccChris Craik    object.
1429cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1430cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch.object` can be used as a decorator, class decorator or a context
1431cef7893435aa41160dd1255c43cb8498279738ccChris Craik    manager. Arguments `new`, `spec`, `create`, `spec_set`,
1432cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `autospec` and `new_callable` have the same meaning as for `patch`. Like
1433cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch`, `patch.object` takes arbitrary keyword arguments for configuring
1434cef7893435aa41160dd1255c43cb8498279738ccChris Craik    the mock object it creates.
1435cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1436cef7893435aa41160dd1255c43cb8498279738ccChris Craik    When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
1437cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for choosing which methods to wrap.
1438cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1439cef7893435aa41160dd1255c43cb8498279738ccChris Craik    getter = lambda: target
1440cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return _patch(
1441cef7893435aa41160dd1255c43cb8498279738ccChris Craik        getter, attribute, new, spec, create,
1442cef7893435aa41160dd1255c43cb8498279738ccChris Craik        spec_set, autospec, new_callable, kwargs
1443cef7893435aa41160dd1255c43cb8498279738ccChris Craik    )
1444cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1445cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1446cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _patch_multiple(target, spec=None, create=False, spec_set=None,
1447cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    autospec=None, new_callable=None, **kwargs):
1448cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """Perform multiple patches in a single call. It takes the object to be
1449cef7893435aa41160dd1255c43cb8498279738ccChris Craik    patched (either as an object or a string to fetch the object by importing)
1450cef7893435aa41160dd1255c43cb8498279738ccChris Craik    and keyword arguments for the patches::
1451cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1452cef7893435aa41160dd1255c43cb8498279738ccChris Craik        with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
1453cef7893435aa41160dd1255c43cb8498279738ccChris Craik            ...
1454cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1455cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Use `DEFAULT` as the value if you want `patch.multiple` to create
1456cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mocks for you. In this case the created mocks are passed into a decorated
1457cef7893435aa41160dd1255c43cb8498279738ccChris Craik    function by keyword, and a dictionary is returned when `patch.multiple` is
1458cef7893435aa41160dd1255c43cb8498279738ccChris Craik    used as a context manager.
1459cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1460cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch.multiple` can be used as a decorator, class decorator or a context
1461cef7893435aa41160dd1255c43cb8498279738ccChris Craik    manager. The arguments `spec`, `spec_set`, `create`,
1462cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `autospec` and `new_callable` have the same meaning as for `patch`. These
1463cef7893435aa41160dd1255c43cb8498279738ccChris Craik    arguments will be applied to *all* patches done by `patch.multiple`.
1464cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1465cef7893435aa41160dd1255c43cb8498279738ccChris Craik    When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
1466cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for choosing which methods to wrap.
1467cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1468cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if type(target) in (unicode, str):
1469cef7893435aa41160dd1255c43cb8498279738ccChris Craik        getter = lambda: _importer(target)
1470cef7893435aa41160dd1255c43cb8498279738ccChris Craik    else:
1471cef7893435aa41160dd1255c43cb8498279738ccChris Craik        getter = lambda: target
1472cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1473cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not kwargs:
1474cef7893435aa41160dd1255c43cb8498279738ccChris Craik        raise ValueError(
1475cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'Must supply at least one keyword argument with patch.multiple'
1476cef7893435aa41160dd1255c43cb8498279738ccChris Craik        )
1477cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # need to wrap in a list for python 3, where items is a view
1478cef7893435aa41160dd1255c43cb8498279738ccChris Craik    items = list(kwargs.items())
1479cef7893435aa41160dd1255c43cb8498279738ccChris Craik    attribute, new = items[0]
1480cef7893435aa41160dd1255c43cb8498279738ccChris Craik    patcher = _patch(
1481cef7893435aa41160dd1255c43cb8498279738ccChris Craik        getter, attribute, new, spec, create, spec_set,
1482cef7893435aa41160dd1255c43cb8498279738ccChris Craik        autospec, new_callable, {}
1483cef7893435aa41160dd1255c43cb8498279738ccChris Craik    )
1484cef7893435aa41160dd1255c43cb8498279738ccChris Craik    patcher.attribute_name = attribute
1485cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for attribute, new in items[1:]:
1486cef7893435aa41160dd1255c43cb8498279738ccChris Craik        this_patcher = _patch(
1487cef7893435aa41160dd1255c43cb8498279738ccChris Craik            getter, attribute, new, spec, create, spec_set,
1488cef7893435aa41160dd1255c43cb8498279738ccChris Craik            autospec, new_callable, {}
1489cef7893435aa41160dd1255c43cb8498279738ccChris Craik        )
1490cef7893435aa41160dd1255c43cb8498279738ccChris Craik        this_patcher.attribute_name = attribute
1491cef7893435aa41160dd1255c43cb8498279738ccChris Craik        patcher.additional_patchers.append(this_patcher)
1492cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return patcher
1493cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1494cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1495cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef patch(
1496cef7893435aa41160dd1255c43cb8498279738ccChris Craik        target, new=DEFAULT, spec=None, create=False,
1497cef7893435aa41160dd1255c43cb8498279738ccChris Craik        spec_set=None, autospec=None, new_callable=None, **kwargs
1498cef7893435aa41160dd1255c43cb8498279738ccChris Craik    ):
1499cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1500cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch` acts as a function decorator, class decorator or a context
1501cef7893435aa41160dd1255c43cb8498279738ccChris Craik    manager. Inside the body of the function or with statement, the `target`
1502cef7893435aa41160dd1255c43cb8498279738ccChris Craik    is patched with a `new` object. When the function/with statement exits
1503cef7893435aa41160dd1255c43cb8498279738ccChris Craik    the patch is undone.
1504cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1505cef7893435aa41160dd1255c43cb8498279738ccChris Craik    If `new` is omitted, then the target is replaced with a
1506cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `MagicMock`. If `patch` is used as a decorator and `new` is
1507cef7893435aa41160dd1255c43cb8498279738ccChris Craik    omitted, the created mock is passed in as an extra argument to the
1508cef7893435aa41160dd1255c43cb8498279738ccChris Craik    decorated function. If `patch` is used as a context manager the created
1509cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mock is returned by the context manager.
1510cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1511cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `target` should be a string in the form `'package.module.ClassName'`. The
1512cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `target` is imported and the specified object replaced with the `new`
1513cef7893435aa41160dd1255c43cb8498279738ccChris Craik    object, so the `target` must be importable from the environment you are
1514cef7893435aa41160dd1255c43cb8498279738ccChris Craik    calling `patch` from. The target is imported when the decorated function
1515cef7893435aa41160dd1255c43cb8498279738ccChris Craik    is executed, not at decoration time.
1516cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1517cef7893435aa41160dd1255c43cb8498279738ccChris Craik    The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
1518cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if patch is creating one for you.
1519cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1520cef7893435aa41160dd1255c43cb8498279738ccChris Craik    In addition you can pass `spec=True` or `spec_set=True`, which causes
1521cef7893435aa41160dd1255c43cb8498279738ccChris Craik    patch to pass in the object being mocked as the spec/spec_set object.
1522cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1523cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `new_callable` allows you to specify a different class, or callable object,
1524cef7893435aa41160dd1255c43cb8498279738ccChris Craik    that will be called to create the `new` object. By default `MagicMock` is
1525cef7893435aa41160dd1255c43cb8498279738ccChris Craik    used.
1526cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1527cef7893435aa41160dd1255c43cb8498279738ccChris Craik    A more powerful form of `spec` is `autospec`. If you set `autospec=True`
1528cef7893435aa41160dd1255c43cb8498279738ccChris Craik    then the mock with be created with a spec from the object being replaced.
1529cef7893435aa41160dd1255c43cb8498279738ccChris Craik    All attributes of the mock will also have the spec of the corresponding
1530cef7893435aa41160dd1255c43cb8498279738ccChris Craik    attribute of the object being replaced. Methods and functions being
1531cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mocked will have their arguments checked and will raise a `TypeError` if
1532cef7893435aa41160dd1255c43cb8498279738ccChris Craik    they are called with the wrong signature. For mocks replacing a class,
1533cef7893435aa41160dd1255c43cb8498279738ccChris Craik    their return value (the 'instance') will have the same spec as the class.
1534cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1535cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Instead of `autospec=True` you can pass `autospec=some_object` to use an
1536cef7893435aa41160dd1255c43cb8498279738ccChris Craik    arbitrary object as the spec instead of the one being replaced.
1537cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1538cef7893435aa41160dd1255c43cb8498279738ccChris Craik    By default `patch` will fail to replace attributes that don't exist. If
1539cef7893435aa41160dd1255c43cb8498279738ccChris Craik    you pass in `create=True`, and the attribute doesn't exist, patch will
1540cef7893435aa41160dd1255c43cb8498279738ccChris Craik    create the attribute for you when the patched function is called, and
1541cef7893435aa41160dd1255c43cb8498279738ccChris Craik    delete it again afterwards. This is useful for writing tests against
1542cef7893435aa41160dd1255c43cb8498279738ccChris Craik    attributes that your production code creates at runtime. It is off by by
1543cef7893435aa41160dd1255c43cb8498279738ccChris Craik    default because it can be dangerous. With it switched on you can write
1544cef7893435aa41160dd1255c43cb8498279738ccChris Craik    passing tests against APIs that don't actually exist!
1545cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1546cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Patch can be used as a `TestCase` class decorator. It works by
1547cef7893435aa41160dd1255c43cb8498279738ccChris Craik    decorating each test method in the class. This reduces the boilerplate
1548cef7893435aa41160dd1255c43cb8498279738ccChris Craik    code when your test methods share a common patchings set. `patch` finds
1549cef7893435aa41160dd1255c43cb8498279738ccChris Craik    tests by looking for method names that start with `patch.TEST_PREFIX`.
1550cef7893435aa41160dd1255c43cb8498279738ccChris Craik    By default this is `test`, which matches the way `unittest` finds tests.
1551cef7893435aa41160dd1255c43cb8498279738ccChris Craik    You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
1552cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1553cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Patch can be used as a context manager, with the with statement. Here the
1554cef7893435aa41160dd1255c43cb8498279738ccChris Craik    patching applies to the indented block after the with statement. If you
1555cef7893435aa41160dd1255c43cb8498279738ccChris Craik    use "as" then the patched object will be bound to the name after the
1556cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "as"; very useful if `patch` is creating a mock object for you.
1557cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1558cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch` takes arbitrary keyword arguments. These will be passed to
1559cef7893435aa41160dd1255c43cb8498279738ccChris Craik    the `Mock` (or `new_callable`) on construction.
1560cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1561cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
1562cef7893435aa41160dd1255c43cb8498279738ccChris Craik    available for alternate use-cases.
1563cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1564cef7893435aa41160dd1255c43cb8498279738ccChris Craik    getter, attribute = _get_target(target)
1565cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return _patch(
1566cef7893435aa41160dd1255c43cb8498279738ccChris Craik        getter, attribute, new, spec, create,
1567cef7893435aa41160dd1255c43cb8498279738ccChris Craik        spec_set, autospec, new_callable, kwargs
1568cef7893435aa41160dd1255c43cb8498279738ccChris Craik    )
1569cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1570cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1571cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _patch_dict(object):
1572cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1573cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Patch a dictionary, or dictionary like object, and restore the dictionary
1574cef7893435aa41160dd1255c43cb8498279738ccChris Craik    to its original state after the test.
1575cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1576cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `in_dict` can be a dictionary or a mapping like container. If it is a
1577cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mapping then it must at least support getting, setting and deleting items
1578cef7893435aa41160dd1255c43cb8498279738ccChris Craik    plus iterating over keys.
1579cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1580cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `in_dict` can also be a string specifying the name of the dictionary, which
1581cef7893435aa41160dd1255c43cb8498279738ccChris Craik    will then be fetched by importing it.
1582cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1583cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `values` can be a dictionary of values to set in the dictionary. `values`
1584cef7893435aa41160dd1255c43cb8498279738ccChris Craik    can also be an iterable of `(key, value)` pairs.
1585cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1586cef7893435aa41160dd1255c43cb8498279738ccChris Craik    If `clear` is True then the dictionary will be cleared before the new
1587cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values are set.
1588cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1589cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch.dict` can also be called with arbitrary keyword arguments to set
1590cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values in the dictionary::
1591cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1592cef7893435aa41160dd1255c43cb8498279738ccChris Craik        with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):
1593cef7893435aa41160dd1255c43cb8498279738ccChris Craik            ...
1594cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1595cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch.dict` can be used as a context manager, decorator or class
1596cef7893435aa41160dd1255c43cb8498279738ccChris Craik    decorator. When used as a class decorator `patch.dict` honours
1597cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `patch.TEST_PREFIX` for choosing which methods to wrap.
1598cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1599cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1600cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self, in_dict, values=(), clear=False, **kwargs):
1601cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if isinstance(in_dict, basestring):
1602cef7893435aa41160dd1255c43cb8498279738ccChris Craik            in_dict = _importer(in_dict)
1603cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.in_dict = in_dict
1604cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # support any argument supported by dict(...) constructor
1605cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.values = dict(values)
1606cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.values.update(kwargs)
1607cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.clear = clear
1608cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._original = None
1609cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1610cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1611cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __call__(self, f):
1612cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if isinstance(f, ClassTypes):
1613cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return self.decorate_class(f)
1614cef7893435aa41160dd1255c43cb8498279738ccChris Craik        @wraps(f)
1615cef7893435aa41160dd1255c43cb8498279738ccChris Craik        def _inner(*args, **kw):
1616cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self._patch_dict()
1617cef7893435aa41160dd1255c43cb8498279738ccChris Craik            try:
1618cef7893435aa41160dd1255c43cb8498279738ccChris Craik                return f(*args, **kw)
1619cef7893435aa41160dd1255c43cb8498279738ccChris Craik            finally:
1620cef7893435aa41160dd1255c43cb8498279738ccChris Craik                self._unpatch_dict()
1621cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1622cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return _inner
1623cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1624cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1625cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def decorate_class(self, klass):
1626cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for attr in dir(klass):
1627cef7893435aa41160dd1255c43cb8498279738ccChris Craik            attr_value = getattr(klass, attr)
1628cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if (attr.startswith(patch.TEST_PREFIX) and
1629cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 hasattr(attr_value, "__call__")):
1630cef7893435aa41160dd1255c43cb8498279738ccChris Craik                decorator = _patch_dict(self.in_dict, self.values, self.clear)
1631cef7893435aa41160dd1255c43cb8498279738ccChris Craik                decorated = decorator(attr_value)
1632cef7893435aa41160dd1255c43cb8498279738ccChris Craik                setattr(klass, attr, decorated)
1633cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return klass
1634cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1635cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1636cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __enter__(self):
1637cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Patch the dict."""
1638cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._patch_dict()
1639cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1640cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1641cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _patch_dict(self):
1642cef7893435aa41160dd1255c43cb8498279738ccChris Craik        values = self.values
1643cef7893435aa41160dd1255c43cb8498279738ccChris Craik        in_dict = self.in_dict
1644cef7893435aa41160dd1255c43cb8498279738ccChris Craik        clear = self.clear
1645cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1646cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
1647cef7893435aa41160dd1255c43cb8498279738ccChris Craik            original = in_dict.copy()
1648cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except AttributeError:
1649cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # dict like object with no copy method
1650cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # must support iteration over keys
1651cef7893435aa41160dd1255c43cb8498279738ccChris Craik            original = {}
1652cef7893435aa41160dd1255c43cb8498279738ccChris Craik            for key in in_dict:
1653cef7893435aa41160dd1255c43cb8498279738ccChris Craik                original[key] = in_dict[key]
1654cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._original = original
1655cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1656cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if clear:
1657cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _clear_dict(in_dict)
1658cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1659cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
1660cef7893435aa41160dd1255c43cb8498279738ccChris Craik            in_dict.update(values)
1661cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except AttributeError:
1662cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # dict like object with no update method
1663cef7893435aa41160dd1255c43cb8498279738ccChris Craik            for key in values:
1664cef7893435aa41160dd1255c43cb8498279738ccChris Craik                in_dict[key] = values[key]
1665cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1666cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1667cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _unpatch_dict(self):
1668cef7893435aa41160dd1255c43cb8498279738ccChris Craik        in_dict = self.in_dict
1669cef7893435aa41160dd1255c43cb8498279738ccChris Craik        original = self._original
1670cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1671cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _clear_dict(in_dict)
1672cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1673cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
1674cef7893435aa41160dd1255c43cb8498279738ccChris Craik            in_dict.update(original)
1675cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except AttributeError:
1676cef7893435aa41160dd1255c43cb8498279738ccChris Craik            for key in original:
1677cef7893435aa41160dd1255c43cb8498279738ccChris Craik                in_dict[key] = original[key]
1678cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1679cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1680cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __exit__(self, *args):
1681cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Unpatch the dict."""
1682cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._unpatch_dict()
1683cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return False
1684cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1685cef7893435aa41160dd1255c43cb8498279738ccChris Craik    start = __enter__
1686cef7893435aa41160dd1255c43cb8498279738ccChris Craik    stop = __exit__
1687cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1688cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1689cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _clear_dict(in_dict):
1690cef7893435aa41160dd1255c43cb8498279738ccChris Craik    try:
1691cef7893435aa41160dd1255c43cb8498279738ccChris Craik        in_dict.clear()
1692cef7893435aa41160dd1255c43cb8498279738ccChris Craik    except AttributeError:
1693cef7893435aa41160dd1255c43cb8498279738ccChris Craik        keys = list(in_dict)
1694cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for key in keys:
1695cef7893435aa41160dd1255c43cb8498279738ccChris Craik            del in_dict[key]
1696cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1697cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1698cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _patch_stopall():
1699cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """Stop all active patches."""
1700cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for patch in list(_patch._active_patches):
1701cef7893435aa41160dd1255c43cb8498279738ccChris Craik        patch.stop()
1702cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1703cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1704cef7893435aa41160dd1255c43cb8498279738ccChris Craikpatch.object = _patch_object
1705cef7893435aa41160dd1255c43cb8498279738ccChris Craikpatch.dict = _patch_dict
1706cef7893435aa41160dd1255c43cb8498279738ccChris Craikpatch.multiple = _patch_multiple
1707cef7893435aa41160dd1255c43cb8498279738ccChris Craikpatch.stopall = _patch_stopall
1708cef7893435aa41160dd1255c43cb8498279738ccChris Craikpatch.TEST_PREFIX = 'test'
1709cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1710cef7893435aa41160dd1255c43cb8498279738ccChris Craikmagic_methods = (
1711cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "lt le gt ge eq ne "
1712cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "getitem setitem delitem "
1713cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "len contains iter "
1714cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "hash str sizeof "
1715cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "enter exit "
1716cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "divmod neg pos abs invert "
1717cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "complex int float index "
1718cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "trunc floor ceil "
1719cef7893435aa41160dd1255c43cb8498279738ccChris Craik)
1720cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1721cef7893435aa41160dd1255c43cb8498279738ccChris Craiknumerics = "add sub mul div floordiv mod lshift rshift and xor or pow "
1722cef7893435aa41160dd1255c43cb8498279738ccChris Craikinplace = ' '.join('i%s' % n for n in numerics.split())
1723cef7893435aa41160dd1255c43cb8498279738ccChris Craikright = ' '.join('r%s' % n for n in numerics.split())
1724cef7893435aa41160dd1255c43cb8498279738ccChris Craikextra = ''
1725cef7893435aa41160dd1255c43cb8498279738ccChris Craikif inPy3k:
1726cef7893435aa41160dd1255c43cb8498279738ccChris Craik    extra = 'bool next '
1727cef7893435aa41160dd1255c43cb8498279738ccChris Craikelse:
1728cef7893435aa41160dd1255c43cb8498279738ccChris Craik    extra = 'unicode long nonzero oct hex truediv rtruediv '
1729cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1730cef7893435aa41160dd1255c43cb8498279738ccChris Craik# not including __prepare__, __instancecheck__, __subclasscheck__
1731cef7893435aa41160dd1255c43cb8498279738ccChris Craik# (as they are metaclass methods)
1732cef7893435aa41160dd1255c43cb8498279738ccChris Craik# __del__ is not supported at all as it causes problems if it exists
1733cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1734cef7893435aa41160dd1255c43cb8498279738ccChris Craik_non_defaults = set('__%s__' % method for method in [
1735cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'cmp', 'getslice', 'setslice', 'coerce', 'subclasses',
1736cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'format', 'get', 'set', 'delete', 'reversed',
1737cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'missing', 'reduce', 'reduce_ex', 'getinitargs',
1738cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'getnewargs', 'getstate', 'setstate', 'getformat',
1739cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'setformat', 'repr', 'dir'
1740cef7893435aa41160dd1255c43cb8498279738ccChris Craik])
1741cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1742cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1743cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _get_method(name, func):
1744cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "Turns a callable object (like a mock) into a real function"
1745cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def method(self, *args, **kw):
1746cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return func(self, *args, **kw)
1747cef7893435aa41160dd1255c43cb8498279738ccChris Craik    method.__name__ = name
1748cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return method
1749cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1750cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1751cef7893435aa41160dd1255c43cb8498279738ccChris Craik_magics = set(
1752cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__%s__' % method for method in
1753cef7893435aa41160dd1255c43cb8498279738ccChris Craik    ' '.join([magic_methods, numerics, inplace, right, extra]).split()
1754cef7893435aa41160dd1255c43cb8498279738ccChris Craik)
1755cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1756cef7893435aa41160dd1255c43cb8498279738ccChris Craik_all_magics = _magics | _non_defaults
1757cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1758cef7893435aa41160dd1255c43cb8498279738ccChris Craik_unsupported_magics = set([
1759cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__getattr__', '__setattr__',
1760cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__init__', '__new__', '__prepare__'
1761cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__instancecheck__', '__subclasscheck__',
1762cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__del__'
1763cef7893435aa41160dd1255c43cb8498279738ccChris Craik])
1764cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1765cef7893435aa41160dd1255c43cb8498279738ccChris Craik_calculate_return_value = {
1766cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__hash__': lambda self: object.__hash__(self),
1767cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__str__': lambda self: object.__str__(self),
1768cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__sizeof__': lambda self: object.__sizeof__(self),
1769cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__unicode__': lambda self: unicode(object.__str__(self)),
1770cef7893435aa41160dd1255c43cb8498279738ccChris Craik}
1771cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1772cef7893435aa41160dd1255c43cb8498279738ccChris Craik_return_values = {
1773cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__lt__': NotImplemented,
1774cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__gt__': NotImplemented,
1775cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__le__': NotImplemented,
1776cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__ge__': NotImplemented,
1777cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__int__': 1,
1778cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__contains__': False,
1779cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__len__': 0,
1780cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__exit__': False,
1781cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__complex__': 1j,
1782cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__float__': 1.0,
1783cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__bool__': True,
1784cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__nonzero__': True,
1785cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__oct__': '1',
1786cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__hex__': '0x1',
1787cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__long__': long(1),
1788cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__index__': 1,
1789cef7893435aa41160dd1255c43cb8498279738ccChris Craik}
1790cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1791cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1792cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _get_eq(self):
1793cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __eq__(other):
1794cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ret_val = self.__eq__._mock_return_value
1795cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if ret_val is not DEFAULT:
1796cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return ret_val
1797cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self is other
1798cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return __eq__
1799cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1800cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _get_ne(self):
1801cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __ne__(other):
1802cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self.__ne__._mock_return_value is not DEFAULT:
1803cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return DEFAULT
1804cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self is not other
1805cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return __ne__
1806cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1807cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _get_iter(self):
1808cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __iter__():
1809cef7893435aa41160dd1255c43cb8498279738ccChris Craik        ret_val = self.__iter__._mock_return_value
1810cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if ret_val is DEFAULT:
1811cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return iter([])
1812cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # if ret_val was already an iterator, then calling iter on it should
1813cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # return the iterator unchanged
1814cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return iter(ret_val)
1815cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return __iter__
1816cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1817cef7893435aa41160dd1255c43cb8498279738ccChris Craik_side_effect_methods = {
1818cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__eq__': _get_eq,
1819cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__ne__': _get_ne,
1820cef7893435aa41160dd1255c43cb8498279738ccChris Craik    '__iter__': _get_iter,
1821cef7893435aa41160dd1255c43cb8498279738ccChris Craik}
1822cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1823cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1824cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1825cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _set_return_value(mock, method, name):
1826cef7893435aa41160dd1255c43cb8498279738ccChris Craik    fixed = _return_values.get(name, DEFAULT)
1827cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if fixed is not DEFAULT:
1828cef7893435aa41160dd1255c43cb8498279738ccChris Craik        method.return_value = fixed
1829cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return
1830cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1831cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return_calulator = _calculate_return_value.get(name)
1832cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if return_calulator is not None:
1833cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
1834cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return_value = return_calulator(mock)
1835cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except AttributeError:
1836cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # XXXX why do we return AttributeError here?
1837cef7893435aa41160dd1255c43cb8498279738ccChris Craik            #      set it as a side_effect instead?
1838cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return_value = AttributeError(name)
1839cef7893435aa41160dd1255c43cb8498279738ccChris Craik        method.return_value = return_value
1840cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return
1841cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1842cef7893435aa41160dd1255c43cb8498279738ccChris Craik    side_effector = _side_effect_methods.get(name)
1843cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if side_effector is not None:
1844cef7893435aa41160dd1255c43cb8498279738ccChris Craik        method.side_effect = side_effector(mock)
1845cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1846cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1847cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1848cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass MagicMixin(object):
1849cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self, *args, **kw):
1850cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _super(MagicMixin, self).__init__(*args, **kw)
1851cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._mock_set_magics()
1852cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1853cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1854cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _mock_set_magics(self):
1855cef7893435aa41160dd1255c43cb8498279738ccChris Craik        these_magics = _magics
1856cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1857cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self._mock_methods is not None:
1858cef7893435aa41160dd1255c43cb8498279738ccChris Craik            these_magics = _magics.intersection(self._mock_methods)
1859cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1860cef7893435aa41160dd1255c43cb8498279738ccChris Craik            remove_magics = set()
1861cef7893435aa41160dd1255c43cb8498279738ccChris Craik            remove_magics = _magics - these_magics
1862cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1863cef7893435aa41160dd1255c43cb8498279738ccChris Craik            for entry in remove_magics:
1864cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if entry in type(self).__dict__:
1865cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    # remove unneeded magic methods
1866cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    delattr(self, entry)
1867cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1868cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # don't overwrite existing attributes if called a second time
1869cef7893435aa41160dd1255c43cb8498279738ccChris Craik        these_magics = these_magics - set(type(self).__dict__)
1870cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1871cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _type = type(self)
1872cef7893435aa41160dd1255c43cb8498279738ccChris Craik        for entry in these_magics:
1873cef7893435aa41160dd1255c43cb8498279738ccChris Craik            setattr(_type, entry, MagicProxy(entry, self))
1874cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1875cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1876cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1877cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass NonCallableMagicMock(MagicMixin, NonCallableMock):
1878cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """A version of `MagicMock` that isn't callable."""
1879cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def mock_add_spec(self, spec, spec_set=False):
1880cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Add a spec to a mock. `spec` can either be an object or a
1881cef7893435aa41160dd1255c43cb8498279738ccChris Craik        list of strings. Only attributes on the `spec` can be fetched as
1882cef7893435aa41160dd1255c43cb8498279738ccChris Craik        attributes from the mock.
1883cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1884cef7893435aa41160dd1255c43cb8498279738ccChris Craik        If `spec_set` is True then only attributes on the spec can be set."""
1885cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._mock_add_spec(spec, spec_set)
1886cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._mock_set_magics()
1887cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1888cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1889cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1890cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass MagicMock(MagicMixin, Mock):
1891cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1892cef7893435aa41160dd1255c43cb8498279738ccChris Craik    MagicMock is a subclass of Mock with default implementations
1893cef7893435aa41160dd1255c43cb8498279738ccChris Craik    of most of the magic methods. You can use MagicMock without having to
1894cef7893435aa41160dd1255c43cb8498279738ccChris Craik    configure the magic methods yourself.
1895cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1896cef7893435aa41160dd1255c43cb8498279738ccChris Craik    If you use the `spec` or `spec_set` arguments then *only* magic
1897cef7893435aa41160dd1255c43cb8498279738ccChris Craik    methods that exist in the spec will be created.
1898cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1899cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Attributes and the return value of a `MagicMock` will also be `MagicMocks`.
1900cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1901cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def mock_add_spec(self, spec, spec_set=False):
1902cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """Add a spec to a mock. `spec` can either be an object or a
1903cef7893435aa41160dd1255c43cb8498279738ccChris Craik        list of strings. Only attributes on the `spec` can be fetched as
1904cef7893435aa41160dd1255c43cb8498279738ccChris Craik        attributes from the mock.
1905cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1906cef7893435aa41160dd1255c43cb8498279738ccChris Craik        If `spec_set` is True then only attributes on the spec can be set."""
1907cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._mock_add_spec(spec, spec_set)
1908cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self._mock_set_magics()
1909cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1910cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1911cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1912cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass MagicProxy(object):
1913cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self, name, parent):
1914cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.name = name
1915cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.parent = parent
1916cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1917cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __call__(self, *args, **kwargs):
1918cef7893435aa41160dd1255c43cb8498279738ccChris Craik        m = self.create_mock()
1919cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return m(*args, **kwargs)
1920cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1921cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def create_mock(self):
1922cef7893435aa41160dd1255c43cb8498279738ccChris Craik        entry = self.name
1923cef7893435aa41160dd1255c43cb8498279738ccChris Craik        parent = self.parent
1924cef7893435aa41160dd1255c43cb8498279738ccChris Craik        m = parent._get_child_mock(name=entry, _new_name=entry,
1925cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                   _new_parent=parent)
1926cef7893435aa41160dd1255c43cb8498279738ccChris Craik        setattr(parent, entry, m)
1927cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _set_return_value(parent, m, entry)
1928cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return m
1929cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1930cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __get__(self, obj, _type=None):
1931cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self.create_mock()
1932cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1933cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1934cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1935cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _ANY(object):
1936cef7893435aa41160dd1255c43cb8498279738ccChris Craik    "A helper object that compares equal to everything."
1937cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1938cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __eq__(self, other):
1939cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return True
1940cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1941cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __ne__(self, other):
1942cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return False
1943cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1944cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __repr__(self):
1945cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return '<ANY>'
1946cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1947cef7893435aa41160dd1255c43cb8498279738ccChris CraikANY = _ANY()
1948cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1949cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1950cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1951cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _format_call_signature(name, args, kwargs):
1952cef7893435aa41160dd1255c43cb8498279738ccChris Craik    message = '%s(%%s)' % name
1953cef7893435aa41160dd1255c43cb8498279738ccChris Craik    formatted_args = ''
1954cef7893435aa41160dd1255c43cb8498279738ccChris Craik    args_string = ', '.join([repr(arg) for arg in args])
1955cef7893435aa41160dd1255c43cb8498279738ccChris Craik    kwargs_string = ', '.join([
1956cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '%s=%r' % (key, value) for key, value in kwargs.items()
1957cef7893435aa41160dd1255c43cb8498279738ccChris Craik    ])
1958cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if args_string:
1959cef7893435aa41160dd1255c43cb8498279738ccChris Craik        formatted_args = args_string
1960cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if kwargs_string:
1961cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if formatted_args:
1962cef7893435aa41160dd1255c43cb8498279738ccChris Craik            formatted_args += ', '
1963cef7893435aa41160dd1255c43cb8498279738ccChris Craik        formatted_args += kwargs_string
1964cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1965cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return message % formatted_args
1966cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1967cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1968cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1969cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _Call(tuple):
1970cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1971cef7893435aa41160dd1255c43cb8498279738ccChris Craik    A tuple for holding the results of a call to a mock, either in the form
1972cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `(args, kwargs)` or `(name, args, kwargs)`.
1973cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1974cef7893435aa41160dd1255c43cb8498279738ccChris Craik    If args or kwargs are empty then a call tuple will compare equal to
1975cef7893435aa41160dd1255c43cb8498279738ccChris Craik    a tuple without those values. This makes comparisons less verbose::
1976cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1977cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _Call(('name', (), {})) == ('name',)
1978cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _Call(('name', (1,), {})) == ('name', (1,))
1979cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _Call(((), {'a': 'b'})) == ({'a': 'b'},)
1980cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1981cef7893435aa41160dd1255c43cb8498279738ccChris Craik    The `_Call` object provides a useful shortcut for comparing with call::
1982cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1983cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)
1984cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)
1985cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1986cef7893435aa41160dd1255c43cb8498279738ccChris Craik    If the _Call has no name then it will match any name.
1987cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
1988cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __new__(cls, value=(), name=None, parent=None, two=False,
1989cef7893435aa41160dd1255c43cb8498279738ccChris Craik                from_kall=True):
1990cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name = ''
1991cef7893435aa41160dd1255c43cb8498279738ccChris Craik        args = ()
1992cef7893435aa41160dd1255c43cb8498279738ccChris Craik        kwargs = {}
1993cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _len = len(value)
1994cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if _len == 3:
1995cef7893435aa41160dd1255c43cb8498279738ccChris Craik            name, args, kwargs = value
1996cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif _len == 2:
1997cef7893435aa41160dd1255c43cb8498279738ccChris Craik            first, second = value
1998cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if isinstance(first, basestring):
1999cef7893435aa41160dd1255c43cb8498279738ccChris Craik                name = first
2000cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if isinstance(second, tuple):
2001cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    args = second
2002cef7893435aa41160dd1255c43cb8498279738ccChris Craik                else:
2003cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    kwargs = second
2004cef7893435aa41160dd1255c43cb8498279738ccChris Craik            else:
2005cef7893435aa41160dd1255c43cb8498279738ccChris Craik                args, kwargs = first, second
2006cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif _len == 1:
2007cef7893435aa41160dd1255c43cb8498279738ccChris Craik            value, = value
2008cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if isinstance(value, basestring):
2009cef7893435aa41160dd1255c43cb8498279738ccChris Craik                name = value
2010cef7893435aa41160dd1255c43cb8498279738ccChris Craik            elif isinstance(value, tuple):
2011cef7893435aa41160dd1255c43cb8498279738ccChris Craik                args = value
2012cef7893435aa41160dd1255c43cb8498279738ccChris Craik            else:
2013cef7893435aa41160dd1255c43cb8498279738ccChris Craik                kwargs = value
2014cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2015cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if two:
2016cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return tuple.__new__(cls, (args, kwargs))
2017cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2018cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return tuple.__new__(cls, (name, args, kwargs))
2019cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2020cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2021cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self, value=(), name=None, parent=None, two=False,
2022cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 from_kall=True):
2023cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.name = name
2024cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.parent = parent
2025cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.from_kall = from_kall
2026cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2027cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2028cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __eq__(self, other):
2029cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if other is ANY:
2030cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return True
2031cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
2032cef7893435aa41160dd1255c43cb8498279738ccChris Craik            len_other = len(other)
2033cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except TypeError:
2034cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return False
2035cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2036cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self_name = ''
2037cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if len(self) == 2:
2038cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self_args, self_kwargs = self
2039cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
2040cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self_name, self_args, self_kwargs = self
2041cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2042cef7893435aa41160dd1255c43cb8498279738ccChris Craik        other_name = ''
2043cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if len_other == 0:
2044cef7893435aa41160dd1255c43cb8498279738ccChris Craik            other_args, other_kwargs = (), {}
2045cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif len_other == 3:
2046cef7893435aa41160dd1255c43cb8498279738ccChris Craik            other_name, other_args, other_kwargs = other
2047cef7893435aa41160dd1255c43cb8498279738ccChris Craik        elif len_other == 1:
2048cef7893435aa41160dd1255c43cb8498279738ccChris Craik            value, = other
2049cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if isinstance(value, tuple):
2050cef7893435aa41160dd1255c43cb8498279738ccChris Craik                other_args = value
2051cef7893435aa41160dd1255c43cb8498279738ccChris Craik                other_kwargs = {}
2052cef7893435aa41160dd1255c43cb8498279738ccChris Craik            elif isinstance(value, basestring):
2053cef7893435aa41160dd1255c43cb8498279738ccChris Craik                other_name = value
2054cef7893435aa41160dd1255c43cb8498279738ccChris Craik                other_args, other_kwargs = (), {}
2055cef7893435aa41160dd1255c43cb8498279738ccChris Craik            else:
2056cef7893435aa41160dd1255c43cb8498279738ccChris Craik                other_args = ()
2057cef7893435aa41160dd1255c43cb8498279738ccChris Craik                other_kwargs = value
2058cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
2059cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # len 2
2060cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # could be (name, args) or (name, kwargs) or (args, kwargs)
2061cef7893435aa41160dd1255c43cb8498279738ccChris Craik            first, second = other
2062cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if isinstance(first, basestring):
2063cef7893435aa41160dd1255c43cb8498279738ccChris Craik                other_name = first
2064cef7893435aa41160dd1255c43cb8498279738ccChris Craik                if isinstance(second, tuple):
2065cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    other_args, other_kwargs = second, {}
2066cef7893435aa41160dd1255c43cb8498279738ccChris Craik                else:
2067cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    other_args, other_kwargs = (), second
2068cef7893435aa41160dd1255c43cb8498279738ccChris Craik            else:
2069cef7893435aa41160dd1255c43cb8498279738ccChris Craik                other_args, other_kwargs = first, second
2070cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2071cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self_name and other_name != self_name:
2072cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return False
2073cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2074cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # this order is important for ANY to work!
2075cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return (other_args, other_kwargs) == (self_args, self_kwargs)
2076cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2077cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2078cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __ne__(self, other):
2079cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return not self.__eq__(other)
2080cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2081cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2082cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __call__(self, *args, **kwargs):
2083cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self.name is None:
2084cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return _Call(('', args, kwargs), name='()')
2085cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2086cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name = self.name + '()'
2087cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return _Call((self.name, args, kwargs), name=name, parent=self)
2088cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2089cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2090cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __getattr__(self, attr):
2091cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if self.name is None:
2092cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return _Call(name=attr, from_kall=False)
2093cef7893435aa41160dd1255c43cb8498279738ccChris Craik        name = '%s.%s' % (self.name, attr)
2094cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return _Call(name=name, parent=self, from_kall=False)
2095cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2096cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2097cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __repr__(self):
2098cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not self.from_kall:
2099cef7893435aa41160dd1255c43cb8498279738ccChris Craik            name = self.name or 'call'
2100cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if name.startswith('()'):
2101cef7893435aa41160dd1255c43cb8498279738ccChris Craik                name = 'call%s' % name
2102cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return name
2103cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2104cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if len(self) == 2:
2105cef7893435aa41160dd1255c43cb8498279738ccChris Craik            name = 'call'
2106cef7893435aa41160dd1255c43cb8498279738ccChris Craik            args, kwargs = self
2107cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
2108cef7893435aa41160dd1255c43cb8498279738ccChris Craik            name, args, kwargs = self
2109cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if not name:
2110cef7893435aa41160dd1255c43cb8498279738ccChris Craik                name = 'call'
2111cef7893435aa41160dd1255c43cb8498279738ccChris Craik            elif not name.startswith('()'):
2112cef7893435aa41160dd1255c43cb8498279738ccChris Craik                name = 'call.%s' % name
2113cef7893435aa41160dd1255c43cb8498279738ccChris Craik            else:
2114cef7893435aa41160dd1255c43cb8498279738ccChris Craik                name = 'call%s' % name
2115cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return _format_call_signature(name, args, kwargs)
2116cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2117cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2118cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def call_list(self):
2119cef7893435aa41160dd1255c43cb8498279738ccChris Craik        """For a call object that represents multiple calls, `call_list`
2120cef7893435aa41160dd1255c43cb8498279738ccChris Craik        returns a list of all the intermediate calls as well as the
2121cef7893435aa41160dd1255c43cb8498279738ccChris Craik        final call."""
2122cef7893435aa41160dd1255c43cb8498279738ccChris Craik        vals = []
2123cef7893435aa41160dd1255c43cb8498279738ccChris Craik        thing = self
2124cef7893435aa41160dd1255c43cb8498279738ccChris Craik        while thing is not None:
2125cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if thing.from_kall:
2126cef7893435aa41160dd1255c43cb8498279738ccChris Craik                vals.append(thing)
2127cef7893435aa41160dd1255c43cb8498279738ccChris Craik            thing = thing.parent
2128cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return _CallList(reversed(vals))
2129cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2130cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2131cef7893435aa41160dd1255c43cb8498279738ccChris Craikcall = _Call(from_kall=False)
2132cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2133cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2134cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2135cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef create_autospec(spec, spec_set=False, instance=False, _parent=None,
2136cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    _name=None, **kwargs):
2137cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """Create a mock object using another object as a spec. Attributes on the
2138cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mock will use the corresponding attribute on the `spec` object as their
2139cef7893435aa41160dd1255c43cb8498279738ccChris Craik    spec.
2140cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2141cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Functions or methods being mocked will have their arguments checked
2142cef7893435aa41160dd1255c43cb8498279738ccChris Craik    to check that they are called with the correct signature.
2143cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2144cef7893435aa41160dd1255c43cb8498279738ccChris Craik    If `spec_set` is True then attempting to set attributes that don't exist
2145cef7893435aa41160dd1255c43cb8498279738ccChris Craik    on the spec object will raise an `AttributeError`.
2146cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2147cef7893435aa41160dd1255c43cb8498279738ccChris Craik    If a class is used as a spec then the return value of the mock (the
2148cef7893435aa41160dd1255c43cb8498279738ccChris Craik    instance of the class) will have the same spec. You can use a class as the
2149cef7893435aa41160dd1255c43cb8498279738ccChris Craik    spec for an instance object by passing `instance=True`. The returned mock
2150cef7893435aa41160dd1255c43cb8498279738ccChris Craik    will only be callable if instances of the mock are callable.
2151cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2152cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `create_autospec` also takes arbitrary keyword arguments that are passed to
2153cef7893435aa41160dd1255c43cb8498279738ccChris Craik    the constructor of the created mock."""
2154cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if _is_list(spec):
2155cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # can't pass a list instance to the mock constructor as it will be
2156cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # interpreted as a list of strings
2157cef7893435aa41160dd1255c43cb8498279738ccChris Craik        spec = type(spec)
2158cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2159cef7893435aa41160dd1255c43cb8498279738ccChris Craik    is_type = isinstance(spec, ClassTypes)
2160cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2161cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _kwargs = {'spec': spec}
2162cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if spec_set:
2163cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _kwargs = {'spec_set': spec}
2164cef7893435aa41160dd1255c43cb8498279738ccChris Craik    elif spec is None:
2165cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # None we mock with a normal mock without a spec
2166cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _kwargs = {}
2167cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2168cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _kwargs.update(kwargs)
2169cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2170cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Klass = MagicMock
2171cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if type(spec) in DescriptorTypes:
2172cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # descriptors don't have a spec
2173cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # because we don't know what type they return
2174cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _kwargs = {}
2175cef7893435aa41160dd1255c43cb8498279738ccChris Craik    elif not _callable(spec):
2176cef7893435aa41160dd1255c43cb8498279738ccChris Craik        Klass = NonCallableMagicMock
2177cef7893435aa41160dd1255c43cb8498279738ccChris Craik    elif is_type and instance and not _instance_callable(spec):
2178cef7893435aa41160dd1255c43cb8498279738ccChris Craik        Klass = NonCallableMagicMock
2179cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2180cef7893435aa41160dd1255c43cb8498279738ccChris Craik    _new_name = _name
2181cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if _parent is None:
2182cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # for a top level object no _new_name should be set
2183cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _new_name = ''
2184cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2185cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
2186cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 name=_name, **_kwargs)
2187cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2188cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if isinstance(spec, FunctionTypes):
2189cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # should only happen at the top level because we don't
2190cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # recurse for functions
2191cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock = _set_signature(mock, spec)
2192cef7893435aa41160dd1255c43cb8498279738ccChris Craik    else:
2193cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _check_signature(spec, mock, is_type, instance)
2194cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2195cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if _parent is not None and not instance:
2196cef7893435aa41160dd1255c43cb8498279738ccChris Craik        _parent._mock_children[_name] = mock
2197cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2198cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if is_type and not instance and 'return_value' not in kwargs:
2199cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock.return_value = create_autospec(spec, spec_set, instance=True,
2200cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                            _name='()', _parent=mock)
2201cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2202cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for entry in dir(spec):
2203cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if _is_magic(entry):
2204cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # MagicMock already does the useful magic methods for us
2205cef7893435aa41160dd1255c43cb8498279738ccChris Craik            continue
2206cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2207cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if isinstance(spec, FunctionTypes) and entry in FunctionAttributes:
2208cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # allow a mock to actually be a function
2209cef7893435aa41160dd1255c43cb8498279738ccChris Craik            continue
2210cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2211cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # XXXX do we need a better way of getting attributes without
2212cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # triggering code execution (?) Probably not - we need the actual
2213cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # object to mock it so we would rather trigger a property than mock
2214cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # the property descriptor. Likewise we want to mock out dynamically
2215cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # provided attributes.
2216cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # XXXX what about attributes that raise exceptions other than
2217cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # AttributeError on being fetched?
2218cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # we could be resilient against it, or catch and propagate the
2219cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # exception when the attribute is fetched from the mock
2220cef7893435aa41160dd1255c43cb8498279738ccChris Craik        try:
2221cef7893435aa41160dd1255c43cb8498279738ccChris Craik            original = getattr(spec, entry)
2222cef7893435aa41160dd1255c43cb8498279738ccChris Craik        except AttributeError:
2223cef7893435aa41160dd1255c43cb8498279738ccChris Craik            continue
2224cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2225cef7893435aa41160dd1255c43cb8498279738ccChris Craik        kwargs = {'spec': original}
2226cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if spec_set:
2227cef7893435aa41160dd1255c43cb8498279738ccChris Craik            kwargs = {'spec_set': original}
2228cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2229cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if not isinstance(original, FunctionTypes):
2230cef7893435aa41160dd1255c43cb8498279738ccChris Craik            new = _SpecState(original, spec_set, mock, entry, instance)
2231cef7893435aa41160dd1255c43cb8498279738ccChris Craik            mock._mock_children[entry] = new
2232cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
2233cef7893435aa41160dd1255c43cb8498279738ccChris Craik            parent = mock
2234cef7893435aa41160dd1255c43cb8498279738ccChris Craik            if isinstance(spec, FunctionTypes):
2235cef7893435aa41160dd1255c43cb8498279738ccChris Craik                parent = mock.mock
2236cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2237cef7893435aa41160dd1255c43cb8498279738ccChris Craik            new = MagicMock(parent=parent, name=entry, _new_name=entry,
2238cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            _new_parent=parent, **kwargs)
2239cef7893435aa41160dd1255c43cb8498279738ccChris Craik            mock._mock_children[entry] = new
2240cef7893435aa41160dd1255c43cb8498279738ccChris Craik            skipfirst = _must_skip(spec, entry, is_type)
2241cef7893435aa41160dd1255c43cb8498279738ccChris Craik            _check_signature(original, new, skipfirst=skipfirst)
2242cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2243cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # so functions created with _set_signature become instance attributes,
2244cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # *plus* their underlying mock exists in _mock_children of the parent
2245cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # mock. Adding to _mock_children may be unnecessary where we are also
2246cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # setting as an instance attribute?
2247cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if isinstance(new, FunctionTypes):
2248cef7893435aa41160dd1255c43cb8498279738ccChris Craik            setattr(mock, entry, new)
2249cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2250cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return mock
2251cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2252cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2253cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _must_skip(spec, entry, is_type):
2254cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not isinstance(spec, ClassTypes):
2255cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if entry in getattr(spec, '__dict__', {}):
2256cef7893435aa41160dd1255c43cb8498279738ccChris Craik            # instance attribute - shouldn't skip
2257cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return False
2258cef7893435aa41160dd1255c43cb8498279738ccChris Craik        spec = spec.__class__
2259cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not hasattr(spec, '__mro__'):
2260cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # old style class: can't have descriptors anyway
2261cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return is_type
2262cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2263cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for klass in spec.__mro__:
2264cef7893435aa41160dd1255c43cb8498279738ccChris Craik        result = klass.__dict__.get(entry, DEFAULT)
2265cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if result is DEFAULT:
2266cef7893435aa41160dd1255c43cb8498279738ccChris Craik            continue
2267cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if isinstance(result, (staticmethod, classmethod)):
2268cef7893435aa41160dd1255c43cb8498279738ccChris Craik            return False
2269cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return is_type
2270cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2271cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # shouldn't get here unless function is a dynamically provided attribute
2272cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # XXXX untested behaviour
2273cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return is_type
2274cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2275cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2276cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef _get_class(obj):
2277cef7893435aa41160dd1255c43cb8498279738ccChris Craik    try:
2278cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return obj.__class__
2279cef7893435aa41160dd1255c43cb8498279738ccChris Craik    except AttributeError:
2280cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # in Python 2, _sre.SRE_Pattern objects have no __class__
2281cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return type(obj)
2282cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2283cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2284cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass _SpecState(object):
2285cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2286cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __init__(self, spec, spec_set=False, parent=None,
2287cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 name=None, ids=None, instance=False):
2288cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.spec = spec
2289cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.ids = ids
2290cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.spec_set = spec_set
2291cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.parent = parent
2292cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.instance = instance
2293cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.name = name
2294cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2295cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2296cef7893435aa41160dd1255c43cb8498279738ccChris CraikFunctionTypes = (
2297cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # python function
2298cef7893435aa41160dd1255c43cb8498279738ccChris Craik    type(create_autospec),
2299cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # instance method
2300cef7893435aa41160dd1255c43cb8498279738ccChris Craik    type(ANY.__eq__),
2301cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # unbound method
2302cef7893435aa41160dd1255c43cb8498279738ccChris Craik    type(_ANY.__eq__),
2303cef7893435aa41160dd1255c43cb8498279738ccChris Craik)
2304cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2305cef7893435aa41160dd1255c43cb8498279738ccChris CraikFunctionAttributes = set([
2306cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'func_closure',
2307cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'func_code',
2308cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'func_defaults',
2309cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'func_dict',
2310cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'func_doc',
2311cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'func_globals',
2312cef7893435aa41160dd1255c43cb8498279738ccChris Craik    'func_name',
2313cef7893435aa41160dd1255c43cb8498279738ccChris Craik])
2314cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2315cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2316cef7893435aa41160dd1255c43cb8498279738ccChris Craikfile_spec = None
2317cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2318cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2319cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef mock_open(mock=None, read_data=''):
2320cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
2321cef7893435aa41160dd1255c43cb8498279738ccChris Craik    A helper function to create a mock to replace the use of `open`. It works
2322cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for `open` called directly or used as a context manager.
2323cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2324cef7893435aa41160dd1255c43cb8498279738ccChris Craik    The `mock` argument is the mock object to configure. If `None` (the
2325cef7893435aa41160dd1255c43cb8498279738ccChris Craik    default) then a `MagicMock` will be created for you, with the API limited
2326cef7893435aa41160dd1255c43cb8498279738ccChris Craik    to methods or attributes available on standard file handles.
2327cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2328cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `read_data` is a string for the `read` method of the file handle to return.
2329cef7893435aa41160dd1255c43cb8498279738ccChris Craik    This is an empty string by default.
2330cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
2331cef7893435aa41160dd1255c43cb8498279738ccChris Craik    global file_spec
2332cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if file_spec is None:
2333cef7893435aa41160dd1255c43cb8498279738ccChris Craik        # set on first use
2334cef7893435aa41160dd1255c43cb8498279738ccChris Craik        if inPy3k:
2335cef7893435aa41160dd1255c43cb8498279738ccChris Craik            import _io
2336cef7893435aa41160dd1255c43cb8498279738ccChris Craik            file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
2337cef7893435aa41160dd1255c43cb8498279738ccChris Craik        else:
2338cef7893435aa41160dd1255c43cb8498279738ccChris Craik            file_spec = file
2339cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2340cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if mock is None:
2341cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock = MagicMock(name='open', spec=open)
2342cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2343cef7893435aa41160dd1255c43cb8498279738ccChris Craik    handle = MagicMock(spec=file_spec)
2344cef7893435aa41160dd1255c43cb8498279738ccChris Craik    handle.write.return_value = None
2345cef7893435aa41160dd1255c43cb8498279738ccChris Craik    handle.__enter__.return_value = handle
2346cef7893435aa41160dd1255c43cb8498279738ccChris Craik    handle.read.return_value = read_data
2347cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2348cef7893435aa41160dd1255c43cb8498279738ccChris Craik    mock.return_value = handle
2349cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return mock
2350cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2351cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2352cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass PropertyMock(Mock):
2353cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
2354cef7893435aa41160dd1255c43cb8498279738ccChris Craik    A mock intended to be used as a property, or other descriptor, on a class.
2355cef7893435aa41160dd1255c43cb8498279738ccChris Craik    `PropertyMock` provides `__get__` and `__set__` methods so you can specify
2356cef7893435aa41160dd1255c43cb8498279738ccChris Craik    a return value when it is fetched.
2357cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2358cef7893435aa41160dd1255c43cb8498279738ccChris Craik    Fetching a `PropertyMock` instance from an object calls the mock, with
2359cef7893435aa41160dd1255c43cb8498279738ccChris Craik    no args. Setting it calls the mock with the value being set.
2360cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """
2361cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def _get_child_mock(self, **kwargs):
2362cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return MagicMock(**kwargs)
2363cef7893435aa41160dd1255c43cb8498279738ccChris Craik
2364cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __get__(self, obj, obj_type):
2365cef7893435aa41160dd1255c43cb8498279738ccChris Craik        return self()
2366cef7893435aa41160dd1255c43cb8498279738ccChris Craik    def __set__(self, obj, val):
2367cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self(val)
2368