@@ -73,10 +73,26 @@ class DiffCoverage:
7373
7474
7575class BaseCoverage (ABC ):
76- def compute_coverage (self , num_covered : int , num_total : int ) -> decimal .Decimal :
77- if num_total == 0 :
76+ def convert_to_decimal (self , value : float | decimal .Decimal , precision : int = 2 ) -> decimal .Decimal :
77+ if not isinstance (value , decimal .Decimal ):
78+ value = decimal .Decimal (str (float (value ) / 100 ))
79+ return value .quantize (
80+ exp = decimal .Decimal (10 ) ** - precision ,
81+ rounding = decimal .ROUND_DOWN ,
82+ )
83+
84+ def compute_coverage (
85+ self ,
86+ num_covered : int ,
87+ num_total : int ,
88+ num_branches_covered : int = 0 ,
89+ num_branches_total : int = 0 ,
90+ ) -> decimal .Decimal :
91+ numerator = decimal .Decimal (num_covered + num_branches_covered )
92+ denominator = decimal .Decimal (num_total + num_branches_total )
93+ if denominator == 0 :
7894 return decimal .Decimal ('1' )
79- return decimal . Decimal ( num_covered ) / decimal . Decimal ( num_total )
95+ return numerator / denominator
8096
8197 def get_coverage_info (self , coverage_path : pathlib .Path ) -> Coverage :
8298 try :
@@ -99,6 +115,7 @@ def get_diff_coverage_info( # pylint: disable=too-many-locals
99115 self ,
100116 added_lines : dict [pathlib .Path , list [int ]],
101117 coverage : Coverage ,
118+ branch_coverage : bool = False ,
102119 ) -> DiffCoverage :
103120 files = {}
104121 total_num_lines = 0
@@ -126,7 +143,15 @@ def get_diff_coverage_info( # pylint: disable=too-many-locals
126143 total_num_lines += count_total
127144 total_num_violations += count_missing
128145
129- percent_covered = self .compute_coverage (num_covered = count_executed , num_total = count_total )
146+ if branch_coverage :
147+ percent_covered = self .compute_coverage (
148+ num_covered = count_executed ,
149+ num_total = count_total ,
150+ num_branches_covered = file .info .covered_branches or 0 ,
151+ num_branches_total = file .info .num_branches or 0 ,
152+ )
153+ else :
154+ percent_covered = self .compute_coverage (num_covered = count_executed , num_total = count_total )
130155
131156 files [path ] = FileDiffCoverage (
132157 path = path ,
@@ -136,10 +161,18 @@ def get_diff_coverage_info( # pylint: disable=too-many-locals
136161 added_statements = sorted (added ),
137162 added_lines = added_lines_for_file ,
138163 )
139- final_percentage = self .compute_coverage (
140- num_covered = total_num_lines - total_num_violations ,
141- num_total = total_num_lines ,
142- )
164+ if branch_coverage :
165+ final_percentage = self .compute_coverage (
166+ num_covered = total_num_lines - total_num_violations ,
167+ num_total = total_num_lines ,
168+ num_branches_covered = coverage .info .covered_branches or 0 ,
169+ num_branches_total = coverage .info .num_branches or 0 ,
170+ )
171+ else :
172+ final_percentage = self .compute_coverage (
173+ num_covered = total_num_lines - total_num_violations ,
174+ num_total = total_num_lines ,
175+ )
143176
144177 return DiffCoverage (
145178 total_num_lines = total_num_lines ,
0 commit comments