- rename metainfo to reportinfo for clarity

- report hook: pytest_report_iteminfo to override the .reportinfo() as provided by items

--HG--
branch : trunk
This commit is contained in:
Samuele Pedroni
2009-05-12 17:02:22 +02:00
parent 0f049147f4
commit b392b0eac1
8 changed files with 77 additions and 49 deletions
+6 -5
View File
@@ -53,11 +53,6 @@ class PluginHooks:
""" return custom item/collector for a python object in a module, or None. """
pytest_pycollect_obj.firstresult = True
def pytest_collect_metainfo(self, colitem):
""" return (fspath, lineno, name) for the colitem.
the information is used for result display and to sort tests
"""
def pytest_genfunc(self, funcspec):
""" generate (multiple) parametrized calls to a test function."""
@@ -104,6 +99,12 @@ class PluginHooks:
def pytest_terminal_summary(self, terminalreporter):
""" add additional section in terminal summary reporting. """
def pytest_report_iteminfo(self, item):
""" return (fspath, lineno, name) for the item.
the information is used for result display and to sort tests
"""
pytest_report_iteminfo.firstresult = True
# ------------------------------------------------------------------------------
# doctest hooks
# ------------------------------------------------------------------------------
+16
View File
@@ -54,6 +54,9 @@ class DefaultPlugin:
Directory = parent.config.getvalue('Directory', path)
return Directory(path, parent=parent)
def pytest_report_iteminfo(self, item):
return item.reportinfo()
def pytest_addoption(self, parser):
group = parser.addgroup("general", "test collection and failure interaction options")
group._addoption('-v', '--verbose', action="count",
@@ -248,3 +251,16 @@ def test_dist_options(testdir):
config = testdir.parseconfigure("-d")
assert config.option.dist == "load"
def test_pytest_report_iteminfo():
plugin = DefaultPlugin()
class FakeItem(object):
def reportinfo(self):
return "-reportinfo-"
res = plugin.pytest_report_iteminfo(FakeItem())
assert res == "-reportinfo-"
+3 -3
View File
@@ -64,7 +64,7 @@ class ReSTSyntaxTest(py.test.collect.Item):
super(ReSTSyntaxTest, self).__init__(*args, **kwargs)
self.project = project
def metainfo(self):
def reportinfo(self):
return self.fspath, None, "syntax check"
def runtest(self):
@@ -196,7 +196,7 @@ class ReSTSyntaxTest(py.test.collect.Item):
#return [] # no need to rebuild
class DoctestText(py.test.collect.Item):
def metainfo(self):
def reportinfo(self):
return self.fspath, None, "doctest"
def runtest(self):
@@ -282,7 +282,7 @@ class LinkCheckerMaker(py.test.collect.Collector):
args=(tryfn, path, lineno), callobj=localrefcheck)
class CheckLink(py.test.collect.Function):
def metainfo(self, basedir=None):
def reportinfo(self, basedir=None):
return (self.fspath, self._args[2], "checklink: %s" % self._args[0])
def setup(self):
+41 -12
View File
@@ -149,19 +149,19 @@ class TerminalReporter:
# for dist-testing situations itemstart means we
# queued the item for sending, not interesting (unless debugging)
if self.config.option.debug:
line = self._metainfoline(item)
line = self._reportinfoline(item)
extra = ""
if node:
extra = "-> " + str(node.gateway.id)
self.write_ensure_prefix(line, extra)
else:
if self.config.option.verbose:
line = self._metainfoline(item)
line = self._reportinfoline(item)
self.write_ensure_prefix(line, "")
else:
# ensure that the path is printed before the
# 1st test of a module starts running
fspath, lineno, msg = item.metainfo()
fspath, lineno, msg = self._getreportinfo(item)
self.write_fspath_result(fspath, "")
def pytest_itemtestreport(self, rep):
@@ -173,10 +173,10 @@ class TerminalReporter:
markup = {}
self.stats.setdefault(cat, []).append(rep)
if not self.config.option.verbose:
fspath, lineno, msg = rep.colitem.metainfo()
fspath, lineno, msg = self._getreportinfo(rep.colitem)
self.write_fspath_result(fspath, letter)
else:
line = self._metainfoline(rep.colitem)
line = self._reportinfoline(rep.colitem)
if not hasattr(rep, 'node'):
self.write_ensure_prefix(line, word, **markup)
else:
@@ -254,8 +254,8 @@ class TerminalReporter:
for rootdir in rootdirs:
self.write_line("### Watching: %s" %(rootdir,), bold=True)
def _metainfoline(self, item):
fspath, lineno, msg = item.metainfo()
def _reportinfoline(self, item):
fspath, lineno, msg = self._getreportinfo(item)
if fspath:
fspath = self.curdir.bestrelpath(fspath)
if lineno is not None:
@@ -267,16 +267,26 @@ class TerminalReporter:
elif fspath and lineno:
line = "%(fspath)s:%(lineno)s"
else:
line = "[nometainfo]"
line = "[noreportinfo]"
return line % locals() + " "
def _getfailureheadline(self, rep):
if isinstance(rep.colitem, py.test.collect.Collector):
return str(rep.colitem.fspath)
else:
fspath, lineno, msg = rep.colitem.metainfo()
fspath, lineno, msg = self._getreportinfo(rep.colitem)
return msg
def _getreportinfo(self, item):
try:
return item.__reportinfo
except AttributeError:
pass
reportinfo = item.config.hook.pytest_report_iteminfo(item=item)
# cache on item
item.__reportinfo = reportinfo
return reportinfo
#
# summaries for testrunfinish
#
@@ -579,11 +589,11 @@ class TestTerminal:
"*test_show_path_before_running_test.py*"
])
def test_itemreport_metainfo(self, testdir, linecomp):
def test_itemreport_reportinfo(self, testdir, linecomp):
testdir.makeconftest("""
import py
class Function(py.test.collect.Function):
def metainfo(self):
def reportinfo(self):
return "ABCDE", 42, "custom"
""")
item = testdir.getitem("def test_func(): pass")
@@ -599,6 +609,25 @@ class TestTerminal:
"*ABCDE:43: custom*"
])
def test_itemreport_pytest_report_iteminfo(self, testdir, linecomp):
item = testdir.getitem("def test_func(): pass")
class Plugin:
def pytest_report_iteminfo(self, item):
return "FGHJ", 42, "custom"
item.config.pluginmanager.register(Plugin())
tr = TerminalReporter(item.config, file=linecomp.stringio)
item.config.pluginmanager.register(tr)
tr.config.hook.pytest_itemstart(item=item)
linecomp.assert_contains_lines([
"*FGHJ "
])
tr.config.option.verbose = True
tr.config.hook.pytest_itemstart(item=item)
linecomp.assert_contains_lines([
"*FGHJ:43: custom*"
])
def pseudo_keyboard_interrupt(self, testdir, linecomp, verbose=False):
modcol = testdir.getmodulecol("""
def test_foobar():