10 from coverage import __version__ |
9 from coverage import __version__ |
11 from coverage.report import get_analysis_to_report |
10 from coverage.report import get_analysis_to_report |
12 from coverage.results import Numbers |
11 from coverage.results import Numbers |
13 |
12 |
14 |
13 |
15 class JsonReporter(object): |
14 class JsonReporter: |
16 """A reporter for writing JSON coverage results.""" |
15 """A reporter for writing JSON coverage results.""" |
|
16 |
|
17 report_type = "JSON report" |
17 |
18 |
18 def __init__(self, coverage): |
19 def __init__(self, coverage): |
19 self.coverage = coverage |
20 self.coverage = coverage |
20 self.config = self.coverage.config |
21 self.config = self.coverage.config |
21 self.total = Numbers() |
22 self.total = Numbers(self.config.precision) |
22 self.report_data = {} |
23 self.report_data = {} |
23 |
24 |
24 def report(self, morfs, outfile=None): |
25 def report(self, morfs, outfile=None): |
25 """Generate a json report for `morfs`. |
26 """Generate a json report for `morfs`. |
26 |
27 |
50 |
51 |
51 self.report_data["totals"] = { |
52 self.report_data["totals"] = { |
52 'covered_lines': self.total.n_executed, |
53 'covered_lines': self.total.n_executed, |
53 'num_statements': self.total.n_statements, |
54 'num_statements': self.total.n_statements, |
54 'percent_covered': self.total.pc_covered, |
55 'percent_covered': self.total.pc_covered, |
|
56 'percent_covered_display': self.total.pc_covered_str, |
55 'missing_lines': self.total.n_missing, |
57 'missing_lines': self.total.n_missing, |
56 'excluded_lines': self.total.n_excluded, |
58 'excluded_lines': self.total.n_excluded, |
57 } |
59 } |
58 |
60 |
59 if coverage_data.has_arcs(): |
61 if coverage_data.has_arcs(): |
78 self.total += nums |
80 self.total += nums |
79 summary = { |
81 summary = { |
80 'covered_lines': nums.n_executed, |
82 'covered_lines': nums.n_executed, |
81 'num_statements': nums.n_statements, |
83 'num_statements': nums.n_statements, |
82 'percent_covered': nums.pc_covered, |
84 'percent_covered': nums.pc_covered, |
|
85 'percent_covered_display': nums.pc_covered_str, |
83 'missing_lines': nums.n_missing, |
86 'missing_lines': nums.n_missing, |
84 'excluded_lines': nums.n_excluded, |
87 'excluded_lines': nums.n_excluded, |
85 } |
88 } |
86 reported_file = { |
89 reported_file = { |
87 'executed_lines': sorted(analysis.executed), |
90 'executed_lines': sorted(analysis.executed), |
88 'summary': summary, |
91 'summary': summary, |
89 'missing_lines': sorted(analysis.missing), |
92 'missing_lines': sorted(analysis.missing), |
90 'excluded_lines': sorted(analysis.excluded) |
93 'excluded_lines': sorted(analysis.excluded), |
91 } |
94 } |
92 if self.config.json_show_contexts: |
95 if self.config.json_show_contexts: |
93 reported_file['contexts'] = analysis.data.contexts_by_lineno( |
96 reported_file['contexts'] = analysis.data.contexts_by_lineno(analysis.filename) |
94 analysis.filename, |
|
95 ) |
|
96 if coverage_data.has_arcs(): |
97 if coverage_data.has_arcs(): |
97 reported_file['summary'].update({ |
98 reported_file['summary'].update({ |
98 'num_branches': nums.n_branches, |
99 'num_branches': nums.n_branches, |
99 'num_partial_branches': nums.n_partial_branches, |
100 'num_partial_branches': nums.n_partial_branches, |
100 'covered_branches': nums.n_executed_branches, |
101 'covered_branches': nums.n_executed_branches, |