1.0.0.rc1 (2026-06-02)
Breaking Changes
- JSON formatter: group stats changed from
{ "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. - JSON formatter:
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/`).- Removed
docilegem dependency. TheSimpleCov.configureblock is now evaluated viainstance_execwith instance variable proxying. - Removed automatic activation of
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. - SimpleCov.start now loads the
test_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. - HTML and JSON formatters now write the "Coverage report generated for X to Y" status line (and the per-criterion totals beneath it) to stderr instead of stdout. The message is a diagnostic, not the program's output, and routing it to stdout polluted pipelines like
rspec -f json. Suppress it entirely withsilent: trueon the formatter; redirect with2>&1if you want the old behavior. See #1060. - Under
parallel_tests,SimpleCovnow 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. - Removed
SimpleCov.coverage_criterion. It was a reader/writer for a value nothing inSimpleCovever consumed, so it duplicatedprimary_coveragewithout affecting any behavior. Useprimary_coverageto choose the report's leading criterion (or thecoverage <code>:branch</code>, primary: trueform).
Deprecations
- The configuration API has been redesigned around a smaller, more consistent set of verbs. The legacy methods continue to work but each emits a deprecation warning that names its replacement; a future release will remove them. See the "Migrating from the legacy configuration API" section in the README for the full migration table and a before/after example.
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)
- Calling SimpleCov.start from
.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 explicit SimpleCov.start from a test helper. The migration goes hand-in-hand with the bugfix below: once SimpleCov.start lives 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_percent and
#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.- Added the criterion-first
coverageconfiguration method — a uniform way to configure each coverage criterion (:line,:branch,:method) in one place.coverage <code>:line</code> do minimum 90; minimum_per_file 80; maximum_drop 5 end(or the one-linercoverage <code>:branch</code>, 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. - JSON formatter:
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. - Added
::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, whereMyAdaptersubclasses::SimpleCov::ParallelAdapters::Baseand overrides the four contract methods (active?,first_worker?,wait_for_siblings,expected_worker_count). See #1065. - Added
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. - Added
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 that SimpleCov.start installs (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 final SimpleCov.collate step needs a report — every other worker just drops its.resultset.jsonand exits without paying for HTML or multi-formatter output. See #964.- Setting
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.SimpleCovnow 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.- Added
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. - Added a bundled
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.- The "Coverage report generated for X to Y" status line now prints the report path relative to the current working directory when it lives under cwd, and includes the entry-point filename —
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. - Added
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.start now raises::SimpleCov::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. - Added
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 by SimpleCov.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. - Terminal output is now colorized when stderr is a TTY: coverage percentages in the formatter summary line and threshold-violation messages are rendered green (>= 90%), yellow (>= 75%), or red (< 75%) — matching the HTML report's thresholds. The "SimpleCov failed with exit N…" line is red and the "Stopped processing SimpleCov…" line is yellow. Respects
NO_COLOR(force off, per no-color.org) andFORCE_COLOR(force on);NO_COLORwins if both are set. See #1157. - CLI subcommands
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. - Added
# 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. - Added
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. - JSON formatter:
meta.timestampis now emitted with millisecond precision (iso8601(3)) so the concurrent-overwrite warning can distinguish writes within the same wall-clock second - JSON formatter: added
totalsection 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) - JSON formatter: per-file output now includes
total_lines,lines_covered_percent, and when enabled:branches_covered_percent,methodsarray, andmethods_covered_percent - JSON formatter: group stats now include full statistics for all enabled coverage types, not just line coverage percent
- JSON formatter: added
silent:keyword toJSONFormatter.newto suppress console output - Merged
simplecov-htmlformatter into the main gem. A backward-compatibility shim ensuresrequire "simplecov-html"still works. - Merged
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.new is roughly 7× faster for already-string-keyed input (the SimpleCov.collate hot path). The previous implementation deep-cloned each file's coverage data with
JSON.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.
Bugfixes
- Added
: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 <code>:foo</code>, 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. - Files added via
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 theSimpleCovHTML report). Branches and methods are now enumerated statically via::SimpleCov::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. - HTML report: two groups whose names share an alphanumeric suffix but differ only in a leading non-letter (e.g.
">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. - HTML report: filenames containing
"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). - HTML report: files with literally 0% branch or method coverage now display 0% instead of 100%. The per-file row rendering used
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 is SimpleCov.collate invoked 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.- Files added via
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. - Fix the parent-process / subprocess race where a Rakefile (or Rails
Bundler.require) caused.simplecovto auto-load SimpleCov.start in 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_behavior defers entirely when our merged result is empty andcoverage/.last_run.jsonis fresher than this process. See #581. - Don't report misleading 100% branch/method coverage for files added via
track_filesthat were never loaded. See #902 - Fix HTML formatter tab bar layout: dark mode toggle no longer wraps onto two lines, and tabs connect seamlessly with the content panel
- Allow
SimpleCov.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. - When SimpleCov.start runs after
require "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 meantSimpleCovformatted a 0% report beforeMinitestran. The opposite ordering (SimpleCov first) is still handled bylib/minitest/simplecov_plugin.rb. See #1032, #1099, and #1112.
0.22.1 (2024-09-02)
Enhancements
- You can now define
minimum_coverage_by_group- See https://github.com/simplecov-ruby/simplecov/pull/1105. Thanks @mikhliuk-k! minimum_coverage_by_fileprints the name of the violating file. - @philipritchey
0.22.0 (2022-12-23)
Enhancements
- On Ruby 3.2+, you can now use the new Coverage library feature for
eval- See https://github.com/simplecov-ruby/simplecov/pull/1037. Thanks @mame!
Bugfixes
- Fix for making the test suite pass against the upcoming Ruby 3.2 - See https://github.com/simplecov-ruby/simplecov/pull/1035. Thanks @mame
0.21.2 (2021-01-09)
Bugfixes
maximum_coverage_dropwon't fail any more if.last_run.jsonis still in the old format. Thanks @petertellgrenmaximum_coverage_dropwon't fail if an expectation is specified for a previous unrecorded criterion, it will just pass (there's nothing, so nothing to drop)- fixed bug in
maximum_coverage_dropcalculation that could falsely report it had dropped for minimal differences
0.21.1 (2021-01-04)
Bugfixes
minimum_coverage_by_fileworks again as expected (errored out before 😱)
0.21.0 (2021-01-03)
The "Collate++" release making it more viable for big CI setups by limiting memory consumption. Also includes some nice new additions for branch coverage settings.
Enhancements
- Performance of SimpleCov.collate improved - it should both run faster and consume much less memory esp. when run with many files (memory consumption should not increase with number of files any more)
- Can now define the minimum_coverage_by_file, maximum_coverage_drop and refuse_coverage_drop by branch as well as line coverage. Thanks to @jemmaissroff
- Can set primary coverage to something other than line by setting
primary_coverage :branchinSimpleCovConfiguration. Thanks to @jemmaissroff
Misc
- reduce gem size by splitting Changelog into
Changelog.mdand a pre 0.18Changelog.old.md, the latter of which is not included in the gem - The interface of
ResultMeger.merge_and_storeis changed to support thecollateperformance improvements mentioned above. It's not considered an official API, hence this is not in the breaking section. For people using it to merge results from different machines, it's recommended to migrate to collate.
0.20.0 (2020-11-29)
The "JSON formatter" release. Starting now a JSON formatter is included by default in the release. This is mostly done for Code Climate reasons, you can find more details in this issue.
Shipping with so much by default is sub-optimal, we know. It's the long term plan to also provide simplecov-core without the HTML or JSON formatters for those who don't need them/for other formatters to rely on.
Enhancements
simplecov_json_formatterincluded by default (docs), this should enable the Code Climate test reporter to work again once it's updated- invalidate internal cache after switching
SimpleCov.root, should help with some bugs
0.19.1 (2020-10-25)
Bugfixes
- No more warnings triggered by
enable_for_subprocesses. Thanks to @mame - Avoid trying to patch
Process.forkwhen it isn't available. Thanks to @MSP-Greg
0.19.0 (2020-08-16)
Breaking Changes
- Dropped support for Ruby 2.4, it reached EOL
Enhancements
- observe forked processes (enable with
SimpleCov.enable_for_subprocesses). See #881, thanks to @robotdana SimpleCovdistinguishes better that it stopped processing because of a previous error vs.SimpleCovis the originator of said error due to coverage requirements.
Bugfixes
- Changing the
SimpleCov.rootcombined with the root filtering didn't work. Now they do! Thanks to @deivid-rodriguez and see #894 - in parallel test execution it could happen that the last coverage result was written to disk when it didn't complete yet, changed to only write it once it's the final result
- if you run parallel tests only the final process will report violations of the configured test coverage, not all previous processes
- changed the parallel_tests merging mechanisms to do the waiting always in the last process, should reduce race conditions
Noteworthy
- The repo has moved to https://github.com/simplecov-ruby/simplecov - everything stays the same, redirects should work but you might wanna update anyhow
- The primary development branch is now
main, notmasteranymore. If you get simplecov directly from github change your reference. For a whilemasterwill still be occasionally updated but that's no long term solion.
0.18.5 (2020-02-25)
Can you guess? Another bugfix release!
Bugfixes
- minitest won't crash if
SimpleCovisn't loaded - aka don't executeSimpleCovcode in the minitest plugin ifSimpleCovisn't loaded. Thanks to @edariedl for the report of the peculiar problem in #877.
0.18.4 (2020-02-24)
Another small bugfix release 🙈 Fixes SimpleCov running with rspec-rails, which was broken due to our fixed minitest integration.
Bugfixes
SimpleCovwill run again correctly when used with rspec-rails. The excellent bug report #873 by @odlp perfectly details what went wrong. Thanks to @adam12 for the fix #874.
0.18.3 (2020-02-23)
Small bugfix release. It's especially recommended to upgrade simplecov-html as well because of bugs in the 0.12.0 release.
Bugfixes
- Fix a regression related to file encodings as special characters were missing. Furthermore we now respect the magic
# encoding: ...comment and read files in the right encoding. Thanks (@Tietew) - see #866 - Use
Minitest.after_runhook to trigger post-run hooks ifMinitestis present. See #756 and #855 thanks (@adam12)
0.18.2 (2020-02-12)
Small release just to allow you to use the new simplecov-html.
Enhancements
- Relax simplecov-html requirement so that you're able to use [0.12.0]#0120-2020-02-12)
0.18.1 (2020-01-31)
Small Bugfix release.
Bugfixes
- Just putting
# :nocov:on top of a file or having an uneven number of them in general works again and acts as if ignoring until the end of the file. See #846 and thanks @DannyBen for the report.
0.18.0 (2020-01-28)
Huge release! Highlights are support for branch coverage (Ruby 2.5+) and dropping support for EOL'ed Ruby versions (< 2.4). Please also read the other beta patch notes.
You can run with branch coverage by putting enable_coverage :branch into your SimpleCov configuration (like the SimpleCov.start do .. end block)
Enhancements
- You can now define the minimum expected coverage by criterion like
minimum_coverage line: 90, branch: 80 - Memoized some internal data structures that didn't change to reduce
SimpleCovoverhead - Both
FileListandSourceFilenow have acoveragemethod that returns a hash that points from a coverage criterion to aCoverageStatisticsobject for uniform access to overall coverage statistics for both line and branch coverage
Bugfixes
- we were losing precision by rounding the covered strength early, that has been removed. For Formatters this also means that you may need to round it yourself now.
- Removed an inconsistency in how we treat skipped vs. irrelevant lines (see #565) - SimpleCov's definition of 100% is now "You covered everything that you could" so if coverage is 0/0 that's counted as a 100% no matter if the lines were irrelevant or ignored/skipped
Noteworthy
FileListstopped inheriting from Array, it includes Enumerable so if you didn't use Array specific methods on it in formatters you should be fine- We needed to change an internal file format, which we use for merging across processes, to accommodate branch coverage. Sadly CodeClimate chose to use this file to report test coverage. Until a resolution is found the code climate test reporter won't work with
SimpleCovfor 0.18+, see this issue on the test reporter.
0.18.0.beta3 (2020-01-20)
Enhancements
- Instead of ignoring old
.resultset.jsons that are inside the merge timeout, adapt and respect them
Bugfixes
- Remove the constant warning printing if you still have a
.resultset.jsonin pre 0.18 layout that is within your merge timeout
0.18.0.beta2 (2020-01-19)
Enhancements
- only turn on the requested coverage criteria (when activating branch coverage before
SimpleCovwould also instruct Ruby to take Method coverage) - Change how branch coverage is displayed, now it's
branch_type: hit_countwhich should be more self explanatory. See #830 for an example and feel free to give feedback! - Allow early running exit tasks and avoid the
at_exithook through the SimpleCov.run_exit_tasks! method. (thanks @macumber) - Allow manual collation of result sets through the SimpleCov.collate entrypoint. See the README for more details (thanks @ticky)
- Within
case, even if there is noelsebranch declared show missing coverage for it (aka no branch of it). See #825 - Stop symbolizing all keys when loading cache (should lead to be faster and consume less memory)
- Cache whether we can use/are using branch coverage (should be slightly faster)
Bugfixes
- Fix a crash that happened when an old version of our internal cache file
.resultset.jsonwas still present
0.18.0.beta1 (2020-01-05)
This is a huge release highlighted by changing our support for ruby versions to 2.4+ (so things that aren't EOL'ed) and finally adding branch coverage support!
This release is still beta because we'd love for you to test out branch coverage and get your feedback before doing a full release.
On a personal note from @PragTob thanks to ruby together for sponsoring this work on SimpleCov making it possible to deliver this and subsequent releases.
Breaking
- Dropped support for all EOL'ed rubies meaning we only support 2.4+. Simplecov can no longer be installed on older rubies, but older simplecov releases should still work. (thanks @deivid-rodriguez)
- Dropped the
rake simplecovtask that "magically" integreated with rails. It was always undocumented, caused some issues and had some issues. Use the integration as described in the README please :)
Enhancements
- Branch coverage is here! Please try it out and test it! You can activate it with
enable_coverage :branch. See the README for more details. This is thanks to a bunch of people most notably @som4ik, @tycooon, @stepozer, @klyonrad and your humble maintainers also contributed ;) - If the minimum coverage is set to be greater than 100, a warning will be shown. See #737 (thanks @belfazt)
- Add a configuration option to disable the printing of non-successful exit statuses. See #747 (thanks @JacobEvelyn)
- Calculating 100% coverage is now stricter, so 100% means 100%. See #680 thanks @gleseur
Bugfixes
- Add new instance of
Minitestconstant. TheMiniTestconstant (with the capital T) will be removed in the next major release ofMinitest. See #757 (thanks @adam12)
Older Changelogs
Looking for older changelogs? Please check the [old Changelog])