Class: RSpecTracer::Tracker::EnvSnapshot Private
- Inherits:
-
Object
- Object
- RSpecTracer::Tracker::EnvSnapshot
- Defined in:
- lib/rspec_tracer/tracker/env_snapshot.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.
Observer #5 in the 2.0 tracker pipeline (WholeSuiteInvalidators
is #4). Owns the per-run snapshot of environment-variable
values that the per-example tracks: { env: ... } metadata declares.
Watch list is caller-provided - unlike WholeSuiteInvalidators,
which hard-codes Gemfile.lock / .ruby-version / .rspec-tracer,
env names come from user metadata and are only known once
RSpec has discovered every example. The engine unions every
example's declared env names and hands the set to
digest_snapshot at finalize time.
Digest algorithm: Digest::MD5.hexdigest(ENV[name].to_s).
Missing env var digests the same as empty string - absent is a
valid state. ENV is process-stable within a single run (we
never mutate it mid-run), so one snapshot per run is enough.
Graceful degradation: the observer never raises on malformed input. Non-String env names are coerced via #to_s; nil / empty names are skipped silently.
Instance Method Summary collapse
-
#digest_snapshot(names) ⇒ Object
private
Snapshot the current ENV values for
names. -
#initialize(env: ::ENV) ⇒ EnvSnapshot
constructor
private
ENV source is injectable for testability - specs can pass a Hash double without poking the real process env.
-
#invalidated_keys(previous_snapshot, names) ⇒ Object
private
Return the set of env names whose digest differs between
previous_snapshotand the current ENV.
Constructor Details
#initialize(env: ::ENV) ⇒ EnvSnapshot
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.
ENV source is injectable for testability - specs can pass a Hash double without poking the real process env.
32 33 34 |
# File 'lib/rspec_tracer/tracker/env_snapshot.rb', line 32 def initialize(env: ::ENV) @env = env end |
Instance Method Details
#digest_snapshot(names) ⇒ 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 the current ENV values for names. Returns
Hash[name => md5_hex]. Idempotent; callers may invoke it
repeatedly without side effects.
39 40 41 42 43 44 45 46 47 48 |
# File 'lib/rspec_tracer/tracker/env_snapshot.rb', line 39 def digest_snapshot(names) snapshot = {} names.each do |raw| key = raw.to_s next if key.empty? snapshot[key] = Digest::MD5.hexdigest(@env[key].to_s) end snapshot end |
#invalidated_keys(previous_snapshot, names) ⇒ 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.
Return the set of env names whose digest differs between
previous_snapshot and the current ENV. Keys in either
snapshot participate:
- present in both, digests differ => invalidated
- present in previous, absent now => invalidated
- absent previously, present now => invalidated
previous_snapshot may be nil (first run, no cache); in that
case every currently-tracked key is considered invalidated so
the examples declaring them get a mandatory cold re-run on
first sighting. names scopes the check: only keys in
names are considered, which means one example adding a new
tracks: env: ... doesn't cascade-invalidate examples that
declared different env keys previously.
65 66 67 68 69 70 71 72 73 74 |
# File 'lib/rspec_tracer/tracker/env_snapshot.rb', line 65 def invalidated_keys(previous_snapshot, names) previous = previous_snapshot || {} current = digest_snapshot(names) invalidated = Set.new current.each do |key, digest| invalidated << key if digest != previous[key] end invalidated end |