Module: RSpecTracer::Tracker::FileDigest Private
- Defined in:
- lib/rspec_tracer/tracker/file_digest.rb
Overview
This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.
Process-wide SHA256 file-digest cache. Keyed on absolute path with [mtime_ns, size] as the freshness check — when the file’s stat timestamps + size match the cached values, the prior digest is reused; otherwise the digest is recomputed and the cache entry refreshed.
The cache is populated lazily and never evicted within a process. Tracer runs are bounded (one rspec invocation per process), so unbounded growth is bounded by the project’s dependency-graph size (typically << 10k unique files).
SystemCallError on stat / digest is treated as “file gone / unreadable” and returns nil — same graceful-degradation contract every call site already implemented locally before this module centralized them.
Thread-safety: rspec example execution is single-threaded (cold-subprocess contract); the cache uses a plain Hash without locking. Multi-threaded callers are unsupported (consistent with the rest of the tracer’s threading model).
Class Method Summary collapse
-
.compute(path) ⇒ Object
private
Returns the SHA256 hex digest of ‘path`, or nil when the file can’t be stat’d (missing / permission denied / racey delete).
-
.reset! ⇒ Object
private
Drop the cache.
Class Method Details
.compute(path) ⇒ 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.
Returns the SHA256 hex digest of ‘path`, or nil when the file can’t be stat’d (missing / permission denied / racey delete). Subsequent calls for the same path with unchanged stat skip the digest computation entirely.
35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/rspec_tracer/tracker/file_digest.rb', line 35 def compute(path) stat = File.stat(path) key = (stat.mtime.to_i * 1_000_000_000) + stat.mtime.nsec size = stat.size cache = (@cache ||= {}) cached = cache[path] return cached[2] if cached && cached[0] == key && cached[1] == size digest = Digest::SHA256.file(path).hexdigest cache[path] = [key, size, digest] digest rescue SystemCallError nil end |
.reset! ⇒ 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.
Drop the cache. Tests that mutate file content in-place at nanosecond granularity (and so might collide on the mtime+size key) should call this between scenarios. Normal tracer runs never need it — the cache lives for one rspec invocation only.
55 56 57 |
# File 'lib/rspec_tracer/tracker/file_digest.rb', line 55 def reset! @cache = {} end |