3 from coverage import coverage
4 from coverage.results import Numbers
5 from coverage.summary import SummaryReporter
6 from twisted.python import usage
8 # this is an adaptation of the code behind "coverage report", modified to
9 # display+sortby "lines uncovered", which (IMHO) is more important of a
10 # metric than lines covered or percentage covered. Concentrating on the files
11 # with the most uncovered lines encourages getting the tree and test suite
12 # into a state that provides full line-coverage on all files.
14 # much of this code was adapted from coverage/summary.py in the 'coverage'
15 # distribution, and is used under their BSD license.
17 class Options(usage.Options):
19 ("sortby", "s", "uncovered", "how to sort: uncovered, covered, name"),
22 class MyReporter(SummaryReporter):
23 def report(self, outfile=None, sortby="uncovered"):
24 self.find_code_units(None, ["/System", "/Library", "/usr/lib",
25 "support/lib", "src/allmydata/test"])
27 # Prepare the formatting strings
28 max_name = max([len(cu.name) for cu in self.code_units] + [5])
29 fmt_name = "%%- %ds " % max_name
30 fmt_err = "%s %s: %s\n"
31 header1 = (fmt_name % "" ) + " Statements "
32 header2 = (fmt_name % "Name") + " Uncovered Covered"
33 fmt_coverage = fmt_name + "%9d %7d "
35 header1 += " Branches "
36 header2 += " Found Excutd"
37 fmt_coverage += " %6d %6d"
40 fmt_coverage += " %7d%%"
45 rule = "-" * len(header1) + "\n"
54 outfile.write(header1)
55 outfile.write(header2)
62 for cu in self.code_units:
64 analysis = self.coverage._analyze(cu)
65 nums = analysis.numbers
66 uncovered = nums.n_statements - nums.n_executed
67 total_uncovered += uncovered
68 args = (cu.name, uncovered, nums.n_executed)
70 args += (nums.n_branches, nums.n_executed_branches)
71 args += (nums.pc_covered,)
73 args += (analysis.missing_formatted(),)
74 if sortby == "covered":
75 sortkey = nums.pc_covered
76 elif sortby == "uncovered":
80 lines.append((sortkey, fmt_coverage % args))
82 except KeyboardInterrupt: # pragma: no cover
85 if not self.ignore_errors:
86 typ, msg = sys.exc_info()[:2]
87 outfile.write(fmt_err % (cu.name, typ.__name__, msg))
89 if sortby in ("uncovered", "covered"):
91 for sortkey,line in lines:
96 args = ("TOTAL", total_uncovered, total.n_executed)
98 args += (total.n_branches, total.n_executed_branches)
99 args += (total.pc_covered,)
100 if self.show_missing:
102 outfile.write(fmt_coverage % args)
107 r = MyReporter(c, show_missing=False, ignore_errors=False)
108 r.report(sortby=o['sortby'])
110 if __name__ == '__main__':