Class: SimpleCov::SourceFile
- Inherits:
-
Object
- Object
- SimpleCov::SourceFile
- Includes:
- BuilderContext
- Defined in:
- lib/simplecov/source_file.rb,
lib/simplecov/source_file/line.rb,
lib/simplecov/source_file/branch.rb,
lib/simplecov/source_file/method.rb,
lib/simplecov/source_file/statistics.rb,
lib/simplecov/source_file/skip_chunks.rb,
lib/simplecov/source_file/line_builder.rb,
lib/simplecov/source_file/source_loader.rb,
lib/simplecov/source_file/branch_builder.rb,
lib/simplecov/source_file/method_builder.rb,
lib/simplecov/source_file/builder_context.rb,
lib/simplecov/source_file/ruby_data_parser.rb
Overview
Representation of a source file including it’s coverage data, source code, source lines and featuring helpers to interpret that data.
Defined Under Namespace
Modules: BuilderContext, RubyDataParser, SourceLoader Classes: Branch, BranchBuilder, Line, LineBuilder, Method, MethodBuilder, SkipChunks, Statistics
Instance Attribute Summary collapse
-
#coverage_data ⇒ Object
readonly
The array of coverage data received from the Coverage.result.
-
#filename ⇒ Object
readonly
The full path to this source file (e.g. /User/colszowka/projects/simplecov/lib/simplecov/source_file.rb).
Instance Method Summary collapse
-
#branches ⇒ Object
Return all the branches inside current source file.
-
#branches_coverage_percent ⇒ Object
DEPRECATED: use ‘covered_percent(:branch)`.
- #branches_for_line(line_number) ⇒ Object
-
#branches_report ⇒ Object
Return hash with key of line number and branch coverage count as value.
-
#coverage_statistics(criterion = nil) ⇒ Object
Returns a hash keyed by every supported coverage criterion.
-
#covered_branches ⇒ Object
Select the covered branches.
-
#covered_lines ⇒ Object
Returns all covered lines as SimpleCov::SourceFile::Line.
- #covered_methods ⇒ Object
-
#covered_percent(criterion = :line) ⇒ Object
The coverage for this file in percent, for the given criterion (line by default).
- #covered_strength(criterion = :line) ⇒ Object
-
#initialize(filename, coverage_data, loaded: true) ⇒ SourceFile
constructor
A new instance of SourceFile.
-
#line(number) ⇒ Object
Access SimpleCov::SourceFile::Line source lines by line number.
-
#line_with_missed_branch?(line_number) ⇒ Boolean
Check if any branches missing on given line number.
-
#lines ⇒ Object
(also: #source_lines)
Returns all source lines for this file as instances of SimpleCov::SourceFile::Line, and thus including coverage data.
-
#lines_of_code ⇒ Object
Returns the number of relevant lines (covered + missed).
-
#methods ⇒ Object
Return all methods detected in this source file.
-
#methods_coverage_percent ⇒ Object
DEPRECATED: use ‘covered_percent(:method)`.
-
#missed_branches ⇒ Object
Select the missed branches with coverage equal to zero.
-
#missed_lines ⇒ Object
Returns all lines that should have been, but were not covered as instances of SimpleCov::SourceFile::Line.
- #missed_methods ⇒ Object
-
#never_lines ⇒ Object
Returns all lines that are not relevant for coverage as SimpleCov::SourceFile::Line instances.
- #no_branches? ⇒ Boolean
- #no_lines? ⇒ Boolean
-
#not_loaded? ⇒ Boolean
Whether this file was added via track_files but never loaded/required.
-
#project_filename ⇒ Object
The path to this source file relative to the projects directory.
- #relevant_lines ⇒ Object
-
#skipped_lines ⇒ Object
Returns all lines that were skipped as SimpleCov::SourceFile::Line instances.
-
#src ⇒ Object
(also: #source)
The source code for this file.
-
#total_branches ⇒ Object
Return the relevant branches to source file.
Methods included from BuilderContext
#real_source_positions, #skip_chunks_for
Constructor Details
#initialize(filename, coverage_data, loaded: true) ⇒ SourceFile
Returns a new instance of SourceFile.
27 28 29 30 31 |
# File 'lib/simplecov/source_file.rb', line 27 def initialize(filename, coverage_data, loaded: true) @filename = filename @coverage_data = coverage_data @loaded = loaded end |
Instance Attribute Details
#coverage_data ⇒ Object (readonly)
The array of coverage data received from the Coverage.result
25 26 27 |
# File 'lib/simplecov/source_file.rb', line 25 def coverage_data @coverage_data end |
#filename ⇒ Object (readonly)
The full path to this source file (e.g. /User/colszowka/projects/simplecov/lib/simplecov/source_file.rb)
23 24 25 |
# File 'lib/simplecov/source_file.rb', line 23 def filename @filename end |
Instance Method Details
#branches ⇒ Object
Return all the branches inside current source file
116 117 118 |
# File 'lib/simplecov/source_file.rb', line 116 def branches @branches ||= BranchBuilder.new(self).call end |
#branches_coverage_percent ⇒ Object
DEPRECATED: use ‘covered_percent(:branch)`.
125 126 127 128 129 |
# File 'lib/simplecov/source_file.rb', line 125 def branches_coverage_percent warn "#{Kernel.caller.first}: [DEPRECATION] `SimpleCov::SourceFile#branches_coverage_percent` is deprecated. " \ "Use `covered_percent(:branch)`." covered_percent(:branch) end |
#branches_for_line(line_number) ⇒ Object
155 156 157 |
# File 'lib/simplecov/source_file.rb', line 155 def branches_for_line(line_number) branches_report.fetch(line_number, []) end |
#branches_report ⇒ Object
Return hash with key of line number and branch coverage count as value
137 138 139 140 |
# File 'lib/simplecov/source_file.rb', line 137 def branches_report @branches_report ||= branches.reject(&:skipped?).group_by(&:report_line).transform_values { |bs| bs.map(&:report) } end |
#coverage_statistics(criterion = nil) ⇒ Object
Returns a hash keyed by every supported coverage criterion. Each value is a CoverageStatistics, even for criteria that weren’t enabled during the run — those collapse to 0/0/0. Consumers (FileList, formatters) decide which keys to surface based on ‘SimpleCov.coverage_criterion_enabled?`. The per-criterion coverage statistics for this file. With no argument returns the `branch:, method:` Hash; pass a criterion symbol (`:line` / `:branch` / `:method`) to get that one CoverageStatistics.
53 54 55 56 |
# File 'lib/simplecov/source_file.rb', line 53 def coverage_statistics(criterion = nil) @coverage_statistics ||= Statistics.new(self).call criterion ? @coverage_statistics[criterion] : @coverage_statistics end |
#covered_branches ⇒ Object
Select the covered branches. We use a tree schema here because some conditions like ‘case` may have an additional `else` that isn’t declared in code but is given by default by the coverage report.
146 147 148 |
# File 'lib/simplecov/source_file.rb', line 146 def covered_branches @covered_branches ||= branches.select(&:covered?) end |
#covered_lines ⇒ Object
Returns all covered lines as SimpleCov::SourceFile::Line
66 67 68 |
# File 'lib/simplecov/source_file.rb', line 66 def covered_lines @covered_lines ||= lines.select(&:covered?) end |
#covered_methods ⇒ Object
169 170 171 |
# File 'lib/simplecov/source_file.rb', line 169 def covered_methods @covered_methods ||= methods.select(&:covered?) end |
#covered_percent(criterion = :line) ⇒ Object
The coverage for this file in percent, for the given criterion (line by default). Returns nil if the criterion was not measured.
99 100 101 |
# File 'lib/simplecov/source_file.rb', line 99 def covered_percent(criterion = :line) coverage_statistics(criterion)&.percent end |
#covered_strength(criterion = :line) ⇒ Object
103 104 105 |
# File 'lib/simplecov/source_file.rb', line 103 def covered_strength(criterion = :line) coverage_statistics(criterion)&.strength end |
#line(number) ⇒ Object
Access SimpleCov::SourceFile::Line source lines by line number
93 94 95 |
# File 'lib/simplecov/source_file.rb', line 93 def line(number) lines[number - 1] end |
#line_with_missed_branch?(line_number) ⇒ Boolean
Check if any branches missing on given line number
160 161 162 |
# File 'lib/simplecov/source_file.rb', line 160 def line_with_missed_branch?(line_number) branches_for_line(line_number).any? { |_type, count| count.zero? } end |
#lines ⇒ Object Also known as: source_lines
Returns all source lines for this file as instances of SimpleCov::SourceFile::Line, and thus including coverage data. Aliased as :source_lines
60 61 62 |
# File 'lib/simplecov/source_file.rb', line 60 def lines @lines ||= LineBuilder.new(self).call end |
#lines_of_code ⇒ Object
Returns the number of relevant lines (covered + missed)
88 89 90 |
# File 'lib/simplecov/source_file.rb', line 88 def lines_of_code coverage_statistics[:line]&.total || 0 end |
#methods ⇒ Object
Return all methods detected in this source file
165 166 167 |
# File 'lib/simplecov/source_file.rb', line 165 def methods @methods ||= MethodBuilder.new(self).call end |
#methods_coverage_percent ⇒ Object
DEPRECATED: use ‘covered_percent(:method)`.
178 179 180 181 182 |
# File 'lib/simplecov/source_file.rb', line 178 def methods_coverage_percent warn "#{Kernel.caller.first}: [DEPRECATION] `SimpleCov::SourceFile#methods_coverage_percent` is deprecated. " \ "Use `covered_percent(:method)`." covered_percent(:method) end |
#missed_branches ⇒ Object
Select the missed branches with coverage equal to zero
151 152 153 |
# File 'lib/simplecov/source_file.rb', line 151 def missed_branches @missed_branches ||= branches.select(&:missed?) end |
#missed_lines ⇒ Object
Returns all lines that should have been, but were not covered as instances of SimpleCov::SourceFile::Line
72 73 74 |
# File 'lib/simplecov/source_file.rb', line 72 def missed_lines @missed_lines ||= lines.select(&:missed?) end |
#missed_methods ⇒ Object
173 174 175 |
# File 'lib/simplecov/source_file.rb', line 173 def missed_methods @missed_methods ||= methods.select(&:missed?) end |
#never_lines ⇒ Object
Returns all lines that are not relevant for coverage as SimpleCov::SourceFile::Line instances
78 79 80 |
# File 'lib/simplecov/source_file.rb', line 78 def never_lines @never_lines ||= lines.select(&:never?) end |
#no_branches? ⇒ Boolean
120 121 122 |
# File 'lib/simplecov/source_file.rb', line 120 def no_branches? total_branches.empty? end |
#no_lines? ⇒ Boolean
107 108 109 |
# File 'lib/simplecov/source_file.rb', line 107 def no_lines? lines.empty? || (lines.length == never_lines.size) end |
#not_loaded? ⇒ Boolean
Whether this file was added via track_files but never loaded/required.
185 186 187 |
# File 'lib/simplecov/source_file.rb', line 185 def not_loaded? !@loaded end |
#project_filename ⇒ Object
The path to this source file relative to the projects directory
34 35 36 |
# File 'lib/simplecov/source_file.rb', line 34 def project_filename @filename.delete_prefix(SimpleCov.root).sub(%r{\A[/\\]}, "") end |
#relevant_lines ⇒ Object
111 112 113 |
# File 'lib/simplecov/source_file.rb', line 111 def relevant_lines lines.size - never_lines.size - skipped_lines.size end |
#skipped_lines ⇒ Object
Returns all lines that were skipped as SimpleCov::SourceFile::Line instances
83 84 85 |
# File 'lib/simplecov/source_file.rb', line 83 def skipped_lines @skipped_lines ||= lines.select(&:skipped?) end |
#src ⇒ Object Also known as: source
The source code for this file. Aliased as :source. Intentionally read lazily to suppress reading unused source code.
40 41 42 |
# File 'lib/simplecov/source_file.rb', line 40 def src @src ||= SourceLoader.call(filename) end |
#total_branches ⇒ Object
Return the relevant branches to source file
132 133 134 |
# File 'lib/simplecov/source_file.rb', line 132 def total_branches @total_branches ||= covered_branches + missed_branches end |