.. currentmodule:: mock


CHANGELOG
=========

2012/11/5 Version 1.0.1
-----------------------

* Functions decorated with `patch` variants have a `__wrapped__` attribute
  pointing to the original function. This brings compatibility with the
  default behaviour in Python 3.3 (due to a new feature in `functools.wraps`).

Note that due to changes in `tox`, `mock` is no longer tested with Python 2.4.
The compatibility code has not been removed so it probably still works, but
tests are no longer run.


2012/10/07 Version 1.0.0
------------------------

No changes since 1.0.0 beta 1. This version has feature parity with
`unittest.mock
<http://docs.python.org/py3k/library/unittest.mock.html#module-unittest.mock>`_
in Python 3.3.

Full list of changes since 0.8:

* `mocksignature`, along with the `mocksignature` argument to `patch`, removed
* Support for deleting attributes (accessing deleted attributes will raise an
  `AttributeError`)
* Added the `mock_open` helper function for mocking the builtin `open`
* `__class__` is assignable, so a mock can pass an `isinstance` check without
  requiring a spec
* Addition of `PropertyMock`, for mocking properties
* `MagicMocks` made unorderable by default (in Python 3). The comparison
  methods (other than equality and inequality) now return `NotImplemented`
* Propagate traceback info to support subclassing of `_patch` by other
  libraries
* `create_autospec` works with attributes present in results of `dir` that
  can't be fetched from the object's class. Contributed by Konstantine Rybnikov
* Any exceptions in an iterable `side_effect` will be raised instead of
  returned
* In Python 3, `create_autospec` now supports keyword only arguments
* Added `patch.stopall` method to stop all active patches created by `start`
* BUGFIX: calling `MagicMock.reset_mock` wouldn't reset magic method mocks
* BUGFIX: calling `reset_mock` on a `MagicMock` created with autospec could
  raise an exception
* BUGFIX: passing multiple spec arguments to patchers (`spec` , `spec_set` and
  `autospec`) had unpredictable results, now it is an error
* BUGFIX: using `spec=True` *and* `create=True` as arguments to patchers could
  result in using `DEFAULT` as the spec. Now it is an error instead
* BUGFIX: using `spec` or `autospec` arguments to patchers, along with
  `spec_set=True` did not work correctly
* BUGFIX: using an object that evaluates to False as a spec could be ignored
* BUGFIX: a list as the `spec` argument to a patcher would always result in a
  non-callable mock. Now if `__call__` is in the spec the mock is callable


2012/07/13 Version 1.0.0 beta 1
--------------------------------

* Added `patch.stopall` method to stop all active patches created by `start`
* BUGFIX: calling `MagicMock.reset_mock` wouldn't reset magic method mocks
* BUGFIX: calling `reset_mock` on a `MagicMock` created with autospec could
  raise an exception


2012/05/04 Version 1.0.0 alpha 2
--------------------------------

* `PropertyMock` attributes are now standard `MagicMocks`
* `create_autospec` works with attributes present in results of `dir` that
  can't be fetched from the object's class. Contributed by Konstantine Rybnikov
* Any exceptions in an iterable `side_effect` will be raised instead of
  returned
* In Python 3, `create_autospec` now supports keyword only arguments


2012/03/25 Version 1.0.0 alpha 1
--------------------------------

The standard library version!

* `mocksignature`, along with the `mocksignature` argument to `patch`, removed
* Support for deleting attributes (accessing deleted attributes will raise an
  `AttributeError`)
* Added the `mock_open` helper function for mocking the builtin `open`
* `__class__` is assignable, so a mock can pass an `isinstance` check without
  requiring a spec
* Addition of `PropertyMock`, for mocking properties
* `MagicMocks` made unorderable by default (in Python 3). The comparison
  methods (other than equality and inequality) now return `NotImplemented`
* Propagate traceback info to support subclassing of `_patch` by other
  libraries
* BUGFIX: passing multiple spec arguments to patchers (`spec` , `spec_set` and
  `autospec`) had unpredictable results, now it is an error
* BUGFIX: using `spec=True` *and* `create=True` as arguments to patchers could
  result in using `DEFAULT` as the spec. Now it is an error instead
* BUGFIX: using `spec` or `autospec` arguments to patchers, along with
  `spec_set=True` did not work correctly
* BUGFIX: using an object that evaluates to False as a spec could be ignored
* BUGFIX: a list as the `spec` argument to a patcher would always result in a
  non-callable mock. Now if `__call__` is in the spec the mock is callable


