Merge pull request #4360 from blueyed/merge-master

Merge master into features
This commit is contained in:
Ronny Pfannschmidt 2018-11-09 17:26:40 +01:00 committed by GitHub
commit 10d27f412b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 58 additions and 23 deletions

View File

@ -47,11 +47,6 @@ jobs:
env: TOXENV=py37 env: TOXENV=py37
before_install: before_install:
- brew update - brew update
# remove c++ include files because upgrading python as of 2018-10-23, also
# attempts to upgrade gcc, and it fails because the include files already
# exist. removing the include files is one of the solutions recommended by brew
# this workaround might not be necessary in the future
- rm '/usr/local/include/c++'
- brew upgrade python - brew upgrade python
- brew unlink python - brew unlink python
- brew link python - brew link python

View File

@ -76,6 +76,7 @@ Endre Galaczi
Eric Hunsberger Eric Hunsberger
Eric Siegerman Eric Siegerman
Erik M. Bray Erik M. Bray
Fabien Zarifian
Fabio Zadrozny Fabio Zadrozny
Feng Ma Feng Ma
Florian Bruhin Florian Bruhin

View File

@ -0,0 +1 @@
Block the ``stepwise`` plugin if ``cacheprovider`` is also blocked, as one depends on the other.

View File

@ -0,0 +1 @@
Fix TypeError in report_collect with _collect_report_last_write.

View File

@ -255,8 +255,8 @@ Pytest supports the use of ``breakpoint()`` with the following behaviours:
- When ``breakpoint()`` is called and ``PYTHONBREAKPOINT`` is set to the default value, pytest will use the custom internal PDB trace UI instead of the system default ``Pdb``. - When ``breakpoint()`` is called and ``PYTHONBREAKPOINT`` is set to the default value, pytest will use the custom internal PDB trace UI instead of the system default ``Pdb``.
- When tests are complete, the system will default back to the system ``Pdb`` trace UI. - When tests are complete, the system will default back to the system ``Pdb`` trace UI.
- If ``--pdb`` is called on execution of pytest, the custom internal Pdb trace UI is used on both ``breakpoint()`` and failed tests/unhandled exceptions. - With ``--pdb`` passed to pytest, the custom internal Pdb trace UI is used with both ``breakpoint()`` and failed tests/unhandled exceptions.
- If ``--pdbcls`` is used, the custom class debugger will be executed when a test fails (as expected within existing behaviour), but also when ``breakpoint()`` is called from within a test, the custom class debugger will be instantiated. - ``--pdbcls`` can be used to specify a custom debugger class.
.. _durations: .. _durations:

View File

@ -477,6 +477,11 @@ class PytestPluginManager(PluginManager):
def consider_pluginarg(self, arg): def consider_pluginarg(self, arg):
if arg.startswith("no:"): if arg.startswith("no:"):
name = arg[3:] name = arg[3:]
# PR #4304 : remove stepwise if cacheprovider is blocked
if name == "cacheprovider":
self.set_blocked("stepwise")
self.set_blocked("pytest_stepwise")
self.set_blocked(name) self.set_blocked(name)
if not name.startswith("pytest_"): if not name.startswith("pytest_"):
self.set_blocked("pytest_" + name) self.set_blocked("pytest_" + name)

View File

