Skip to content

Commit 31ee959

Browse files
authored
Merge pull request #623 from danmayer/optimize-file-list-lines-of-code-9272917346959534296
Optimize FileList#lines_of_code and related methods
2 parents 8ae1212 + f69d132 commit 31ee959

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

lib/coverband/utils/file_list.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,28 @@ class FileList < Array
1414
def covered_lines
1515
return 0.0 if empty?
1616

17-
sum { |f| f.covered_lines.count }
17+
@covered_lines ||= sum(&:covered_lines_count)
1818
end
1919

2020
# Returns the count of lines that have been missed
2121
def missed_lines
2222
return 0.0 if empty?
2323

24-
sum { |f| f.missed_lines.count }
24+
@missed_lines ||= sum(&:missed_lines_count)
2525
end
2626

2727
# Returns the count of lines that are not relevant for coverage
2828
def never_lines
2929
return 0.0 if empty?
3030

31-
sum { |f| f.never_lines.count }
31+
@never_lines ||= sum(&:never_lines_count)
3232
end
3333

3434
# Returns the count of skipped lines
3535
def skipped_lines
3636
return 0.0 if empty?
3737

38-
sum { |f| f.skipped_lines.count }
38+
@skipped_lines ||= sum(&:skipped_lines_count)
3939
end
4040

4141
# Computes the coverage based upon lines covered and lines missed for each file
@@ -48,7 +48,7 @@ def covered_percentages
4848
def lines_of_code
4949
return 0.0 if empty?
5050

51-
sum(&:lines_of_code)
51+
@lines_of_code ||= sum(&:lines_of_code)
5252
end
5353

5454
# Computes the coverage based upon lines covered and lines missed

lib/coverband/utils/source_file.rb

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def covered_percent
104104
return 0.0 if relevant_lines.zero?
105105

106106
# handle edge case where runtime in dev can go over 100%
107-
[Float(covered_lines.size * 100.0 / relevant_lines.to_f), 100.0].min&.round(2)
107+
[Float(covered_lines_count * 100.0 / relevant_lines.to_f), 100.0].min&.round(2)
108108
end
109109

110110
def formatted_covered_percent
@@ -128,7 +128,8 @@ def lines_strength
128128
end
129129

130130
def relevant_lines
131-
@runtime_relavant_lines || (lines.size - never_lines.size - skipped_lines.size)
131+
return @runtime_relavant_lines if @runtime_relavant_lines
132+
lines_of_code
132133
end
133134

134135
# Returns all covered lines as Coverband::Utils::SourceFile::Line
@@ -137,7 +138,8 @@ def covered_lines
137138
end
138139

139140
def covered_lines_count
140-
covered_lines&.count
141+
return @covered_lines.size if defined?(@covered_lines) && @covered_lines
142+
lines.count(&:covered?)
141143
end
142144

143145
def line_coverage(index)
@@ -154,20 +156,39 @@ def missed_lines
154156
@missed_lines ||= lines.select(&:missed?)
155157
end
156158

159+
def missed_lines_count
160+
return @missed_lines.size if defined?(@missed_lines) && @missed_lines
161+
lines.count(&:missed?)
162+
end
163+
157164
# Returns all lines that are not relevant for coverage as
158165
# Coverband::Utils::SourceFile::Line instances
159166
def never_lines
160167
@never_lines ||= lines.select(&:never?)
161168
end
162169

170+
def never_lines_count
171+
return @never_lines.size if defined?(@never_lines) && @never_lines
172+
lines.count(&:never?)
173+
end
174+
163175
# Returns all lines that were skipped as Coverband::Utils::SourceFile::Line instances
164176
def skipped_lines
165177
@skipped_lines ||= lines.select(&:skipped?)
166178
end
167179

180+
def skipped_lines_count
181+
return @skipped_lines.size if defined?(@skipped_lines) && @skipped_lines
182+
lines.count(&:skipped?)
183+
end
184+
168185
# Returns the number of relevant lines (covered + missed)
169186
def lines_of_code
170-
covered_lines.size + missed_lines.size
187+
@lines_of_code ||= if @covered_lines && @missed_lines
188+
@covered_lines.size + @missed_lines.size
189+
else
190+
lines.count { |l| l.covered? || l.missed? }
191+
end
171192
end
172193

173194
# Will go through all source files and mark lines that are wrapped within # :nocov: comment blocks

0 commit comments

Comments
 (0)