2012/02/13 Version 0.8.0
------------------------

The only changes since 0.8rc2 are:

* Improved repr of :data:`sentinel` objects
* :data:`ANY` can be used for comparisons against :data:`call` objects
* The return value of `MagicMock.__iter__` method can be set to
  any iterable and isn't required to be an iterator

Full List of changes since 0.7:

mock 0.8.0 is the last version that will support Python 2.4.

* Addition of :attr:`~Mock.mock_calls` list for *all* calls (including magic
  methods and chained calls)
* :func:`patch` and :func:`patch.object` now create a :class:`MagicMock`
  instead of a :class:`Mock` by default
* The patchers (`patch`, `patch.object` and `patch.dict`), plus `Mock` and
  `MagicMock`, take arbitrary keyword arguments for configuration
* New mock method :meth:`~Mock.configure_mock` for setting attributes and
  return values / side effects on the mock and its attributes
* New mock assert methods :meth:`~Mock.assert_any_call` and
  :meth:`~Mock.assert_has_calls`
* Implemented :ref:`auto-speccing` (recursive, lazy speccing of mocks with
  mocked signatures for functions/methods), as the `autospec` argument to
  `patch`
* Added the :func:`create_autospec` function for manually creating
  'auto-specced' mocks
* :func:`patch.multiple` for doing multiple patches in a single call, using
  keyword arguments
* Setting :attr:`~Mock.side_effect` to an iterable will cause calls to the mock
  to return the next value from the iterable
* New `new_callable` argument to `patch` and `patch.object` allowing you to
  pass in a class or callable object (instead of `MagicMock`) that will be
  called to replace the object being patched
* Addition of :class:`NonCallableMock` and :class:`NonCallableMagicMock`, mocks
  without a `__call__` method
* Addition of :meth:`~Mock.mock_add_spec` method for adding (or changing) a
  spec on an existing mock
* Protocol methods on :class:`MagicMock` are magic mocks, and are created
  lazily on first lookup. This means the result of calling a protocol method is
  a `MagicMock` instead of a `Mock` as it was previously
* Addition of :meth:`~Mock.attach_mock` method
* Added :data:`ANY` for ignoring arguments in :meth:`~Mock.assert_called_with`
  calls
* Addition of :data:`call` helper object
* Improved repr for mocks
* Improved repr for :attr:`Mock.call_args` and entries in
  :attr:`Mock.call_args_list`, :attr:`Mock.method_calls` and
  :attr:`Mock.mock_calls`
* Improved repr for :data:`sentinel` objects
* `patch` lookup is done at use time not at decoration time
* In Python 2.6 or more recent, `dir` on a mock will report all the dynamically
  created attributes (or the full list of attributes if there is a spec) as
  well as all the mock methods and attributes.
* Module level :data:`FILTER_DIR` added to control whether `dir(mock)` filters
  private attributes. `True` by default.
* `patch.TEST_PREFIX` for controlling how patchers recognise test methods when
  used to decorate a class
* Support for using Java exceptions as a :attr:`~Mock.side_effect` on Jython
* `Mock` call lists (`call_args_list`, `method_calls` & `mock_calls`) are now
  custom list objects that allow membership tests for "sub lists" and have
  a nicer representation if you `str` or `print` them
* Mocks attached as attributes or return values to other mocks have calls
  recorded in `method_calls` and `mock_calls` of the parent (unless a name is
  already set on the child)
* Improved failure messages for `assert_called_with` and
  `assert_called_once_with`
* The return value of the :class:`MagicMock` `__iter__` method can be set to
  any iterable and isn't required to be an iterator
* Added the Mock API (`assert_called_with` etc) to functions created by
  :func:`mocksignature`
* Tuples as well as lists can be used to specify allowed methods for `spec` &
  `spec_set` arguments
* Calling `stop` on an unstarted patcher fails with  a more meaningful error
  message
* Renamed the internal classes `Sentinel` and `SentinelObject` to prevent abuse
* BUGFIX: an error creating a patch, with nested patch decorators, won't leave
  patches in place
* BUGFIX: `__truediv__` and `__rtruediv__` not available as magic methods on
  mocks in Python 3
* BUGFIX: `assert_called_with` / `assert_called_once_with` can be used with
  `self` as a keyword argument
