Skip to content

Bump simplecov from 1.0.3 to 1.1.0 - #284

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/bundler/simplecov-1.1.0
Open

Bump simplecov from 1.0.3 to 1.1.0#284
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/bundler/simplecov-1.1.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 11, 2026

Copy link
Copy Markdown
Contributor

Bumps simplecov from 1.0.3 to 1.1.0.

Release notes

Sourced from simplecov's releases.

v1.1.0

What's Changed

New Contributors

Full Changelog: simplecov-ruby/simplecov@v1.0.3...v1.1.0

Changelog

Sourced from simplecov's changelog.

1.1.0 (2026-08-10)

Breaking Changes

  • simplecov report --json now emits {"total": {...}, "groups": {...}} instead of flattening the overall "All Files" entry and configured groups into one object. The old shape silently overwrote the overall totals when a user group was also named All Files; the text report now labels that user section All Files (group) as well.
  • Ungrouped is now reserved for the implicit group of files that match no configured group. Defining an explicit group with that name previously caused SimpleCov to overwrite it during result processing and silently discard its matched files; rename such a group to Other or another distinct label. Group names are also normalized when configured: a Symbol name (group :Models) now means the same group as its String spelling (so group :Ungrouped is rejected like the string form, and a symbol-named group can no longer produce a duplicate JSON key next to a string-named one), and a name that is neither a String nor a Symbol raises SimpleCov::ConfigurationError.
  • The HTML report is now a single self-contained index.html. The viewer's JavaScript and CSS are inlined into the compiled template at build time, and the coverage data is embedded at report time (with < escaped in the payload so embedded source text cannot terminate the surrounding <script> element), so coverage/ contains just index.html and coverage.json. A single file can be mailed, uploaded as a non-zipped GitHub Actions run artifact (actions/upload-artifact with archive: false, viewable directly from the run page), or copied anywhere without sibling files, and the report can no longer be read mid-write in a torn state where index.html, coverage_data.js, and application.js come from different runs — the whole report updates in one atomic rename. The sibling files the formatter previously wrote (coverage_data.js, application.js, application.css, and the three favicon PNGs) are gone; anything scripted against that layout should read coverage.json (the sanctioned data artifact, unchanged) instead of coverage_data.js. Formatting also deletes those six names from the output directory when an earlier version left them there, so an upgraded project's coverage/ doesn't keep a stale coverage_data.js around for simplecov serve to serve. This restores single-file reports to the 1.0 line — the pre-1.0 simplecov-html formatter offered them via the SIMPLECOV_INLINE_ASSETS environment variable, which the 1.0 client-side rendering rewrite dropped — and makes them the default and only mode, with no environment variable or configuration flag. See #1241.

