2009-03-30 06:10:24 +08:00
|
|
|
import py
|
|
|
|
|
|
|
|
class FigleafPlugin:
|
|
|
|
def pytest_addoption(self, parser):
|
|
|
|
group = parser.addgroup('figleaf options')
|
|
|
|
group.addoption('-F', action='store_true', default=False,
|
|
|
|
dest = 'figleaf',
|
|
|
|
help='trace coverage with figleaf and write HTML')
|
|
|
|
group.addoption('--figleaf-data', action='store', default='.figleaf',
|
|
|
|
dest='figleafdata',
|
|
|
|
help='path coverage tracing file.')
|
|
|
|
group.addoption('--figleaf-html', action='store', default='html',
|
|
|
|
dest='figleafhtml',
|
|
|
|
help='path to the coverage html dir.')
|
|
|
|
|
|
|
|
def pytest_configure(self, config):
|
|
|
|
if config.getvalue('figleaf'):
|
|
|
|
try:
|
|
|
|
import figleaf
|
|
|
|
import figleaf.annotate_html
|
|
|
|
except ImportError:
|
|
|
|
raise config.Error('Could not import figleaf module')
|
|
|
|
self.figleaf = figleaf
|
|
|
|
self.figleaf.start()
|
|
|
|
|
|
|
|
def pytest_terminal_summary(self, terminalreporter):
|
|
|
|
if hasattr(self, 'figleaf'):
|
2009-03-30 07:12:41 +08:00
|
|
|
datafile = terminalreporter.config.getvalue('figleafdata')
|
|
|
|
datafile = py.path.local(datafile)
|
2009-03-30 06:10:24 +08:00
|
|
|
tw = terminalreporter._tw
|
|
|
|
tw.sep('-', 'figleaf')
|
2009-03-30 07:12:41 +08:00
|
|
|
tw.line('Writing figleaf data to %s' % (datafile))
|
2009-03-30 06:10:24 +08:00
|
|
|
self.figleaf.stop()
|
2009-03-30 07:12:41 +08:00
|
|
|
self.figleaf.write_coverage(str(datafile))
|
|
|
|
coverage = self.get_coverage(datafile,
|
|
|
|
terminalreporter.config.topdir)
|
2009-03-30 06:10:24 +08:00
|
|
|
|
|
|
|
reportdir = terminalreporter.config.getvalue('figleafhtml')
|
|
|
|
reportdir = py.path.local(reportdir)
|
|
|
|
tw.line('Writing figleaf html to file://%s' % (reportdir))
|
|
|
|
self.figleaf.annotate_html.prepare_reportdir(str(reportdir))
|
2009-03-30 07:12:41 +08:00
|
|
|
exclude = []
|
2009-03-30 06:10:24 +08:00
|
|
|
self.figleaf.annotate_html.report_as_html(coverage,
|
|
|
|
str(reportdir), exclude, {})
|
|
|
|
|
2009-03-30 07:12:41 +08:00
|
|
|
def get_coverage(self, datafile, topdir):
|
|
|
|
data = self.figleaf.read_coverage(str(datafile))
|
|
|
|
d = {}
|
|
|
|
coverage = self.figleaf.combine_coverage(d, data)
|
|
|
|
for path in coverage.keys():
|
|
|
|
if not py.path.local(path).relto(topdir):
|
|
|
|
del coverage[path]
|
|
|
|
|
|
|
|
return coverage
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-03-30 06:40:44 +08:00
|
|
|
def test_generic(plugintester):
|
|
|
|
plugintester.apicheck(FigleafPlugin)
|
2009-03-30 06:10:24 +08:00
|
|
|
|
2009-03-30 06:40:44 +08:00
|
|
|
def test_functional(testdir):
|
|
|
|
testdir.plugins.append('figleaf')
|
|
|
|
testdir.makepyfile("""
|
|
|
|
def f():
|
|
|
|
x = 42
|
|
|
|
def test_whatever():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest('-F')
|
|
|
|
assert result.ret == 0
|
|
|
|
assert result.stdout.fnmatch_lines([
|
|
|
|
'*figleaf html*'
|
|
|
|
])
|
|
|
|
print result.stdout.str()
|