* BUGFIX: when patching a class with an explicit spec / spec_set (not a
  boolean) it applies "spec inheritance" to the return value of the created
  mock (the "instance")
* BUGFIX: remove the `__unittest` marker causing traceback truncation
* Removal of deprecated `patch_object`
* Private attributes `_name`, `_methods`, '_children', `_wraps` and `_parent`
  (etc) renamed to reduce likelihood of clash with user attributes.
* Added license file to the distribution


2012/01/10 Version 0.8.0 release candidate 2
--------------------------------------------

* Removed the `configure` keyword argument to `create_autospec` and allow
  arbitrary keyword arguments (for the `Mock` constructor) instead
* Fixed `ANY` equality with some types in `assert_called_with` calls
* Switched to a standard Sphinx theme (compatible with
  `readthedocs.org <http://mock.readthedocs.org>`_)


2011/12/29 Version 0.8.0 release candidate 1
--------------------------------------------

* `create_autospec` on the return value of a mocked class will use `__call__`
  for the signature rather than `__init__`
* Performance improvement instantiating `Mock` and `MagicMock`
* Mocks used as magic methods have the same type as their parent instead of
  being hardcoded to `MagicMock`

Special thanks to Julian Berman for his help with diagnosing and improving
performance in this release.


2011/10/09 Version 0.8.0 beta 4
-------------------------------

* `patch` lookup is done at use time not at decoration time
* When attaching a Mock to another Mock as a magic method, calls are recorded
  in mock_calls
* Addition of `attach_mock` method
* Renamed the internal classes `Sentinel` and `SentinelObject` to prevent abuse
* BUGFIX: various issues around circular references with mocks (setting a mock
  return value to be itself etc)


2011/08/15 Version 0.8.0 beta 3
-------------------------------

* Mocks attached as attributes or return values to other mocks have calls
  recorded in `method_calls` and `mock_calls` of the parent (unless a name is
  already set on the child)
* Addition of `mock_add_spec` method for adding (or changing) a spec on an
  existing mock
* Improved repr for `Mock.call_args` and entries in `Mock.call_args_list`,
  `Mock.method_calls` and `Mock.mock_calls`
* Improved repr for mocks
* BUGFIX: minor fixes in the way `mock_calls` is worked out,
  especially for "intermediate" mocks in a call chain


2011/08/05 Version 0.8.0 beta 2
-------------------------------

* Setting `side_effect` to an iterable will cause calls to the mock to return
  the next value from the iterable
* Added `assert_any_call` method
* Moved `assert_has_calls` from call lists onto mocks
* BUGFIX: `call_args` and all members of `call_args_list` are two tuples of
  `(args, kwargs)` again instead of three tuples of `(name, args, kwargs)`


2011/07/25 Version 0.8.0 beta 1
-------------------------------

* `patch.TEST_PREFIX` for controlling how patchers recognise test methods when
  used to decorate a class
* `Mock` call lists (`call_args_list`, `method_calls` & `mock_calls`) are now
  custom list objects that allow membership tests for "sub lists" and have
  an `assert_has_calls` method for unordered call checks
* `callargs` changed to *always* be a three-tuple of `(name, args, kwargs)`
* Addition of `mock_calls` list for *all* calls (including magic methods and
  chained calls)
* Extension of `call` object to support chained calls and `callargs` for better
  comparisons with or without names. `call` object has a `call_list` method for
  chained calls
* Added the public `instance` argument to `create_autospec`
* Support for using Java exceptions as a `side_effect` on Jython
* Improved failure messages for `assert_called_with` and
  `assert_called_once_with`
* Tuples as well as lists can be used to specify allowed methods for `spec` &
  `spec_set` arguments
* BUGFIX: Fixed bug in `patch.multiple` for argument passing when creating
  mocks
* Added license file to the distribution


2011/07/16 Version 0.8.0 alpha 2
--------------------------------

* `patch.multiple` for doing multiple patches in a single call, using keyword
  arguments
* New `new_callable` argument to `patch` and `patch.object` allowing you to
  pass in a class or callable object (instead of `MagicMock`) that will be
  called to replace the object being patched
* Addition of `NonCallableMock` and `NonCallableMagicMock`, mocks without a
  `__call__` method
* Mocks created by `patch` have a `MagicMock` as the `return_value` where a
  class is being patched
* `create_autospec` can create non-callable mocks for non-callable objects.
  `return_value` mocks of classes will be non-callable unless the class has
  a `__call__` method
