Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
afaaa7e
Travis: test py38-dev only with cron builds
blueyed Feb 13, 2019
c84ae0b
Merge pull request #4789 from blueyed/travis-pluggymaster-cron
blueyed Feb 13, 2019
407d4a0
collect: python: fix `AssertionError` with broken symlinks
blueyed Feb 13, 2019
40cec63
Update kwarg for attr.ib to use 'converter' as 'convert' is due to be…
ramatevish Feb 14, 2019
0e4750d
Travis CI: The 'sudo' tag is now deprecated
cclauss Feb 14, 2019
4bc2f96
Remove 'message' parameter docs from assert.rst
nicoddemus Feb 14, 2019
0b69604
Merge pull request #4795 from ramatevish/update-attr-kwarg
nicoddemus Feb 14, 2019
0b1f813
Merge pull request #4784 from blueyed/fix-4782
blueyed Feb 14, 2019
66b4709
Merge pull request #4798 from nicoddemus/remove-message-docs
asottile Feb 14, 2019
2106515
Merge pull request #4796 from cclauss/patch-1
blueyed Feb 14, 2019
59f69dd
Add good talk by Andrew Svetlov
gyermolenko Feb 15, 2019
80ad448
Fix code-block in Node docstring
gyermolenko Feb 15, 2019
3460105
Travis: use xdist for py?? envs, keeping py27/py37
blueyed Feb 13, 2019
6fb7269
terminal: write_fspath_result: work around py bug
blueyed Feb 13, 2019
71373b0
tox: add generic xdist factor
blueyed Feb 8, 2019
40eef6d
AppVeyor: use xdist for py?? envs, drop py27/py37
blueyed Feb 11, 2019
498b994
Merge pull request #4787 from blueyed/travis-xdist
blueyed Feb 15, 2019
4f9e835
Travis: remove cron_only stage, use conditional job
blueyed Feb 15, 2019
e59fc73
Merge pull request #4801 from gyermolenko/add_talk
blueyed Feb 16, 2019
68dc433
Merge pull request #4802 from gyermolenko/fix_code_block_in_Node_docs…
asottile Feb 16, 2019
a36e986
Merge pull request #4803 from blueyed/travis-cron
nicoddemus Feb 16, 2019
0395996
Merge remote-tracking branch 'upstream/master' into release-4.3.0
nicoddemus Feb 16, 2019
31c869b
Preparing release version 4.3.0
nicoddemus Feb 16, 2019
5505826
Fix python3.8 / pypy failures
asottile Feb 16, 2019
eeac28f
Merge pull request #4804 from asottile/fix_py38
nicoddemus Feb 18, 2019
ff015f6
Fix docs (tox -e regen, plus pre-commit)
blueyed Feb 18, 2019
f0a9f90
Merge pull request #4805 from nicoddemus/release-4.3.0
nicoddemus Feb 18, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
sudo: false
language: python
dist: xenial
stages:
Expand Down Expand Up @@ -26,22 +25,20 @@ env:
matrix:
allow_failures:
- python: '3.8-dev'
env: TOXENV=py38
env: TOXENV=py38-xdist

jobs:
include:
# Coverage tracking is slow with pypy, skip it.
- env: TOXENV=pypy PYTEST_NO_COVERAGE=1
python: 'pypy-5.4'
dist: trusty
- env: TOXENV=py34
- env: TOXENV=py34-xdist
python: '3.4'
- env: TOXENV=py35
- env: TOXENV=py35-xdist
python: '3.5'
- env: TOXENV=py36
- env: TOXENV=py36-xdist
python: '3.6'
- env: TOXENV=py38
python: '3.8-dev'
- env: TOXENV=py37
- &test-macos
language: generic
Expand All @@ -50,15 +47,20 @@ jobs:
sudo: required
install:
- python -m pip install --pre tox
env: TOXENV=py27
env: TOXENV=py27-xdist
- <<: *test-macos
env: TOXENV=py37
env: TOXENV=py37-xdist
before_install:
- brew update
- brew upgrade python
- brew unlink python
- brew link python

