Skip to content

Commit e47e7e7

Browse files
committed
refactor: move duplicate code into methods
1 parent 3d6be2b commit e47e7e7

File tree

1 file changed

+34
-47
lines changed

1 file changed

+34
-47
lines changed

coverage/jsonreport.py

+34-47
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import json
1010
import sys
1111

12-
from typing import Any, IO, Iterable, TYPE_CHECKING
12+
from typing import Any, Dict, IO, Iterable, TYPE_CHECKING
1313

1414
from coverage import __version__
1515
from coverage.report_core import get_analysis_to_report
@@ -22,6 +22,9 @@
2222
from coverage.plugin import FileReporter
2323

2424

25+
# A type for data that can be JSON-serialized.
26+
JsonObj = Dict[str, Any]
27+
2528
# "Version 1" had no format number at all.
2629
# 2: add the meta.format field.
2730
# 3: add region information (functions, classes)
@@ -36,7 +39,27 @@ def __init__(self, coverage: Coverage) -> None:
3639
self.coverage = coverage
3740
self.config = self.coverage.config
3841
self.total = Numbers(self.config.precision)
39-
self.report_data: dict[str, Any] = {}
42+
self.report_data: JsonObj = {}
43+
44+
def make_summary(self, nums: Numbers) -> JsonObj:
45+
"""Create a dict summarizing `nums`."""
46+
return {
47+
"covered_lines": nums.n_executed,
48+
"num_statements": nums.n_statements,
49+
"percent_covered": nums.pc_covered,
50+
"percent_covered_display": nums.pc_covered_str,
51+
"missing_lines": nums.n_missing,
52+
"excluded_lines": nums.n_excluded,
53+
}
54+
55+
def make_branch_summary(self, nums: Numbers) -> JsonObj:
56+
"""Create a dict summarizing the branch info in `nums`."""
57+
return {
58+
"num_branches": nums.n_branches,
59+
"num_partial_branches": nums.n_partial_branches,
60+
"covered_branches": nums.n_executed_branches,
61+
"missing_branches": nums.n_missing_branches,
62+
}
4063

4164
def report(self, morfs: Iterable[TMorf] | None, outfile: IO[str]) -> float:
4265
"""Generate a json report for `morfs`.
@@ -66,23 +89,10 @@ def report(self, morfs: Iterable[TMorf] | None, outfile: IO[str]) -> float:
6689
)
6790

6891
self.report_data["files"] = measured_files
69-
70-
self.report_data["totals"] = {
71-
"covered_lines": self.total.n_executed,
72-
"num_statements": self.total.n_statements,
73-
"percent_covered": self.total.pc_covered,
74-
"percent_covered_display": self.total.pc_covered_str,
75-
"missing_lines": self.total.n_missing,
76-
"excluded_lines": self.total.n_excluded,
77-
}
92+
self.report_data["totals"] = self.make_summary(self.total)
7893

7994
if coverage_data.has_arcs():
80-
self.report_data["totals"].update({
81-
"num_branches": self.total.n_branches,
82-
"num_partial_branches": self.total.n_partial_branches,
83-
"covered_branches": self.total.n_executed_branches,
84-
"missing_branches": self.total.n_missing_branches,
85-
})
95+
self.report_data["totals"].update(self.make_branch_summary(self.total))
8696

8797
json.dump(
8898
self.report_data,
@@ -94,19 +104,12 @@ def report(self, morfs: Iterable[TMorf] | None, outfile: IO[str]) -> float:
94104

95105
def report_one_file(
96106
self, coverage_data: CoverageData, analysis: Analysis, file_reporter: FileReporter
97-
) -> dict[str, Any]:
107+
) -> JsonObj:
98108
"""Extract the relevant report data for a single file."""
99109
nums = analysis.numbers
100110
self.total += nums
101-
summary = {
102-
"covered_lines": nums.n_executed,
103-
"num_statements": nums.n_statements,
104-
"percent_covered": nums.pc_covered,
105-
"percent_covered_display": nums.pc_covered_str,
106-
"missing_lines": nums.n_missing,
107-
"excluded_lines": nums.n_excluded,
108-
}
109-
reported_file: dict[str, Any] = {
111+
summary = self.make_summary(nums)
112+
reported_file: JsonObj = {
110113
"executed_lines": sorted(analysis.executed),
111114
"summary": summary,
112115
"missing_lines": sorted(analysis.missing),
@@ -115,12 +118,7 @@ def report_one_file(
115118
if self.config.json_show_contexts:
116119
reported_file["contexts"] = coverage_data.contexts_by_lineno(analysis.filename)
117120
if coverage_data.has_arcs():
118-
summary.update({
119-
"num_branches": nums.n_branches,
120-
"num_partial_branches": nums.n_partial_branches,
121-
"covered_branches": nums.n_executed_branches,
122-
"missing_branches": nums.n_missing_branches,
123-
})
121+
summary.update(self.make_branch_summary(nums))
124122
reported_file["executed_branches"] = list(
125123
_convert_branch_arcs(analysis.executed_branch_arcs()),
126124
)
@@ -136,14 +134,7 @@ def report_one_file(
136134
outside_lines -= region.lines
137135
narrowed_analysis = analysis.narrow(region.lines)
138136
narrowed_nums = narrowed_analysis.numbers
139-
narrowed_summary = {
140-
"covered_lines": narrowed_nums.n_executed,
141-
"num_statements": narrowed_nums.n_statements,
142-
"percent_covered": narrowed_nums.pc_covered,
143-
"percent_covered_display": narrowed_nums.pc_covered_str,
144-
"missing_lines": narrowed_nums.n_missing,
145-
"excluded_lines": narrowed_nums.n_excluded,
146-
}
137+
narrowed_summary = self.make_summary(narrowed_nums)
147138
reported_file[region.kind][region.name] = {
148139
"executed_lines": sorted(narrowed_analysis.executed),
149140
"summary": narrowed_summary,
@@ -154,18 +145,14 @@ def report_one_file(
154145
contexts = coverage_data.contexts_by_lineno(narrowed_analysis.filename)
155146
reported_file[region.kind][region.name]["contexts"] = contexts
156147
if coverage_data.has_arcs():
157-
narrowed_summary.update({
158-
"num_branches": narrowed_nums.n_branches,
159-
"num_partial_branches": narrowed_nums.n_partial_branches,
160-
"covered_branches": narrowed_nums.n_executed_branches,
161-
"missing_branches": narrowed_nums.n_missing_branches,
162-
})
148+
narrowed_summary.update(self.make_branch_summary(narrowed_nums))
163149
reported_file[region.kind][region.name]["executed_branches"] = list(
164150
_convert_branch_arcs(narrowed_analysis.executed_branch_arcs()),
165151
)
166152
reported_file[region.kind][region.name]["missing_branches"] = list(
167153
_convert_branch_arcs(narrowed_analysis.missing_branch_arcs()),
168154
)
155+
169156
return reported_file
170157

171158

0 commit comments

Comments
 (0)