Enhancements

  • The HTML report gains a colorblind-friendly mode and non-color coverage markers. A Colorblind toggle next to the Dark toggle swaps the covered/missed pairing (and the coverage bands) for blue versus orange, the standard colorblind-safe pairing, in both themes; the choice persists in localStorage and is applied before first paint. Independently of that mode, the source view now carries a glyph in a left gutter on every line (plus for covered, minus for missed, tilde for skipped, and an f for an uncalled method), and the same glyphs appear on the legend swatches, so the mapping stays legible in greyscale and to assistive technology regardless of palette. Both toggles report state via aria-pressed.
  • simplecov serve now handles each connection on its own thread with a read timeout, so a stalled connection (browsers routinely open speculative sockets that send no bytes) no longer blocks every other request. It also works on JRuby and TruffleRuby, answers malformed request lines with a 400 instead of an empty response, and prints a bracketed URL for IPv6 hosts.
  • The README was trimmed from 1,617 lines to under 180, with the full documentation moved into topic guides under a new docs/ directory (Configuration, Parallelism, Formatters, CLI, Troubleshooting) alongside the changelogs, contributing guide, and code of conduct, with the issue template tucked into .github/. This changelog now lives at docs/Changelog.md and the gem's changelog_uri metadata follows it. Nothing under docs/ ships in the gem, which also stops packaging the old doc/* link lists. The alternate formatters catalog was rebuilt against RubyGems: twenty formatters join the twelve that were listed, organized by output type.
  • .resultset.json is now written as compact JSON instead of pretty-printed. It is a machine-read cache that every parallel worker rewrites wholesale, and pretty printing nearly doubled the bytes written, read back, and parsed on each store-merge round trip — on a 100,000-file project the file shrinks from 89MB to 51MB and serialization halves. Any JSON parser reads the compact form; pipe it through jq if you need to inspect it by eye.
  • The favicon (a solid square in the overall coverage band's colour) is now drawn by the viewer from the report's own palette instead of shipping as fixed PNGs, so it matches the report's green/yellow/red exactly and follows the light/dark theme, including the in-page toggle.
  • SimpleCov.collate takes a new processes: argument that fans the resultset merge out across that many forked worker processes. This addresses the wall clock of a large CI matrix's collate step, where the collating process reads, parses and folds hundreds of resultsets in sequence and nearly all the time goes into that fold: merging 160 resultsets covering 1,836 files on a 14-core machine took 4.53s at the default processes: 1 and 1.35s across 8 workers. The report is identical either way, not merely equivalent — each worker folds a contiguous slice of the file list and the collating process folds the slices back in order, so the resultsets are visited in the same order a single-process merge visits them. The fan-out lives in a new SimpleCov::ParallelResultMerger, whose absorb_results mirrors ResultMerger.absorb_results, splitting that fold across workers and unioning the tracked paths each one saw. processes defaults to the SIMPLECOV_CONCURRENCY environment variable (1 when unset), so one rake task can serve CI runners of different sizes without being edited, and an explicit argument wins over the variable. It never forks at 1, so existing collate calls are unaffected; it is deliberately not clamped to the core count nor gated on a minimum number of resultsets — only the caller knows what a collate job is allowed to use — asking for more processes than there are result files just gives one file per process, and anything below 1 is taken as 1. Merging falls back to the collating process, with the same report and no error, when the runtime cannot fork (JRuby, TruffleRuby, Windows), when there is only one resultset, or when a worker dies. A benchmarks/collate.rb harness (PROCESSES=N) measures the phases against a saved baseline.

Bugfixes

  • Two concurrent runners sharing a command name no longer lose the later writer's coverage for files both carried. A live result serializes its criterion tables under Ruby's Symbol keys while entries parsed back from .resultset.json carry Strings, and the combiners read only Strings, so the merge that exists to prevent an empty parent process from clobbering a subprocess's data (#581) silently contributed nothing from the incoming side. Criterion keys are now stringified at serialization time so the stored and live shapes always match.
  • Merging or collating stored resultsets with method coverage enabled no longer crashes on singleton methods defined on instances. def obj.greet records its receiver as the nested inspect form #<Class:#<Object:0x...>>, and the parser that turns JSON-stringified method keys back into tuples stopped at the first closing angle bracket, raising ArgumentError out of the merge. The quoting now handles nested segments.
  • That same clobber-prevention backstop now stands down for failed child runs too. It keyed its freshness check on .last_run.json, which only fully successful runs write, so a Rakefile parent overwrote the child's report exactly when the child's tests or coverage checks had failed and the report mattered most. Formatting now touches a coverage/.report_stamp marker no matter how the run ends, and the backstop accepts either file as evidence of a fresher report.
  • A # simplecov:disable line block around a method no longer silently removes that method from method-coverage totals. The method skip fell back to asking whether all of the method's lines were skipped, so the line-only directive (the README's own example) leaked into the method criterion. Deprecated # :nocov: chunks still exclude methods, now routed explicitly like every other criterion.
  • A directive reason that merely starts with a category name no longer narrows the directive. # simplecov:disable linear algebra reasons parsed as category line with the rest as reason, disabling only line coverage where the documented behavior for unrecognised text is to over-disable everything. The category list now requires a word boundary.
  • Per-group minimums configured with a Symbol group name are enforced again. group :Models normalizes the name to a String but minimum_per_group 95, only: :Models (and the deprecated minimum_coverage_by_group) stored the Symbol untouched, so the check-time lookup missed and warned that group "Models" doesn't exist while listing that very name as available.
  • simplecov diff matches its documentation: --threshold N is inclusive (a file that moved exactly N% is listed), removed files no longer trip --fail-on-drop (deleting a covered file is not a regression), and sub-epsilon float noise no longer fails the gate on a row shown only for its gains.
  • Tracked-but-unloaded files with multi-statement parenthesized conditions no longer synthesize phantom branches. CRuby folds if (1; 2) by its last expression when the compiler can eliminate every leading statement, and the rules differ per version (parse.y eliminates only pure literals, 3.3 also eliminates side-effect-free reads and containers of them, 3.4+ narrows containers to fully static literals). The static extractor now mirrors each compiler exactly, verified against real Coverage output on every supported Ruby.
  • require "simplecov" no longer raises when HOME is set but empty, as some container and CI images do. The global-config loader treats an empty HOME like an unset one.
  • simplecov merge, report, and coverage print one-line errors instead of backtraces on more bad inputs: a directory or unreadable file passed to merge, valid JSON whose total or groups has the wrong type, and a per-file entry that is not an object.
  • An empty or non-numeric PARALLEL_TEST_GROUPS no longer makes the reporting worker expect zero siblings and skip the wait for their results; unusable values now mean one worker, and non-positive values are rejected too.
  • Simulating tracked files became tolerant of unreadable paths: a track_files glob that sweeps up a directory named like a Ruby file or a permission-denied entry now treats it as empty instead of crashing the merge or report step. Resultset files truncated to a single byte now warn like other corruption instead of reading as quietly empty, a hand-edited .last_run.json with a non-numeric percentage no longer raises out of the at_exit hook, and the missing-group notice respects print_errors and survives -W0 like every other enforcement message.
  • coverage :eval, minimum: 100 now explains that thresholds are unsupported for :eval instead of claiming the criterion itself is invalid, and simplecov clean --dry-run counts dotfiles such as .resultset.json in its entry count.
  • Source files containing invalid UTF-8 bytes no longer crash report generation. A file with no encoding magic comment is read as UTF-8, and a stray high-bit byte (a Latin-1 comment, say) previously raised ArgumentError: invalid byte sequence in UTF-8 from the first regex that touched the line — the shebang check or the lines classifier — taking the whole report down. Invalid bytes are now replaced with the Unicode replacement character at load time, so every line leaves the source loader as valid UTF-8 and the rest of the pipeline (classification, JSON embedding, the HTML viewer payload) works from sanitized text.
  • Generated coverage artifacts now share one collision-safe atomic writer. Concurrent threads no longer reuse the same process-ID temporary name, and the JSON formatter and simplecov merge no longer expose partially written documents to readers; existing Unix permission bits and each artifact's historical byte format are preserved.
  • Configuration blocks no longer install temporary method_missing hooks on their caller or copy caller instance variables into SimpleCov. Those hooks leaked DSL commands across threads, broke overlapping and nested evaluations, rejected frozen or immediate-value owners, changed require_relative and binding behavior, and could mask an original exception during cleanup. See the parameterized-block migration under Breaking Changes.
  • Non-final parallel workers now stop after storing their own result instead of reading and caching a partial merge. A single ownership predicate selects the adapter's final process for merging, formatting, threshold checks, and .last_run.json; explicit SimpleCov.collate remains authoritative regardless of worker identity.
  • simplecov serve now builds a missing index.html from coverage.json and fails before binding when neither artifact exists or the JSON is invalid. An existing self-contained report remains usable even if its optional sidecar JSON was later removed or damaged.
  • Coverage JSON consumers now reject malformed syntax, invalid UTF-8, and non-object roots through one shared parser. HTMLFormatter#format_from_json also validates the viewer's required metadata, coverage flags, enabled totals, groups, and source arrays before creating or replacing its output.
  • HTML reports now render correctly when line coverage is disabled. Branch-only and method-only runs use their configured primary criterion for tabs, color bands, sorting, tables, filters, and source summaries instead of crashing while dereferencing absent line statistics.
  • HTML reports now disambiguate source files whose truncated SHA-1 identifiers collide. Existing fragments stay unchanged for non-colliding files, while colliding links receive deterministic suffixes and always open the intended source.
  • SimpleFormatter now prints each file's configured primary coverage percentage instead of always printing line coverage. Branch-, method-, and oneshot-primary reports now match the documented primary-criterion behavior; oneshot coverage correctly reads the normalized line statistics.
  • Frontend builds now use the esbuild binary installed from html_frontend/bun.lock instead of whichever global version happens to be on PATH. CI recompiles the self-contained HTML template and fails on a diff, preventing dependency updates or source changes from leaving the checked-in report asset stale.
  • Frontend asset compilation now fails when esbuild rejects the CSS. The rake helper previously ignored the minifier subprocess's exit status and continued with empty output, allowing a successful build to replace the checked-in report template with a stylesheet-free page.
  • Read-only CLI commands now handle unreadable, malformed, and structurally unusable coverage.json inputs consistently. coverage, report, uncovered, and both inputs to diff return status 1 with one command-specific diagnostic instead of raising a JSON parser backtrace; uncovered no longer mislabels its input errors as simplecov report.
  • Sorting one HTML report group no longer corrupts the next group's first sort. Every table previously shared the same fallback sort-state key because the tables have no ids, so clicking a column already selected in another group reversed unsorted rows while displaying an ascending indicator; sort state is now scoped to each table element.
  • The HTML report now gives the overall file list and configured groups distinct typed identities, so a user-defined group named All Files no longer shares the overall section's DOM id and tab target. Both identically labelled tabs now remain present and open their own file lists.
  • HTML group tabs now remain distinct when one group name contains punctuation and another contains that character's hexadecimal escape spelling (for example, By/group and By_2f_group). Literal underscores are now escaped because underscores delimit encoded characters; previously both names produced the same DOM id and one tab opened the wrong file list.
  • Enabling ordinary line coverage after oneshot-line coverage no longer passes both incompatible modes to Ruby's Coverage.start, which raised RuntimeError: cannot enable lines and oneshot_lines simultaneously. The two modes now replace each other in either direction, with the last request winning, and replacing the active primary criterion resets it to an enabled default.
  • Branch and method tuples are no longer synthesized for code the compiler eliminates. 1.0.2 stopped synthesizing a branch for a constant-folded condition itself (if false, if true, a ternary on a literal), but everything nested inside the dead arm was still visited, so an if false ... end block containing conditionals or method definitions — a common way to disable code — gave a tracked-but-unloaded file tuples Ruby's Coverage never emits: phantom, permanently-missed branches and phantom uncovered methods, the same unmergeable-tuple failure mode as #1226 / #1233. The extractor now descends only into the arm the compiler keeps, so a dead arm's entire subtree (nested conditionals, loops, safe navigation, and defs alike) emits nothing, while the live arm's contents — and the surviving elsif chain of a falsy if — are tracked exactly as Coverage tracks them. The folding table also gains the three literals it was missing: __LINE__, __ENCODING__, and a stabby lambda (->) fold as conditions too, while their lookalikes __FILE__ and a lambda call do not and are still tracked. And the fold's paren transparency now matches the compiler's, which is not universal: if (1) folds like if 1, but (nil), ("x"), and (-> {}) keep their real branch the moment parentheses wrap them (for the string, this mismatch predates these changes).
  • A merged report no longer shows 100% branch and method coverage for a tracked file that no process ever loaded. SourceFile::Statistics reports 0% rather than a misleading 100% when a never-loaded file has no branch or method data at all (#902), but that rule keys off a loaded: flag that only the single-process path ever set: ResultMerger.create_result built its Result without not_loaded_files, so every file in a merged report claimed to have been loaded and the rule could never fire there. The flag isn't serialized into .resultset.json (Result#to_hash writes only coverage and a timestamp), so the merged result now re-derives it from the merged line counts, using the same "did any line execute" signal Combine::FilesCombiner already reconciles on. In practice this surfaced on files with no branches at all, such as a constants file picked up by a cover glob, since #1059's synthesized tuples already produce 0% for anything containing a conditional. Anything a process did load is unaffected, including under a branch-only or method-only configuration: Coverage reports no line data there, so a simulated file omits it too and the merged report flags nothing rather than mistaking every loaded file for an unloaded one. A file is judged only when it has at least one relevant line, so a loaded file with no executable lines at all (a comment-only constants stub, say) keeps its usual statistics rather than being mistaken for never-loaded — a simulated file carries a 0 on every relevant line, so genuinely unloaded files are still flagged. Reported with an exemplary diagnosis by @​andriytyurnikov. See #1250.
  • SimpleCov.command_name is no longer decided by an incidental substring of the path to the Ruby interpreter. CommandGuesser matches its framework patterns against "#{$PROGRAM_NAME} #{ARGV.join(' ')}", and those patterns were bare substrings, so a test/ anywhere in that string won. A Ruby installed under a latest/bin directory (the layout mise creates alongside the versioned one) put test/ in the path of every binary run through it, and because test/ is checked before spec/, RSpec and Cucumber suites alike were labelled Unit Tests. The same flaw applied inside the arguments, where rspec spec/greatest/foo_spec.rb was mislabelled for the same reason. The patterns now match only at a path segment boundary, so latest/, contest/, and greatest/ no longer read as test/. Because the command name is the resultset key under merging, a mislabelled suite was filed under the wrong key, letting two different suites merge into each other rather than failing loudly. Reported with an exemplary diagnosis by @​andriytyurnikov. See #1249.
  • The invoked executable is now consulted before the path patterns, so an rspec or cucumber binary names the framework regardless of what surrounds it on the command line. This is what keeps rspec features reporting as RSpec rather than as Cucumber: an RSpec suite whose examples live in features/ is still an RSpec suite, and previously that case only worked by accident, because the old unanchored spec pattern matched the letters inside the word rspec. Generic runners are deliberately not in the table, so ruby test/integration/foo_test.rb and rake's test loader still fall through to the path patterns that draw the unit, functional, and integration distinction. The executable is read from $PROGRAM_NAME, which is now recorded separately from the flattened command as CommandGuesser.original_program_name, because the space that joins it to ARGV makes a program path containing one (/opt/My Ruby/bin/rspec) impossible to recover afterwards.

... (truncated)

Commits
  • b946d8a Bump version to 1.1.0
  • 211b408 Repeat the mode toggles in the source file view
  • 04cb1b8 Address review: dark toggle role and print palette
  • fa08213 Add a colorblind-friendly mode and non-color coverage symbols
  • 0a7d740 Restructure the documentation around a trimmed README
  • 2700360 Make the clobber-prevention backstop see failed child reports
  • 48fd412 Clarify the eval threshold error and two stale comments
  • 3f16339 Route cover filters through Filter.build_filter
  • 8d19b4b Share the interned count-merge loop between combiners
  • d73c758 Extract a shared base class for the exit-code checks
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [simplecov](https://github.com/simplecov-ruby/simplecov) from 1.0.3 to 1.1.0.
- [Release notes](https://github.com/simplecov-ruby/simplecov/releases)
- [Changelog](https://github.com/simplecov-ruby/simplecov/blob/main/docs/Changelog.md)
- [Commits](simplecov-ruby/simplecov@v1.0.3...v1.1.0)

---
updated-dependencies:
- dependency-name: simplecov
  dependency-version: 1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file ruby Pull requests that update ruby code labels Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file ruby Pull requests that update ruby code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant