Class: RSpecTracer::Reporters::CoverageJsonReporter Private
- Defined in:
- lib/rspec_tracer/reporters/coverage_json_reporter.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.
Single owner of coverage.json emission in 2.0. Replaces the
legacy CoverageReporter + CoverageWriter + CoverageMerger +
RubyCoverage quartet that 1.x carried. Output shape preserved byte-for-byte
for downstream consumers (user CI dashboards parse this):
{ "RSpecTracer": {
"coverage": { "<absolute_path>": [Integer|nil, ...], ... },
"timestamp": <Integer>
} }
Cumulative coverage source: ::Coverage.peek_result at finalize
time, routed through Tracker::CoverageAdapter#peek_unfiltered
so the lib/-wide peek_result call-site count stays at 3 (one
each in coverage_adapter.rb, rspec/installation.rb, and
tracker/loaded_files_tracker.rb).
Skipped-example contribution: Engine#merge_skipped_coverage,
which replays 1.x's CoverageReporter algorithm verbatim - per-
skipped-example per-line strengths add into the cumulative map.
SimpleCov interop: when SimpleCov is loaded, this reporter does
NOT write coverage.json. Instead it installs a small inner module
via ::Coverage.singleton_class.prepend so SimpleCov's at_exit
result-merge sees rspec-tracer's filtered coverage. Matches 1.x
behavior + the integration matrix convention.
Parallel_tests: per-worker emit happens through the Registry
like every other reporter (each worker writes its own
coverage.json under the per-worker coverage_path). The elected
worker calls merge_parallel from RSpec::ParallelTests to
union the per-worker files into the top-level coverage.json.
Defined Under Namespace
Modules: SimpleCovInterop
Constant Summary collapse
- FILENAME =
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.
Internal constant.
'coverage.json'
Instance Attribute Summary
Attributes inherited from Base
#logger, #options, #report_dir, #run_metadata, #snapshot
Class Method Summary collapse
-
.merge_parallel(peer_paths:, output_path:, logger: nil) ⇒ Object
private
Class-level rollup for parallel_tests.
Instance Method Summary collapse
-
#generate ⇒ String?
private
Concrete implementation of Base#generate.
-
#no_op? ⇒ Boolean
private
Coverage emission fires unconditionally - even when no examples ran, 1.x writes coverage.json with whatever boot-time peek_result returned (plus filter + stub).
Methods inherited from Base
Constructor Details
This class inherits a constructor from RSpecTracer::Reporters::Base
Class Method Details
.merge_parallel(peer_paths:, output_path:, logger: nil) ⇒ 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.
Class-level rollup for parallel_tests. Unions per-line
strengths across the per-worker coverage.json files written by
generate on each worker, then writes the merged top-level
coverage.json. Replaces 1.x's
CoverageMerger.new + CoverageWriter.new(top_path, merger).
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/rspec_tracer/reporters/coverage_json_reporter.rb', line 81 def self.merge_parallel(peer_paths:, output_path:, logger: nil) merged = {} peer_paths.each do |peer| path = File.join(peer, FILENAME) next unless File.file?(path) data = JSON.parse(File.read(path, encoding: 'UTF-8')) peer_coverage = data.fetch('RSpecTracer').fetch('coverage') peer_coverage.each do |file_path, lines| if merged.key?(file_path) merge_line_arrays(merged[file_path], lines) else merged[file_path] = lines.dup end end end FileUtils.mkdir_p(File.dirname(output_path)) payload = { RSpecTracer: { coverage: merged, timestamp: Time.now.utc.to_i } } File.write(output_path, JSON.pretty_generate(payload), encoding: 'UTF-8') logger&.debug("rspec-tracer: wrote merged coverage.json to #{output_path}") output_path end |
Instance Method Details
#generate ⇒ String?
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.
Concrete implementation of Base#generate.
Builds the cumulative coverage payload and writes coverage.json
under Base#report_dir, except when SimpleCov owns the run (in which
case the SimpleCov interop shim takes over).
57 58 59 60 61 62 63 64 65 |
# File 'lib/rspec_tracer/reporters/coverage_json_reporter.rb', line 57 def generate return nil unless RSpecTracer.engine return install_simplecov_interop if RSpecTracer.simplecov? coverage = build_coverage write_coverage_json(coverage) log_stats(coverage) target_path end |
#no_op? ⇒ Boolean
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.
Coverage emission fires unconditionally - even when no examples ran, 1.x writes coverage.json with whatever boot-time peek_result returned (plus filter + stub). Override Base#no_op? so the parent's "snapshot has zero examples" early-return doesn't gate this emitter.
72 73 74 |
# File 'lib/rspec_tracer/reporters/coverage_json_reporter.rb', line 72 def no_op? false end |