- Try to import mock first instead of unittest.mock. This gives the user
flexibility to install a newer mock version from PyPI instead of using
the one available in the Python distribution.
- mock.sentinel is now aliased as mocker.sentinel for convenience.
See #1702.
Breaking Changes
With pytest-qt 2.0, we changed some defaults to values we think are much
better, however this required some backwards-incompatible changes:
- pytest-qt now defaults to using PyQt5 if PYTEST_QT_API is not set.
Before, it preferred PySide which is using the discontinued Qt4.
- Python 3 versions prior to 3.4 are no longer supported.
- The @pytest.mark.qt_log_ignore mark now defaults to extend=True, i.e.
extends the patterns defined in the config file rather than overriding
them. You can pass extend=False to get the old behaviour of overriding
the patterns.
- qtbot.waitSignal now defaults to raising=True and raises an exception
on timeouts. You can set qt_wait_signal_raising = false in your config
to get back the old behaviour.
- PYTEST_QT_FORCE_PYQT environment variable is no longer supported. Set
PYTEST_QT_API to the appropriate value instead or the new qt_api
configuration option in your pytest.ini file.
New Features
- From this version onward, pytest-qt is licensed under the MIT license.
- New qtmodeltester fixture to test QAbstractItemModel subclasses.
- waitSignal and waitSignals can receive an optional callback that can
evaluate if the arguments of emitted signals should resume execution
or not.
- Now which Qt binding pytest-qt will use can be configured by the
qt_api config option.
- While pytestqt.qt_compat is an internal module and shouldn't be
imported directly, it is known that some test suites did import it.
This module now uses a lazy-load mechanism to load Qt classes and
objects, so the old symbols (QtCore, QApplication, etc.) are no longer
available from it.
Other Changes
- Exceptions caught by pytest-qt in sys.excepthook are now also printed
to stderr, making debugging them easier from within an IDE.
Version 4.2
------------
- Since concurrency=multiprocessing uses subprocesses, options specified
on the coverage.py command line will not be communicated down to them.
Only options in the configuration file will apply to the subprocesses.
Previously, the options didn't apply to the subprocesses, but there
was no indication. Now it is an error to use
--concurrency=multiprocessing and other run-affecting options on the
command line. This prevents failures like those reported in issue 495.
- Filtering the HTML report is now faster, thanks to Ville Skyttä.
Version 4.2b1
-------------
Work from the PyCon 2016 Sprints!
- BACKWARD INCOMPATIBILITY: the coverage combine command now ignores an
existing .coverage data file. It used to include that file in its
combining. This caused confusing results, and extra tox "clean" steps.
If you want the old behavior, use the new coverage combine --append
option.
- The concurrency option can now take multiple values, to support
programs using multiprocessing and another library such as eventlet.
This is only possible in the configuration file, not from the command
line. The configuration file is the only way for sub-processes to all
run with the same options.
- Using a concurrency setting of multiprocessing now implies --parallel
so that the main program is measured similarly to the sub-processes.
- When using automatic subprocess measurement, running coverage commands
would create spurious data files. This is now fixed.
- A new configuration option, report:sort, controls what column of the
text report is used to sort the rows.
- The HTML report has a more-visible indicator for which column is being
sorted.
- If the HTML report cannot find the source for a file, the message now
suggests using the -i flag to allow the report to continue.
- When reports are ignoring errors, there's now a warning if a file
cannot be parsed, rather than being silently ignored.
- A new option for coverage debug is available: coverage debug config
shows the current configuration.
- Running coverage as a module (python -m coverage) no longer shows the
program name as __main__.py.
- The test_helpers module has been moved into a separate pip-installable
package: unittest-mixins.
Implement systemd's socket activation mechanism for CherryPy servers,
based on work sponsored by Endless Computers.
Socket Activation allows one to setup a system so that systemd will sit
on a port and start services 'on demand' (a little bit like inetd and
xinetd used to do).
7.0.0
-----
Removed the long-deprecated backward compatibility for
legacy config keys in the engine. Use the config for the
namespaced-plugins instead:
- autoreload_on -> autoreload.on
- autoreload_frequency -> autoreload.frequency
- autoreload_match -> autoreload.match
- reload_files -> autoreload.files
- deadlock_poll_frequency -> timeout_monitor.frequency
6.2.1
-----
Fix KeyError in Bus.publish when signal handlers set in config.
* Beautiful Soup is no longer compatible with Python 2.6. This
actually happened a few releases ago, but it's now official.
* Beautiful Soup will now work with versions of html5lib greater than
0.99999999.
* If a search against each individual value of a multi-valued
attribute fails, the search will be run one final time against the
complete attribute value considered as a single string. That is, if
a tag has class="foo bar" and neither "foo" nor "bar" matches, but
"foo bar" does, the tag is now considered a match.
This happened in previous versions, but only when the value being
searched for was a string. Now it also works when that value is
a regular expression, a list of strings, etc.
* Fixed a bug that deranged the tree when a whitespace element was
reparented into a tag that contained an identical whitespace
element.
* Added support for CSS selector values that contain quoted spaces,
such as tag[style="display: foo"].
* Corrected handling of XML processing instructions.
* Corrected an encoding error that happened when a BeautifulSoup
object was copied.
* The contents of <textarea> tags will no longer be modified when the
tree is prettified.
* When a BeautifulSoup object is pickled but its tree builder cannot
be pickled, its .builder attribute is set to None instead of being
destroyed. This avoids a performance problem once the object is
unpickled.
* Specify the file and line number when warning about a
BeautifulSoup object being instantiated without a parser being
specified.
* The `limit` argument to `select()` now works correctly, though it's
not implemented very efficiently.
* Fixed a Python 3 ByteWarning when a URL was passed in as though it
were markup. Thanks to James Salter for a patch and
test.
* We don't run the check for a filename passed in as markup if the
'filename' contains a less-than character; the less-than character
indicates it's most likely a very small document.
* Added tool to automatically convert request params based on type
annotations (primarily in Python 3). For example:
@cherrypy.tools.params()
def resource(self, limit: int):
assert isinstance(limit, int)
- Test functions defined using @given can now be called from other
threads
- Attempting to delete a settings property would previously have
silently done the wrong thing. Now it raises an AttributeError.
- Creating a settings object with a custom database_file parameter was
silently getting ignored and the default was being used instead. Now
it’s not.
On Windows when running two Hypothesis processes in parallel (e.g. using
pytest-xdist) they could race with each other and one would raise an
exception due to the non-atomic nature of file renaming on Windows and
the fact that you can't rename over an existing file. This is now fixed.
- Add support for specifying output location for html, xml, and annotate
report.
- Fix bug hiding test failure when cov-fail-under failed.
- For coverage >= 4.0, match the default behaviour of coverage report
and error if coverage fails to find the source instead of just
printing a warning.
- Fixed bug occurred when bare --cov parameter was used with xdist.
- Add support for skip_covered and added --cov-report=term-skip-covered
command line options.
* Don't flag attributes as unused if they are used as global variables in
another module.
* Don't consider "True" and "False" variable names.
* Abort with error message when invoked on .pyc files.
This means we can remove the whitelisted globals in run_vulture.py and
the associated xfailing test.
We also needed to adjust run_vulture.py slightly as the file attribute
got renamed to filename.
* Setuptools is now required to build CherryPy. Pure distutils installs
are no longer supported. This change allows CherryPy to depend on
other packages and re-use code from them. It's still possible to
install pre-built CherryPy packages (wheels) using pip without
Setuptools.
* Back out changes attempting to fix redirects with Unicode URLs, as it
also had the unintended consequence of causing the 'Location' to be
``bytes`` on Python 3.
* ``cherrypy.expose`` now works on classes.
* ``cherrypy.config`` decorator is now used throughout the code
internally.
* ``@cherrypy.expose`` now will also set the exposed
attribute on a class.
* Rewrote all tutorials and internal usage to prefer
the decorator usage of ``expose`` rather than setting
the attribute explicitly.
* Removed test-specific code from tutorials.
* Fix for filenames with semicolons and quote characters in filenames
found in headers.
* Added decorator for registering tools.
* Use simpler encoding rules for SCRIPT_NAME and PATH_INFO environment
variables in CherryPy Tree allowing non-latin characters to pass even
when ``wsgi.version`` is not ``u.0``.
* Ensure that multipart fields are decoded even when cached in a file.
- From this version onward, pytest-mock is licensed under the MIT
license.
- Now the plugin also adds introspection information on differing call
arguments when calling helper methods such as assert_called_once_with.
The extra introspection information is similar to pytest's and can be
disabled with the mock_traceback_monkeypatch option.
- mocker.stub() now allows passing in the name for the constructed Mock
object instead of having to set it using the internal _mock_name
attribute directly. This is useful for debugging as the name is used
in the mock's repr string as well as related assertion failure
messages.
- Monkey patching mock module for friendlier tracebacks is automatically
disabled with the --tb=native option. The underlying mechanism used to
suppress traceback entries from mock module does not work with that
option anyway plus it generates confusing messages on Python 3.5 due
to exception chaining.
- mock.call is now aliased as mocker.call for convenience.
* skip tests where one parameterize dimension was empty
* Fix Xfail does not work with condition keyword argument.
* Fix win32 path issue when puttinging custom config file with absolute
path in ``pytest.main("-c your_absolute_path")``.
* Fix maximum recursion depth detection when raised error class is not
aware of unicode/encoded bytes.
* Fix ``pytest.mark.skip`` mark when used in strict mode.
* Minor improvements and fixes to the documentation.
* Fix ``--fixtures`` to show all fixture definitions as opposed to just
one per fixture name.
While this makes things a little more complicated and means we'll need to use
`-r` to recreate tox environments, it has several advantages:
- Full support from requires.io (including PRs)
- Workaround for https://bitbucket.org/hpk42/tox/issues/332/ so we can update
virtualenv/pip