Update dependency simplecov to v1#974
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
0.22.0→1.0.0Release Notes
simplecov-ruby/simplecov (simplecov)
v1.0.0Compare Source
==================
First stable release of the 1.0 line. The entries below consolidate release candidates rc1 through rc5 and describe all changes since 0.22.1.
Breaking Changes
RUBY_VERSION3.4). Ruby 3.1 reached end of life in March 2025, and a recenti18nrelease callsFiber[], a Ruby 3.2 API, at load time, so suites that load Rails no longer run on 3.1. Raisingrequired_ruby_versionto>= 3.2also excludes JRuby 9.4, which reportsRUBY_VERSION3.1.x. See #1171.{ "covered_percent": 80.0 }to full stats shape{ "covered": 8, "missed": 2, "total": 10, "percent": 80.0, "strength": 0.0 }. The keycovered_percentis renamed topercent.simplecov_json_formattergem is now built in.require "simplecov_json_formatter"continues to work via a shim.StringFilternow matches at path-segment boundaries."lib"matches/lib/but no longer matches/library/. Use aRegexpfilter for substring matching.SourceFile#project_filenamenow returns a truly relative path with no leading separator (e.g.lib/foo.rbinstead of/lib/foo.rb). This also removes the leading/from file path keys incoverage.jsonand from the filename inminimum_coverage_by_fileerror messages. AnchoredRegexFilters that relied on a leading/(e.g.%r{^/lib/}) should be rewritten (e.g.%r{\Alib/}).docilegem dependency. TheSimpleCov.configureblock is now evaluated viainstance_execwith instance variable proxying.JSONFormatterwhen theCC_TEST_REPORTER_IDenvironment variable is set. The defaultHTMLFormatternow emitscoverage.jsonalongside the HTML report (usingJSONFormatter.build_hashto serialize the same payloadJSONFormatterwrites), so the env-var special case is no longer needed. Because of this, listingJSONFormatteralongsideHTMLFormatteris redundant and can be removed.SimpleCov.startnow loads thetest_frameworksprofile by default, which filters paths undertest/,spec/,features/, andautotest/. Running the suite always executes 100% of the test files themselves, which inflated the overall percentage and obscured application coverage. To opt back in (e.g. to surface dead test helpers), drop the filter withremove_filter %r{\A(test|features|spec|autotest)/}. See #816.rspec -f json. Suppress it entirely withsilent: trueon the formatter; redirect with2>&1if you want the old behavior. See #1060.parallel_tests, SimpleCov now waits in the first started process (viaParallelTests.first_process?) rather than the last. This matches the conventionparallel_tests's own README recommends for "do something once after all workers finish" hooks, so user code that has its ownParallelTests.wait_for_other_processes_to_finishin anRSpec.after(:suite)(or equivalent) no longer deadlocks against SimpleCov's wait when both pick the same process. As a side benefit, the previousPARALLEL_TEST_GROUPS=1workaround forlast_process?'s"" == "1"mismatch (#1066) is no longer needed —first_process?handles that case naturally. Migration: the rare project that wired its own wait viaParallelTests.last_process?now hits the symmetric deadlock and must switch tofirst_process?. See #922.SimpleCov.coverage_criterion. It was a reader/writer for a value nothing in SimpleCov ever consumed, so it duplicatedprimary_coveragewithout affecting any behavior. Useprimary_coverageto choose the report's leading criterion (or thecoverage :branch, primary: trueform).Deprecations
add_filter→skip(identical matcher grammar; no behavior change)add_group→group(identical matcher grammar; no behavior change)track_files→cover(coverincludes unloaded files liketrack_filesdid and restricts the report to the matching set; pass every directory you want reported, e.g.cover "lib/**/*.rb", "app/**/*.rb", to keep the old additive-only behavior)use_merging→merging(same value)enable_for_subprocesses→merge_subprocesses(same value)enable_coverage_for_eval→enable_coverage :eval(folds into the same call that enables:line/:branch/:method)print_error_status(reader) →print_errors(theprint_error_status=writer is unaffected for now)SimpleCov.startfrom.simplecovis deprecated. Coverage tracking still begins for backward compatibility, but a one-time deprecation warning fires pointing the user at moving the call intospec_helper.rb/test_helper.rb; a future release will require the explicitSimpleCov.startfrom a test helper. The migration goes hand-in-hand with the bugfix below: onceSimpleCov.startlives in the test helper, the parent process that auto-loads.simplecovnever starts tracking and the empty-report-overwrite scenario can't arise. See #581.# :nocov:toggle comments (and the configurableSimpleCov.nocov_token/SimpleCov.skip_token) are deprecated in favor of the new# simplecov:disable/# simplecov:enabledirectives. Each file that still uses# :nocov:emits a one-time deprecation warning to stderr at load time pointing at the recommended replacement, and any call toSimpleCov.nocov_tokenorSimpleCov.skip_token(getter or setter) likewise warns. The directive will be removed in a future release.SimpleCov::SourceFile#branches_coverage_percentand#methods_coverage_percentare deprecated in favor of the uniformcovered_percent(:branch)/covered_percent(:method).covered_percent(andcovered_strength) now take a criterion argument (defaulting to:line), so the same call reaches any criterion instead of line being the unprefixed default while branch and method had their own differently-named methods.coverage_statisticsalso now accepts a criterion (e.g.coverage_statistics(:branch)) to return that oneCoverageStatisticsrather than the whole Hash.minimum_coverage_by_fileandminimum_coverage_by_groupare deprecated in favor of thecoveragemethod'sminimum_per_file/minimum_per_groupverbs. The legacy methods overloaded a single hash to carry both per-criterion defaults and per-path / per-group overrides, withminimum_coverage_by_filefurther distinguishing Symbol keys (criterion defaults) from String / Regexp keys (path overrides) and accepting either a bare number or a per-criterion hash as the value. Thecoverageblock fixes the criterion so every threshold is a plain percentage with anonly:target. The setter form emits a deprecation warning naming the replacement; the no-arg getter (read internally) is unchanged. Replace e.g.minimum_coverage_by_file line: 70, 'app/x.rb' => 100withcoverage(:line) { minimum_per_file 70; minimum_per_file 100, only: 'app/x.rb' }. See the "Per-criterion thresholds withcoverage" README section.Enhancements
simplecov uncoveredgained--criterion line|branch|method(defaultline) so the lowest-coverage listing can rank by branch or method coverage, not just line.coverageconfiguration method — a uniform way to configure each coverage criterion (:line,:branch,:method) in one place.coverage :line do minimum 90; minimum_per_file 80; maximum_drop 5 end(or the one-linercoverage :branch, minimum: 80) enables the criterion and declares its thresholds with identical syntax regardless of criterion, because the criterion is fixed by the enclosing call rather than smuggled into the argument as the historical "a bare number means line coverage, every other criterion needs a Hash" special case. Verbs:minimum,maximum,exact,maximum_drop,minimum_per_file(withonly:String-path / Regexp overrides), andminimum_per_group. Options:primary:(the report's leading criterion),oneshot:(oneshot-lines mode for:line), and:eval. The flatminimum_coveragefamily remains as suite-wide sugar. Thresholds feed the same internal stores, so exit-code enforcement is unchanged. See the "Per-criterion thresholds withcoverage" section in the README.coverage.jsonnow carries a top-level$schemafield holding the URL of the versioned canonical JSON Schema the document conforms to, plus a human-readablemeta.schema_version("major.minor", currently"1.0"). The versioned canonical lives atschemas/coverage-v1.0.schema.jsonand is immutable per version, an unversioned convenience alias atschemas/coverage.schema.jsonalways tracks the latest. Downstream tools can validate inputs, generate types, or pin to a known shape, and the document-level$schemamakes each payload self-describing. The schema version is independent of the gem version: additive changes bump minor, removals or shape changes bump major and ship as a newschemas/coverage-vX.0.schema.jsonfile so prior-version consumers stay valid.meta.commitcarries the git commit SHA the report was generated against (or null outside a git checkout), so tools can recover the exact source from history even whensource_in_json falseomits the per-file source arrays.SimpleCov::ParallelAdapters— a pluggable adapter interface for parallel test runners. SimpleCov's coordination with parallel test runners (deciding which worker does final-result work, waiting for siblings, knowing how many resultsets to expect) now routes through an adapter chain rather than hard-coding theparallel_testsgem's API. Two adapters ship:ParallelTestsAdapterwraps the historical grosser/parallel_tests gem (precise, gem-API-based);GenericAdapterhandles any runner that follows theTEST_ENV_NUMBER/PARALLEL_TEST_GROUPSenv-var convention without shipping a Ruby API. The practical impact: parallel_rspec (and any similar env-var-only runner) now works out of the box — previously every worker thought it was the "final" one and they clobbered each other's resultsets. Custom runners can register their own adapter viaSimpleCov::ParallelAdapters.register MyAdapter, whereMyAdaptersubclassesSimpleCov::ParallelAdapters::Baseand overrides the four contract methods (active?,first_worker?,wait_for_siblings,expected_worker_count). See #1065.SimpleCov.ignore_branchesfor opting out of synthetic:elsebranches that Ruby'sCoveragelibrary reports for constructs with no literalelsekeyword — exhaustivecase/inpattern matches,case/whenwithoutelse,||=/&&=, andif/unlesswithoutelse. Variadic; only:implicit_elseis supported today, with room for future synthetic branch types. Calling it without (or before)enable_coverage :branchis harmless — the setting is stored and applies once branch coverage is enabled. Explicitelsearms still count. See #1033.SimpleCov.coverfor declaring a positive coverage scope (the long-requested allowlist counterpart toadd_filter). Accepts string globs, Regexps, blocks, or arrays of those; multiple calls union. When anycovermatcher is configured the report drops every source file that doesn't match at least one of them, and string-glob matchers also expand on disk so files that exist but were never required during the run still appear in the report (at 0% coverage). Resolves the long-standing requests in #696 and #869. The companionSimpleCov.no_default_skipsopts out of the filters thatSimpleCov.startinstalls (hidden files,vendor/bundle/, test directories) so users who want to opt out wholesale don't have to callclear_filtersthemselves.SimpleCov.formatter false(and the equivalentSimpleCov.formatters []) now opts out of formatting entirely instead of raisingConfigurationError.SimpleCov::Result#format!returnsnilwhen no formatter is configured. Intended for worker processes in big parallel CI runs (hundreds of jobs) where only a finalSimpleCov.collatestep needs a report — every other worker just drops its.resultset.jsonand exits without paying for HTML or multi-formatter output. See #964.TEST_ENV_NUMBERandPARALLEL_TEST_GROUPSno longer triggers a spurious"SimpleCov guessed you were running inside parallel tests but couldn't load it"warning when theparallel_testsgem isn't actually installed. SimpleCov now treats aLoadErroron the auto-require as "the user set those env vars for some other reason (custom subprocess coordination, CI sharding) and isn't using parallel_tests" and silently skips. The newSimpleCov.parallel_tests true/falsesetting forces the auto-require on or off when finer control is needed. See #1018.SimpleCov.minimum_coverage_by_filenow accepts per-path overrides alongside the existing per-criterion defaults: pass String or Regexp keys to declare file- or directory-specific thresholds, e.g.minimum_coverage_by_file line: 70, 'app/mailers/request_mailer.rb' => 100. A String ending in/matches as a directory prefix; otherwise it must equal the project-relative path. Regexp keys match against the project-relative path. Per-path values may be a Numeric (primary criterion) or a per-criterion Hash; for each file the effective threshold is the defaults merged with any matching overrides (later overrides win per criterion, overrides win over defaults). The new overrides surface incoverage.jsonunder the existingerrors.minimum_coverage_by_fileblock. See #575.SimpleCov.maximum_coverage(and the convenienceSimpleCov.expected_coverage, which setsminimum_coverageandmaximum_coverageto the same value) so the suite can be pinned to an exact coverage figure. A drop fails per the minimum; an unexpected increase also fails, prompting you to bump the threshold up rather than silently absorbing the improvement. Accepts the same Numeric / per-criterion Hash forms asminimum_coverage. Exits with status 4 (SimpleCov::ExitCodes::MAXIMUM_COVERAGE) when violated, and surfaces incoverage.jsonundererrors.maximum_coverage. Comparisons floor the actual percent to two decimal places, soexpected_coverage 95.42still passes when the actual is e.g. 95.4287. See #187.strictprofile (SimpleCov.start "strict") that enables line, branch, and method coverage and pins the minimum threshold for each at 100%. Drops to line-only on engines without branch/method support (JRuby). See #1061.SimpleCov.coverage_pathis now explicitly settable rather than always computed fromSimpleCov.root + SimpleCov.coverage_dir. Setting it pins the report destination regardless of laterroot/coverage_dirchanges — useful for out-of-tree build directories (CMake/CTest etc.) where the coverage report doesn't live under the source root. See #716.coverage/index.htmlfrom the HTML formatter,coverage/coverage.jsonfrom the JSON formatter — so the line points at a concrete file (and is clickable in terminals that hyperlink paths). Paths outside cwd stay absolute. See #197.SimpleCov.disable_coverage(criterion)so a project can opt out of line coverage entirely — e.g.enable_coverage :branch; disable_coverage :linefor a branch-only run.SimpleCov.startnow raisesSimpleCov::ConfigurationErrorwhen every criterion has been disabled. The formatter summary and JSON output emit only the criteria that were actually measured, so a branch-only run produces noLine coverage:line, nolineskey incoverage.json, and no zero-padded line numbers in the HTML report. See #845.SimpleCov.remove_filter(arg)to drop a specific filter (matching byfilter_argument) andSimpleCov.clear_filtersto wipe the entire chain. Useful for selectively turning off one of the defaults loaded bySimpleCov.start— e.g.remove_filter(/\A\..*/)to stop hiding paths that begin with a dot. The README's "Default filters" section enumerates what's loaded by default and how to disable each piece. See #803.NO_COLOR(force off, per no-color.org) andFORCE_COLOR(force on);NO_COLORwins if both are set. See #1157.coverage,report,uncovered, anddiffnow colorize their printed percentages by the same threshold (anddiffcolors regressions red, improvements green). Auto-detect based on whether stdout is a TTY; the sameNO_COLOR/FORCE_COLORenv vars apply. Each subcommand also accepts a--no-colorflag as a per-invocation override.# simplecov:disable/# simplecov:enabledirective comments for selectively skippingline,branch, andmethodcoverage. Block form (own line) opens a region until the matching# simplecov:enable; inline form (trailing a code line) skips just that line. Categories may be combined (# simplecov:disable line, branch); omitting categories targets all three. Any trailing text is treated as a free-form reason and discarded (e.g.# simplecov:disable line legacy adapter). Directive markers inside string literals or heredocs are ignored.SimpleCov.source_in_json(default true) to make the per-filesourcearray incoverage.jsonopt-out. Tools that read the project's source files from disk don't need the embedded copy, and on larger projects it dominates the JSON payload. The HTML report'scoverage_data.jsstill embeds source unconditionally because the client-side viewer renders source from there. See #1143.meta.timestampis now emitted with millisecond precision (iso8601(3)) so the concurrent-overwrite warning can distinguish writes within the same wall-clock secondtotalsection with aggregate coverage statistics (covered, missed, total, percent, strength) for line, branch, and method coverage. Line stats additionally includeomitted(count of blank/comment lines, i.e. lines that cannot be covered)total_lines,lines_covered_percent, and when enabled:branches_covered_percent,methodsarray, andmethods_covered_percentsilent:keyword toJSONFormatter.newto suppress console outputsimplecov-htmlformatter into the main gem. A backward-compatibility shim ensuresrequire "simplecov-html"still works.simplecov_json_formatterinto the main gem. A backward-compatibility shim ensuresrequire "simplecov_json_formatter"still works.CommandGuessernow appends the framework name to parallel test data (e.g."RSpec (1/2)"instead of"(1/2)")SimpleCov::Result.newis roughly 7× faster for already-string-keyed input (theSimpleCov.collatehot path). The previous implementation deep-cloned each file's coverage data withJSON.parse(JSON.dump(coverage))per source file — a useful normalization for liveCoverage.resultsymbol keys, but pure overhead for resultsets loaded from disk that already have string keys.Resultnow stringifies the outer hash keys withtransform_keysonly when needed; the inner branch/method-key shape is already handled bySourceFile#restore_ruby_data_structure. See #916.SimpleCov.parallel_wait_timeout(default 60 seconds), which controls how long the process that writes the final report waits for the other parallel-test workers to finish writing their resultsets before it merges. Raise it when one worker runs much heavier test files and routinely finishes well after the others, so its coverage is included in the merge and the minimum and maximum coverage checks run against the full total instead of being skipped against a partial one. See #1171.SimpleCov.finalize_mergeto separate storing mergeable worker resultsets from owning final report finalization. Parallel workers that write to explicit custom coverage destinations can now store their shard.resultset.jsonfiles without waiting on sibling shards they cannot see; an explicitSimpleCov.collatecleanup step then formats the merged report, enforces thresholds, and writes.last_run.json. SimpleCov infers this external-finalization mode only for recognized multi-worker parallel runs with merging enabled and a custom coverage destination, and emits a configuration warning until users setfinalize_merge false(ortrue) explicitly. See #1215.CHANGELOG.md, trimming the largest avoidable part of the payload (the changelog grew with every release). Thechangelog_urigem metadata already links the copy on GitHub.SimpleCov.primary_coverage, line by default), ascending, so the least-covered files lead the list. To carry the primary criterion to the report,coverage.jsonincludes aprimary_coveragefield inmeta, also documented in the coverage schema. See #1171.Bugfixes
:eval_generatedtokens toSimpleCov.ignore_branchesand the newSimpleCov.ignore_methodsso projects using macros like Rails'delegate(or any pattern that callsmodule_eval(body, __FILE__, __LINE__)) can drop the synthetic branch and method entries those macros inject. Ruby'sCoverageattributes eval'd code to the caller's__FILE__/__LINE__, so adelegate :foo, to: :barline surfaces as if it had adef fooand anifbranch right there. Detection uses Prism to walk the static source and treats any Coverage entry whose start_line lacks a realdefkeyword (for methods) or branch construct (for branches) as eval-generated. Opt in withignore_methods :eval_generatedand / orignore_branches :eval_generated. Prism ships with Ruby 3.3+; on older Rubiesgem install prismenables the filter, otherwise the setting is a no-op. See #1046.cover/track_filesthat were neverrequire'd during the run now contribute branch and method entries to the report, not just lines. PreviouslySimulateCoverageleft those fields as empty hashes (because parsing source ourselves felt risky), which made unloaded files invisible to the branch and method denominators while their lines DID count — so acover "{app,lib}/**/*.rb"glob over files without specs silently inflated branch% relative to line% (the OP's reproduction was via SonarQube, which surfaces the asymmetry more visibly than the SimpleCov HTML report). Branches and methods are now enumerated statically viaSimpleCov::StaticCoverageExtractor, which uses Prism to walk the AST and emits Coverage-shaped tuples without loading the file. The shape matches what Ruby's ownCoveragelibrary reports for the same source::if/:case/:while/:untilconstructs plus their:then/:else/:when/:in/:bodyarms, with the synthetic:elsefor case-without-explicit-else that theignore_branches :implicit_elsesetting (see Enhancements) targets. Prism is bundled with Ruby 3.3+; on older Rubiesgem install prismenables the fix, otherwise SimulateCoverage falls back to the previous "empty hashes" behavior. See #1059.">100LOC"/"<10LOC", or any pair using different special characters) no longer render into the same DOM container. The JS that built HTML ids from group names stripped every non-letter prefix and then every remaining non-alphanumeric char, so both names sanitized to"LOC"and the second group silently replaced the first in the rendered tabs. The new encoding ("g-" + each-non-id-char-as-hex) preserves uniqueness across all input shapes. See #1038."or'characters are now escaped when rendered intotitle="..."attributes. The previous DOM-basedescapeHTMLonly escaped&,<, and>, so a project with such filenames could break out of the attribute. The replacement encodes all five HTML-attribute-sensitive characters via areplacecallback (also avoids allocating a DOM node per call).f.branches_covered_percent || 100.0(and the method equivalent), which treated a real0as falsy and substituted the disabled-criterion fallback. The check now distinguishes "criterion disabled" (undefined) from "criterion measured zero" (0).SimpleCov::Resultnow warns when it drops source files because their absolute paths aren't on the local filesystem, instead of silently producing an empty0 / 0 (100.00%)report. The most common trigger isSimpleCov.collateinvoked from a machine or working directory different from where the individual resultsets were generated — when every entry is missing the warning explicitly names that case and points at the issue; when only some are missing the warning is quieter and lists up to five paths with a(+N more)suffix. See #980.track_filesthat were never loaded now use the same line classification as loaded files. Previously,SimulateCoverageran the file throughLinesClassifier, which marks every non-blank, non-comment line as relevant — so a multi-line method chain@x = a.foo.barreported 4 relevant lines for the unloaded copy and 2 for the loaded copy, throwing off per-file and overall percentages.SimulateCoveragenow usesCoverage.line_stub(the same stub Ruby would have produced if the file were required), then overlays# :nocov:toggles and# simplecov:disable linedirective ranges that the runtime doesn't know about. The two paths now agree on every shape: multi-line statements,endkeywords, blank lines, and SimpleCov-specific exclusion comments. Some projects will see theirtracked_filespercentages shift as a result. See #654.Bundler.require) caused.simplecovto auto-loadSimpleCov.startin the rake parent, which then shelled out to a test runner subprocess; the subprocess wrote a correct report, then the parent'sat_exitwould clobber it with an empty 0% report. Three layers of defense now apply: (1).simplecovis treated as configuration only and no longer starts tracking from the parent (see Deprecations); (2)ResultMerger.store_resultmerges incoming entries with same-command_nameentries that were written after ourprocess_start_timeinstead of overwriting them; (3)SimpleCov.at_exit_behaviordefers entirely when our merged result is empty andcoverage/.last_run.jsonis fresher than this process. See #581.track_filesthat were never loaded. See #902SimpleCov.root('/')so files outside the conventional project root can be tracked (e.g. Docker layouts where code and tests are siblings at/). The root-prefix regex no longer doubles the separator (//), andproject_nameno longer crashes whenroothas no parent segment. The user-facing:root_filterprofile and the unconditionalUselessResultsRemovernow share a single regex source instead of computing it independently. See #860.SimpleCov.startruns afterrequire "minitest/autorun"(e.g. underRake::TestTaskorMinitest::TestTask, which shell out asruby -e 'require "minitest/autorun"; ...'), automatically setexternal_at_exitand route the report throughMinitest.after_run. Previously, theat_exitLIFO order meant SimpleCov formatted a 0% report before Minitest ran. The opposite ordering (SimpleCov first) is still handled bylib/minitest/simplecov_plugin.rb. See #1032, #1099, and #1112.parallelize) are now named by a stable per-run serial rather than the child's OS process id. Because the pid changed every run, a re-run's worker results were never named the same as the previous run's and so never overwrote them. They accumulated in.resultset.jsonuntilmerge_timeoutdropped them, and while several runs sat inside that window together SimpleCov merged them all. When the set of files had drifted between those runs (a deleted file, a changed filter) the stale results leaked into the report, inflating the denominator and changing the coverage percentage from one run to the next. The serial sequence is identical from one run to the next, so a re-run's workers now overwrite the previous run's entries and the resultset stays bounded. See #1171.merge_timeout" warning is now emitted at most once, from the reporting process, instead of once per forked worker. Every worker merges the resultset too, and the defaultat_forksetsprint_errors falsefor them, but this one warning did not honor the flag, so an eight-worker run printed eight copies. See #1171.TEST_ENV_NUMBER, such as Minitest'sparallelize, match no parallel-test adapter, so SimpleCov now marks forked children (it already hooksProcess._fork) and treats them as non-reporters when no adapter is active, leaving the process that did the forking to merge every slice and report once. See #1171.parallel_testsadapter now only activates and uses the native wait API when the native pid-file synchronization contract is present. Processes that inheritTEST_ENV_NUMBER/PARALLEL_TEST_GROUPSwithoutPARALLEL_PID_FILE, or losePARALLEL_PID_FILEbefore SimpleCov'sat_exithook runs, now use the generic resultset polling path instead of callingParallelTests.wait_for_other_processes_to_finishand failing whenparallel_testsfetches the missing pid-file path. See #1210.at_exitformatter now writes reports only from the final parallel-test worker while still storing each worker's resultset for the final merge, so JSON/XML/HTML formatters no longer clobber canonical coverage files from non-final workers. See #1210.SimpleCov.parallel_tests falsenow disables the genericTEST_ENV_NUMBERadapter as well as theparallel_testsgem adapter, so projects that use those environment variables for a different coverage collation flow can opt out consistently. See #1208.N-1ofNworkers and skipped threshold checks immediately before producing a complete merged report. See #1208.unlessand safe-navigation calls, and resultset merges now combine serialized branch tuples by source location instead of by their local sequential ids. This prevents equivalent branches from being duplicated when static and runtime branch extraction assign different ids. See #1206.Configuration
📅 Schedule: (UTC)
* 0-4,22-23 * * 1-5)* * * * 0,6)🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.