Bump simplecov from 1.0.3 to 1.1.1 in /ruby in the ruby-deps group
Merged
DE
2mo ago+2+2+0123456789-2-2-0123456789
Bumps the ruby-deps group in /ruby with 1 update: simplecov.
Updates simplecov from 1.0.3 to 1.1.1
Release notes
Sourced from simplecov's releases.
v1.1.1
What's Changed
- Bump step-security/harden-runner from 2.20.0 to 2.20.1 by
@dependabot[bot] in simplecov-ruby/simplecov#1258- rspec-conductor Support by
@sferikin simplecov-ruby/simplecov#1259Full Changelog: https://github.com/simplecov-ruby/simplecov/compare/v1.1.0...v1.1.1
v1.1.0
What's Changed
- Bump actions/checkout from 7.0.0 to 7.0.1 by
@dependabot[bot] in simplecov-ruby/simplecov#1243- Bump ruby/setup-ruby from 1.318.0 to 1.320.0 by
@dependabot[bot] in simplecov-ruby/simplecov#1242- Improve collate performance by
@danielwestendorfin simplecov-ruby/simplecov#1244- Bump ruby/setup-ruby from 1.320.0 to 1.321.0 by
@dependabot[bot] in simplecov-ruby/simplecov#1247- Make the HTML report a single self-contained index.html by
@sferikin simplecov-ruby/simplecov#1245- Cut unloaded-file injection cost, fix 100% coverage in merged reports by
@sferikin simplecov-ruby/simplecov#1252- Stop matching the :nocov: regex twice on every classified line by
@andriytyurnikovin simplecov-ruby/simplecov#1253- Absorb resultsets into one accumulator instead of folding pairwise by
@andriytyurnikovin simplecov-ruby/simplecov#1254- Inject unloaded files once at the merge point, not once per process by
@sferikin simplecov-ruby/simplecov#1255- Fix CommandGuesser mislabelling suites from incidental path substrings by
@sferikin simplecov-ruby/simplecov#1251- Speed up SimpleCov.collate with optional multi-process merge by
@danielwestendorfin simplecov-ruby/simplecov#1246- Keep branch and method data the resultsets carried by
@sferikin simplecov-ruby/simplecov#1256- Colorblind mode by
@sferikin simplecov-ruby/simplecov#1257New Contributors
@danielwestendorfmade their first contribution in simplecov-ruby/simplecov#1244@andriytyurnikovmade their first contribution in simplecov-ruby/simplecov#1253Full Changelog: https://github.com/simplecov-ruby/simplecov/compare/v1.0.3...v1.1.0
Changelog
Sourced from simplecov's changelog.
1.1.1 (2026-08-12)
Enhancements
- The HTML report remembers how a file list was sorted. The selected column and direction persist in localStorage across the All Files and group tables, so reloading a report restores the order it was left in. The preference stores semantic column keys rather than numeric positions, so a report whose enabled criteria differ from the report that stored it falls back to the primary coverage sort instead of sorting by whatever column now happens to sit in that position. Equal values break by filename so the restored order matches the clicked order exactly, and the covered and total columns now sort by their numeric value rather than their comma-grouped digits, which used to rank 1,250 below 999.
- The report's top bar is now a proper tab strip. Every group tab is outlined, so an unselected group reads as a tab rather than as loose text floating above the panel, while the selected one fills with the panel's own colour and drops its bottom border to merge into it. The colorblind and theme toggles stay unfilled, which keeps the filled shapes in the bar meaningful: the selected tab, and a toggle that is switched on. With more groups than fit, the strip scrolls and both ends fade instead of guillotining whichever tab straddles an edge.
- The source file view was polished to match. The colorblind and theme controls sit at the same viewport coordinates as the index toolbar, with the scrollbar gutter reserved so opening the dialog cannot slide them sideways. Each legend key shares a row with its line, branch, or method summary, and the generated-at footer is repeated at the bottom of the source dialog. On paper the header returns to document flow, where the toggles and close button are hidden and the legend reads better at full width.
- The source view no longer prints a coverage glyph in a left gutter on every line, and the legend swatches are plain chips of the colours the source view paints rather than a key to a symbol set. The glyphs stated each line's status without relying on colour, but they read as noise down the left edge of every file. Line numbers keep their per-status background, and the Colorblind toggle does the accessibility work on its own by swapping covered and missed for blue versus orange, the pairing red/green vision cannot separate.
- The packaged gem no longer ships the
schemas/directory, dropping 32 KB unpacked from every install. Nothing read it at runtime: the JSON formatter points consumers at the canonical schema URL on GitHub, and the schema specs read from the repository.Bugfixes
- Coverage checks no longer get skipped under runners that close a worker's output streams before its
at_exithooks run. rspec-conductor closes each worker's pipes as soon as the worker has sent its run summary, and emitting SimpleCov's status line probesColor.enabled?, whoseIO#tty?call raisedIOErroron the closed stream. That exception aborted the remaining exit tasks, so the HTML and JSON reports were written but the minimum and maximum coverage checks silently never ran, and neither.last_run.jsonnor the.report_stampdeferral marker was written. A closed stream now counts as not a tty, and the status line and the violation report are dropped rather than cancelling the checks that follow. rspec-conductor is also named in the parallel adapter documentation and covered end to end now, since it follows theTEST_ENV_NUMBERandPARALLEL_TEST_GROUPSconvention the generic adapter already recognizes. See #1156.SimpleCov.collateno longer depends on load order forCoverage.line_stub.SimulateCoverageandResultAdapterboth call it without requiring the coverage library. A normal run loads that library while starting tracking, but a collate-only process never starts tracking, so the constant resolved only by luck through a criterion-support check that happened to run first. Any reordering of that path would have turned into aNameErrorout ofSimpleCov.collate, so each file now requires what it uses.1.1.0 (2026-08-10)
Breaking Changes
simplecov report --jsonnow 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 namedAll Files; the text report now labels that user sectionAll Files (group)as well.Ungroupedis 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 toOtheror another distinct label. Group names are also normalized when configured: aSymbolname (group :Models) now means the same group as itsStringspelling (sogroup :Ungroupedis 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 aStringnor aSymbolraisesSimpleCov::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), socoverage/contains justindex.htmlandcoverage.json. A single file can be mailed, uploaded as a non-zipped GitHub Actions run artifact (actions/upload-artifactwitharchive: 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 whereindex.html,coverage_data.js, andapplication.jscome 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 readcoverage.json(the sanctioned data artifact, unchanged) instead ofcoverage_data.js. Formatting also deletes those six names from the output directory when an earlier version left them there, so an upgraded project'scoverage/doesn't keep a stalecoverage_data.jsaround forsimplecov serveto serve. This restores single-file reports to the 1.0 line — the pre-1.0simplecov-htmlformatter offered them via theSIMPLECOV_INLINE_ASSETSenvironment 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. 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. Both toggles report state via
aria-pressed.simplecov servenow 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 atdocs/Changelog.mdand the gem'schangelog_urimetadata follows it. Nothing underdocs/ships in the gem, which also stops packaging the olddoc/*link lists. The alternate formatters catalog was rebuilt against RubyGems: twenty formatters join the twelve that were listed, organized by output type..resultset.jsonis 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 throughjqif 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.collatetakes a newprocesses: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 defaultprocesses: 1and 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 newSimpleCov::ParallelResultMerger, whoseabsorb_resultsmirrorsResultMerger.absorb_results, splitting that fold across workers and unioning the tracked paths each one saw.processesdefaults to theSIMPLECOV_CONCURRENCYenvironment 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 existingcollatecalls 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. Abenchmarks/collate.rbharness (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.jsoncarry 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.greetrecords 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, raisingArgumentErrorout 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 acoverage/.report_stampmarker no matter how the run ends, and the backstop accepts either file as evidence of a fresher report.- A
# simplecov:disable lineblock 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 reasonsparsed as categorylinewith 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 :Modelsnormalizes the name to a String butminimum_per_group 95, only: :Models(and the deprecatedminimum_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 diffmatches its documentation:--threshold Nis 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 realCoverageoutput on every supported Ruby.require "simplecov"no longer raises whenHOMEis set but empty, as some container and CI images do. The global-config loader treats an emptyHOMElike an unset one.simplecov merge,report, andcoverageprint one-line errors instead of backtraces on more bad inputs: a directory or unreadable file passed tomerge, valid JSON whosetotalorgroupshas the wrong type, and a per-file entry that is not an object.- An empty or non-numeric
PARALLEL_TEST_GROUPSno 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_filesglob 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.jsonwith a non-numeric percentage no longer raises out of the at_exit hook, and the missing-group notice respectsprint_errorsand survives-W0like every other enforcement message.coverage :eval, minimum: 100now explains that thresholds are unsupported for:evalinstead of claiming the criterion itself is invalid, andsimplecov clean --dry-runcounts dotfiles such as.resultset.jsonin 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-8from 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 mergeno 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_missinghooks 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, changedrequire_relativeand 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; explicitSimpleCov.collateremains authoritative regardless of worker identity.simplecov servenow builds a missingindex.htmlfromcoverage.jsonand 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_jsonalso validates the viewer's required metadata, coverage flags, enabled totals, groups, and source arrays before creating or replacing its output.
... (truncated)
Commits
76a8e4eBump version to 1.1.1e1bf502Refresh the report screenshotsf33e0bfDrop the coverage glyphs from the source view and its legend2673f9aLet the tab strip own the report's top barc6ef10bReport a sandbox command timeout instead of its teardown0675978Keep the conductor's merged report from hinging on runner luck560fae5Exercise Rails' built-in Minitest integrationab66677Remember the file-list sort order6640c1ePolish the source file viewe9ba8c3Build a Rails-style screenshot coverage fixture- Additional commits viewable in compare view
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 rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore <dependency name> major versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)@dependabot ignore <dependency name> minor versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)@dependabot ignore <dependency name>will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)@dependabot unignore <dependency name>will remove all of the ignore conditions of the specified dependency@dependabot unignore <dependency name> <ignore condition>will remove the ignore condition of the specified dependency and ignore conditions
Summary by cubic
Bumps simplecov from 1.0.3 to 1.1.1 in the ruby-deps group. This minor release includes breaking changes to report output and configuration.
Breaking changes
- The JSON report now nests overall totals and groups instead of flattening them, and the HTML report is a single self-contained
index.html; the old sibling files are gone. - The
Ungroupedgroup name is reserved, and configuration blocks no longer installmethod_missinghooks, so any DSL commands in them need to be parameterized.