* `autospec` creates a `MagicMock` without a spec for properties and slot
  descriptors, because we don't know the type of object they return
* Removed the "inherit" argument from `create_autospec`
* Calling `stop` on an unstarted patcher fails with  a more meaningful error
  message
* BUGFIX: an error creating a patch, with nested patch decorators, won't leave
  patches in place
* BUGFIX: `__truediv__` and `__rtruediv__` not available as magic methods on
  mocks in Python 3
* BUGFIX: `assert_called_with` / `assert_called_once_with` can be used with
  `self` as a keyword argument
* BUGFIX: autospec for functions / methods with an argument named self that
  isn't the first argument no longer broken
* BUGFIX: when patching a class with an explicit spec / spec_set (not a
  boolean) it applies "spec inheritance" to the return value of the created
  mock (the "instance")
* BUGFIX: remove the `__unittest` marker causing traceback truncation


2011/06/14 Version 0.8.0 alpha 1
--------------------------------

mock 0.8.0 is the last version that will support Python 2.4.

* The patchers (`patch`, `patch.object` and `patch.dict`), plus `Mock` and
  `MagicMock`, take arbitrary keyword arguments for configuration
* New mock method `configure_mock` for setting attributes and return values /
  side effects on the mock and its attributes
* In Python 2.6 or more recent, `dir` on a mock will report all the dynamically
  created attributes (or the full list of attributes if there is a spec) as
  well as all the mock methods and attributes.
* Module level `FILTER_DIR` added to control whether `dir(mock)` filters
  private attributes. `True` by default. Note that `vars(Mock())` can still be
  used to get all instance attributes and `dir(type(Mock())` will still return
  all the other attributes (irrespective of `FILTER_DIR`)
* `patch` and `patch.object` now create a `MagicMock` instead of a `Mock` by
  default
* Added `ANY` for ignoring arguments in `assert_called_with` calls
* Addition of `call` helper object
* Protocol methods on `MagicMock` are magic mocks, and are created lazily on
  first lookup. This means the result of calling a protocol method is a
  MagicMock instead of a Mock as it was previously
* Added the Mock API (`assert_called_with` etc) to functions created by
  `mocksignature`
* Private attributes `_name`, `_methods`, '_children', `_wraps` and `_parent`
  (etc) renamed to reduce likelihood of clash with user attributes.
* Implemented auto-speccing (recursive, lazy speccing of mocks with mocked
  signatures for functions/methods)

  Limitations:

  - Doesn't mock magic methods or attributes (it creates MagicMocks, so the
    magic methods are *there*, they just don't have the signature mocked nor
    are attributes followed)
  - Doesn't mock function / method attributes
  - Uses object traversal on the objects being mocked to determine types - so
    properties etc may be triggered
  - The return value of mocked classes (the 'instance') has the same call
    signature as the class __init__ (as they share the same spec)

  You create auto-specced mocks by passing `autospec=True` to `patch`.

  Note that attributes that are None are special cased and mocked without a
  spec (so any attribute / method can be used). This is because None is
  typically used as a default value for attributes that may be of some other
  type, and as we don't know what type that may be we allow all access.

  Note that the `autospec` option to `patch` obsoletes the `mocksignature`
  option.

* Added the `create_autospec` function for manually creating 'auto-specced'
  mocks
* Removal of deprecated `patch_object`


2011/05/30 Version 0.7.2
------------------------

* BUGFIX: instances of list subclasses can now be used as mock specs
* BUGFIX: MagicMock equality / inequality protocol methods changed to use the
  default equality / inequality. This is done through a `side_effect` on
  the mocks used for `__eq__` / `__ne__`


2011/05/06 Version 0.7.1
------------------------

Package fixes contributed by Michael Fladischer. No code changes.

* Include template in package
* Use isolated binaries for the tox tests
* Unset executable bit on docs
* Fix DOS line endings in getting-started.txt


2011/03/05 Version 0.7.0
------------------------

No API changes since 0.7.0 rc1. Many documentation changes including a stylish
new `Sphinx theme <https://github.com/coordt/ADCtheme/>`_.

The full set of changes since 0.6.0 are:

* Python 3 compatibility
* Ability to mock magic methods with `Mock` and addition of `MagicMock`
  with pre-created magic methods
* Addition of `mocksignature` and `mocksignature` argument to `patch` and
  `patch.object`
