Blame tests/mock.py

Packit 6f3914
# mock.py
Packit 6f3914
# Test tools for mocking and patching.
Packit 6f3914
# Copyright (C) 2007-2012 Michael Foord & the mock team
Packit 6f3914
# E-mail: fuzzyman AT voidspace DOT org DOT uk
Packit 6f3914
Packit 6f3914
# mock 1.0.1
Packit 6f3914
# http://www.voidspace.org.uk/python/mock/
Packit 6f3914
Packit 6f3914
# Released subject to the BSD License
Packit 6f3914
# Please see http://www.voidspace.org.uk/python/license.shtml
Packit 6f3914
Packit 6f3914
__all__ = (
Packit 6f3914
    'Mock',
Packit 6f3914
    'MagicMock',
Packit 6f3914
    'patch',
Packit 6f3914
    'sentinel',
Packit 6f3914
    'DEFAULT',
Packit 6f3914
    'ANY',
Packit 6f3914
    'call',
Packit 6f3914
    'create_autospec',
Packit 6f3914
    'FILTER_DIR',
Packit 6f3914
    'NonCallableMock',
Packit 6f3914
    'NonCallableMagicMock',
Packit 6f3914
    'mock_open',
Packit 6f3914
    'PropertyMock',
Packit 6f3914
)
Packit 6f3914
Packit 6f3914
Packit 6f3914
__version__ = '1.0.1'
Packit 6f3914
Packit 6f3914
Packit 6f3914
import pprint
Packit 6f3914
import sys
Packit 6f3914
Packit 6f3914
try:
Packit 6f3914
    import inspect
Packit 6f3914
except ImportError:
Packit 6f3914
    # for alternative platforms that
Packit 6f3914
    # may not have inspect
Packit 6f3914
    inspect = None
Packit 6f3914
Packit 6f3914
try:
Packit 6f3914
    from functools import wraps as original_wraps
Packit 6f3914
except ImportError:
Packit 6f3914
    # Python 2.4 compatibility
Packit 6f3914
    def wraps(original):
Packit 6f3914
        def inner(f):
Packit 6f3914
            f.__name__ = original.__name__
Packit 6f3914
            f.__doc__ = original.__doc__
Packit 6f3914
            f.__module__ = original.__module__
Packit 6f3914
            wrapped = getattr(original, '__wrapped__', original)
Packit 6f3914
            f.__wrapped__ = wrapped
Packit 6f3914
            return f
Packit 6f3914
        return inner
Packit 6f3914
else:
Packit 6f3914
    if sys.version_info[:2] >= (3, 2):
Packit 6f3914
        wraps = original_wraps
Packit 6f3914
    else:
Packit 6f3914
        def wraps(func):
Packit 6f3914
            def inner(f):
Packit 6f3914
                f = original_wraps(func)(f)
Packit 6f3914
                wrapped = getattr(func, '__wrapped__', func)
Packit 6f3914
                f.__wrapped__ = wrapped
Packit 6f3914
                return f
Packit 6f3914
            return inner
Packit 6f3914
Packit 6f3914
try:
Packit 6f3914
    unicode
Packit 6f3914
except NameError:
Packit 6f3914
    # Python 3
Packit 6f3914
    basestring = unicode = str
Packit 6f3914
Packit 6f3914
try:
Packit 6f3914
    long
Packit 6f3914
except NameError:
Packit 6f3914
    # Python 3
Packit 6f3914
    long = int
Packit 6f3914
Packit 6f3914
try:
Packit 6f3914
    BaseException
Packit 6f3914
except NameError:
Packit 6f3914
    # Python 2.4 compatibility
Packit 6f3914
    BaseException = Exception
Packit 6f3914
Packit 6f3914
try:
Packit 6f3914
    next
Packit 6f3914
except NameError:
Packit 6f3914
    def next(obj):
Packit 6f3914
        return obj.next()
Packit 6f3914
Packit 6f3914
Packit 6f3914
BaseExceptions = (BaseException,)
Packit 6f3914
if 'java' in sys.platform:
Packit 6f3914
    # jython
Packit 6f3914
    import java
Packit 6f3914
    BaseExceptions = (BaseException, java.lang.Throwable)
Packit 6f3914
Packit 6f3914
try:
Packit 6f3914
    _isidentifier = str.isidentifier
Packit 6f3914
except AttributeError:
Packit 6f3914
    # Python 2.X
Packit 6f3914
    import keyword
Packit 6f3914
    import re
Packit 6f3914
    regex = re.compile(r'^[a-z_][a-z0-9_]*$', re.I)
Packit 6f3914
    def _isidentifier(string):
Packit 6f3914
        if string in keyword.kwlist:
Packit 6f3914
            return False
Packit 6f3914
        return regex.match(string)
Packit 6f3914
Packit 6f3914
Packit 6f3914
inPy3k = sys.version_info[0] == 3
Packit 6f3914
Packit 6f3914
# Needed to work around Python 3 bug where use of "super" interferes with
Packit 6f3914
# defining __class__ as a descriptor
Packit 6f3914
_super = super
Packit 6f3914
Packit 6f3914
self = 'im_self'
Packit 6f3914
builtin = '__builtin__'
Packit 6f3914
if inPy3k:
Packit 6f3914
    self = '__self__'
Packit 6f3914
    builtin = 'builtins'
Packit 6f3914
Packit 6f3914
FILTER_DIR = True
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _is_instance_mock(obj):
Packit 6f3914
    # can't use isinstance on Mock objects because they override __class__
Packit 6f3914
    # The base class for all mocks is NonCallableMock
Packit 6f3914
    return issubclass(type(obj), NonCallableMock)
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _is_exception(obj):
Packit 6f3914
    return (
Packit 6f3914
        isinstance(obj, BaseExceptions) or
Packit 6f3914
        isinstance(obj, ClassTypes) and issubclass(obj, BaseExceptions)
Packit 6f3914
    )
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _slotted(object):
Packit 6f3914
    __slots__ = ['a']
Packit 6f3914
Packit 6f3914
Packit 6f3914
DescriptorTypes = (
Packit 6f3914
    type(_slotted.a),
Packit 6f3914
    property,
Packit 6f3914
)
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _getsignature(func, skipfirst, instance=False):
Packit 6f3914
    if inspect is None:
Packit 6f3914
        raise ImportError('inspect module not available')
Packit 6f3914
Packit 6f3914
    if isinstance(func, ClassTypes) and not instance:
Packit 6f3914
        try:
Packit 6f3914
            func = func.__init__
Packit 6f3914
        except AttributeError:
Packit 6f3914
            return
Packit 6f3914
        skipfirst = True
Packit 6f3914
    elif not isinstance(func, FunctionTypes):
Packit 6f3914
        # for classes where instance is True we end up here too
Packit 6f3914
        try:
Packit 6f3914
            func = func.__call__
Packit 6f3914
        except AttributeError:
Packit 6f3914
            return
Packit 6f3914
Packit 6f3914
    if inPy3k:
Packit 6f3914
        try:
Packit 6f3914
            argspec = inspect.getfullargspec(func)
Packit 6f3914
        except TypeError:
Packit 6f3914
            # C function / method, possibly inherited object().__init__
Packit 6f3914
            return
Packit 6f3914
        regargs, varargs, varkw, defaults, kwonly, kwonlydef, ann = argspec
Packit 6f3914
    else:
Packit 6f3914
        try:
Packit 6f3914
            regargs, varargs, varkwargs, defaults = inspect.getargspec(func)
Packit 6f3914
        except TypeError:
Packit 6f3914
            # C function / method, possibly inherited object().__init__
Packit 6f3914
            return
Packit 6f3914
Packit 6f3914
    # instance methods and classmethods need to lose the self argument
Packit 6f3914
    if getattr(func, self, None) is not None:
Packit 6f3914
        regargs = regargs[1:]
Packit 6f3914
    if skipfirst:
Packit 6f3914
        # this condition and the above one are never both True - why?
Packit 6f3914
        regargs = regargs[1:]
Packit 6f3914
Packit 6f3914
    if inPy3k:
Packit 6f3914
        signature = inspect.formatargspec(
Packit 6f3914
            regargs, varargs, varkw, defaults,
Packit 6f3914
            kwonly, kwonlydef, ann, formatvalue=lambda value: "")
Packit 6f3914
    else:
Packit 6f3914
        signature = inspect.formatargspec(
Packit 6f3914
            regargs, varargs, varkwargs, defaults,
Packit 6f3914
            formatvalue=lambda value: "")
Packit 6f3914
    return signature[1:-1], func
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _check_signature(func, mock, skipfirst, instance=False):
Packit 6f3914
    if not _callable(func):
Packit 6f3914
        return
Packit 6f3914
Packit 6f3914
    result = _getsignature(func, skipfirst, instance)
Packit 6f3914
    if result is None:
Packit 6f3914
        return
Packit 6f3914
    signature, func = result
Packit 6f3914
Packit 6f3914
    # can't use self because "self" is common as an argument name
Packit 6f3914
    # unfortunately even not in the first place
Packit 6f3914
    src = "lambda _mock_self, %s: None" % signature
Packit 6f3914
    checksig = eval(src, {})
Packit 6f3914
    _copy_func_details(func, checksig)
Packit 6f3914
    type(mock)._mock_check_sig = checksig
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _copy_func_details(func, funcopy):
Packit 6f3914
    funcopy.__name__ = func.__name__
Packit 6f3914
    funcopy.__doc__ = func.__doc__
Packit 6f3914
    #funcopy.__dict__.update(func.__dict__)
Packit 6f3914
    funcopy.__module__ = func.__module__
Packit 6f3914
    if not inPy3k:
Packit 6f3914
        funcopy.func_defaults = func.func_defaults
Packit 6f3914
        return
Packit 6f3914
    funcopy.__defaults__ = func.__defaults__
Packit 6f3914
    funcopy.__kwdefaults__ = func.__kwdefaults__
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _callable(obj):
Packit 6f3914
    if isinstance(obj, ClassTypes):
Packit 6f3914
        return True
Packit 6f3914
    if getattr(obj, '__call__', None) is not None:
Packit 6f3914
        return True
Packit 6f3914
    return False
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _is_list(obj):
Packit 6f3914
    # checks for list or tuples
Packit 6f3914
    # XXXX badly named!
Packit 6f3914
    return type(obj) in (list, tuple)
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _instance_callable(obj):
Packit 6f3914
    """Given an object, return True if the object is callable.
Packit 6f3914
    For classes, return True if instances would be callable."""
Packit 6f3914
    if not isinstance(obj, ClassTypes):
Packit 6f3914
        # already an instance
Packit 6f3914
        return getattr(obj, '__call__', None) is not None
Packit 6f3914
Packit 6f3914
    klass = obj
Packit 6f3914
    # uses __bases__ instead of __mro__ so that we work with old style classes
Packit 6f3914
    if klass.__dict__.get('__call__') is not None:
Packit 6f3914
        return True
Packit 6f3914
Packit 6f3914
    for base in klass.__bases__:
Packit 6f3914
        if _instance_callable(base):
Packit 6f3914
            return True
Packit 6f3914
    return False
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _set_signature(mock, original, instance=False):
Packit 6f3914
    # creates a function with signature (*args, **kwargs) that delegates to a
Packit 6f3914
    # mock. It still does signature checking by calling a lambda with the same
Packit 6f3914
    # signature as the original.
Packit 6f3914
    if not _callable(original):
Packit 6f3914
        return
Packit 6f3914
Packit 6f3914
    skipfirst = isinstance(original, ClassTypes)
Packit 6f3914
    result = _getsignature(original, skipfirst, instance)
Packit 6f3914
    if result is None:
Packit 6f3914
        # was a C function (e.g. object().__init__ ) that can't be mocked
Packit 6f3914
        return
Packit 6f3914
Packit 6f3914
    signature, func = result
Packit 6f3914
Packit 6f3914
    src = "lambda %s: None" % signature
Packit 6f3914
    checksig = eval(src, {})
Packit 6f3914
    _copy_func_details(func, checksig)
Packit 6f3914
Packit 6f3914
    name = original.__name__
Packit 6f3914
    if not _isidentifier(name):
Packit 6f3914
        name = 'funcopy'
Packit 6f3914
    context = {'_checksig_': checksig, 'mock': mock}
Packit 6f3914
    src = """def %s(*args, **kwargs):
Packit 6f3914
    _checksig_(*args, **kwargs)
Packit 6f3914
    return mock(*args, **kwargs)""" % name
Packit 6f3914
    exec (src, context)
Packit 6f3914
    funcopy = context[name]
Packit 6f3914
    _setup_func(funcopy, mock)
Packit 6f3914
    return funcopy
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _setup_func(funcopy, mock):
Packit 6f3914
    funcopy.mock = mock
Packit 6f3914
Packit 6f3914
    # can't use isinstance with mocks
Packit 6f3914
    if not _is_instance_mock(mock):
Packit 6f3914
        return
Packit 6f3914
Packit 6f3914
    def assert_called_with(*args, **kwargs):
Packit 6f3914
        return mock.assert_called_with(*args, **kwargs)
Packit 6f3914
    def assert_called_once_with(*args, **kwargs):
Packit 6f3914
        return mock.assert_called_once_with(*args, **kwargs)
Packit 6f3914
    def assert_has_calls(*args, **kwargs):
Packit 6f3914
        return mock.assert_has_calls(*args, **kwargs)
Packit 6f3914
    def assert_any_call(*args, **kwargs):
Packit 6f3914
        return mock.assert_any_call(*args, **kwargs)
Packit 6f3914
    def reset_mock():
Packit 6f3914
        funcopy.method_calls = _CallList()