# Jobs only run via Travis cron jobs (currently daily).
- env: TOXENV=py38-xdist
python: '3.8-dev'
if: type = cron

- stage: baseline
env: TOXENV=py27-pexpect,py27-trial,py27-numpy
- env: TOXENV=py37-xdist
Expand Down
42 changes: 42 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,48 @@ with advance notice in the **Deprecations** section of releases.

.. towncrier release notes start

pytest 4.3.0 (2019-02-16)
=========================

Deprecations
------------

- `#4724 <https://github.com/pytest-dev/pytest/issues/4724>`_: ``pytest.warns()`` now emits a warning when it receives unknown keyword arguments.

This will be changed into an error in the future.



Features
--------

- `#2753 <https://github.com/pytest-dev/pytest/issues/2753>`_: Usage errors from argparse are mapped to pytest's ``UsageError``.


- `#3711 <https://github.com/pytest-dev/pytest/issues/3711>`_: Add the ``--ignore-glob`` parameter to exclude test-modules with Unix shell-style wildcards.
Add the ``collect_ignore_glob`` for ``conftest.py`` to exclude test-modules with Unix shell-style wildcards.


- `#4698 <https://github.com/pytest-dev/pytest/issues/4698>`_: The warning about Python 2.7 and 3.4 not being supported in pytest 5.0 has been removed.

In the end it was considered to be more
of a nuisance than actual utility and users of those Python versions shouldn't have problems as ``pip`` will not
install pytest 5.0 on those interpreters.


- `#4707 <https://github.com/pytest-dev/pytest/issues/4707>`_: With the help of new ``set_log_path()`` method there is a way to set ``log_file`` paths from hooks.



Bug Fixes
---------

- `#4651 <https://github.com/pytest-dev/pytest/issues/4651>`_: ``--help`` and ``--version`` are handled with ``UsageError``.


- `#4782 <https://github.com/pytest-dev/pytest/issues/4782>`_: Fix ``AssertionError`` with collection of broken symlinks with packages.


pytest 4.2.1 (2019-02-12)
=========================

Expand Down
1 change: 0 additions & 1 deletion changelog/2753.feature.rst

This file was deleted.

2 changes: 0 additions & 2 deletions changelog/3711.feature.rst

This file was deleted.

1 change: 0 additions & 1 deletion changelog/4651.bugfix.rst

This file was deleted.

5 changes: 0 additions & 5 deletions changelog/4698.feature.rst

This file was deleted.

1 change: 0 additions & 1 deletion changelog/4707.feature.rst

This file was deleted.

3 changes: 0 additions & 3 deletions changelog/4724.deprecation.rst

This file was deleted.

1 change: 1 addition & 0 deletions doc/en/announce/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Release announcements
:maxdepth: 2


release-4.3.0
release-4.2.1
release-4.2.0
release-4.1.1
Expand Down
36 changes: 36 additions & 0 deletions doc/en/announce/release-4.3.0.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
pytest-4.3.0
=======================================

The pytest team is proud to announce the 4.3.0 release!

pytest is a mature Python testing tool with more than a 2000 tests
against itself, passing on many different interpreters and platforms.

This release contains a number of bugs fixes and improvements, so users are encouraged
to take a look at the CHANGELOG:

https://docs.pytest.org/en/latest/changelog.html

For complete documentation, please visit:

https://docs.pytest.org/en/latest/

As usual, you can upgrade from pypi via:

pip install -U pytest

Thanks to all who contributed to this release, among them:

* Andras Mitzki
* Anthony Sottile
* Bruno Oliveira
* Christian Fetzer
* Daniel Hahler
* Grygorii Iermolenko
* R. Alex Matevish
* Ronny Pfannschmidt
* cclauss


Happy testing,
The Pytest Development Team
46 changes: 18 additions & 28 deletions doc/en/assert.rst
Original file line number Diff line number Diff line change
Expand Up @@ -88,23 +88,30 @@ and if you need to have access to the actual exception info you may use::
the actual exception raised. The main attributes of interest are
``.type``, ``.value`` and ``.traceback``.

