Class: SimpleCov::SourceFile

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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_dataObject (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

#filenameObject (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

#branchesObject

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_percentObject

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_reportObject

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_branchesObject

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_linesObject

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_methodsObject



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

Returns:

  • (Boolean)


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

#linesObject 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_codeObject

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

#methodsObject

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_percentObject

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_branchesObject

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_linesObject

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_methodsObject



173
174
175
# File 'lib/simplecov/source_file.rb', line 173

def missed_methods
  @missed_methods ||= methods.select(&:missed?)
end

#never_linesObject

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

Returns:

  • (Boolean)


120
121
122
# File 'lib/simplecov/source_file.rb', line 120

def no_branches?
  total_branches.empty?
end

#no_lines?Boolean

Returns:

  • (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.

Returns:

  • (Boolean)


185
186
187
# File 'lib/simplecov/source_file.rb', line 185

def not_loaded?
  !@loaded
end

#project_filenameObject

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_linesObject



111
112
113
# File 'lib/simplecov/source_file.rb', line 111

def relevant_lines
  lines.size - never_lines.size - skipped_lines.size
end

#skipped_linesObject

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

#srcObject 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_branchesObject

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