Packit 6f3914
        funcopy.mock_calls = _CallList()
Packit 6f3914
        mock.reset_mock()
Packit 6f3914
        ret = funcopy.return_value
Packit 6f3914
        if _is_instance_mock(ret) and not ret is mock:
Packit 6f3914
            ret.reset_mock()
Packit 6f3914
Packit 6f3914
    funcopy.called = False
Packit 6f3914
    funcopy.call_count = 0
Packit 6f3914
    funcopy.call_args = None
Packit 6f3914
    funcopy.call_args_list = _CallList()
Packit 6f3914
    funcopy.method_calls = _CallList()
Packit 6f3914
    funcopy.mock_calls = _CallList()
Packit 6f3914
Packit 6f3914
    funcopy.return_value = mock.return_value
Packit 6f3914
    funcopy.side_effect = mock.side_effect
Packit 6f3914
    funcopy._mock_children = mock._mock_children
Packit 6f3914
Packit 6f3914
    funcopy.assert_called_with = assert_called_with
Packit 6f3914
    funcopy.assert_called_once_with = assert_called_once_with
Packit 6f3914
    funcopy.assert_has_calls = assert_has_calls
Packit 6f3914
    funcopy.assert_any_call = assert_any_call
Packit 6f3914
    funcopy.reset_mock = reset_mock
Packit 6f3914
Packit 6f3914
    mock._mock_delegate = funcopy
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _is_magic(name):
Packit 6f3914
    return '__%s__' % name[2:-2] == name
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _SentinelObject(object):
Packit 6f3914
    "A unique, named, sentinel object."
Packit 6f3914
    def __init__(self, name):
Packit 6f3914
        self.name = name
Packit 6f3914
Packit 6f3914
    def __repr__(self):
Packit 6f3914
        return 'sentinel.%s' % self.name
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _Sentinel(object):
Packit 6f3914
    """Access attributes to return a named object, usable as a sentinel."""
Packit 6f3914
    def __init__(self):
Packit 6f3914
        self._sentinels = {}
Packit 6f3914
Packit 6f3914
    def __getattr__(self, name):
Packit 6f3914
        if name == '__bases__':
Packit 6f3914
            # Without this help(mock) raises an exception
Packit 6f3914
            raise AttributeError
Packit 6f3914
        return self._sentinels.setdefault(name, _SentinelObject(name))
Packit 6f3914
Packit 6f3914
Packit 6f3914
sentinel = _Sentinel()
Packit 6f3914
Packit 6f3914
DEFAULT = sentinel.DEFAULT
Packit 6f3914
_missing = sentinel.MISSING
Packit 6f3914
_deleted = sentinel.DELETED
Packit 6f3914
Packit 6f3914
Packit 6f3914
class OldStyleClass:
Packit 6f3914
    pass
Packit 6f3914
ClassType = type(OldStyleClass)
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _copy(value):
Packit 6f3914
    if type(value) in (dict, list, tuple, set):
Packit 6f3914
        return type(value)(value)
Packit 6f3914
    return value
Packit 6f3914
Packit 6f3914
Packit 6f3914
ClassTypes = (type,)
Packit 6f3914
if not inPy3k:
Packit 6f3914
    ClassTypes = (type, ClassType)
Packit 6f3914
Packit 6f3914
_allowed_names = set(
Packit 6f3914
    [
Packit 6f3914
        'return_value', '_mock_return_value', 'side_effect',
Packit 6f3914
        '_mock_side_effect', '_mock_parent', '_mock_new_parent',
Packit 6f3914
        '_mock_name', '_mock_new_name'
Packit 6f3914
    ]
Packit 6f3914
)
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _delegating_property(name):
Packit 6f3914
    _allowed_names.add(name)
Packit 6f3914
    _the_name = '_mock_' + name
Packit 6f3914
    def _get(self, name=name, _the_name=_the_name):
Packit 6f3914
        sig = self._mock_delegate
Packit 6f3914
        if sig is None:
Packit 6f3914
            return getattr(self, _the_name)
Packit 6f3914
        return getattr(sig, name)
Packit 6f3914
    def _set(self, value, name=name, _the_name=_the_name):
Packit 6f3914
        sig = self._mock_delegate
Packit 6f3914
        if sig is None:
Packit 6f3914
            self.__dict__[_the_name] = value
Packit 6f3914
        else:
Packit 6f3914
            setattr(sig, name, value)
Packit 6f3914
Packit 6f3914
    return property(_get, _set)
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _CallList(list):
Packit 6f3914
Packit 6f3914
    def __contains__(self, value):
Packit 6f3914
        if not isinstance(value, list):
Packit 6f3914
            return list.__contains__(self, value)
Packit 6f3914
        len_value = len(value)
Packit 6f3914
        len_self = len(self)
Packit 6f3914
        if len_value > len_self:
Packit 6f3914
            return False
Packit 6f3914
Packit 6f3914
        for i in range(0, len_self - len_value + 1):
Packit 6f3914
            sub_list = self[i:i+len_value]
Packit 6f3914
            if sub_list == value:
Packit 6f3914
                return True
Packit 6f3914
        return False
Packit 6f3914
Packit 6f3914
    def __repr__(self):
Packit 6f3914
        return pprint.pformat(list(self))
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _check_and_set_parent(parent, value, name, new_name):
Packit 6f3914
    if not _is_instance_mock(value):
Packit 6f3914
        return False
Packit 6f3914
    if ((value._mock_name or value._mock_new_name) or
Packit 6f3914
        (value._mock_parent is not None) or
Packit 6f3914
        (value._mock_new_parent is not None)):
Packit 6f3914
        return False
Packit 6f3914
Packit 6f3914
    _parent = parent
Packit 6f3914
    while _parent is not None:
Packit 6f3914
        # setting a mock (value) as a child or return value of itself
Packit 6f3914
        # should not modify the mock
Packit 6f3914
        if _parent is value:
Packit 6f3914
            return False
Packit 6f3914
        _parent = _parent._mock_new_parent
Packit 6f3914
Packit 6f3914
    if new_name:
Packit 6f3914
        value._mock_new_parent = parent
Packit 6f3914
        value._mock_new_name = new_name
Packit 6f3914
    if name:
Packit 6f3914
        value._mock_parent = parent
Packit 6f3914
        value._mock_name = name
Packit 6f3914
    return True
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class Base(object):
Packit 6f3914
    _mock_return_value = DEFAULT
Packit 6f3914
    _mock_side_effect = None
Packit 6f3914
    def __init__(self, *args, **kwargs):
Packit 6f3914
        pass
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class NonCallableMock(Base):
Packit 6f3914
    """A non-callable version of `Mock`"""
Packit 6f3914
Packit 6f3914
    def __new__(cls, *args, **kw):
Packit 6f3914
        # every instance has its own class
Packit 6f3914
        # so we can create magic methods on the
Packit 6f3914
        # class without stomping on other mocks
Packit 6f3914
        new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__})
Packit 6f3914
        instance = object.__new__(new)
Packit 6f3914
        return instance
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __init__(
Packit 6f3914
            self, spec=None, wraps=None, name=None, spec_set=None,
Packit 6f3914
            parent=None, _spec_state=None, _new_name='', _new_parent=None,
Packit 6f3914
            **kwargs
Packit 6f3914
        ):
Packit 6f3914
        if _new_parent is None:
Packit 6f3914
            _new_parent = parent
Packit 6f3914
Packit 6f3914
        __dict__ = self.__dict__
Packit 6f3914
        __dict__['_mock_parent'] = parent
Packit 6f3914
        __dict__['_mock_name'] = name
Packit 6f3914
        __dict__['_mock_new_name'] = _new_name
Packit 6f3914
        __dict__['_mock_new_parent'] = _new_parent
Packit 6f3914
Packit 6f3914
        if spec_set is not None:
Packit 6f3914
            spec = spec_set
Packit 6f3914
            spec_set = True
Packit 6f3914
Packit 6f3914
        self._mock_add_spec(spec, spec_set)
Packit 6f3914
Packit 6f3914
        __dict__['_mock_children'] = {}
Packit 6f3914
        __dict__['_mock_wraps'] = wraps
Packit 6f3914
        __dict__['_mock_delegate'] = None
Packit 6f3914
Packit 6f3914
        __dict__['_mock_called'] = False
Packit 6f3914
        __dict__['_mock_call_args'] = None
Packit 6f3914
        __dict__['_mock_call_count'] = 0
Packit 6f3914
        __dict__['_mock_call_args_list'] = _CallList()
Packit 6f3914
        __dict__['_mock_mock_calls'] = _CallList()
Packit 6f3914
Packit 6f3914
        __dict__['method_calls'] = _CallList()
Packit 6f3914
Packit 6f3914
        if kwargs:
Packit 6f3914
            self.configure_mock(**kwargs)
Packit 6f3914
Packit 6f3914
        _super(NonCallableMock, self).__init__(
Packit 6f3914
            spec, wraps, name, spec_set, parent,
Packit 6f3914
            _spec_state
Packit 6f3914
        )
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def attach_mock(self, mock, attribute):
Packit 6f3914
        """
Packit 6f3914
        Attach a mock as an attribute of this one, replacing its name and
Packit 6f3914
        parent. Calls to the attached mock will be recorded in the
Packit 6f3914
        `method_calls` and `mock_calls` attributes of this one."""
Packit 6f3914
        mock._mock_parent = None
Packit 6f3914
        mock._mock_new_parent = None
Packit 6f3914
        mock._mock_name = ''
Packit 6f3914
        mock._mock_new_name = None
Packit 6f3914
Packit 6f3914
        setattr(self, attribute, mock)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def mock_add_spec(self, spec, spec_set=False):
Packit 6f3914
        """Add a spec to a mock. `spec` can either be an object or a
Packit 6f3914
        list of strings. Only attributes on the `spec` can be fetched as
Packit 6f3914
        attributes from the mock.
Packit 6f3914
Packit 6f3914
        If `spec_set` is True then only attributes on the spec can be set."""
Packit 6f3914
        self._mock_add_spec(spec, spec_set)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _mock_add_spec(self, spec, spec_set):
Packit 6f3914
        _spec_class = None
Packit 6f3914
Packit 6f3914
        if spec is not None and not _is_list(spec):
Packit 6f3914
            if isinstance(spec, ClassTypes):
Packit 6f3914
                _spec_class = spec
Packit 6f3914
            else:
Packit 6f3914
                _spec_class = _get_class(spec)
Packit 6f3914
Packit 6f3914
            spec = dir(spec)
Packit 6f3914
Packit 6f3914
        __dict__ = self.__dict__
Packit 6f3914
        __dict__['_spec_class'] = _spec_class
Packit 6f3914
        __dict__['_spec_set'] = spec_set
Packit 6f3914
        __dict__['_mock_methods'] = spec
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __get_return_value(self):
Packit 6f3914
        ret = self._mock_return_value
Packit 6f3914
        if self._mock_delegate is not None:
Packit 6f3914
            ret = self._mock_delegate.return_value
Packit 6f3914
Packit 6f3914
        if ret is DEFAULT:
Packit 6f3914
            ret = self._get_child_mock(
Packit 6f3914
                _new_parent=self, _new_name='()'
Packit 6f3914
            )
Packit 6f3914
            self.return_value = ret
Packit 6f3914
        return ret
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __set_return_value(self, value):
Packit 6f3914
        if self._mock_delegate is not None:
Packit 6f3914
            self._mock_delegate.return_value = value
Packit 6f3914
        else:
Packit 6f3914
            self._mock_return_value = value
Packit 6f3914
            _check_and_set_parent(self, value, None, '()')
Packit 6f3914
Packit 6f3914
    __return_value_doc = "The value to be returned when the mock is called."
Packit 6f3914
    return_value = property(__get_return_value, __set_return_value,
Packit 6f3914
                            __return_value_doc)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    def __class__(self):
Packit 6f3914
        if self._spec_class is None:
Packit 6f3914
            return type(self)
Packit 6f3914
        return self._spec_class
Packit 6f3914
Packit 6f3914
    called = _delegating_property('called')
Packit 6f3914
    call_count = _delegating_property('call_count')
Packit 6f3914
    call_args = _delegating_property('call_args')
Packit 6f3914
    call_args_list = _delegating_property('call_args_list')
Packit 6f3914
    mock_calls = _delegating_property('mock_calls')
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __get_side_effect(self):
Packit 6f3914
        sig = self._mock_delegate
Packit 6f3914
        if sig is None:
Packit 6f3914
            return self._mock_side_effect
Packit 6f3914
        return sig.side_effect
Packit 6f3914
Packit 6f3914
    def __set_side_effect(self, value):
Packit 6f3914
        value = _try_iter(value)
Packit 6f3914
        sig = self._mock_delegate
Packit 6f3914
        if sig is None:
Packit 6f3914
            self._mock_side_effect = value
Packit 6f3914
        else:
Packit 6f3914
            sig.side_effect = value
Packit 6f3914
Packit 6f3914
    side_effect = property(__get_side_effect, __set_side_effect)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def reset_mock(self):
Packit 6f3914
        "Restore the mock object to its initial state."
Packit 6f3914
        self.called = False
Packit 6f3914
        self.call_args = None
Packit 6f3914
        self.call_count = 0
Packit 6f3914
        self.mock_calls = _CallList()
Packit 6f3914
        self.call_args_list = _CallList()
Packit 6f3914
        self.method_calls = _CallList()
Packit 6f3914
Packit 6f3914
        for child in self._mock_children.itervalues():
Packit 6f3914
            if isinstance(child, _SpecState):
Packit 6f3914
                continue
Packit 6f3914
            child.reset_mock()
Packit 6f3914
Packit 6f3914
        ret = self._mock_return_value