.. versionchanged:: 3.0
You can pass a ``match`` keyword parameter to the context-manager to test
that a regular expression matches on the string representation of an exception
(similar to the ``TestCase.assertRaisesRegexp`` method from ``unittest``)::

In the context manager form you may use the keyword argument
``message`` to specify a custom failure message::
import pytest

>>> with raises(ZeroDivisionError, message="Expecting ZeroDivisionError"):
... pass
... Failed: Expecting ZeroDivisionError
def myfunc():
raise ValueError("Exception 123 raised")

If you want to write test code that works on Python 2.4 as well,
you may also use two other ways to test for an expected exception::
def test_match():
with pytest.raises(ValueError, match=r'.* 123 .*'):
myfunc()

The regexp parameter of the ``match`` method is matched with the ``re.search``
function, so in the above example ``match='123'`` would have worked as
well.

There's an alternate form of the ``pytest.raises`` function where you pass
a function that will be executed with the given ``*args`` and ``**kwargs`` and
assert that the given exception is raised::

pytest.raises(ExpectedException, func, *args, **kwargs)

which will execute the specified function with args and kwargs and
assert that the given ``ExpectedException`` is raised. The reporter will
provide you with helpful output in case of failures such as *no
The reporter will provide you with helpful output in case of failures such as *no
exception* or *wrong exception*.

Note that it is also possible to specify a "raises" argument to
Expand All @@ -121,23 +128,6 @@ exceptions your own code is deliberately raising, whereas using
like documenting unfixed bugs (where the test describes what "should" happen)
or bugs in dependencies.

Also, the context manager form accepts a ``match`` keyword parameter to test
that a regular expression matches on the string representation of an exception
(like the ``TestCase.assertRaisesRegexp`` method from ``unittest``)::

import pytest

def myfunc():
raise ValueError("Exception 123 raised")

def test_match():
with pytest.raises(ValueError, match=r'.* 123 .*'):
myfunc()

The regexp parameter of the ``match`` method is matched with the ``re.search``
function. So in the above example ``match='123'`` would have worked as
well.


.. _`assertwarns`:

Expand Down
6 changes: 2 additions & 4 deletions doc/en/example/parametrize.rst
Original file line number Diff line number Diff line change
Expand Up @@ -436,10 +436,8 @@ Running it results in some skips if we don't have all the python interpreters in
.. code-block:: pytest

. $ pytest -rs -q multipython.py
...sss...sssssssss...sss... [100%]
========================= short test summary info ==========================
SKIPPED [15] $REGENDOC_TMPDIR/CWD/multipython.py:30: 'python3.4' not found
12 passed, 15 skipped in 0.12 seconds
........................... [100%]
27 passed in 0.12 seconds

Indirect parametrization of optional implementations/imports
--------------------------------------------------------------------
Expand Down
3 changes: 3 additions & 0 deletions doc/en/talks.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ Talks and blog postings

- pytest: recommendations, basic packages for testing in Python and Django, Andreu Vallbona, PyconES 2017 (`slides in english <http://talks.apsl.io/testing-pycones-2017/>`_, `video in spanish <https://www.youtube.com/watch?v=K20GeR-lXDk>`_)

- `pytest advanced, Andrew Svetlov (Russian, PyCon Russia, 2016)
<https://www.youtube.com/watch?v=7KgihdKTWY4>`_.

- `Pythonic testing, Igor Starikov (Russian, PyNsk, November 2016)
<https://www.youtube.com/watch?v=_92nfdd5nK8>`_.

Expand Down
7 changes: 6 additions & 1 deletion src/_pytest/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,12 @@ def _collect(self, arg):
yield y

