diff --git a/_pytest/config.py b/_pytest/config.py index e73452b25..c9af4d030 100644 --- a/_pytest/config.py +++ b/_pytest/config.py @@ -16,6 +16,8 @@ hookspec = HookspecMarker("pytest") # pytest startup # + + class ConftestImportFailure(Exception): def __init__(self, path, excinfo): Exception.__init__(self, path, excinfo) @@ -135,8 +137,6 @@ class PytestPluginManager(PluginManager): """ def __init__(self): super(PytestPluginManager, self).__init__("pytest", implprefix="pytest_") - self._warnings = [] - self._pushwarning = self._warnings.append self._conftest_plugins = set() # state related to local conftest plugins @@ -227,30 +227,14 @@ class PytestPluginManager(PluginManager): "trylast: mark a hook implementation function such that the " "plugin machinery will try to call it last/as late as possible.") - def pytest_plugin_registered(self, plugin): - if self.get_name(plugin) == 'terminalreporter': - warnings = self._warnings - self._warnings = None - config = self.get_plugin('pytestconfig') - - def pushwarning(args): - assert args.pop('nodeid', None) is None - config.warn(**args) - - self._pushwarning = pushwarning - for warning in warnings: - config.hook.pytest_logwarning(**warning) - def _warn(self, message): - if isinstance(message, dict): - self._pushwarning(message) - else: - self._pushwarning({ - 'code': 'I1', - 'message': message, - 'fslocation': None, - 'nodeid': None, - }) + kwargs = message if isinstance(message, dict) else { + 'code': 'I1', + 'message': message, + 'fslocation': None, + 'nodeid': None, + } + self.hook.pytest_logwarning.call_historic(kwargs=kwargs) # # internal API for local conftest plugin handling @@ -726,6 +710,7 @@ class MyOptionParser(argparse.ArgumentParser): getattr(args, FILE_OR_DIR).extend(argv) return args + class DropShorterLongHelpFormatter(argparse.HelpFormatter): """shorten help for long options that differ only in extra hyphens @@ -845,8 +830,9 @@ class Config(object): def warn(self, code, message, fslocation=None): """ generate a warning for this test session. """ - self.hook.pytest_logwarning(code=code, message=message, - fslocation=fslocation, nodeid=None) + self.hook.pytest_logwarning.call_historic(kwargs=dict( + code=code, message=message, + fslocation=fslocation, nodeid=None)) def get_terminal_writer(self): return self.pluginmanager.get_plugin("terminalreporter")._tw diff --git a/_pytest/hookspec.py b/_pytest/hookspec.py index c75f563f4..a3a481d6a 100644 --- a/_pytest/hookspec.py +++ b/_pytest/hookspec.py @@ -249,6 +249,8 @@ def pytest_report_teststatus(report): def pytest_terminal_summary(terminalreporter): """ add additional section in terminal summary reporting. """ + +@hookspec(historic=True) def pytest_logwarning(message, code, nodeid, fslocation): """ process a warning specified by a message, a code string, a nodeid and fslocation (both of which may be None diff --git a/_pytest/main.py b/_pytest/main.py index 4f3d2625f..6b2ccb6b7 100644 --- a/_pytest/main.py +++ b/_pytest/main.py @@ -279,9 +279,9 @@ class Node(object): else: fslocation = "%s:%s" % fslocation[:2] - self.ihook.pytest_logwarning(code=code, message=message, - nodeid=self.nodeid, - fslocation=fslocation) + self.ihook.pytest_logwarning.call_historic(kwargs=dict( + code=code, message=message, + nodeid=self.nodeid, fslocation=fslocation)) # methods for ordering nodes @property @@ -742,5 +742,3 @@ class Session(FSCollector): for x in self.genitems(subnode): yield x node.ihook.pytest_collectreport(report=rep) - - diff --git a/testing/test_pluginmanager.py b/testing/test_pluginmanager.py index 92afba9bc..c49938100 100644 --- a/testing/test_pluginmanager.py +++ b/testing/test_pluginmanager.py @@ -129,14 +129,21 @@ class TestPytestPluginInteractions: undo() def test_warn_on_deprecated_multicall(self, pytestpm): + warnings = [] + + class get_warnings: + def pytest_logwarning(self, message): + warnings.append(message) + class Plugin: def pytest_configure(self, __multicall__): pass - before = list(pytestpm._warnings) + pytestpm.register(get_warnings()) + before = list(warnings) pytestpm.register(Plugin()) - assert len(pytestpm._warnings) == len(before) + 1 - assert "deprecated" in pytestpm._warnings[-1]["message"] + assert len(warnings) == len(before) + 1 + assert "deprecated" in warnings[-1] def test_namespace_has_default_and_env_plugins(testdir):