Packit 6f3914
        if _is_instance_mock(ret) and ret is not self:
Packit 6f3914
            ret.reset_mock()
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def configure_mock(self, **kwargs):
Packit 6f3914
        """Set attributes on the mock through keyword arguments.
Packit 6f3914
Packit 6f3914
        Attributes plus return values and side effects can be set on child
Packit 6f3914
        mocks using standard dot notation and unpacking a dictionary in the
Packit 6f3914
        method call:
Packit 6f3914
Packit 6f3914
        >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
Packit 6f3914
        >>> mock.configure_mock(**attrs)"""
Packit 6f3914
        for arg, val in sorted(kwargs.items(),
Packit 6f3914
                               # we sort on the number of dots so that
Packit 6f3914
                               # attributes are set before we set attributes on
Packit 6f3914
                               # attributes
Packit 6f3914
                               key=lambda entry: entry[0].count('.')):
Packit 6f3914
            args = arg.split('.')
Packit 6f3914
            final = args.pop()
Packit 6f3914
            obj = self
Packit 6f3914
            for entry in args:
Packit 6f3914
                obj = getattr(obj, entry)
Packit 6f3914
            setattr(obj, final, val)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __getattr__(self, name):
Packit 6f3914
        if name == '_mock_methods':
Packit 6f3914
            raise AttributeError(name)
Packit 6f3914
        elif self._mock_methods is not None:
Packit 6f3914
            if name not in self._mock_methods or name in _all_magics:
Packit 6f3914
                raise AttributeError("Mock object has no attribute %r" % name)
Packit 6f3914
        elif _is_magic(name):
Packit 6f3914
            raise AttributeError(name)
Packit 6f3914
Packit 6f3914
        result = self._mock_children.get(name)
Packit 6f3914
        if result is _deleted:
Packit 6f3914
            raise AttributeError(name)
Packit 6f3914
        elif result is None:
Packit 6f3914
            wraps = None
Packit 6f3914
            if self._mock_wraps is not None:
Packit 6f3914
                # XXXX should we get the attribute without triggering code
Packit 6f3914
                # execution?
Packit 6f3914
                wraps = getattr(self._mock_wraps, name)
Packit 6f3914
Packit 6f3914
            result = self._get_child_mock(
Packit 6f3914
                parent=self, name=name, wraps=wraps, _new_name=name,
Packit 6f3914
                _new_parent=self
Packit 6f3914
            )
Packit 6f3914
            self._mock_children[name]  = result
Packit 6f3914
Packit 6f3914
        elif isinstance(result, _SpecState):
Packit 6f3914
            result = create_autospec(
Packit 6f3914
                result.spec, result.spec_set, result.instance,
Packit 6f3914
                result.parent, result.name
Packit 6f3914
            )
Packit 6f3914
            self._mock_children[name]  = result
Packit 6f3914
Packit 6f3914
        return result
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __repr__(self):
Packit 6f3914
        _name_list = [self._mock_new_name]
Packit 6f3914
        _parent = self._mock_new_parent
Packit 6f3914
        last = self
Packit 6f3914
Packit 6f3914
        dot = '.'
Packit 6f3914
        if _name_list == ['()']:
Packit 6f3914
            dot = ''
Packit 6f3914
        seen = set()
Packit 6f3914
        while _parent is not None:
Packit 6f3914
            last = _parent
Packit 6f3914
Packit 6f3914
            _name_list.append(_parent._mock_new_name + dot)
Packit 6f3914
            dot = '.'
Packit 6f3914
            if _parent._mock_new_name == '()':
Packit 6f3914
                dot = ''
Packit 6f3914
Packit 6f3914
            _parent = _parent._mock_new_parent
Packit 6f3914
Packit 6f3914
            # use ids here so as not to call __hash__ on the mocks
Packit 6f3914
            if id(_parent) in seen:
Packit 6f3914
                break
Packit 6f3914
            seen.add(id(_parent))
Packit 6f3914
Packit 6f3914
        _name_list = list(reversed(_name_list))
Packit 6f3914
        _first = last._mock_name or 'mock'
Packit 6f3914
        if len(_name_list) > 1:
Packit 6f3914
            if _name_list[1] not in ('()', '().'):
Packit 6f3914
                _first += '.'
Packit 6f3914
        _name_list[0] = _first
Packit 6f3914
        name = ''.join(_name_list)
Packit 6f3914
Packit 6f3914
        name_string = ''
Packit 6f3914
        if name not in ('mock', 'mock.'):
Packit 6f3914
            name_string = ' name=%r' % name
Packit 6f3914
Packit 6f3914
        spec_string = ''
Packit 6f3914
        if self._spec_class is not None:
Packit 6f3914
            spec_string = ' spec=%r'
Packit 6f3914
            if self._spec_set:
Packit 6f3914
                spec_string = ' spec_set=%r'
Packit 6f3914
            spec_string = spec_string % self._spec_class.__name__
Packit 6f3914
        return "<%s%s%s id='%s'>" % (
Packit 6f3914
            type(self).__name__,
Packit 6f3914
            name_string,
Packit 6f3914
            spec_string,
Packit 6f3914
            id(self)
Packit 6f3914
        )
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __dir__(self):
Packit 6f3914
        """Filter the output of `dir(mock)` to only useful members.
Packit 6f3914
        XXXX
Packit 6f3914
        """
Packit 6f3914
        extras = self._mock_methods or []
Packit 6f3914
        from_type = dir(type(self))
Packit 6f3914
        from_dict = list(self.__dict__)
Packit 6f3914
Packit 6f3914
        if FILTER_DIR:
Packit 6f3914
            from_type = [e for e in from_type if not e.startswith('_')]
Packit 6f3914
            from_dict = [e for e in from_dict if not e.startswith('_') or
Packit 6f3914
                         _is_magic(e)]
Packit 6f3914
        return sorted(set(extras + from_type + from_dict +
Packit 6f3914
                          list(self._mock_children)))
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __setattr__(self, name, value):
Packit 6f3914
        if name in _allowed_names:
Packit 6f3914
            # property setters go through here
Packit 6f3914
            return object.__setattr__(self, name, value)
Packit 6f3914
        elif (self._spec_set and self._mock_methods is not None and
Packit 6f3914
            name not in self._mock_methods and
Packit 6f3914
            name not in self.__dict__):
Packit 6f3914
            raise AttributeError("Mock object has no attribute '%s'" % name)
Packit 6f3914
        elif name in _unsupported_magics:
Packit 6f3914
            msg = 'Attempting to set unsupported magic method %r.' % name
Packit 6f3914
            raise AttributeError(msg)
Packit 6f3914
        elif name in _all_magics:
Packit 6f3914
            if self._mock_methods is not None and name not in self._mock_methods:
Packit 6f3914
                raise AttributeError("Mock object has no attribute '%s'" % name)
Packit 6f3914
Packit 6f3914
            if not _is_instance_mock(value):
Packit 6f3914
                setattr(type(self), name, _get_method(name, value))
Packit 6f3914
                original = value
Packit 6f3914
                value = lambda *args, **kw: original(self, *args, **kw)
Packit 6f3914
            else:
Packit 6f3914
                # only set _new_name and not name so that mock_calls is tracked
Packit 6f3914
                # but not method calls
Packit 6f3914
                _check_and_set_parent(self, value, None, name)
Packit 6f3914
                setattr(type(self), name, value)
Packit 6f3914
                self._mock_children[name] = value
Packit 6f3914
        elif name == '__class__':
Packit 6f3914
            self._spec_class = value
Packit 6f3914
            return
Packit 6f3914
        else:
Packit 6f3914
            if _check_and_set_parent(self, value, name, name):
Packit 6f3914
                self._mock_children[name] = value
Packit 6f3914
        return object.__setattr__(self, name, value)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __delattr__(self, name):
Packit 6f3914
        if name in _all_magics and name in type(self).__dict__:
Packit 6f3914
            delattr(type(self), name)
Packit 6f3914
            if name not in self.__dict__:
Packit 6f3914
                # for magic methods that are still MagicProxy objects and
Packit 6f3914
                # not set on the instance itself
Packit 6f3914
                return
Packit 6f3914
Packit 6f3914
        if name in self.__dict__:
Packit 6f3914
            object.__delattr__(self, name)
Packit 6f3914
Packit 6f3914
        obj = self._mock_children.get(name, _missing)
Packit 6f3914
        if obj is _deleted:
Packit 6f3914
            raise AttributeError(name)
Packit 6f3914
        if obj is not _missing:
Packit 6f3914
            del self._mock_children[name]
Packit 6f3914
        self._mock_children[name] = _deleted
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _format_mock_call_signature(self, args, kwargs):
Packit 6f3914
        name = self._mock_name or 'mock'
Packit 6f3914
        return _format_call_signature(name, args, kwargs)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _format_mock_failure_message(self, args, kwargs):
Packit 6f3914
        message = 'Expected call: %s\nActual call: %s'
Packit 6f3914
        expected_string = self._format_mock_call_signature(args, kwargs)
Packit 6f3914
        call_args = self.call_args
Packit 6f3914
        if len(call_args) == 3:
Packit 6f3914
            call_args = call_args[1:]
Packit 6f3914
        actual_string = self._format_mock_call_signature(*call_args)
Packit 6f3914
        return message % (expected_string, actual_string)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def assert_called_with(_mock_self, *args, **kwargs):
Packit 6f3914
        """assert that the mock was called with the specified arguments.
Packit 6f3914
Packit 6f3914
        Raises an AssertionError if the args and keyword args passed in are
Packit 6f3914
        different to the last call to the mock."""
Packit 6f3914
        self = _mock_self
Packit 6f3914
        if self.call_args is None:
Packit 6f3914
            expected = self._format_mock_call_signature(args, kwargs)
Packit 6f3914
            raise AssertionError('Expected call: %s\nNot called' % (expected,))
Packit 6f3914
Packit 6f3914
        if self.call_args != (args, kwargs):
Packit 6f3914
            msg = self._format_mock_failure_message(args, kwargs)
Packit 6f3914
            raise AssertionError(msg)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def assert_called_once_with(_mock_self, *args, **kwargs):
Packit 6f3914
        """assert that the mock was called exactly once and with the specified
Packit 6f3914
        arguments."""
Packit 6f3914
        self = _mock_self
Packit 6f3914
        if not self.call_count == 1:
Packit 6f3914
            msg = ("Expected to be called once. Called %s times." %
Packit 6f3914
                   self.call_count)
Packit 6f3914
            raise AssertionError(msg)
Packit 6f3914
        return self.assert_called_with(*args, **kwargs)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def assert_has_calls(self, calls, any_order=False):
Packit 6f3914
        """assert the mock has been called with the specified calls.
Packit 6f3914
        The `mock_calls` list is checked for the calls.
Packit 6f3914
Packit 6f3914
        If `any_order` is False (the default) then the calls must be
Packit 6f3914
        sequential. There can be extra calls before or after the
Packit 6f3914
        specified calls.
Packit 6f3914
Packit 6f3914
        If `any_order` is True then the calls can be in any order, but
Packit 6f3914
        they must all appear in `mock_calls`."""
Packit 6f3914
        if not any_order:
Packit 6f3914
            if calls not in self.mock_calls:
Packit 6f3914
                raise AssertionError(
Packit 6f3914
                    'Calls not found.\nExpected: %r\n'
Packit 6f3914
                    'Actual: %r' % (calls, self.mock_calls)
Packit 6f3914
                )
Packit 6f3914
            return
Packit 6f3914
Packit 6f3914
        all_calls = list(self.mock_calls)
Packit 6f3914
Packit 6f3914
        not_found = []
Packit 6f3914
        for kall in calls:
Packit 6f3914
            try:
Packit 6f3914
                all_calls.remove(kall)
Packit 6f3914
            except ValueError:
Packit 6f3914
                not_found.append(kall)
Packit 6f3914
        if not_found:
Packit 6f3914
            raise AssertionError(
Packit 6f3914
                '%r not all found in call list' % (tuple(not_found),)
Packit 6f3914
            )
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def assert_any_call(self, *args, **kwargs):
Packit 6f3914
        """assert the mock has been called with the specified arguments.
Packit 6f3914
Packit 6f3914
        The assert passes if the mock has *ever* been called, unlike
Packit 6f3914
        `assert_called_with` and `assert_called_once_with` that only pass if
Packit 6f3914
        the call is the most recent one."""
Packit 6f3914
        kall = call(*args, **kwargs)
Packit 6f3914
        if kall not in self.call_args_list:
Packit 6f3914
            expected_string = self._format_mock_call_signature(args, kwargs)
Packit 6f3914
            raise AssertionError(
Packit 6f3914
                '%s call not found' % expected_string
Packit 6f3914
            )
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _get_child_mock(self, **kw):
Packit 6f3914
        """Create the child mocks for attributes and return value.
Packit 6f3914
        By default child mocks will be the same type as the parent.
Packit 6f3914
        Subclasses of Mock may want to override this to customize the way
Packit 6f3914
        child mocks are made.
Packit 6f3914
Packit 6f3914
        For non-callable mocks the callable variant will be used (rather than
Packit 6f3914
        any custom subclass)."""
Packit 6f3914
        _type = type(self)
Packit 6f3914
        if not issubclass(_type, CallableMixin):
Packit 6f3914
            if issubclass(_type, NonCallableMagicMock):
Packit 6f3914
                klass = MagicMock
Packit 6f3914
            elif issubclass(_type, NonCallableMock) :
Packit 6f3914
                klass = Mock
Packit 6f3914
        else:
Packit 6f3914
            klass = _type.__mro__[1]
Packit 6f3914
        return klass(**kw)
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _try_iter(obj):
Packit 6f3914
    if obj is None:
Packit 6f3914
        return obj
Packit 6f3914
    if _is_exception(obj):
Packit 6f3914
        return obj
Packit 6f3914
    if _callable(obj):
Packit 6f3914
        return obj
Packit 6f3914
    try:
Packit 6f3914
        return iter(obj)
Packit 6f3914
    except TypeError:
Packit 6f3914
        # XXXX backwards compatibility
Packit 6f3914
        # but this will blow up on first call - so maybe we should fail early?
Packit 6f3914
        return obj
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class CallableMixin(Base):
Packit 6f3914
Packit 6f3914
    def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,
Packit 6f3914
                 wraps=None, name=None, spec_set=None, parent=None,
Packit 6f3914
                 _spec_state=None, _new_name='', _new_parent=None, **kwargs):
Packit 6f3914
        self.__dict__['_mock_return_value'] = return_value
Packit 6f3914
Packit 6f3914
        _super(CallableMixin, self).__init__(
Packit 6f3914
            spec, wraps, name, spec_set, parent,
Packit 6f3914
            _spec_state, _new_name, _new_parent, **kwargs
Packit 6f3914
        )
Packit 6f3914
Packit 6f3914
        self.side_effect = side_effect
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _mock_check_sig(self, *args, **kwargs):
Packit 6f3914
        # stub method that can be replaced with one with a specific signature
Packit 6f3914
        pass
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __call__(_mock_self, *args, **kwargs):
Packit 6f3914
        # can't use self in-case a function / method we are mocking uses self
Packit 6f3914
        # in the signature
Packit 6f3914
        _mock_self._mock_check_sig(*args, **kwargs)
Packit 6f3914
        return _mock_self._mock_call(*args, **kwargs)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _mock_call(_mock_self, *args, **kwargs):
Packit 6f3914
        self = _mock_self
Packit 6f3914
        self.called = True
Packit 6f3914
        self.call_count += 1
Packit 6f3914
        self.call_args = _Call((args, kwargs), two=True)
Packit 6f3914
        self.call_args_list.append(_Call((args, kwargs), two=True))
Packit 6f3914
Packit 6f3914
        _new_name = self._mock_new_name
Packit 6f3914
        _new_parent = self._mock_new_parent
Packit 6f3914
        self.mock_calls.append(_Call(('', args, kwargs)))
Packit 6f3914
Packit 6f3914
        seen = set()
Packit 6f3914
        skip_next_dot = _new_name == '()'
Packit 6f3914
        do_method_calls = self._mock_parent is not None
Packit 6f3914
        name = self._mock_name
Packit 6f3914
        while _new_parent is not None:
Packit 6f3914
            this_mock_call = _Call((_new_name, args, kwargs))
Packit 6f3914
            if _new_parent._mock_new_name:
Packit 6f3914
                dot = '.'
Packit 6f3914
                if skip_next_dot:
Packit 6f3914
                    dot = ''
Packit 6f3914
Packit 6f3914
                skip_next_dot = False
Packit 6f3914
                if _new_parent._mock_new_name == '()':
Packit 6f3914
                    skip_next_dot = True
Packit 6f3914
Packit 6f3914
                _new_name = _new_parent._mock_new_name + dot + _new_name
Packit 6f3914
Packit 6f3914
            if do_method_calls:
Packit 6f3914
                if _new_name == name:
Packit 6f3914
                    this_method_call = this_mock_call
Packit 6f3914
                else:
Packit 6f3914
                    this_method_call = _Call((name, args, kwargs))
Packit 6f3914
                _new_parent.method_calls.append(this_method_call)
Packit 6f3914
Packit 6f3914
                do_method_calls = _new_parent._mock_parent is not None
Packit 6f3914
                if do_method_calls:
Packit 6f3914
                    name = _new_parent._mock_name + '.' + name
Packit 6f3914
Packit 6f3914
            _new_parent.mock_calls.append(this_mock_call)
Packit 6f3914
            _new_parent = _new_parent._mock_new_parent
Packit 6f3914
Packit 6f3914
            # use ids here so as not to call __hash__ on the mocks
Packit 6f3914
            _new_parent_id = id(_new_parent)
Packit 6f3914
            if _new_parent_id in seen:
Packit 6f3914
                break
Packit 6f3914
            seen.add(_new_parent_id)
Packit 6f3914
Packit 6f3914
        ret_val = DEFAULT
Packit 6f3914
        effect = self.side_effect
Packit 6f3914
        if effect is not None:
Packit 6f3914
            if _is_exception(effect):
Packit 6f3914
                raise effect
Packit 6f3914
Packit 6f3914
            if not _callable(effect):
Packit 6f3914
                result = next(effect)
Packit 6f3914
                if _is_exception(result):
Packit 6f3914
                    raise result
Packit 6f3914
                return result
Packit 6f3914
Packit 6f3914
            ret_val = effect(*args, **kwargs)
Packit 6f3914
            if ret_val is DEFAULT:
Packit 6f3914
                ret_val = self.return_value
Packit 6f3914
Packit 6f3914
        if (self._mock_wraps is not None and
Packit 6f3914
             self._mock_return_value is DEFAULT):
Packit 6f3914
            return self._mock_wraps(*args, **kwargs)
Packit 6f3914
        if ret_val is DEFAULT:
Packit 6f3914
            ret_val = self.return_value
Packit 6f3914
        return ret_val
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class Mock(CallableMixin, NonCallableMock):
Packit 6f3914
    """
Packit 6f3914
    Create a new `Mock` object. `Mock` takes several optional arguments
Packit 6f3914
    that specify the behaviour of the Mock object:
Packit 6f3914
Packit 6f3914
    * `spec`: This can be either a list of strings or an existing object (a
Packit 6f3914
      class or instance) that acts as the specification for the mock object. If
Packit 6f3914
      you pass in an object then a list of strings is formed by calling dir on
Packit 6f3914
      the object (excluding unsupported magic attributes and methods). Accessing
Packit 6f3914
      any attribute not in this list will raise an `AttributeError`.
Packit 6f3914
Packit 6f3914
      If `spec` is an object (rather than a list of strings) then
Packit 6f3914
      `mock.__class__` returns the class of the spec object. This allows mocks
Packit 6f3914
      to pass `isinstance` tests.
Packit 6f3914
Packit 6f3914
    * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
Packit 6f3914
      or get an attribute on the mock that isn't on the object passed as
Packit 6f3914
      `spec_set` will raise an `AttributeError`.
Packit 6f3914
Packit 6f3914
    * `side_effect`: A function to be called whenever the Mock is called. See
Packit 6f3914
      the `side_effect` attribute. Useful for raising exceptions or
Packit 6f3914
      dynamically changing return values. The function is called with the same
Packit 6f3914
      arguments as the mock, and unless it returns `DEFAULT`, the return
Packit 6f3914
      value of this function is used as the return value.
Packit 6f3914
Packit 6f3914
      Alternatively `side_effect` can be an exception class or instance. In
Packit 6f3914
      this case the exception will be raised when the mock is called.
Packit 6f3914
Packit 6f3914
      If `side_effect` is an iterable then each call to the mock will return
Packit 6f3914
      the next value from the iterable. If any of the members of the iterable
Packit 6f3914
      are exceptions they will be raised instead of returned.
Packit 6f3914
Packit 6f3914
    * `return_value`: The value returned when the mock is called. By default
Packit 6f3914
      this is a new Mock (created on first access). See the
Packit 6f3914
      `return_value` attribute.
Packit 6f3914
Packit 6f3914
    * `wraps`: Item for the mock object to wrap. If `wraps` is not None then
Packit 6f3914
      calling the Mock will pass the call through to the wrapped object
Packit 6f3914
      (returning the real result). Attribute access on the mock will return a
Packit 6f3914
      Mock object that wraps the corresponding attribute of the wrapped object
Packit 6f3914
      (so attempting to access an attribute that doesn't exist will raise an
Packit 6f3914
      `AttributeError`).
Packit 6f3914
Packit 6f3914
      If the mock has an explicit `return_value` set then calls are not passed
Packit 6f3914
      to the wrapped object and the `return_value` is returned instead.
Packit 6f3914
Packit 6f3914
    * `name`: If the mock has a name then it will be used in the repr of the
Packit 6f3914
      mock. This can be useful for debugging. The name is propagated to child
Packit 6f3914
      mocks.
Packit 6f3914
Packit 6f3914
    Mocks can also be called with arbitrary keyword arguments. These will be
Packit 6f3914
    used to set attributes on the mock after it is created.
Packit 6f3914
    """
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _dot_lookup(thing, comp, import_path):
Packit 6f3914
    try:
Packit 6f3914
        return getattr(thing, comp)
Packit 6f3914
    except AttributeError:
Packit 6f3914
        __import__(import_path)
Packit 6f3914
        return getattr(thing, comp)
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _importer(target):
Packit 6f3914
    components = target.split('.')
Packit 6f3914
    import_path = components.pop(0)
Packit 6f3914
    thing = __import__(import_path)
Packit 6f3914
Packit 6f3914
    for comp in components:
Packit 6f3914
        import_path += ".%s" % comp
Packit 6f3914
        thing = _dot_lookup(thing, comp, import_path)
Packit 6f3914
    return thing
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _is_started(patcher):
Packit 6f3914
    # XXXX horrible
Packit 6f3914
    return hasattr(patcher, 'is_local')
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _patch(object):
Packit 6f3914
Packit 6f3914
    attribute_name = None
Packit 6f3914
    _active_patches = set()
Packit 6f3914
Packit 6f3914
    def __init__(
Packit 6f3914
            self, getter, attribute, new, spec, create,
Packit 6f3914
            spec_set, autospec, new_callable, kwargs
Packit 6f3914
        ):
Packit 6f3914
        if new_callable is not None:
Packit 6f3914
            if new is not DEFAULT:
Packit 6f3914
                raise ValueError(
Packit 6f3914
                    "Cannot use 'new' and 'new_callable' together"
Packit 6f3914
                )
Packit 6f3914
            if autospec is not None:
Packit 6f3914
                raise ValueError(
Packit 6f3914
                    "Cannot use 'autospec' and 'new_callable' together"
Packit 6f3914
                )
Packit 6f3914
Packit 6f3914
        self.getter = getter
Packit 6f3914
        self.attribute = attribute
Packit 6f3914
        self.new = new
Packit 6f3914
        self.new_callable = new_callable
Packit 6f3914
        self.spec = spec
Packit 6f3914
        self.create = create
Packit 6f3914
        self.has_local = False
Packit 6f3914
        self.spec_set = spec_set
Packit 6f3914
        self.autospec = autospec
Packit 6f3914
        self.kwargs = kwargs
Packit 6f3914
        self.additional_patchers = []
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def copy(self):
Packit 6f3914
        patcher = _patch(
Packit 6f3914
            self.getter, self.attribute, self.new, self.spec,
Packit 6f3914
            self.create, self.spec_set,
Packit 6f3914
            self.autospec, self.new_callable, self.kwargs
Packit 6f3914
        )
Packit 6f3914
        patcher.attribute_name = self.attribute_name
Packit 6f3914
        patcher.additional_patchers = [
Packit 6f3914
            p.copy() for p in self.additional_patchers
Packit 6f3914
        ]
Packit 6f3914
        return patcher
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __call__(self, func):
Packit 6f3914
        if isinstance(func, ClassTypes):
Packit 6f3914
            return self.decorate_class(func)
Packit 6f3914
        return self.decorate_callable(func)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def decorate_class(self, klass):
Packit 6f3914
        for attr in dir(klass):
Packit 6f3914
            if not attr.startswith(patch.TEST_PREFIX):
Packit 6f3914
                continue
Packit 6f3914
Packit 6f3914
            attr_value = getattr(klass, attr)
Packit 6f3914
            if not hasattr(attr_value, "__call__"):
Packit 6f3914
                continue
Packit 6f3914
Packit 6f3914
            patcher = self.copy()
Packit 6f3914
            setattr(klass, attr, patcher(attr_value))
Packit 6f3914
        return klass
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def decorate_callable(self, func):
Packit 6f3914
        if hasattr(func, 'patchings'):
Packit 6f3914
            func.patchings.append(self)
Packit 6f3914
            return func
Packit 6f3914
Packit 6f3914
        @wraps(func)
Packit 6f3914
        def patched(*args, **keywargs):
Packit 6f3914
            # don't use a with here (backwards compatibility with Python 2.4)
Packit 6f3914
            extra_args = []
Packit 6f3914
            entered_patchers = []
Packit 6f3914
Packit 6f3914
            # can't use try...except...finally because of Python 2.4
Packit 6f3914
            # compatibility
Packit 6f3914
            exc_info = tuple()
Packit 6f3914
            try:
Packit 6f3914
                try:
Packit 6f3914
                    for patching in patched.patchings:
Packit 6f3914
                        arg = patching.__enter__()
Packit 6f3914
                        entered_patchers.append(patching)
Packit 6f3914
                        if patching.attribute_name is not None:
Packit 6f3914
                            keywargs.update(arg)
Packit 6f3914
                        elif patching.new is DEFAULT:
Packit 6f3914
                            extra_args.append(arg)
Packit 6f3914
Packit 6f3914
                    args += tuple(extra_args)
Packit 6f3914
                    return func(*args, **keywargs)
Packit 6f3914
                except:
Packit 6f3914
                    if (patching not in entered_patchers and
Packit 6f3914
                        _is_started(patching)):
Packit 6f3914
                        # the patcher may have been started, but an exception
Packit 6f3914
                        # raised whilst entering one of its additional_patchers
Packit 6f3914
                        entered_patchers.append(patching)
Packit 6f3914
                    # Pass the exception to __exit__
Packit 6f3914
                    exc_info = sys.exc_info()
Packit 6f3914
                    # re-raise the exception
Packit 6f3914
                    raise
Packit 6f3914
            finally:
Packit 6f3914
                for patching in reversed(entered_patchers):
Packit 6f3914
                    patching.__exit__(*exc_info)
Packit 6f3914
Packit 6f3914
        patched.patchings = [self]
Packit 6f3914
        if hasattr(func, 'func_code'):
Packit 6f3914
            # not in Python 3
Packit 6f3914
            patched.compat_co_firstlineno = getattr(
Packit 6f3914
                func, "compat_co_firstlineno",
Packit 6f3914
                func.func_code.co_firstlineno
Packit 6f3914
            )
Packit 6f3914
        return patched
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def get_original(self):
Packit 6f3914
        target = self.getter()
Packit 6f3914
        name = self.attribute
Packit 6f3914
Packit 6f3914
        original = DEFAULT
Packit 6f3914
        local = False
Packit 6f3914
Packit 6f3914
        try:
Packit 6f3914
            original = target.__dict__[name]
Packit 6f3914
        except (AttributeError, KeyError):
Packit 6f3914
            original = getattr(target, name, DEFAULT)
Packit 6f3914
        else:
Packit 6f3914
            local = True
Packit 6f3914
Packit 6f3914
        if not self.create and original is DEFAULT:
Packit 6f3914
            raise AttributeError(
Packit 6f3914
                "%s does not have the attribute %r" % (target, name)
Packit 6f3914
            )
Packit 6f3914
        return original, local
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __enter__(self):
Packit 6f3914
        """Perform the patch."""
Packit 6f3914
        new, spec, spec_set = self.new, self.spec, self.spec_set
Packit 6f3914
        autospec, kwargs = self.autospec, self.kwargs
Packit 6f3914
        new_callable = self.new_callable
Packit 6f3914
        self.target = self.getter()
Packit 6f3914
Packit 6f3914
        # normalise False to None
Packit 6f3914
        if spec is False:
Packit 6f3914
            spec = None
Packit 6f3914
        if spec_set is False:
Packit 6f3914
            spec_set = None
Packit 6f3914
        if autospec is False:
Packit 6f3914
            autospec = None
Packit 6f3914
Packit 6f3914
        if spec is not None and autospec is not None:
Packit 6f3914
            raise TypeError("Can't specify spec and autospec")
Packit 6f3914
        if ((spec is not None or autospec is not None) and
Packit 6f3914
            spec_set not in (True, None)):
Packit 6f3914
            raise TypeError("Can't provide explicit spec_set *and* spec or autospec")
Packit 6f3914
Packit 6f3914
        original, local = self.get_original()
Packit 6f3914
Packit 6f3914
        if new is DEFAULT and autospec is None:
Packit 6f3914
            inherit = False
Packit 6f3914
            if spec is True:
Packit 6f3914
                # set spec to the object we are replacing
Packit 6f3914
                spec = original
Packit 6f3914
                if spec_set is True:
Packit 6f3914
                    spec_set = original
Packit 6f3914
                    spec = None
Packit 6f3914
            elif spec is not None:
Packit 6f3914
                if spec_set is True:
Packit 6f3914
                    spec_set = spec
Packit 6f3914
                    spec = None
Packit 6f3914
            elif spec_set is True:
Packit 6f3914
                spec_set = original
Packit 6f3914
Packit 6f3914
            if spec is not None or spec_set is not None:
Packit 6f3914
                if original is DEFAULT:
Packit 6f3914
                    raise TypeError("Can't use 'spec' with create=True")
Packit 6f3914
                if isinstance(original, ClassTypes):
Packit 6f3914
                    # If we're patching out a class and there is a spec
Packit 6f3914
                    inherit = True
Packit 6f3914
Packit 6f3914
            Klass = MagicMock
Packit 6f3914
            _kwargs = {}
Packit 6f3914
            if new_callable is not None:
Packit 6f3914
                Klass = new_callable
Packit 6f3914
            elif spec is not None or spec_set is not None:
Packit 6f3914
                this_spec = spec
Packit 6f3914
                if spec_set is not None:
Packit 6f3914
                    this_spec = spec_set
Packit 6f3914
                if _is_list(this_spec):
Packit 6f3914
                    not_callable = '__call__' not in this_spec
Packit 6f3914
                else:
Packit 6f3914
                    not_callable = not _callable(this_spec)
Packit 6f3914
                if not_callable:
Packit 6f3914
                    Klass = NonCallableMagicMock
Packit 6f3914
Packit 6f3914
            if spec is not None:
Packit 6f3914
                _kwargs['spec'] = spec
Packit 6f3914
            if spec_set is not None:
Packit 6f3914
                _kwargs['spec_set'] = spec_set
Packit 6f3914
Packit 6f3914
            # add a name to mocks
Packit 6f3914
            if (isinstance(Klass, type) and
Packit 6f3914
                issubclass(Klass, NonCallableMock) and self.attribute):
Packit 6f3914
                _kwargs['name'] = self.attribute
Packit 6f3914
Packit 6f3914
            _kwargs.update(kwargs)
Packit 6f3914
            new = Klass(**_kwargs)
Packit 6f3914
Packit 6f3914
            if inherit and _is_instance_mock(new):
Packit 6f3914
                # we can only tell if the instance should be callable if the
Packit 6f3914
                # spec is not a list
Packit 6f3914
                this_spec = spec
Packit 6f3914
                if spec_set is not None:
Packit 6f3914
                    this_spec = spec_set
Packit 6f3914
                if (not _is_list(this_spec) and not
Packit 6f3914
                    _instance_callable(this_spec)):
Packit 6f3914
                    Klass = NonCallableMagicMock
Packit 6f3914
Packit 6f3914
                _kwargs.pop('name')
Packit 6f3914
                new.return_value = Klass(_new_parent=new, _new_name='()',
Packit 6f3914
                                         **_kwargs)
Packit 6f3914
        elif autospec is not None:
Packit 6f3914
            # spec is ignored, new *must* be default, spec_set is treated
Packit 6f3914
            # as a boolean. Should we check spec is not None and that spec_set
Packit 6f3914
            # is a bool?
Packit 6f3914
            if new is not DEFAULT:
Packit 6f3914
                raise TypeError(
Packit 6f3914
                    "autospec creates the mock for you. Can't specify "
Packit 6f3914
                    "autospec and new."
Packit 6f3914
                )
Packit 6f3914
            if original is DEFAULT:
Packit 6f3914
                raise TypeError("Can't use 'autospec' with create=True")
Packit 6f3914
            spec_set = bool(spec_set)
Packit 6f3914
            if autospec is True:
Packit 6f3914
                autospec = original
Packit 6f3914
Packit 6f3914
            new = create_autospec(autospec, spec_set=spec_set,
Packit 6f3914
                                  _name=self.attribute, **kwargs)
Packit 6f3914
        elif kwargs:
Packit 6f3914
            # can't set keyword args when we aren't creating the mock
Packit 6f3914
            # XXXX If new is a Mock we could call new.configure_mock(**kwargs)
Packit 6f3914
            raise TypeError("Can't pass kwargs to a mock we aren't creating")
Packit 6f3914
Packit 6f3914
        new_attr = new
Packit 6f3914
Packit 6f3914
        self.temp_original = original
Packit 6f3914
        self.is_local = local
Packit 6f3914
        setattr(self.target, self.attribute, new_attr)
Packit 6f3914
        if self.attribute_name is not None:
Packit 6f3914
            extra_args = {}
Packit 6f3914
            if self.new is DEFAULT:
Packit 6f3914
                extra_args[self.attribute_name] =  new
Packit 6f3914
            for patching in self.additional_patchers:
Packit 6f3914
                arg = patching.__enter__()
Packit 6f3914
                if patching.new is DEFAULT:
Packit 6f3914
                    extra_args.update(arg)
Packit 6f3914
            return extra_args
Packit 6f3914
Packit 6f3914
        return new
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __exit__(self, *exc_info):
Packit 6f3914
        """Undo the patch."""
Packit 6f3914
        if not _is_started(self):
Packit 6f3914
            raise RuntimeError('stop called on unstarted patcher')
Packit 6f3914
Packit 6f3914
        if self.is_local and self.temp_original is not DEFAULT:
Packit 6f3914
            setattr(self.target, self.attribute, self.temp_original)
Packit 6f3914
        else:
Packit 6f3914
            delattr(self.target, self.attribute)
Packit 6f3914
            if not self.create and not hasattr(self.target, self.attribute):
Packit 6f3914
                # needed for proxy objects like django settings
Packit 6f3914
                setattr(self.target, self.attribute, self.temp_original)
Packit 6f3914
Packit 6f3914
        del self.temp_original
Packit 6f3914
        del self.is_local
Packit 6f3914
        del self.target
Packit 6f3914
        for patcher in reversed(self.additional_patchers):
Packit 6f3914
            if _is_started(patcher):
Packit 6f3914
                patcher.__exit__(*exc_info)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def start(self):
Packit 6f3914
        """Activate a patch, returning any created mock."""
Packit 6f3914
        result = self.__enter__()
Packit 6f3914
        self._active_patches.add(self)
Packit 6f3914
        return result
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def stop(self):
Packit 6f3914
        """Stop an active patch."""
Packit 6f3914
        self._active_patches.discard(self)
Packit 6f3914
        return self.__exit__()
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _get_target(target):
Packit 6f3914
    try:
Packit 6f3914
        target, attribute = target.rsplit('.', 1)
Packit 6f3914
    except (TypeError, ValueError):
Packit 6f3914
        raise TypeError("Need a valid target to patch. You supplied: %r" %
Packit 6f3914
                        (target,))
Packit 6f3914
    getter = lambda: _importer(target)
Packit 6f3914
    return getter, attribute
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _patch_object(
Packit 6f3914
        target, attribute, new=DEFAULT, spec=None,
Packit 6f3914
        create=False, spec_set=None, autospec=None,
Packit 6f3914
        new_callable=None, **kwargs
Packit 6f3914
    ):
Packit 6f3914
    """
Packit 6f3914
    patch.object(target, attribute, new=DEFAULT, spec=None, create=False,
Packit 6f3914
                 spec_set=None, autospec=None, new_callable=None, **kwargs)
Packit 6f3914
Packit 6f3914
    patch the named member (`attribute`) on an object (`target`) with a mock
Packit 6f3914
    object.
Packit 6f3914
Packit 6f3914
    `patch.object` can be used as a decorator, class decorator or a context
Packit 6f3914
    manager. Arguments `new`, `spec`, `create`, `spec_set`,
Packit 6f3914
    `autospec` and `new_callable` have the same meaning as for `patch`. Like
Packit 6f3914
    `patch`, `patch.object` takes arbitrary keyword arguments for configuring
Packit 6f3914
    the mock object it creates.
Packit 6f3914
Packit 6f3914
    When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
Packit 6f3914
    for choosing which methods to wrap.
Packit 6f3914
    """
Packit 6f3914
    getter = lambda: target
Packit 6f3914
    return _patch(
Packit 6f3914
        getter, attribute, new, spec, create,
Packit 6f3914
        spec_set, autospec, new_callable, kwargs
Packit 6f3914
    )
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _patch_multiple(target, spec=None, create=False, spec_set=None,
Packit 6f3914
                    autospec=None, new_callable=None, **kwargs):
Packit 6f3914
    """Perform multiple patches in a single call. It takes the object to be
Packit 6f3914
    patched (either as an object or a string to fetch the object by importing)
Packit 6f3914
    and keyword arguments for the patches::
Packit 6f3914
Packit 6f3914
        with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
Packit 6f3914
            ...
Packit 6f3914
Packit 6f3914
    Use `DEFAULT` as the value if you want `patch.multiple` to create
Packit 6f3914
    mocks for you. In this case the created mocks are passed into a decorated
Packit 6f3914
    function by keyword, and a dictionary is returned when `patch.multiple` is
Packit 6f3914
    used as a context manager.
Packit 6f3914
Packit 6f3914
    `patch.multiple` can be used as a decorator, class decorator or a context
Packit 6f3914
    manager. The arguments `spec`, `spec_set`, `create`,
Packit 6f3914
    `autospec` and `new_callable` have the same meaning as for `patch`. These
Packit 6f3914
    arguments will be applied to *all* patches done by `patch.multiple`.
Packit 6f3914
Packit 6f3914
    When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
Packit 6f3914
    for choosing which methods to wrap.
Packit 6f3914
    """
Packit 6f3914
    if type(target) in (unicode, str):
Packit 6f3914
        getter = lambda: _importer(target)
Packit 6f3914
    else:
Packit 6f3914
        getter = lambda: target
Packit 6f3914
Packit 6f3914
    if not kwargs:
Packit 6f3914
        raise ValueError(
Packit 6f3914
            'Must supply at least one keyword argument with patch.multiple'
Packit 6f3914
        )
Packit 6f3914
    # need to wrap in a list for python 3, where items is a view
Packit 6f3914
    items = list(kwargs.items())
Packit 6f3914
    attribute, new = items[0]
Packit 6f3914
    patcher = _patch(
Packit 6f3914
        getter, attribute, new, spec, create, spec_set,
Packit 6f3914
        autospec, new_callable, {}
Packit 6f3914
    )
Packit 6f3914
    patcher.attribute_name = attribute
Packit 6f3914
    for attribute, new in items[1:]:
Packit 6f3914
        this_patcher = _patch(
Packit 6f3914
            getter, attribute, new, spec, create, spec_set,
Packit 6f3914
            autospec, new_callable, {}
Packit 6f3914
        )
