Class: RSpecTracer::Tracker::CoverageAdapter Private
- Inherits:
-
Object
- Object
- RSpecTracer::Tracker::CoverageAdapter
- Defined in:
- lib/rspec_tracer/tracker/coverage_adapter.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Wraps Ruby's built-in ::Coverage module. The first observer in the 2.0 tracker pipeline -- ingests the per-file line-coverage bitmap that MRI/JRuby maintain natively, normalizes the two possible shapes (array vs SimpleCov-style hash) and emits Tracker::Input values for the files touched between two peeks.
All state lives on the instance; no reads from RSpecTracer.*. Pass root, filters, and mode at construction time.
Content digest is SHA256 hex (see Input's file-level comment). Changing the algorithm is a storage schema_version bump.
Constant Summary collapse
- MODES =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
::Coverage.peek_result returns one of two shapes:
:array -- { path => [hit_counts | nil, ...] } (default) :hash -- { path => { lines: [...], branches: {...} } } (SimpleCov with branch coverage):auto detects on the first peek by sniffing a value's type.
%i[auto array hash].freeze
Instance Attribute Summary collapse
-
#filters ⇒ Object
readonly
private
Internal attribute.
-
#mode ⇒ Object
readonly
private
Internal attribute.
-
#root ⇒ Object
readonly
private
Internal attribute.
Instance Method Summary collapse
-
#compute_diff(before, after) ⇒ Object
private
Pure function: returns Set for files whose line arrays changed between
beforeandafter. -
#initialize(root:, filters: [], mode: :auto) ⇒ CoverageAdapter
constructor
private
Internal method on the tracer pipeline.
-
#peek ⇒ Object
private
Snapshot of the current coverage state: { absolute_path => Array<Integer|nil> } for files under project root that survive the user filter.
-
#peek_unfiltered ⇒ Object
private
Same shape as #peek but only filters by
@root_prefix-- skips the userfiltersfilter. -
#peek_unfiltered_full ⇒ Object
private
Same root-prefix scoping as #peek_unfiltered, but preserves Coverage's full per-file shape (Hash
{ lines: [...], branches: {...} }in hash mode; Array<Integer|nil> in array mode) instead of reducing hash entries to their:linescomponent.
Constructor Details
#initialize(root:, filters: [], mode: :auto) ⇒ CoverageAdapter
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Internal method on the tracer pipeline.
39 40 41 42 43 44 45 46 47 |
# File 'lib/rspec_tracer/tracker/coverage_adapter.rb', line 39 def initialize(root:, filters: [], mode: :auto) raise ArgumentError, "invalid mode: #{mode.inspect}, allowed: #{MODES}" \ unless MODES.include?(mode) @root = File.(root) @root_prefix = "#{@root}/" @filters = filters @mode = mode end |
Instance Attribute Details
#filters ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Internal attribute.
35 36 37 |
# File 'lib/rspec_tracer/tracker/coverage_adapter.rb', line 35 def filters @filters end |
#mode ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Internal attribute.
35 36 37 |
# File 'lib/rspec_tracer/tracker/coverage_adapter.rb', line 35 def mode @mode end |
#root ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Internal attribute.
35 36 37 |
# File 'lib/rspec_tracer/tracker/coverage_adapter.rb', line 35 def root @root end |
Instance Method Details
#compute_diff(before, after) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Pure function: returns Set for files whose line arrays
changed between before and after. Handles nil line entries
(unexecutable lines) correctly -- nil<->nil is not a delta, any
other transition is.
102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/rspec_tracer/tracker/coverage_adapter.rb', line 102 def compute_diff(before, after) changed = Set.new (before.keys | after.keys).each do |path| next unless delta?(before[path], after[path]) changed << Input.for_file( path: path, kind: :ruby, digest: file_digest(path), root: @root ) end changed end |
#peek ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Snapshot of the current coverage state: { absolute_path => Array<Integer|nil> } for files under project root that survive the user filter. Hash-mode input is reduced to its :lines component -- 2.0 ignores branch coverage (same as 1.x; noted in the upgrade docs).
54 55 56 |
# File 'lib/rspec_tracer/tracker/coverage_adapter.rb', line 54 def peek peek_normalized { |path| filtered?(path) } end |
#peek_unfiltered ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Same shape as #peek but only filters by @root_prefix -- skips
the user filters filter. The coverage.json emitter
(Reporters::CoverageJsonReporter) calls this at finalize to
capture cumulative coverage matching legacy semantics: 1.x's
CoverageReporter#peek_coverage applied no filters filter at
peek time and let coverage_filters do the final exclusion.
Routing the emitter's finalize peek through this method keeps
the lib/-wide ::Coverage.peek_result call-site count at 3
(one per file: this adapter, rspec/installation, and
tracker/loaded_files_tracker) instead of adding a fourth.
68 69 70 |
# File 'lib/rspec_tracer/tracker/coverage_adapter.rb', line 68 def peek_unfiltered peek_normalized { false } end |
#peek_unfiltered_full ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Same root-prefix scoping as #peek_unfiltered, but preserves
Coverage's full per-file shape (Hash { lines: [...], branches: {...} } in hash mode; Array<Integer|nil> in array mode) instead
of reducing hash entries to their :lines component.
Lone caller is the SimpleCov interop shim
(Reporters::CoverageJsonReporter::SimpleCovInterop): when
SimpleCov has enable_coverage :branch, Coverage runs in hash
mode and the prepended Coverage.result MUST hand back the
branches sub-hash so SimpleCov's branch-coverage report path
has data to render. The legacy peek_unfiltered strips
branches because the user-facing coverage.json shape is
documented as Array<Integer|nil> per file (1.x compatibility);
do not change peek_unfiltered to do otherwise without bumping
the storage schema.
87 88 89 90 91 92 93 94 95 96 |
# File 'lib/rspec_tracer/tracker/coverage_adapter.rb', line 87 def peek_unfiltered_full raw = ::Coverage.peek_result @mode = detect_mode(raw) if @mode == :auto raw.each_with_object({}) do |(path, stats), acc| next unless path.start_with?(@root_prefix) acc[path] = stats end end |