Blame tests/mock.py

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