Packit 6f3914
        this_patcher.attribute_name = attribute
Packit 6f3914
        patcher.additional_patchers.append(this_patcher)
Packit 6f3914
    return patcher
Packit 6f3914
Packit 6f3914
Packit 6f3914
def patch(
Packit 6f3914
        target, new=DEFAULT, spec=None, create=False,
Packit 6f3914
        spec_set=None, autospec=None, new_callable=None, **kwargs
Packit 6f3914
    ):
Packit 6f3914
    """
Packit 6f3914
    `patch` acts as a function decorator, class decorator or a context
Packit 6f3914
    manager. Inside the body of the function or with statement, the `target`
Packit 6f3914
    is patched with a `new` object. When the function/with statement exits
Packit 6f3914
    the patch is undone.
Packit 6f3914
Packit 6f3914
    If `new` is omitted, then the target is replaced with a
Packit 6f3914
    `MagicMock`. If `patch` is used as a decorator and `new` is
Packit 6f3914
    omitted, the created mock is passed in as an extra argument to the
Packit 6f3914
    decorated function. If `patch` is used as a context manager the created
Packit 6f3914
    mock is returned by the context manager.
Packit 6f3914
Packit 6f3914
    `target` should be a string in the form `'package.module.ClassName'`. The
Packit 6f3914
    `target` is imported and the specified object replaced with the `new`
Packit 6f3914
    object, so the `target` must be importable from the environment you are
Packit 6f3914
    calling `patch` from. The target is imported when the decorated function
Packit 6f3914
    is executed, not at decoration time.
Packit 6f3914
Packit 6f3914
    The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
Packit 6f3914
    if patch is creating one for you.
Packit 6f3914
Packit 6f3914
    In addition you can pass `spec=True` or `spec_set=True`, which causes
Packit 6f3914
    patch to pass in the object being mocked as the spec/spec_set object.
Packit 6f3914
Packit 6f3914
    `new_callable` allows you to specify a different class, or callable object,
Packit 6f3914
    that will be called to create the `new` object. By default `MagicMock` is
Packit 6f3914
    used.
Packit 6f3914
Packit 6f3914
    A more powerful form of `spec` is `autospec`. If you set `autospec=True`
Packit 6f3914
    then the mock with be created with a spec from the object being replaced.
Packit 6f3914
    All attributes of the mock will also have the spec of the corresponding
Packit 6f3914
    attribute of the object being replaced. Methods and functions being
Packit 6f3914
    mocked will have their arguments checked and will raise a `TypeError` if
Packit 6f3914
    they are called with the wrong signature. For mocks replacing a class,
Packit 6f3914
    their return value (the 'instance') will have the same spec as the class.
Packit 6f3914
Packit 6f3914
    Instead of `autospec=True` you can pass `autospec=some_object` to use an
Packit 6f3914
    arbitrary object as the spec instead of the one being replaced.
Packit 6f3914
Packit 6f3914
    By default `patch` will fail to replace attributes that don't exist. If
Packit 6f3914
    you pass in `create=True`, and the attribute doesn't exist, patch will
Packit 6f3914
    create the attribute for you when the patched function is called, and
Packit 6f3914
    delete it again afterwards. This is useful for writing tests against
Packit 6f3914
    attributes that your production code creates at runtime. It is off by by
Packit 6f3914
    default because it can be dangerous. With it switched on you can write
Packit 6f3914
    passing tests against APIs that don't actually exist!
Packit 6f3914
Packit 6f3914
    Patch can be used as a `TestCase` class decorator. It works by
Packit 6f3914
    decorating each test method in the class. This reduces the boilerplate
Packit 6f3914
    code when your test methods share a common patchings set. `patch` finds
Packit 6f3914
    tests by looking for method names that start with `patch.TEST_PREFIX`.
Packit 6f3914
    By default this is `test`, which matches the way `unittest` finds tests.
Packit 6f3914
    You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
Packit 6f3914
Packit 6f3914
    Patch can be used as a context manager, with the with statement. Here the
Packit 6f3914
    patching applies to the indented block after the with statement. If you
Packit 6f3914
    use "as" then the patched object will be bound to the name after the
Packit 6f3914
    "as"; very useful if `patch` is creating a mock object for you.
Packit 6f3914
Packit 6f3914
    `patch` takes arbitrary keyword arguments. These will be passed to
Packit 6f3914
    the `Mock` (or `new_callable`) on construction.
Packit 6f3914
Packit 6f3914
    `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
Packit 6f3914
    available for alternate use-cases.
Packit 6f3914
    """
Packit 6f3914
    getter, attribute = _get_target(target)
Packit 6f3914
    return _patch(
Packit 6f3914
        getter, attribute, new, spec, create,
Packit 6f3914
        spec_set, autospec, new_callable, kwargs
Packit 6f3914
    )
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _patch_dict(object):
Packit 6f3914
    """
Packit 6f3914
    Patch a dictionary, or dictionary like object, and restore the dictionary
Packit 6f3914
    to its original state after the test.
Packit 6f3914
Packit 6f3914
    `in_dict` can be a dictionary or a mapping like container. If it is a
Packit 6f3914
    mapping then it must at least support getting, setting and deleting items
Packit 6f3914
    plus iterating over keys.
Packit 6f3914
Packit 6f3914
    `in_dict` can also be a string specifying the name of the dictionary, which
Packit 6f3914
    will then be fetched by importing it.
Packit 6f3914
Packit 6f3914
    `values` can be a dictionary of values to set in the dictionary. `values`
Packit 6f3914
    can also be an iterable of `(key, value)` pairs.
Packit 6f3914
Packit 6f3914
    If `clear` is True then the dictionary will be cleared before the new
Packit 6f3914
    values are set.
Packit 6f3914
Packit 6f3914
    `patch.dict` can also be called with arbitrary keyword arguments to set
Packit 6f3914
    values in the dictionary::
Packit 6f3914
Packit 6f3914
        with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):
Packit 6f3914
            ...
Packit 6f3914
Packit 6f3914
    `patch.dict` can be used as a context manager, decorator or class
Packit 6f3914
    decorator. When used as a class decorator `patch.dict` honours
Packit 6f3914
    `patch.TEST_PREFIX` for choosing which methods to wrap.
Packit 6f3914
    """
Packit 6f3914
Packit 6f3914
    def __init__(self, in_dict, values=(), clear=False, **kwargs):
Packit 6f3914
        if isinstance(in_dict, basestring):
Packit 6f3914
            in_dict = _importer(in_dict)
Packit 6f3914
        self.in_dict = in_dict
Packit 6f3914
        # support any argument supported by dict(...) constructor
Packit 6f3914
        self.values = dict(values)
Packit 6f3914
        self.values.update(kwargs)
Packit 6f3914
        self.clear = clear
Packit 6f3914
        self._original = None
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __call__(self, f):
Packit 6f3914
        if isinstance(f, ClassTypes):
Packit 6f3914
            return self.decorate_class(f)
Packit 6f3914
        @wraps(f)
Packit 6f3914
        def _inner(*args, **kw):
Packit 6f3914
            self._patch_dict()
Packit 6f3914
            try:
Packit 6f3914
                return f(*args, **kw)
Packit 6f3914
            finally:
Packit 6f3914
                self._unpatch_dict()
Packit 6f3914
Packit 6f3914
        return _inner
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def decorate_class(self, klass):
Packit 6f3914
        for attr in dir(klass):
Packit 6f3914
            attr_value = getattr(klass, attr)
Packit 6f3914
            if (attr.startswith(patch.TEST_PREFIX) and
Packit 6f3914
                 hasattr(attr_value, "__call__")):
Packit 6f3914
                decorator = _patch_dict(self.in_dict, self.values, self.clear)
Packit 6f3914
                decorated = decorator(attr_value)
Packit 6f3914
                setattr(klass, attr, decorated)
Packit 6f3914
        return klass
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __enter__(self):
Packit 6f3914
        """Patch the dict."""
Packit 6f3914
        self._patch_dict()
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _patch_dict(self):
Packit 6f3914
        values = self.values
Packit 6f3914
        in_dict = self.in_dict
Packit 6f3914
        clear = self.clear
Packit 6f3914
Packit 6f3914
        try:
Packit 6f3914
            original = in_dict.copy()
Packit 6f3914
        except AttributeError:
Packit 6f3914
            # dict like object with no copy method
Packit 6f3914
            # must support iteration over keys
Packit 6f3914
            original = {}
Packit 6f3914
            for key in in_dict:
Packit 6f3914
                original[key] = in_dict[key]
Packit 6f3914
        self._original = original
Packit 6f3914
Packit 6f3914
        if clear:
Packit 6f3914
            _clear_dict(in_dict)
Packit 6f3914
Packit 6f3914
        try:
Packit 6f3914
            in_dict.update(values)
Packit 6f3914
        except AttributeError:
Packit 6f3914
            # dict like object with no update method
Packit 6f3914
            for key in values:
Packit 6f3914
                in_dict[key] = values[key]
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _unpatch_dict(self):
Packit 6f3914
        in_dict = self.in_dict
Packit 6f3914
        original = self._original
Packit 6f3914
Packit 6f3914
        _clear_dict(in_dict)
Packit 6f3914
Packit 6f3914
        try:
Packit 6f3914
            in_dict.update(original)
Packit 6f3914
        except AttributeError:
Packit 6f3914
            for key in original:
Packit 6f3914
                in_dict[key] = original[key]
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __exit__(self, *args):
Packit 6f3914
        """Unpatch the dict."""
Packit 6f3914
        self._unpatch_dict()
Packit 6f3914
        return False
Packit 6f3914
Packit 6f3914
    start = __enter__
Packit 6f3914
    stop = __exit__
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _clear_dict(in_dict):
Packit 6f3914
    try:
Packit 6f3914
        in_dict.clear()
Packit 6f3914
    except AttributeError:
Packit 6f3914
        keys = list(in_dict)
Packit 6f3914
        for key in keys:
Packit 6f3914
            del in_dict[key]
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _patch_stopall():
Packit 6f3914
    """Stop all active patches."""
Packit 6f3914
    for patch in list(_patch._active_patches):
Packit 6f3914
        patch.stop()
Packit 6f3914
Packit 6f3914
Packit 6f3914
patch.object = _patch_object
Packit 6f3914
patch.dict = _patch_dict
Packit 6f3914
patch.multiple = _patch_multiple
Packit 6f3914
patch.stopall = _patch_stopall
Packit 6f3914
patch.TEST_PREFIX = 'test'
Packit 6f3914
Packit 6f3914
magic_methods = (
Packit 6f3914
    "lt le gt ge eq ne "
Packit 6f3914
    "getitem setitem delitem "
Packit 6f3914
    "len contains iter "
Packit 6f3914
    "hash str sizeof "
Packit 6f3914
    "enter exit "
Packit 6f3914
    "divmod neg pos abs invert "
Packit 6f3914
    "complex int float index "
Packit 6f3914
    "trunc floor ceil "
Packit 6f3914
)
Packit 6f3914
Packit 6f3914
numerics = "add sub mul div floordiv mod lshift rshift and xor or pow "
Packit 6f3914
inplace = ' '.join('i%s' % n for n in numerics.split())
Packit 6f3914
right = ' '.join('r%s' % n for n in numerics.split())
Packit 6f3914
extra = ''
Packit 6f3914
if inPy3k:
Packit 6f3914
    extra = 'bool next '
Packit 6f3914
else:
Packit 6f3914
    extra = 'unicode long nonzero oct hex truediv rtruediv '
Packit 6f3914
Packit 6f3914
# not including __prepare__, __instancecheck__, __subclasscheck__
Packit 6f3914
# (as they are metaclass methods)
Packit 6f3914
# __del__ is not supported at all as it causes problems if it exists
Packit 6f3914
Packit 6f3914
_non_defaults = set('__%s__' % method for method in [
Packit 6f3914
    'cmp', 'getslice', 'setslice', 'coerce', 'subclasses',
Packit 6f3914
    'format', 'get', 'set', 'delete', 'reversed',
Packit 6f3914
    'missing', 'reduce', 'reduce_ex', 'getinitargs',
Packit 6f3914
    'getnewargs', 'getstate', 'setstate', 'getformat',
Packit 6f3914
    'setformat', 'repr', 'dir'
Packit 6f3914
])
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _get_method(name, func):
Packit 6f3914
    "Turns a callable object (like a mock) into a real function"
Packit 6f3914
    def method(self, *args, **kw):
Packit 6f3914
        return func(self, *args, **kw)
Packit 6f3914
    method.__name__ = name
Packit 6f3914
    return method