* Addition of `patch.dict` for changing dictionaries during a test
* Ability to use `patch`, `patch.object` and `patch.dict` as class decorators
* Renamed ``patch_object`` to `patch.object` (``patch_object`` is
  deprecated)
* Addition of soft comparisons: `call_args`, `call_args_list` and `method_calls`
  now return tuple-like objects which compare equal even when empty args
  or kwargs are skipped
* patchers (`patch`, `patch.object` and `patch.dict`) have start and stop
  methods
* Addition of `assert_called_once_with` method
* Mocks can now be named (`name` argument to constructor) and the name is used
  in the repr
* repr of a mock with a spec includes the class name of the spec
* `assert_called_with` works with `python -OO`
* New `spec_set` keyword argument to `Mock` and `patch`. If used,
  attempting to *set* an attribute on a mock not on the spec will raise an
  `AttributeError`
* Mocks created with a spec can now pass `isinstance` tests (`__class__`
  returns the type of the spec)
* Added docstrings to all objects
* Improved failure message for `Mock.assert_called_with` when the mock
  has not been called at all
* Decorated functions / methods have their docstring and `__module__`
  preserved on Python 2.4.
* BUGFIX: `mock.patch` now works correctly with certain types of objects that
  proxy attribute access, like the django settings object
* BUGFIX: mocks are now copyable (thanks to Ned Batchelder for reporting and
  diagnosing this)
* BUGFIX: `spec=True` works with old style classes
* BUGFIX: ``help(mock)`` works now (on the module). Can no longer use ``__bases__``
  as a valid sentinel name (thanks to Stephen Emslie for reporting and
  diagnosing this)
* BUGFIX: ``side_effect`` now works with ``BaseException`` exceptions like
  ``KeyboardInterrupt``
* BUGFIX: `reset_mock` caused infinite recursion when a mock is set as its own
  return value
* BUGFIX: patching the same object twice now restores the patches correctly
* with statement tests now skipped on Python 2.4
* Tests require unittest2 (or unittest2-py3k) to run
* Tested with `tox <http://pypi.python.org/pypi/tox>`_ on Python 2.4 - 3.2,
  jython and pypy (excluding 3.0)
* Added 'build_sphinx' command to setup.py (requires setuptools or distribute)
  Thanks to Florian Bauer
* Switched from subversion to mercurial for source code control
* `Konrad Delong <http://konryd.blogspot.com/>`_ added as co-maintainer


2011/02/16 Version 0.7.0 RC 1
-----------------------------

Changes since beta 4:

* Tested with jython, pypy and Python 3.2 and 3.1
* Decorated functions / methods have their docstring and `__module__`
  preserved on Python 2.4
* BUGFIX: `mock.patch` now works correctly with certain types of objects that
  proxy attribute access, like the django settings object
* BUGFIX: `reset_mock` caused infinite recursion when a mock is set as its own
  return value


2010/11/12 Version 0.7.0 beta 4
-------------------------------

* patchers (`patch`, `patch.object` and `patch.dict`) have start and stop
  methods
* Addition of `assert_called_once_with` method
* repr of a mock with a spec includes the class name of the spec
* `assert_called_with` works with `python -OO`
* New `spec_set` keyword argument to `Mock` and `patch`. If used,
  attempting to *set* an attribute on a mock not on the spec will raise an
  `AttributeError`
* Attributes and return value of a `MagicMock` are `MagicMock` objects
* Attempting to set an unsupported magic method now raises an `AttributeError`
* `patch.dict` works as a class decorator
* Switched from subversion to mercurial for source code control
* BUGFIX: mocks are now copyable (thanks to Ned Batchelder for reporting and
  diagnosing this)
* BUGFIX: `spec=True` works with old style classes
* BUGFIX: `mocksignature=True` can now patch instance methods via
  `patch.object`


2010/09/18 Version 0.7.0 beta 3
-------------------------------

* Using spec with :class:`MagicMock` only pre-creates magic methods in the spec
* Setting a magic method on a mock with a ``spec`` can only be done if the
  spec has that method
* Mocks can now be named (`name` argument to constructor) and the name is used
  in the repr
* `mocksignature` can now be used with classes (signature based on `__init__`)
  and callable objects (signature based on `__call__`)
* Mocks created with a spec can now pass `isinstance` tests (`__class__`
  returns the type of the spec)
* Default numeric value for MagicMock is 1 rather than zero (because the
  MagicMock bool defaults to True and 0 is False)
* Improved failure message for :meth:`~Mock.assert_called_with` when the mock
  has not been called at all
* Adding the following to the set of supported magic methods:

  - ``__getformat__`` and ``__setformat__``
  - pickle methods
  - ``__trunc__``, ``__ceil__`` and ``__floor__``
  - ``__sizeof__``

* Added 'build_sphinx' command to setup.py (requires setuptools or distribute)
  Thanks to Florian Bauer
* with statement tests now skipped on Python 2.4
* Tests require unittest2 to run on Python 2.7
* Improved several docstrings and documentation


2010/06/23 Version 0.7.0 beta 2
-------------------------------

* :func:`patch.dict` works as a context manager as well as a decorator
* ``patch.dict`` takes a string to specify dictionary as well as a dictionary
  object. If a string is supplied the name specified is imported
* BUGFIX: ``patch.dict`` restores dictionary even when an exception is raised


2010/06/22 Version 0.7.0 beta 1
-------------------------------

* Addition of :func:`mocksignature`
* Ability to mock magic methods
* Ability to use ``patch`` and ``patch.object`` as class decorators
* Renamed ``patch_object`` to :func:`patch.object` (``patch_object`` is
  deprecated)
* Addition of :class:`MagicMock` class with all magic methods pre-created for you
* Python 3 compatibility (tested with 3.2 but should work with 3.0 & 3.1 as
  well)
* Addition of :func:`patch.dict` for changing dictionaries during a test
* Addition of ``mocksignature`` argument to ``patch`` and ``patch.object``
* ``help(mock)`` works now (on the module). Can no longer use ``__bases__``
  as a valid sentinel name (thanks to Stephen Emslie for reporting and
  diagnosing this)
* Addition of soft comparisons: `call_args`, `call_args_list` and `method_calls`
  now return tuple-like objects which compare equal even when empty args
  or kwargs are skipped
* Added docstrings.
* BUGFIX: ``side_effect`` now works with ``BaseException`` exceptions like
  ``KeyboardInterrupt``
* BUGFIX: patching the same object twice now restores the patches correctly
* The tests now require `unittest2 <http://pypi.python.org/pypi/unittest2>`_
  to run
* `Konrad Delong <http://konryd.blogspot.com/>`_ added as co-maintainer


2009/08/22 Version 0.6.0
------------------------

* New test layout compatible with test discovery
* Descriptors (static methods / class methods etc) can now be patched and
  restored correctly
* Mocks can raise exceptions when called by setting ``side_effect`` to an
  exception class or instance
* Mocks that wrap objects will not pass on calls to the underlying object if
  an explicit return_value is set


2009/04/17 Version 0.5.0
------------------------

* Made DEFAULT part of the public api.
* Documentation built with Sphinx.
* ``side_effect`` is now called with the same arguments as the mock is called with and
  if returns a non-DEFAULT value that is automatically set as the ``mock.return_value``.
* ``wraps`` keyword argument used for wrapping objects (and passing calls through to the wrapped object).
* ``Mock.reset`` renamed to ``Mock.reset_mock``, as reset is a common API name.
* ``patch`` / ``patch_object`` are now context managers and can be used with ``with``.
* A new 'create' keyword argument to patch and patch_object that allows them to patch
  (and unpatch) attributes that don't exist. (Potentially unsafe to use - it can allow
  you to have tests that pass when they are testing an API that doesn't exist - use at
  your own risk!)
* The methods keyword argument to Mock has been removed and merged with spec. The spec
  argument can now be a list of methods or an object to take the spec from.
* Nested patches may now be applied in a different order (created mocks passed
  in the opposite order). This is actually a bugfix.
* patch and patch_object now take a spec keyword argument. If spec is
  passed in as 'True' then the Mock created will take the object it is replacing
  as its spec object. If the object being replaced is a class, then the return
  value for the mock will also use the class as a spec.
* A Mock created without a spec will not attempt to mock any magic methods / attributes
  (they will raise an ``AttributeError`` instead).


2008/10/12 Version 0.4.0
------------------------

* Default return value is now a new mock rather than None
* return_value added as a keyword argument to the constructor
* New method 'assert_called_with'
* Added 'side_effect' attribute / keyword argument called when mock is called
* patch decorator split into two decorators:

    - ``patch_object`` which takes an object and an attribute name to patch
      (plus optionally a value to patch with which defaults to a mock object)
    - ``patch`` which takes a string specifying a target to patch; in the form
      'package.module.Class.attribute'. (plus optionally a value to
      patch with which defaults to a mock object)

