You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.9 KiB
Python
87 lines
2.9 KiB
Python
"""Summary reporting"""
|
|
|
|
import sys
|
|
|
|
from coverage.report import Reporter
|
|
from coverage.results import Numbers
|
|
from coverage.misc import NotPython
|
|
|
|
|
|
class SummaryReporter(Reporter):
|
|
"""A reporter for writing the summary report."""
|
|
|
|
def __init__(self, coverage, config):
|
|
super(SummaryReporter, self).__init__(coverage, config)
|
|
self.branches = coverage.data.has_arcs()
|
|
|
|
def report(self, morfs, outfile=None):
|
|
"""Writes a report summarizing coverage statistics per module.
|
|
|
|
`outfile` is a file object to write the summary to.
|
|
|
|
"""
|
|
self.find_code_units(morfs)
|
|
|
|
# Prepare the formatting strings
|
|
max_name = max([len(cu.name) for cu in self.code_units] + [5])
|
|
fmt_name = "%%- %ds " % max_name
|
|
fmt_err = "%s %s: %s\n"
|
|
header = (fmt_name % "Name") + " Stmts Miss"
|
|
fmt_coverage = fmt_name + "%6d %6d"
|
|
if self.branches:
|
|
header += " Branch BrMiss"
|
|
fmt_coverage += " %6d %6d"
|
|
width100 = Numbers.pc_str_width()
|
|
header += "%*s" % (width100+4, "Cover")
|
|
fmt_coverage += "%%%ds%%%%" % (width100+3,)
|
|
if self.config.show_missing:
|
|
header += " Missing"
|
|
fmt_coverage += " %s"
|
|
rule = "-" * len(header) + "\n"
|
|
header += "\n"
|
|
fmt_coverage += "\n"
|
|
|
|
if not outfile:
|
|
outfile = sys.stdout
|
|
|
|
# Write the header
|
|
outfile.write(header)
|
|
outfile.write(rule)
|
|
|
|
total = Numbers()
|
|
|
|
for cu in self.code_units:
|
|
try:
|
|
analysis = self.coverage._analyze(cu)
|
|
nums = analysis.numbers
|
|
args = (cu.name, nums.n_statements, nums.n_missing)
|
|
if self.branches:
|
|
args += (nums.n_branches, nums.n_missing_branches)
|
|
args += (nums.pc_covered_str,)
|
|
if self.config.show_missing:
|
|
args += (analysis.missing_formatted(),)
|
|
outfile.write(fmt_coverage % args)
|
|
total += nums
|
|
except KeyboardInterrupt: # pragma: not covered
|
|
raise
|
|
except:
|
|
report_it = not self.config.ignore_errors
|
|
if report_it:
|
|
typ, msg = sys.exc_info()[:2]
|
|
if typ is NotPython and not cu.should_be_python():
|
|
report_it = False
|
|
if report_it:
|
|
outfile.write(fmt_err % (cu.name, typ.__name__, msg))
|
|
|
|
if total.n_files > 1:
|
|
outfile.write(rule)
|
|
args = ("TOTAL", total.n_statements, total.n_missing)
|
|
if self.branches:
|
|
args += (total.n_branches, total.n_missing_branches)
|
|
args += (total.pc_covered_str,)
|
|
if self.config.show_missing:
|
|
args += ("",)
|
|
outfile.write(fmt_coverage % args)
|
|
|
|
return total.pc_covered
|