Packit 6f3914
Packit 6f3914
Packit 6f3914
_magics = set(
Packit 6f3914
    '__%s__' % method for method in
Packit 6f3914
    ' '.join([magic_methods, numerics, inplace, right, extra]).split()
Packit 6f3914
)
Packit 6f3914
Packit 6f3914
_all_magics = _magics | _non_defaults
Packit 6f3914
Packit 6f3914
_unsupported_magics = set([
Packit 6f3914
    '__getattr__', '__setattr__',
Packit 6f3914
    '__init__', '__new__', '__prepare__'
Packit 6f3914
    '__instancecheck__', '__subclasscheck__',
Packit 6f3914
    '__del__'
Packit 6f3914
])
Packit 6f3914
Packit 6f3914
_calculate_return_value = {
Packit 6f3914
    '__hash__': lambda self: object.__hash__(self),
Packit 6f3914
    '__str__': lambda self: object.__str__(self),
Packit 6f3914
    '__sizeof__': lambda self: object.__sizeof__(self),
Packit 6f3914
    '__unicode__': lambda self: unicode(object.__str__(self)),
Packit 6f3914
}
Packit 6f3914
Packit 6f3914
_return_values = {
Packit 6f3914
    '__lt__': NotImplemented,
Packit 6f3914
    '__gt__': NotImplemented,
Packit 6f3914
    '__le__': NotImplemented,
Packit 6f3914
    '__ge__': NotImplemented,
Packit 6f3914
    '__int__': 1,
Packit 6f3914
    '__contains__': False,
Packit 6f3914
    '__len__': 0,
Packit 6f3914
    '__exit__': False,
Packit 6f3914
    '__complex__': 1j,
Packit 6f3914
    '__float__': 1.0,
Packit 6f3914
    '__bool__': True,
Packit 6f3914
    '__nonzero__': True,
Packit 6f3914
    '__oct__': '1',
Packit 6f3914
    '__hex__': '0x1',
Packit 6f3914
    '__long__': long(1),
Packit 6f3914
    '__index__': 1,
Packit 6f3914
}
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _get_eq(self):
Packit 6f3914
    def __eq__(other):
Packit 6f3914
        ret_val = self.__eq__._mock_return_value
Packit 6f3914
        if ret_val is not DEFAULT:
Packit 6f3914
            return ret_val
Packit 6f3914
        return self is other
Packit 6f3914
    return __eq__
Packit 6f3914
Packit 6f3914
def _get_ne(self):
Packit 6f3914
    def __ne__(other):
Packit 6f3914
        if self.__ne__._mock_return_value is not DEFAULT:
Packit 6f3914
            return DEFAULT
Packit 6f3914
        return self is not other
Packit 6f3914
    return __ne__
Packit 6f3914
Packit 6f3914
def _get_iter(self):
Packit 6f3914
    def __iter__():
Packit 6f3914
        ret_val = self.__iter__._mock_return_value
Packit 6f3914
        if ret_val is DEFAULT:
Packit 6f3914
            return iter([])
Packit 6f3914
        # if ret_val was already an iterator, then calling iter on it should
Packit 6f3914
        # return the iterator unchanged
Packit 6f3914
        return iter(ret_val)
Packit 6f3914
    return __iter__
Packit 6f3914
Packit 6f3914
_side_effect_methods = {
Packit 6f3914
    '__eq__': _get_eq,
Packit 6f3914
    '__ne__': _get_ne,
Packit 6f3914
    '__iter__': _get_iter,
Packit 6f3914
}
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _set_return_value(mock, method, name):
Packit 6f3914
    fixed = _return_values.get(name, DEFAULT)
Packit 6f3914
    if fixed is not DEFAULT:
Packit 6f3914
        method.return_value = fixed
Packit 6f3914
        return
Packit 6f3914
Packit 6f3914
    return_calulator = _calculate_return_value.get(name)
Packit 6f3914
    if return_calulator is not None:
Packit 6f3914
        try:
Packit 6f3914
            return_value = return_calulator(mock)
Packit 6f3914
        except AttributeError:
Packit 6f3914
            # XXXX why do we return AttributeError here?
Packit 6f3914
            #      set it as a side_effect instead?
Packit 6f3914
            return_value = AttributeError(name)
Packit 6f3914
        method.return_value = return_value
Packit 6f3914
        return
Packit 6f3914
Packit 6f3914
    side_effector = _side_effect_methods.get(name)
Packit 6f3914
    if side_effector is not None:
Packit 6f3914
        method.side_effect = side_effector(mock)
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class MagicMixin(object):
Packit 6f3914
    def __init__(self, *args, **kw):
Packit 6f3914
        _super(MagicMixin, self).__init__(*args, **kw)
Packit 6f3914
        self._mock_set_magics()
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def _mock_set_magics(self):
Packit 6f3914
        these_magics = _magics
Packit 6f3914
Packit 6f3914
        if self._mock_methods is not None:
Packit 6f3914
            these_magics = _magics.intersection(self._mock_methods)
Packit 6f3914
Packit 6f3914
            remove_magics = set()
Packit 6f3914
            remove_magics = _magics - these_magics
Packit 6f3914
Packit 6f3914
            for entry in remove_magics:
Packit 6f3914
                if entry in type(self).__dict__:
Packit 6f3914
                    # remove unneeded magic methods
Packit 6f3914
                    delattr(self, entry)
Packit 6f3914
Packit 6f3914
        # don't overwrite existing attributes if called a second time
Packit 6f3914
        these_magics = these_magics - set(type(self).__dict__)
Packit 6f3914
Packit 6f3914
        _type = type(self)
Packit 6f3914
        for entry in these_magics:
Packit 6f3914
            setattr(_type, entry, MagicProxy(entry, self))
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class NonCallableMagicMock(MagicMixin, NonCallableMock):
Packit 6f3914
    """A version of `MagicMock` that isn't callable."""
Packit 6f3914
    def mock_add_spec(self, spec, spec_set=False):
Packit 6f3914
        """Add a spec to a mock. `spec` can either be an object or a
Packit 6f3914
        list of strings. Only attributes on the `spec` can be fetched as
Packit 6f3914
        attributes from the mock.
Packit 6f3914
Packit 6f3914
        If `spec_set` is True then only attributes on the spec can be set."""
Packit 6f3914
        self._mock_add_spec(spec, spec_set)
Packit 6f3914
        self._mock_set_magics()
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class MagicMock(MagicMixin, Mock):
Packit 6f3914
    """
Packit 6f3914
    MagicMock is a subclass of Mock with default implementations
Packit 6f3914
    of most of the magic methods. You can use MagicMock without having to
Packit 6f3914
    configure the magic methods yourself.
Packit 6f3914
Packit 6f3914
    If you use the `spec` or `spec_set` arguments then *only* magic
Packit 6f3914
    methods that exist in the spec will be created.
Packit 6f3914
Packit 6f3914
    Attributes and the return value of a `MagicMock` will also be `MagicMocks`.
Packit 6f3914
    """
Packit 6f3914
    def mock_add_spec(self, spec, spec_set=False):
Packit 6f3914
        """Add a spec to a mock. `spec` can either be an object or a
Packit 6f3914
        list of strings. Only attributes on the `spec` can be fetched as
Packit 6f3914
        attributes from the mock.
Packit 6f3914
Packit 6f3914
        If `spec_set` is True then only attributes on the spec can be set."""
Packit 6f3914
        self._mock_add_spec(spec, spec_set)
Packit 6f3914
        self._mock_set_magics()
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class MagicProxy(object):
Packit 6f3914
    def __init__(self, name, parent):
Packit 6f3914
        self.name = name
Packit 6f3914
        self.parent = parent
Packit 6f3914
Packit 6f3914
    def __call__(self, *args, **kwargs):
Packit 6f3914
        m = self.create_mock()
Packit 6f3914
        return m(*args, **kwargs)
Packit 6f3914
Packit 6f3914
    def create_mock(self):
Packit 6f3914
        entry = self.name
Packit 6f3914
        parent = self.parent
Packit 6f3914
        m = parent._get_child_mock(name=entry, _new_name=entry,
Packit 6f3914
                                   _new_parent=parent)
Packit 6f3914
        setattr(parent, entry, m)
Packit 6f3914
        _set_return_value(parent, m, entry)
Packit 6f3914
        return m
Packit 6f3914
Packit 6f3914
    def __get__(self, obj, _type=None):
Packit 6f3914
        return self.create_mock()
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _ANY(object):
Packit 6f3914
    "A helper object that compares equal to everything."
Packit 6f3914
Packit 6f3914
    def __eq__(self, other):
Packit 6f3914
        return True
Packit 6f3914
Packit 6f3914
    def __ne__(self, other):
Packit 6f3914
        return False
Packit 6f3914
Packit 6f3914
    def __repr__(self):
Packit 6f3914
        return '<ANY>'
Packit 6f3914
Packit 6f3914
ANY = _ANY()
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _format_call_signature(name, args, kwargs):
Packit 6f3914
    message = '%s(%%s)' % name
Packit 6f3914
    formatted_args = ''
Packit 6f3914
    args_string = ', '.join([repr(arg) for arg in args])
Packit 6f3914
    kwargs_string = ', '.join([
Packit 6f3914
        '%s=%r' % (key, value) for key, value in kwargs.items()
Packit 6f3914
    ])
Packit 6f3914
    if args_string:
Packit 6f3914
        formatted_args = args_string
Packit 6f3914
    if kwargs_string:
Packit 6f3914
        if formatted_args:
Packit 6f3914
            formatted_args += ', '
Packit 6f3914
        formatted_args += kwargs_string
Packit 6f3914
Packit 6f3914
    return message % formatted_args
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _Call(tuple):
Packit 6f3914
    """
Packit 6f3914
    A tuple for holding the results of a call to a mock, either in the form
Packit 6f3914
    `(args, kwargs)` or `(name, args, kwargs)`.
Packit 6f3914
Packit 6f3914
    If args or kwargs are empty then a call tuple will compare equal to
Packit 6f3914
    a tuple without those values. This makes comparisons less verbose::
Packit 6f3914
Packit 6f3914
        _Call(('name', (), {})) == ('name',)
Packit 6f3914
        _Call(('name', (1,), {})) == ('name', (1,))
Packit 6f3914
        _Call(((), {'a': 'b'})) == ({'a': 'b'},)
Packit 6f3914
Packit 6f3914
    The `_Call` object provides a useful shortcut for comparing with call::
Packit 6f3914
Packit 6f3914
        _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)
Packit 6f3914
        _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)
Packit 6f3914
Packit 6f3914
    If the _Call has no name then it will match any name.
Packit 6f3914
    """
Packit 6f3914
    def __new__(cls, value=(), name=None, parent=None, two=False,
Packit 6f3914
                from_kall=True):
Packit 6f3914
        name = ''
Packit 6f3914
        args = ()
Packit 6f3914
        kwargs = {}
Packit 6f3914
        _len = len(value)
Packit 6f3914
        if _len == 3:
Packit 6f3914
            name, args, kwargs = value
Packit 6f3914
        elif _len == 2:
Packit 6f3914
            first, second = value
Packit 6f3914
            if isinstance(first, basestring):
Packit 6f3914
                name = first
Packit 6f3914
                if isinstance(second, tuple):
Packit 6f3914
                    args = second
Packit 6f3914
                else:
Packit 6f3914
                    kwargs = second
Packit 6f3914
            else:
Packit 6f3914
                args, kwargs = first, second
Packit 6f3914
        elif _len == 1:
Packit 6f3914
            value, = value
Packit 6f3914
            if isinstance(value, basestring):
Packit 6f3914
                name = value
Packit 6f3914
            elif isinstance(value, tuple):
Packit 6f3914
                args = value
Packit 6f3914
            else:
Packit 6f3914
                kwargs = value
Packit 6f3914
Packit 6f3914
        if two:
Packit 6f3914
            return tuple.__new__(cls, (args, kwargs))
Packit 6f3914
Packit 6f3914
        return tuple.__new__(cls, (name, args, kwargs))
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __init__(self, value=(), name=None, parent=None, two=False,
Packit 6f3914
                 from_kall=True):
Packit 6f3914
        self.name = name
Packit 6f3914
        self.parent = parent
Packit 6f3914
        self.from_kall = from_kall
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __eq__(self, other):
Packit 6f3914
        if other is ANY:
Packit 6f3914
            return True
Packit 6f3914
        try:
Packit 6f3914
            len_other = len(other)
Packit 6f3914
        except TypeError:
Packit 6f3914
            return False
Packit 6f3914
Packit 6f3914
        self_name = ''
Packit 6f3914
        if len(self) == 2:
Packit 6f3914
            self_args, self_kwargs = self
Packit 6f3914
        else:
Packit 6f3914
            self_name, self_args, self_kwargs = self
Packit 6f3914
Packit 6f3914
        other_name = ''
Packit 6f3914
        if len_other == 0:
Packit 6f3914
            other_args, other_kwargs = (), {}
Packit 6f3914
        elif len_other == 3:
Packit 6f3914
            other_name, other_args, other_kwargs = other
Packit 6f3914
        elif len_other == 1:
Packit 6f3914
            value, = other
Packit 6f3914
            if isinstance(value, tuple):
Packit 6f3914
                other_args = value
Packit 6f3914
                other_kwargs = {}
Packit 6f3914
            elif isinstance(value, basestring):
Packit 6f3914
                other_name = value
Packit 6f3914
                other_args, other_kwargs = (), {}
Packit 6f3914
            else:
Packit 6f3914
                other_args = ()
Packit 6f3914
                other_kwargs = value
Packit 6f3914
        else:
Packit 6f3914
            # len 2
Packit 6f3914
            # could be (name, args) or (name, kwargs) or (args, kwargs)
Packit 6f3914
            first, second = other
Packit 6f3914
            if isinstance(first, basestring):
Packit 6f3914
                other_name = first
Packit 6f3914
                if isinstance(second, tuple):
Packit 6f3914
                    other_args, other_kwargs = second, {}
Packit 6f3914
                else:
Packit 6f3914
                    other_args, other_kwargs = (), second
Packit 6f3914
            else:
Packit 6f3914
                other_args, other_kwargs = first, second
Packit 6f3914
Packit 6f3914
        if self_name and other_name != self_name:
Packit 6f3914
            return False
Packit 6f3914
Packit 6f3914
        # this order is important for ANY to work!
Packit 6f3914
        return (other_args, other_kwargs) == (self_args, self_kwargs)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __ne__(self, other):
Packit 6f3914
        return not self.__eq__(other)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __call__(self, *args, **kwargs):
Packit 6f3914
        if self.name is None:
