126 lines
4.3 KiB
Python
126 lines
4.3 KiB
Python
|
"""
|
||
|
Implements terminal reporting of the full validation process.
|
||
|
|
||
|
Implements the various reporting hooks.
|
||
|
XXX: Currently in progress, NOT IN WORKING STATE.
|
||
|
|
||
|
"""
|
||
|
import sys
|
||
|
|
||
|
def pytest_addoption(parser):
|
||
|
group = parser.getgroup("terminal reporting", after="general")
|
||
|
group._addoption('-v', '--verbose', action="count",
|
||
|
dest="verbose", default=0, help="increase verbosity."),
|
||
|
group.addoption('--report',
|
||
|
action="store", dest="report", default=None, metavar="opts",
|
||
|
help="comma separated options, valid: skipped,xfailed")
|
||
|
group._addoption('--fulltrace',
|
||
|
action="store_true", dest="fulltrace", default=False,
|
||
|
help="don't cut any tracebacks (default is to cut).")
|
||
|
|
||
|
group.addoption('--traceconfig',
|
||
|
action="store_true", dest="traceconfig", default=False,
|
||
|
help="trace considerations of conftest.py files."),
|
||
|
|
||
|
class TerminalReporter:
|
||
|
def __init__(self, config, file=None):
|
||
|
self.config = config
|
||
|
self.stats = {}
|
||
|
self.curdir = py.path.local()
|
||
|
if file is None:
|
||
|
file = sys.stdout
|
||
|
self._tw = TerminalWriter(file)
|
||
|
self.currentfspath = None
|
||
|
self._reportopt = getreportopt(config.getvalue('report'))
|
||
|
|
||
|
def hasopt(self, name):
|
||
|
return self._reportopt.get(name, False)
|
||
|
|
||
|
def write_fspath_result(self, fspath, res):
|
||
|
fspath = self.curdir.bestrelpath(fspath)
|
||
|
if fspath != self.currentfspath:
|
||
|
self._tw.line()
|
||
|
relpath = self.curdir.bestrelpath(fspath)
|
||
|
self._tw.write(relpath + " ")
|
||
|
self.currentfspath = fspath
|
||
|
self._tw.write(res)
|
||
|
|
||
|
def write_ensure_prefix(self, prefix, extra="", **kwargs):
|
||
|
if self.currentfspath != prefix:
|
||
|
self._tw.line()
|
||
|
self.currentfspath = prefix
|
||
|
self._tw.write(prefix)
|
||
|
if extra:
|
||
|
self._tw.write(extra, **kwargs)
|
||
|
self.currentfspath = -2
|
||
|
|
||
|
def ensure_newline(self):
|
||
|
if self.currentfspath:
|
||
|
self._tw.line()
|
||
|
self.currentfspath = None
|
||
|
|
||
|
def write_line(self, line, **markup):
|
||
|
line = str(line)
|
||
|
self.ensure_newline()
|
||
|
self._tw.line(line, **markup)
|
||
|
|
||
|
def write_sep(self, sep, title=None, **markup):
|
||
|
self.ensure_newline()
|
||
|
self._tw.sep(sep, title, **markup)
|
||
|
|
||
|
def getoutcomeword(self, rep):
|
||
|
if rep.passed:
|
||
|
return "PASS", dict(green=True)
|
||
|
elif rep.failed:
|
||
|
return "FAIL", dict(red=True)
|
||
|
elif rep.skipped:
|
||
|
return "SKIP"
|
||
|
else:
|
||
|
return "???", dict(red=True)
|
||
|
|
||
|
#
|
||
|
# summaries for sessionfinish
|
||
|
#
|
||
|
|
||
|
def summary_failures(self):
|
||
|
if 'failed' in self.stats and self.config.option.tbstyle != "no":
|
||
|
self.write_sep("=", "FAILURES")
|
||
|
for rep in self.stats['failed']:
|
||
|
msg = self._getfailureheadline(rep)
|
||
|
self.write_sep("_", msg)
|
||
|
self.write_platinfo(rep)
|
||
|
rep.toterminal(self._tw)
|
||
|
|
||
|
def summary_errors(self):
|
||
|
if 'error' in self.stats and self.config.option.tbstyle != "no":
|
||
|
self.write_sep("=", "ERRORS")
|
||
|
for rep in self.stats['error']:
|
||
|
msg = self._getfailureheadline(rep)
|
||
|
if not hasattr(rep, 'when'):
|
||
|
# collect
|
||
|
msg = "ERROR during collection " + msg
|
||
|
elif rep.when == "setup":
|
||
|
msg = "ERROR at setup of " + msg
|
||
|
elif rep.when == "teardown":
|
||
|
msg = "ERROR at teardown of " + msg
|
||
|
self.write_sep("_", msg)
|
||
|
self.write_platinfo(rep)
|
||
|
rep.toterminal(self._tw)
|
||
|
|
||
|
def summary_stats(self):
|
||
|
session_duration = py.std.time.time() - self._sessionstarttime
|
||
|
|
||
|
keys = "failed passed skipped deselected".split()
|
||
|
for key in self.stats.keys():
|
||
|
if key not in keys:
|
||
|
keys.append(key)
|
||
|
parts = []
|
||
|
for key in keys:
|
||
|
val = self.stats.get(key, None)
|
||
|
if val:
|
||
|
parts.append("%d %s" %(len(val), key))
|
||
|
line = ", ".join(parts)
|
||
|
# XXX coloring
|
||
|
self.write_sep("=", "%s in %.2f seconds" %(line, session_duration))
|
||
|
|