Class: Evilution::Coverage::Map
- Inherits:
-
Object
- Object
- Evilution::Coverage::Map
- Defined in:
- lib/evilution/coverage/map.rb
Overview
Immutable query over a per-example line-coverage index:
source file -> line -> [example locations ("spec.rb:line")].
built_files records the source files for which the build completed, so callers can distinguish “line genuinely uncovered” (file built, no entry) from “we never built this file” (must fall back, not assert a gap).
Class Method Summary collapse
Instance Method Summary collapse
- #built?(file) ⇒ Boolean
- #examples_for(file, line) ⇒ Object
- #executed?(file, line) ⇒ Boolean
-
#initialize(index:, built_files:, executed_lines: {}) ⇒ Map
constructor
executed_lines records, per file, the lines that ran at all during the build (including lines covered only at load, e.g. a ‘def` line, which are attributed to no single example).
- #to_h ⇒ Object
Constructor Details
#initialize(index:, built_files:, executed_lines: {}) ⇒ Map
executed_lines records, per file, the lines that ran at all during the build (including lines covered only at load, e.g. a ‘def` line, which are attributed to no single example). It lets a caller tell a TRUE coverage gap (line never executed) from a load-covered line an example may still exercise indirectly – so the latter falls back instead of being mis-skipped.
24 25 26 27 28 29 |
# File 'lib/evilution/coverage/map.rb', line 24 def initialize(index:, built_files:, executed_lines: {}) @index = deep_freeze_index(index) @built_files = built_files.to_a.freeze @executed_lines = deep_freeze_executed(executed_lines) freeze end |
Class Method Details
.from_h(hash) ⇒ Object
11 12 13 14 15 16 17 |
# File 'lib/evilution/coverage/map.rb', line 11 def self.from_h(hash) index = (hash["index"] || {}).transform_values do |lines| lines.transform_keys(&:to_i) end executed = (hash["executed_lines"] || {}).transform_values { |lines| lines.map(&:to_i) } new(index: index, built_files: hash["built_files"] || [], executed_lines: executed) end |
Instance Method Details
#built?(file) ⇒ Boolean
35 36 37 |
# File 'lib/evilution/coverage/map.rb', line 35 def built?(file) @built_files.include?(file) end |
#examples_for(file, line) ⇒ Object
31 32 33 |
# File 'lib/evilution/coverage/map.rb', line 31 def examples_for(file, line) @index.dig(file, line) || [] end |
#executed?(file, line) ⇒ Boolean
39 40 41 42 |
# File 'lib/evilution/coverage/map.rb', line 39 def executed?(file, line) lines = @executed_lines[file] !lines.nil? && lines.include?(line) end |
#to_h ⇒ Object
44 45 46 |
# File 'lib/evilution/coverage/map.rb', line 44 def to_h { "index" => @index, "built_files" => @built_files, "executed_lines" => @executed_lines } end |