Use warnings module directly with cacheprovider (#6740)
This commit is contained in:
commit
7fc9d4c976
|
@ -71,10 +71,10 @@ class Cache:
|
||||||
return resolve_from_str(config.getini("cache_dir"), config.rootdir)
|
return resolve_from_str(config.getini("cache_dir"), config.rootdir)
|
||||||
|
|
||||||
def warn(self, fmt, **args):
|
def warn(self, fmt, **args):
|
||||||
from _pytest.warnings import _issue_warning_captured
|
import warnings
|
||||||
from _pytest.warning_types import PytestCacheWarning
|
from _pytest.warning_types import PytestCacheWarning
|
||||||
|
|
||||||
_issue_warning_captured(
|
warnings.warn(
|
||||||
PytestCacheWarning(fmt.format(**args) if args else fmt),
|
PytestCacheWarning(fmt.format(**args) if args else fmt),
|
||||||
self._config.hook,
|
self._config.hook,
|
||||||
stacklevel=3,
|
stacklevel=3,
|
||||||
|
|
|
@ -136,6 +136,15 @@ def pytest_terminal_summary(terminalreporter):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.hookimpl(hookwrapper=True)
|
||||||
|
def pytest_sessionfinish(session):
|
||||||
|
config = session.config
|
||||||
|
with catch_warnings_for_item(
|
||||||
|
config=config, ihook=config.hook, when="config", item=None
|
||||||
|
):
|
||||||
|
yield
|
||||||
|
|
||||||
|
|
||||||
def _issue_warning_captured(warning, hook, stacklevel):
|
def _issue_warning_captured(warning, hook, stacklevel):
|
||||||
"""
|
"""
|
||||||
This function should be used instead of calling ``warnings.warn`` directly when we are in the "configure" stage:
|
This function should be used instead of calling ``warnings.warn`` directly when we are in the "configure" stage:
|
||||||
|
|
|
@ -56,9 +56,7 @@ class TestNewAPI:
|
||||||
testdir.tmpdir.ensure_dir(".pytest_cache").chmod(mode)
|
testdir.tmpdir.ensure_dir(".pytest_cache").chmod(mode)
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.platform.startswith("win"), reason="no chmod on windows")
|
@pytest.mark.skipif(sys.platform.startswith("win"), reason="no chmod on windows")
|
||||||
@pytest.mark.filterwarnings(
|
@pytest.mark.filterwarnings("default")
|
||||||
"ignore:could not create cache path:pytest.PytestWarning"
|
|
||||||
)
|
|
||||||
def test_cache_failure_warns(self, testdir, monkeypatch):
|
def test_cache_failure_warns(self, testdir, monkeypatch):
|
||||||
monkeypatch.setenv("PYTEST_DISABLE_PLUGIN_AUTOLOAD", "1")
|
monkeypatch.setenv("PYTEST_DISABLE_PLUGIN_AUTOLOAD", "1")
|
||||||
cache_dir = str(testdir.tmpdir.ensure_dir(".pytest_cache"))
|
cache_dir = str(testdir.tmpdir.ensure_dir(".pytest_cache"))
|
||||||
|
@ -70,7 +68,15 @@ class TestNewAPI:
|
||||||
assert result.ret == 1
|
assert result.ret == 1
|
||||||
# warnings from nodeids, lastfailed, and stepwise
|
# warnings from nodeids, lastfailed, and stepwise
|
||||||
result.stdout.fnmatch_lines(
|
result.stdout.fnmatch_lines(
|
||||||
["*could not create cache path*", "*3 warnings*"]
|
[
|
||||||
|
# Validate location/stacklevel of warning from cacheprovider.
|
||||||
|
"*= warnings summary =*",
|
||||||
|
"*/cacheprovider.py:314",
|
||||||
|
" */cacheprovider.py:314: PytestCacheWarning: could not create cache path "
|
||||||
|
"{}/v/cache/nodeids".format(cache_dir),
|
||||||
|
' config.cache.set("cache/nodeids", self.cached_nodeids)',
|
||||||
|
"*1 failed, 3 warnings in*",
|
||||||
|
]
|
||||||
)
|
)
|
||||||
finally:
|
finally:
|
||||||
testdir.tmpdir.ensure_dir(".pytest_cache").chmod(mode)
|
testdir.tmpdir.ensure_dir(".pytest_cache").chmod(mode)
|
||||||
|
|
|
@ -712,27 +712,6 @@ class TestStackLevel:
|
||||||
assert "resultlog.py" in file
|
assert "resultlog.py" in file
|
||||||
assert func == "pytest_configure"
|
assert func == "pytest_configure"
|
||||||
|
|
||||||
def test_issue4445_cacheprovider_set(self, testdir, capwarn):
|
|
||||||
"""#4445: Make sure the warning points to a reasonable location
|
|
||||||
See origin of _issue_warning_captured at: _pytest.cacheprovider.py:59
|
|
||||||
"""
|
|
||||||
testdir.tmpdir.join(".pytest_cache").write("something wrong")
|
|
||||||
testdir.runpytest(plugins=[capwarn()])
|
|
||||||
|
|
||||||
# with stacklevel=3 the warning originates from one stacklevel above
|
|
||||||
# _issue_warning_captured in cacheprovider.Cache.set and is thrown
|
|
||||||
# when there are errors during cache folder creation
|
|
||||||
|
|
||||||
# set is called twice (in module stepwise and in cacheprovider) so emits
|
|
||||||
# two warnings when there are errors during cache folder creation. (is this intentional?)
|
|
||||||
assert len(capwarn.captured) == 2
|
|
||||||
warning, location = capwarn.captured.pop()
|
|
||||||
file, lineno, func = location
|
|
||||||
|
|
||||||
assert "could not create cache path" in str(warning.message)
|
|
||||||
assert "cacheprovider.py" in file
|
|
||||||
assert func == "set"
|
|
||||||
|
|
||||||
def test_issue4445_issue5928_mark_generator(self, testdir):
|
def test_issue4445_issue5928_mark_generator(self, testdir):
|
||||||
"""#4445 and #5928: Make sure the warning from an unknown mark points to
|
"""#4445 and #5928: Make sure the warning from an unknown mark points to
|
||||||
the test file where this mark is used.
|
the test file where this mark is used.
|
||||||
|
|
Loading…
Reference in New Issue