1 """Summary reporting""" |
1 """Summary reporting""" |
2 |
2 |
3 import sys |
3 import sys |
4 |
4 |
5 from report import Reporter |
5 from coverage.report import Reporter |
|
6 from coverage.results import Numbers |
6 |
7 |
7 |
8 |
8 class SummaryReporter(Reporter): |
9 class SummaryReporter(Reporter): |
9 """A reporter for writing the summary report.""" |
10 """A reporter for writing the summary report.""" |
10 |
11 |
11 def __init__(self, coverage, show_missing=True, ignore_errors=False): |
12 def __init__(self, coverage, show_missing=True, ignore_errors=False): |
12 super(SummaryReporter, self).__init__(coverage, ignore_errors) |
13 super(SummaryReporter, self).__init__(coverage, ignore_errors) |
13 self.show_missing = show_missing |
14 self.show_missing = show_missing |
|
15 self.branches = coverage.data.has_arcs() |
14 |
16 |
15 def report(self, morfs, omit_prefixes=None, outfile=None): |
17 def report(self, morfs, omit_prefixes=None, outfile=None): |
16 """Writes a report summarizing coverage statistics per module.""" |
18 """Writes a report summarizing coverage statistics per module.""" |
17 |
19 |
18 self.find_code_units(morfs, omit_prefixes) |
20 self.find_code_units(morfs, omit_prefixes) |
19 |
21 |
20 # Prepare the formatting strings |
22 # Prepare the formatting strings |
21 max_name = max([len(cu.name) for cu in self.code_units] + [5]) |
23 max_name = max([len(cu.name) for cu in self.code_units] + [5]) |
22 fmt_name = "%%- %ds " % max_name |
24 fmt_name = "%%- %ds " % max_name |
23 fmt_err = "%s %s: %s\n" |
25 fmt_err = "%s %s: %s\n" |
24 header = fmt_name % "Name" + " Stmts Exec Cover\n" |
26 header = (fmt_name % "Name") + " Stmts Exec" |
25 fmt_coverage = fmt_name + "% 6d % 6d % 5d%%\n" |
27 fmt_coverage = fmt_name + "%6d %6d" |
|
28 if self.branches: |
|
29 header += " Branch BrExec" |
|
30 fmt_coverage += " %6d %6d" |
|
31 header += " Cover" |
|
32 fmt_coverage += " %5d%%" |
26 if self.show_missing: |
33 if self.show_missing: |
27 header = header.replace("\n", " Missing\n") |
34 header += " Missing" |
28 fmt_coverage = fmt_coverage.replace("\n", " %s\n") |
35 fmt_coverage += " %s" |
29 rule = "-" * (len(header)-1) + "\n" |
36 rule = "-" * len(header) + "\n" |
|
37 header += "\n" |
|
38 fmt_coverage += "\n" |
30 |
39 |
31 if not outfile: |
40 if not outfile: |
32 outfile = sys.stdout |
41 outfile = sys.stdout |
33 |
42 |
34 # Write the header |
43 # Write the header |
35 outfile.write(header) |
44 outfile.write(header) |
36 outfile.write(rule) |
45 outfile.write(rule) |
37 |
46 |
38 total_statements = 0 |
47 total = Numbers() |
39 total_executed = 0 |
48 |
40 total_units = 0 |
|
41 |
|
42 for cu in self.code_units: |
49 for cu in self.code_units: |
43 try: |
50 try: |
44 statements, _, missing, readable = self.coverage._analyze(cu) |
51 analysis = self.coverage._analyze(cu) |
45 n = len(statements) |
52 nums = analysis.numbers |
46 m = n - len(missing) |
53 args = (cu.name, nums.n_statements, nums.n_executed) |
47 if n > 0: |
54 if self.branches: |
48 pc = 100.0 * m / n |
55 args += (nums.n_branches, nums.n_executed_branches) |
49 else: |
56 args += (nums.pc_covered,) |
50 pc = 100.0 |
|
51 args = (cu.name, n, m, pc) |
|
52 if self.show_missing: |
57 if self.show_missing: |
53 args = args + (readable,) |
58 args += (analysis.missing_formatted(),) |
54 outfile.write(fmt_coverage % args) |
59 outfile.write(fmt_coverage % args) |
55 total_units += 1 |
60 total += nums |
56 total_statements = total_statements + n |
|
57 total_executed = total_executed + m |
|
58 except KeyboardInterrupt: #pragma: no cover |
61 except KeyboardInterrupt: #pragma: no cover |
59 raise |
62 raise |
60 except: |
63 except: |
61 if not self.ignore_errors: |
64 if not self.ignore_errors: |
62 typ, msg = sys.exc_info()[:2] |
65 typ, msg = sys.exc_info()[:2] |
63 outfile.write(fmt_err % (cu.name, typ.__name__, msg)) |
66 outfile.write(fmt_err % (cu.name, typ.__name__, msg)) |
64 |
67 |
65 if total_units > 1: |
68 if total.n_files > 1: |
66 outfile.write(rule) |
69 outfile.write(rule) |
67 if total_statements > 0: |
70 args = ("TOTAL", total.n_statements, total.n_executed) |
68 pc = 100.0 * total_executed / total_statements |
71 if self.branches: |
69 else: |
72 args += (total.n_branches, total.n_executed_branches) |
70 pc = 100.0 |
73 args += (total.pc_covered,) |
71 args = ("TOTAL", total_statements, total_executed, pc) |
|
72 if self.show_missing: |
74 if self.show_missing: |
73 args = args + ("",) |
75 args += ("",) |
74 outfile.write(fmt_coverage % args) |
76 outfile.write(fmt_coverage % args) |