def _collectfile(self, path, handle_dupes=True):
assert path.isfile()
assert path.isfile(), "%r is not a file (isdir=%r, exists=%r, islink=%r)" % (
path,
path.isdir(),
path.exists(),
path.islink(),
)
ihook = self.gethookproxy(path)
if not self.isinitpath(path):
if ihook.pytest_ignore_collect(path=path, config=self.config):
Expand Down
3 changes: 2 additions & 1 deletion src/_pytest/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,11 +113,12 @@ def warn(self, warning):

:raise ValueError: if ``warning`` instance is not a subclass of PytestWarning.

Example usage::
Example usage:

.. code-block:: python

node.warn(PytestWarning("some message"))

"""
from _pytest.warning_types import PytestWarning

Expand Down
20 changes: 14 additions & 6 deletions src/_pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,12 @@ def gethookproxy(self, fspath):
return proxy

def _collectfile(self, path, handle_dupes=True):
assert path.isfile()
assert path.isfile(), "%r is not a file (isdir=%r, exists=%r, islink=%r)" % (
path,
path.isdir(),
path.exists(),
path.islink(),
)
ihook = self.gethookproxy(path)
if not self.isinitpath(path):
if ihook.pytest_ignore_collect(path=path, config=self.config):
Expand Down Expand Up @@ -632,7 +637,8 @@ def collect(self):
pkg_prefixes = set()
for path in this_path.visit(rec=self._recurse, bf=True, sort=True):
# We will visit our own __init__.py file, in which case we skip it.
if path.isfile():
is_file = path.isfile()
if is_file:
if path.basename == "__init__.py" and path.dirpath() == this_path:
continue

Expand All @@ -643,12 +649,14 @@ def collect(self):
):
continue

if path.isdir():
if path.join("__init__.py").check(file=1):
pkg_prefixes.add(path)
else:
if is_file:
for x in self._collectfile(path):
yield x
elif not path.isdir():
# Broken symlink or invalid/missing file.
continue
elif path.join("__init__.py").check(file=1):
pkg_prefixes.add(path)


def _get_xunit_setup_teardown(holder, attr_name, param_obj=None):
Expand Down
4 changes: 3 additions & 1 deletion src/_pytest/terminal.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,9 @@ def hasopt(self, char):

def write_fspath_result(self, nodeid, res, **markup):
fspath = self.config.rootdir.join(nodeid.split("::")[0])
if fspath != self.currentfspath:
# NOTE: explicitly check for None to work around py bug, and for less
# overhead in general (https://github.com/pytest-dev/py/pull/207).
if self.currentfspath is None or fspath != self.currentfspath:
if self.currentfspath is not None and self._show_progress_info:
self._write_progress_information_filling_space()
self.currentfspath = fspath
Expand Down
2 changes: 1 addition & 1 deletion src/_pytest/tmpdir.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class TempPathFactory(object):
# using os.path.abspath() to get absolute path instead of resolve() as it
# does not work the same in all platforms (see #4427)
# Path.absolute() exists, but it is not public (see https://bugs.python.org/issue25012)
convert=attr.converters.optional(
converter=attr.converters.optional(
lambda p: Path(os.path.abspath(six.text_type(p)))
)
)
Expand Down
11 changes: 8 additions & 3 deletions testing/code/test_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -560,7 +560,6 @@ def test_oneline_and_comment():
assert str(source) == "raise ValueError"


@pytest.mark.xfail(hasattr(sys, "pypy_version_info"), reason="does not work on pypy")
def test_comments():
source = '''def test():
"comment 1"
Expand All @@ -576,9 +575,15 @@ def test_comments():
'''
for line in range(2, 6):
assert str(getstatement(line, source)) == " x = 1"
for line in range(6, 10):
if sys.version_info >= (3, 8) or hasattr(sys, "pypy_version_info"):
tqs_start = 8
else:
tqs_start = 10
assert str(getstatement(10, source)) == '"""'
for line in range(6, tqs_start):
assert str(getstatement(line, source)) == " assert False"
assert str(getstatement(10, source)) == '"""'
for line in range(tqs_start, 10):
assert str(getstatement(line, source)) == '"""\ncomment 4\n"""'


def test_comment_in_statement():
Expand Down
Loading