Packit 6f3914
            return _Call(('', args, kwargs), name='()')
Packit 6f3914
Packit 6f3914
        name = self.name + '()'
Packit 6f3914
        return _Call((self.name, args, kwargs), name=name, parent=self)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __getattr__(self, attr):
Packit 6f3914
        if self.name is None:
Packit 6f3914
            return _Call(name=attr, from_kall=False)
Packit 6f3914
        name = '%s.%s' % (self.name, attr)
Packit 6f3914
        return _Call(name=name, parent=self, from_kall=False)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def __repr__(self):
Packit 6f3914
        if not self.from_kall:
Packit 6f3914
            name = self.name or 'call'
Packit 6f3914
            if name.startswith('()'):
Packit 6f3914
                name = 'call%s' % name
Packit 6f3914
            return name
Packit 6f3914
Packit 6f3914
        if len(self) == 2:
Packit 6f3914
            name = 'call'
Packit 6f3914
            args, kwargs = self
Packit 6f3914
        else:
Packit 6f3914
            name, args, kwargs = self
Packit 6f3914
            if not name:
Packit 6f3914
                name = 'call'
Packit 6f3914
            elif not name.startswith('()'):
Packit 6f3914
                name = 'call.%s' % name
Packit 6f3914
            else:
Packit 6f3914
                name = 'call%s' % name
Packit 6f3914
        return _format_call_signature(name, args, kwargs)
Packit 6f3914
Packit 6f3914
Packit 6f3914
    def call_list(self):
Packit 6f3914
        """For a call object that represents multiple calls, `call_list`
Packit 6f3914
        returns a list of all the intermediate calls as well as the
Packit 6f3914
        final call."""
Packit 6f3914
        vals = []
Packit 6f3914
        thing = self
Packit 6f3914
        while thing is not None:
Packit 6f3914
            if thing.from_kall:
Packit 6f3914
                vals.append(thing)
Packit 6f3914
            thing = thing.parent
Packit 6f3914
        return _CallList(reversed(vals))
Packit 6f3914
Packit 6f3914
Packit 6f3914
call = _Call(from_kall=False)
Packit 6f3914
Packit 6f3914
Packit 6f3914
Packit 6f3914
def create_autospec(spec, spec_set=False, instance=False, _parent=None,
Packit 6f3914
                    _name=None, **kwargs):
Packit 6f3914
    """Create a mock object using another object as a spec. Attributes on the
Packit 6f3914
    mock will use the corresponding attribute on the `spec` object as their
Packit 6f3914
    spec.
Packit 6f3914
Packit 6f3914
    Functions or methods being mocked will have their arguments checked
Packit 6f3914
    to check that they are called with the correct signature.
Packit 6f3914
Packit 6f3914
    If `spec_set` is True then attempting to set attributes that don't exist
Packit 6f3914
    on the spec object will raise an `AttributeError`.
Packit 6f3914
Packit 6f3914
    If a class is used as a spec then the return value of the mock (the
Packit 6f3914
    instance of the class) will have the same spec. You can use a class as the
Packit 6f3914
    spec for an instance object by passing `instance=True`. The returned mock
Packit 6f3914
    will only be callable if instances of the mock are callable.
Packit 6f3914
Packit 6f3914
    `create_autospec` also takes arbitrary keyword arguments that are passed to
Packit 6f3914
    the constructor of the created mock."""
Packit 6f3914
    if _is_list(spec):
Packit 6f3914
        # can't pass a list instance to the mock constructor as it will be
Packit 6f3914
        # interpreted as a list of strings
Packit 6f3914
        spec = type(spec)
Packit 6f3914
Packit 6f3914
    is_type = isinstance(spec, ClassTypes)
Packit 6f3914
Packit 6f3914
    _kwargs = {'spec': spec}
Packit 6f3914
    if spec_set:
Packit 6f3914
        _kwargs = {'spec_set': spec}
Packit 6f3914
    elif spec is None:
Packit 6f3914
        # None we mock with a normal mock without a spec
Packit 6f3914
        _kwargs = {}
Packit 6f3914
Packit 6f3914
    _kwargs.update(kwargs)
Packit 6f3914
Packit 6f3914
    Klass = MagicMock
Packit 6f3914
    if type(spec) in DescriptorTypes:
Packit 6f3914
        # descriptors don't have a spec
Packit 6f3914
        # because we don't know what type they return
Packit 6f3914
        _kwargs = {}
Packit 6f3914
    elif not _callable(spec):
Packit 6f3914
        Klass = NonCallableMagicMock
Packit 6f3914
    elif is_type and instance and not _instance_callable(spec):
Packit 6f3914
        Klass = NonCallableMagicMock
Packit 6f3914
Packit 6f3914
    _new_name = _name
Packit 6f3914
    if _parent is None:
Packit 6f3914
        # for a top level object no _new_name should be set
Packit 6f3914
        _new_name = ''
Packit 6f3914
Packit 6f3914
    mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
Packit 6f3914
                 name=_name, **_kwargs)
Packit 6f3914
Packit 6f3914
    if isinstance(spec, FunctionTypes):
Packit 6f3914
        # should only happen at the top level because we don't
Packit 6f3914
        # recurse for functions
Packit 6f3914
        mock = _set_signature(mock, spec)
Packit 6f3914
    else:
Packit 6f3914
        _check_signature(spec, mock, is_type, instance)
Packit 6f3914
Packit 6f3914
    if _parent is not None and not instance:
Packit 6f3914
        _parent._mock_children[_name] = mock
Packit 6f3914
Packit 6f3914
    if is_type and not instance and 'return_value' not in kwargs:
Packit 6f3914
        mock.return_value = create_autospec(spec, spec_set, instance=True,
Packit 6f3914
                                            _name='()', _parent=mock)
Packit 6f3914
Packit 6f3914
    for entry in dir(spec):
Packit 6f3914
        if _is_magic(entry):
Packit 6f3914
            # MagicMock already does the useful magic methods for us
Packit 6f3914
            continue
Packit 6f3914
Packit 6f3914
        if isinstance(spec, FunctionTypes) and entry in FunctionAttributes:
Packit 6f3914
            # allow a mock to actually be a function
Packit 6f3914
            continue
Packit 6f3914
Packit 6f3914
        # XXXX do we need a better way of getting attributes without
Packit 6f3914
        # triggering code execution (?) Probably not - we need the actual
Packit 6f3914
        # object to mock it so we would rather trigger a property than mock
Packit 6f3914
        # the property descriptor. Likewise we want to mock out dynamically
Packit 6f3914
        # provided attributes.
Packit 6f3914
        # XXXX what about attributes that raise exceptions other than
Packit 6f3914
        # AttributeError on being fetched?
Packit 6f3914
        # we could be resilient against it, or catch and propagate the
Packit 6f3914
        # exception when the attribute is fetched from the mock
Packit 6f3914
        try:
Packit 6f3914
            original = getattr(spec, entry)
Packit 6f3914
        except AttributeError:
Packit 6f3914
            continue
Packit 6f3914
Packit 6f3914
        kwargs = {'spec': original}
Packit 6f3914
        if spec_set:
Packit 6f3914
            kwargs = {'spec_set': original}
Packit 6f3914
Packit 6f3914
        if not isinstance(original, FunctionTypes):
Packit 6f3914
            new = _SpecState(original, spec_set, mock, entry, instance)
Packit 6f3914
            mock._mock_children[entry] = new
Packit 6f3914
        else:
Packit 6f3914
            parent = mock
Packit 6f3914
            if isinstance(spec, FunctionTypes):
Packit 6f3914
                parent = mock.mock
Packit 6f3914
Packit 6f3914
            new = MagicMock(parent=parent, name=entry, _new_name=entry,
Packit 6f3914
                            _new_parent=parent, **kwargs)
Packit 6f3914
            mock._mock_children[entry] = new
Packit 6f3914
            skipfirst = _must_skip(spec, entry, is_type)
Packit 6f3914
            _check_signature(original, new, skipfirst=skipfirst)
Packit 6f3914
Packit 6f3914
        # so functions created with _set_signature become instance attributes,
Packit 6f3914
        # *plus* their underlying mock exists in _mock_children of the parent
Packit 6f3914
        # mock. Adding to _mock_children may be unnecessary where we are also
Packit 6f3914
        # setting as an instance attribute?
Packit 6f3914
        if isinstance(new, FunctionTypes):
Packit 6f3914
            setattr(mock, entry, new)
Packit 6f3914
Packit 6f3914
    return mock
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _must_skip(spec, entry, is_type):
Packit 6f3914
    if not isinstance(spec, ClassTypes):
Packit 6f3914
        if entry in getattr(spec, '__dict__', {}):
Packit 6f3914
            # instance attribute - shouldn't skip
Packit 6f3914
            return False
Packit 6f3914
        spec = spec.__class__
Packit 6f3914
    if not hasattr(spec, '__mro__'):
Packit 6f3914
        # old style class: can't have descriptors anyway
Packit 6f3914
        return is_type
Packit 6f3914
Packit 6f3914
    for klass in spec.__mro__:
Packit 6f3914
        result = klass.__dict__.get(entry, DEFAULT)
Packit 6f3914
        if result is DEFAULT:
Packit 6f3914
            continue
Packit 6f3914
        if isinstance(result, (staticmethod, classmethod)):
Packit 6f3914
            return False
Packit 6f3914
        return is_type
Packit 6f3914
Packit 6f3914
    # shouldn't get here unless function is a dynamically provided attribute
Packit 6f3914
    # XXXX untested behaviour
Packit 6f3914
    return is_type
Packit 6f3914
Packit 6f3914
Packit 6f3914
def _get_class(obj):
Packit 6f3914
    try:
Packit 6f3914
        return obj.__class__
Packit 6f3914
    except AttributeError:
Packit 6f3914
        # in Python 2, _sre.SRE_Pattern objects have no __class__
Packit 6f3914
        return type(obj)
Packit 6f3914
Packit 6f3914
Packit 6f3914
class _SpecState(object):
Packit 6f3914
Packit 6f3914
    def __init__(self, spec, spec_set=False, parent=None,
Packit 6f3914
                 name=None, ids=None, instance=False):
Packit 6f3914
        self.spec = spec
Packit 6f3914
        self.ids = ids
Packit 6f3914
        self.spec_set = spec_set
Packit 6f3914
        self.parent = parent
Packit 6f3914
        self.instance = instance
Packit 6f3914
        self.name = name
Packit 6f3914
Packit 6f3914
Packit 6f3914
FunctionTypes = (
Packit 6f3914
    # python function
Packit 6f3914
    type(create_autospec),
Packit 6f3914
    # instance method
Packit 6f3914
    type(ANY.__eq__),
Packit 6f3914
    # unbound method
Packit 6f3914
    type(_ANY.__eq__),
Packit 6f3914
)
Packit 6f3914
Packit 6f3914
FunctionAttributes = set([
Packit 6f3914
    'func_closure',
Packit 6f3914
    'func_code',
Packit 6f3914
    'func_defaults',
Packit 6f3914
    'func_dict',
Packit 6f3914
    'func_doc',
Packit 6f3914
    'func_globals',
Packit 6f3914
    'func_name',
Packit 6f3914
])
Packit 6f3914
Packit 6f3914
Packit 6f3914
file_spec = None
Packit 6f3914
Packit 6f3914
Packit 6f3914
def mock_open(mock=None, read_data=''):
Packit 6f3914
    """
Packit 6f3914
    A helper function to create a mock to replace the use of `open`. It works
Packit 6f3914
    for `open` called directly or used as a context manager.
Packit 6f3914
Packit 6f3914
    The `mock` argument is the mock object to configure. If `None` (the
Packit 6f3914
    default) then a `MagicMock` will be created for you, with the API limited
Packit 6f3914
    to methods or attributes available on standard file handles.
Packit 6f3914
Packit 6f3914
    `read_data` is a string for the `read` method of the file handle to return.
Packit 6f3914
    This is an empty string by default.
Packit 6f3914
    """
Packit 6f3914
    global file_spec
Packit 6f3914
    if file_spec is None:
Packit 6f3914
        # set on first use
Packit 6f3914
        if inPy3k:
Packit 6f3914
            import _io
Packit 6f3914
            file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
Packit 6f3914
        else:
Packit 6f3914
            file_spec = file
Packit 6f3914
Packit 6f3914
    if mock is None:
Packit 6f3914
        mock = MagicMock(name='open', spec=open)
Packit 6f3914
Packit 6f3914
    handle = MagicMock(spec=file_spec)
Packit 6f3914
    handle.write.return_value = None
Packit 6f3914
    handle.__enter__.return_value = handle
Packit 6f3914
    handle.read.return_value = read_data
Packit 6f3914
Packit 6f3914
    mock.return_value = handle
Packit 6f3914
    return mock
Packit 6f3914
Packit 6f3914
Packit 6f3914
class PropertyMock(Mock):
Packit 6f3914
    """
Packit 6f3914
    A mock intended to be used as a property, or other descriptor, on a class.
Packit 6f3914
    `PropertyMock` provides `__get__` and `__set__` methods so you can specify
Packit 6f3914
    a return value when it is fetched.
Packit 6f3914
Packit 6f3914
    Fetching a `PropertyMock` instance from an object calls the mock, with
Packit 6f3914
    no args. Setting it calls the mock with the value being set.
Packit 6f3914
    """
Packit 6f3914
    def _get_child_mock(self, **kwargs):
Packit 6f3914
        return MagicMock(**kwargs)
Packit 6f3914
Packit 6f3914
    def __get__(self, obj, obj_type):
Packit 6f3914
        return self()
Packit 6f3914
    def __set__(self, obj, val):
Packit 6f3914
        self(val)