1010from typing import IO , TYPE_CHECKING , Any
1111
1212from coverage .exceptions import ConfigError , NoDataError
13- from coverage .misc import human_sorted_items
13+ from coverage .misc import human_sorted_items , plural
1414from coverage .plugin import FileReporter
1515from coverage .report_core import get_analysis_to_report
1616from coverage .results import Analysis , Numbers
@@ -31,7 +31,7 @@ def __init__(self, coverage: Coverage) -> None:
3131 self .output_format = self .config .format or "text"
3232 if self .output_format not in {"text" , "markdown" , "total" }:
3333 raise ConfigError (f"Unknown report format choice: { self .output_format !r} " )
34- self .fr_analysis : list [tuple [FileReporter , Analysis ]] = []
34+ self .fr_analyses : list [tuple [FileReporter , Analysis ]] = []
3535 self .skipped_count = 0
3636 self .empty_count = 0
3737 self .total = Numbers (precision = self .config .precision )
@@ -46,7 +46,7 @@ def write_items(self, items: Iterable[str]) -> None:
4646 """Write a list of strings, joined together."""
4747 self .write ("" .join (items ))
4848
49- def _report_text (
49+ def report_text (
5050 self ,
5151 header : list [str ],
5252 lines_values : list [list [Any ]],
@@ -82,29 +82,36 @@ def _report_text(
8282 self .write (header_str )
8383 self .write (rule )
8484
85- formats .update (dict (Cover = "{:>{n}}%" ), Missing = " {:9}" )
85+ # Write the data lines
86+ formats .update (
87+ dict (
88+ Cover = "{:>{n}}%" ,
89+ Missing = " {:9}" ,
90+ )
91+ )
8692 for values in lines_values :
87- # build string with line values
88- line_items = [
89- formats [item ].format (str (value ), name_len = max_name , n = max_n - 1 )
90- for item , value in zip (header , values )
91- ]
92- self . write_items ( line_items )
93+ self . write_items (
94+ (
95+ formats [item ].format (str (value ), name_len = max_name , n = max_n - 1 )
96+ for item , value in zip (header , values )
97+ )
98+ )
9399
94100 # Write a TOTAL line
95101 if lines_values :
96102 self .write (rule )
97103
98- line_items = [
99- formats [item ].format (str (value ), name_len = max_name , n = max_n - 1 )
100- for item , value in zip (header , total_line )
101- ]
102- self .write_items (line_items )
104+ self .write_items (
105+ (
106+ formats [item ].format (str (value ), name_len = max_name , n = max_n - 1 )
107+ for item , value in zip (header , total_line )
108+ )
109+ )
103110
104111 for end_line in end_lines :
105112 self .write (end_line )
106113
107- def _report_markdown (
114+ def report_markdown (
108115 self ,
109116 header : list [str ],
110117 lines_values : list [list [Any ]],
@@ -143,17 +150,29 @@ def _report_markdown(
143150 self .write (header_str )
144151 self .write (rule_str )
145152
153+ # Write the data lines
146154 for values in lines_values :
147- # build string with line values
148- formats .update (dict (Cover = "{:>{n}}% |" ))
149- line_items = [
150- formats [item ].format (str (value ).replace ("_" , "\\ _" ), name_len = max_name , n = max_n - 1 )
151- for item , value in zip (header , values )
152- ]
153- self .write_items (line_items )
155+ formats .update (
156+ dict (
157+ Cover = "{:>{n}}% |" ,
158+ )
159+ )
160+ self .write_items (
161+ (
162+ formats [item ].format (
163+ str (value ).replace ("_" , "\\ _" ), name_len = max_name , n = max_n - 1
164+ )
165+ for item , value in zip (header , values )
166+ )
167+ )
154168
155169 # Write the TOTAL line
156- formats .update (dict (Name = "|{:>{name_len}} |" , Cover = "{:>{n}} |" ))
170+ formats .update (
171+ dict (
172+ Name = "|{:>{name_len}} |" ,
173+ Cover = "{:>{n}} |" ,
174+ ),
175+ )
157176 total_line_items : list [str ] = []
158177 for item , value in zip (header , total_line ):
159178 if value == "" :
@@ -164,6 +183,7 @@ def _report_markdown(
164183 insert = f" **{ value } **"
165184 total_line_items += formats [item ].format (insert , name_len = max_name , n = max_n )
166185 self .write_items (total_line_items )
186+
167187 for end_line in end_lines :
168188 self .write (end_line )
169189
@@ -206,9 +226,8 @@ def tabular_report(self) -> None:
206226 # `lines_values` is list of lists of sortable values.
207227 lines_values = []
208228
209- for fr , analysis in self .fr_analysis :
229+ for fr , analysis in self .fr_analyses :
210230 nums = analysis .numbers
211-
212231 args = [fr .relative_filename (), nums .n_statements , nums .n_missing ]
213232 if self .branches :
214233 args += [nums .n_branches , nums .n_partial_branches ]
@@ -248,18 +267,18 @@ def tabular_report(self) -> None:
248267 # Create other final lines.
249268 end_lines = []
250269 if self .config .skip_covered and self .skipped_count :
251- file_suffix = "s" if self .skipped_count > 1 else ""
270+ files = plural ( self .skipped_count , "file" )
252271 end_lines .append (
253- f"\n { self .skipped_count } file { file_suffix } skipped due to complete coverage." ,
272+ f"\n { self .skipped_count } { files } skipped due to complete coverage." ,
254273 )
255274 if self .config .skip_empty and self .empty_count :
256- file_suffix = "s" if self .empty_count > 1 else ""
257- end_lines .append (f"\n { self .empty_count } empty file { file_suffix } skipped." )
275+ files = plural ( self .empty_count , "file" )
276+ end_lines .append (f"\n { self .empty_count } empty { files } skipped." )
258277
259278 if self .output_format == "markdown" :
260- formatter = self ._report_markdown
279+ formatter = self .report_markdown
261280 else :
262- formatter = self ._report_text
281+ formatter = self .report_text
263282 formatter (header , lines_values , total_line , end_lines )
264283
265284 def report_one_file (self , fr : FileReporter , analysis : Analysis ) -> None :
@@ -276,4 +295,4 @@ def report_one_file(self, fr: FileReporter, analysis: Analysis) -> None:
276295 # Don't report on empty files.
277296 self .empty_count += 1
278297 else :
279- self .fr_analysis .append ((fr , analysis ))
298+ self .fr_analyses .append ((fr , analysis ))
0 commit comments