* Can now patch objects with ``None``
* Change to patch for nose compatibility with error reporting in wrapped functions
* Reset no longer clears children / return value etc - it just resets
  call count and call args. It also calls reset on all children (and
  the return value if it is a mock).

Thanks to Konrad Delong, Kevin Dangoor and others for patches and suggestions.


2007/12/03  Version 0.3.1
-------------------------

``patch`` maintains the name of decorated functions for compatibility with nose
test autodiscovery.

Tests decorated with ``patch`` that use the two argument form (implicit mock
creation) will receive the mock(s) passed in as extra arguments.

Thanks to Kevin Dangoor for these changes.


2007/11/30  Version 0.3.0
-------------------------

Removed ``patch_module``. ``patch`` can now take a string as the first
argument for patching modules.

The third argument to ``patch`` is optional - a mock will be created by
default if it is not passed in.


2007/11/21  Version 0.2.1
-------------------------

Bug fix, allows reuse of functions decorated with ``patch`` and ``patch_module``.


2007/11/20  Version 0.2.0
-------------------------

Added ``spec`` keyword argument for creating ``Mock`` objects from a
specification object.

Added ``patch`` and ``patch_module`` monkey patching decorators.

Added ``sentinel`` for convenient access to unique objects.

Distribution includes unit tests.


2007/11/19  Version 0.1.0
-------------------------

Initial release.


TODO and Limitations
====================

Contributions, bug reports and comments welcomed!

Feature requests and bug reports are handled on the issue tracker:

 * `mock issue tracker <http://code.google.com/p/mock/issues/list>`_

`wraps` is not integrated with magic methods.

`patch` could auto-do the patching in the constructor and unpatch in the
destructor. This would be useful in itself, but violates TOOWTDI and would be
unsafe for IronPython & PyPy (non-deterministic calling of destructors).
Destructors aren't called in CPython where there are cycles, but a weak
reference with a callback can be used to get round this.

`Mock` has several attributes. This makes it unsuitable for mocking objects
that use these attribute names. A way round this would be to provide methods
that *hide* these attributes when needed. In 0.8 many, but not all, of these
attributes are renamed to gain a `_mock` prefix, making it less likely that
they will clash. Any outstanding attributes that haven't been modified with
the prefix should be changed.

If a patch is started using `patch.start` and then not stopped correctly then
the unpatching is not done. Using weak references it would be possible to
detect and fix this when the patch object itself is garbage collected. This
would be tricky to get right though.

When a `Mock` is created by `patch`, arbitrary keywords can be used to set
attributes. If `patch` is created with a `spec`, and is replacing a class, then
a `return_value` mock is created. The keyword arguments are not applied to the
child mock, but could be.

When mocking a class with `patch`, passing in `spec=True` or `autospec=True`,
the mock class has an instance created from the same spec. Should this be the
default behaviour for mocks anyway (mock return values inheriting the spec
from their parent), or should it be controlled by an additional keyword
argument (`inherit`) to the Mock constructor? `create_autospec` does this, so
an additional keyword argument to Mock is probably unnecessary.

The `mocksignature` argument to `patch` with a non `Mock` passed into
`new_callable` will *probably* cause an error. Should it just be invalid?

Note that `NonCallableMock` and `NonCallableMagicMock` still have the unused
(and unusable) attributes: `return_value`, `side_effect`, `call_count`,
`call_args` and `call_args_list`. These could be removed or raise errors on
getting / setting. They also have the `assert_called_with` and
`assert_called_once_with` methods. Removing these would be pointless as
fetching them would create a mock (attribute) that could be called without
error.

Some outstanding technical debt. The way autospeccing mocks function
signatures was copied and modified from `mocksignature`. This could all be
refactored into one set of functions instead of two. The way we tell if
patchers are started and if a patcher is being used for a `patch.multiple`
call are both horrible. There are now a host of helper functions that should
be rationalised. (Probably time to split mock into a package instead of a
module.)

Passing arbitrary keyword arguments to `create_autospec`, or `patch` with
`autospec`, when mocking a *function* works fine. However, the arbitrary
attributes are set on the created mock - but `create_autospec` returns a
real function (which doesn't have those attributes). However, what is the use
case for using autospec to create functions with attributes that don't exist
on the original?

`mocksignature`, plus the `call_args_list` and `method_calls` attributes of
`Mock` could all be deprecated.