@ -927,7 +927,7 @@ class FixtureDef(object):
return hook.pytest_fixture_setup(fixturedef=self, request=request) return hook.pytest_fixture_setup(fixturedef=self, request=request)
def __repr__(self): def __repr__(self):
return "<FixtureDef name=%r scope=%r baseid=%r>" % ( return "<FixtureDef argname=%r scope=%r baseid=%r>" % (
self.argname, self.argname,
self.scope, self.scope,
self.baseid, self.baseid,

View File

@ -279,7 +279,7 @@ def pytest_ignore_collect(path, config):
return True return True
allow_in_venv = config.getoption("collect_in_virtualenv") allow_in_venv = config.getoption("collect_in_virtualenv")
if _in_venv(path) and not allow_in_venv: if not allow_in_venv and _in_venv(path):
return True return True
return False return False
@ -511,9 +511,9 @@ class Session(nodes.FSCollector):
# No point in finding packages when collecting doctests # No point in finding packages when collecting doctests
if not self.config.option.doctestmodules: if not self.config.option.doctestmodules:
pm = self.config.pluginmanager pm = self.config.pluginmanager
for parent in argpath.parts(): for parent in reversed(argpath.parts()):
if pm._confcutdir and pm._confcutdir.relto(parent): if pm._confcutdir and pm._confcutdir.relto(parent):
continue break
if parent.isdir(): if parent.isdir():
pkginit = parent.join("__init__.py") pkginit = parent.join("__init__.py")

View File

@ -1160,11 +1160,11 @@ class Testdir(object):
def runpytest_subprocess(self, *args, **kwargs): def runpytest_subprocess(self, *args, **kwargs):
"""Run pytest as a subprocess with given arguments. """Run pytest as a subprocess with given arguments.
Any plugins added to the :py:attr:`plugins` list will added using the Any plugins added to the :py:attr:`plugins` list will be added using the
``-p`` command line option. Additionally ``--basetemp`` is used put ``-p`` command line option. Additionally ``--basetemp`` is used to put
any temporary files and directories in a numbered directory prefixed any temporary files and directories in a numbered directory prefixed
with "runpytest-" so they do not conflict with the normal numbered with "runpytest-" to not conflict with the normal numbered pytest
pytest location for temporary files and directories. location for temporary files and directories.
:param args: the sequence of arguments to pass to the pytest subprocess :param args: the sequence of arguments to pass to the pytest subprocess
:param timeout: the period in seconds after which to timeout and raise :param timeout: the period in seconds after which to timeout and raise

View File

@ -497,7 +497,10 @@ class TerminalReporter(object):
if not final: if not final:
# Only write "collecting" report every 0.5s. # Only write "collecting" report every 0.5s.
t = time.time() t = time.time()
if self._collect_report_last_write > t - 0.5: if (
self._collect_report_last_write is not None
and self._collect_report_last_write > t - 0.5
):
return return
self._collect_report_last_write = t self._collect_report_last_write = t

View File

@ -27,8 +27,9 @@ class TestGeneralUsage(object):
def test_config_error(self, testdir): def test_config_error(self, testdir):
testdir.copy_example("conftest_usageerror/conftest.py") testdir.copy_example("conftest_usageerror/conftest.py")
result = testdir.runpytest(testdir.tmpdir) result = testdir.runpytest(testdir.tmpdir)
assert result.ret != 0 assert result.ret == EXIT_USAGEERROR
result.stderr.fnmatch_lines(["*ERROR: hello"]) result.stderr.fnmatch_lines(["*ERROR: hello"])
result.stdout.fnmatch_lines(["*pytest_unconfigure_called"])
def test_root_conftest_syntax_error(self, testdir): def test_root_conftest_syntax_error(self, testdir):
testdir.makepyfile(conftest="raise SyntaxError\n") testdir.makepyfile(conftest="raise SyntaxError\n")

View File

@ -2,3 +2,7 @@ def pytest_configure(config):
import pytest import pytest
raise pytest.UsageError("hello") raise pytest.UsageError("hello")
def pytest_unconfigure(config):
print("pytest_unconfigure_called")

View File

@ -136,5 +136,5 @@ def test_caplog_captures_for_all_stages(caplog, logging_during_setup_and_teardow
assert [x.message for x in caplog.get_records("setup")] == ["a_setup_log"] assert [x.message for x in caplog.get_records("setup")] == ["a_setup_log"]
# This reachers into private API, don't use this type of thing in real tests! # This reaches into private API, don't use this type of thing in real tests!
assert set(caplog._item.catch_log_handlers.keys()) == {"setup", "call"} assert set(caplog._item.catch_log_handlers.keys()) == {"setup", "call"}

View File

@ -874,7 +874,7 @@ class TestRootdir(object):
assert inifile == inifile assert inifile == inifile
@pytest.mark.parametrize("name", "setup.cfg tox.ini".split()) @pytest.mark.parametrize("name", "setup.cfg tox.ini".split())
def test_pytestini_overides_empty_other(self, tmpdir, name): def test_pytestini_overrides_empty_other(self, tmpdir, name):
inifile = tmpdir.ensure("pytest.ini") inifile = tmpdir.ensure("pytest.ini")
a = tmpdir.mkdir("a") a = tmpdir.mkdir("a")
a.ensure(name) a.ensure(name)

View File

@ -19,13 +19,19 @@ def test_fileimport(modfile):
# without needing the pytest namespace being set # without needing the pytest namespace being set
# this is critical for the initialization of xdist # this is critical for the initialization of xdist
res = subprocess.call( p = subprocess.Popen(
[ [
sys.executable, sys.executable,
"-c", "-c",
"import sys, py; py.path.local(sys.argv[1]).pyimport()", "import sys, py; py.path.local(sys.argv[1]).pyimport()",
modfile.strpath, modfile.strpath,
] ],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
) )
if res: (out, err) = p.communicate()
pytest.fail("command result %s" % res) if p.returncode != 0:
pytest.fail(
"importing %s failed (exitcode %d): out=%r, err=%r"
% (modfile, p.returncode, out, err)
)

View File

@ -380,3 +380,21 @@ class TestPytestPluginManagerBootstrapming(object):
pytestpm.consider_preparse(["xyz", "-p", "no:abc"]) pytestpm.consider_preparse(["xyz", "-p", "no:abc"])
l2 = pytestpm.get_plugins() l2 = pytestpm.get_plugins()
assert 42 not in l2 assert 42 not in l2
def test_plugin_prevent_register_stepwise_on_cacheprovider_unregister(
self, pytestpm
):
""" From PR #4304 : The only way to unregister a module is documented at
the end of https://docs.pytest.org/en/latest/plugins.html.
When unregister cacheprovider, then unregister stepwise too
"""
pytestpm.register(42, name="cacheprovider")
pytestpm.register(43, name="stepwise")
l1 = pytestpm.get_plugins()
assert 42 in l1
assert 43 in l1
pytestpm.consider_preparse(["xyz", "-p", "no:cacheprovider"])
l2 = pytestpm.get_plugins()
assert 42 not in l2
assert 43 not in l2