π turbo_tests2 / TurboTests
if ci_badges.map(&:color).detect { it != "green"} βοΈ let me know on Discord or RubyForum, as I may have missed the notification.
if ci_badges.map(&:color).all? { it == "green"} ποΈ send money so I can do more of this. FLOSS maintenance is now my full-time job.
I've summarized my thoughts in this blog post.
| Hard Fork Note |
|---|
I (@pboling) discussed merging this project back into the original turbo_tests with @ilyazub, and we might move in that direction, but it will take time. Since I need this now I'm releasing it as a separate gem/project. We'll be discussing potentially unifying the projects again soon. |
turbo_tests2 is an RSpec parallel test runner. It uses runtime_groups for process counts, pid bookkeeping, file grouping, and runtime balancing, then replaces interleaved worker output with incremental summarized RSpec reporting. Source code of this gem is based on Discourse and RubyGems work in this area. As of v4.0.0 the parallel_tests dependency is gone; the CLI keeps compatibility with the parallel_tests grouping surface documented below.
The project namespace remains TurboTests; the published gem and executable are turbo_tests2.
Incremental summarized output doesn't fit the vision of the parallel_tests author, and RSpec doesn't support built-in parallel testing yet. This gem targets RSpec, not every framework supported by parallel_tests, and may not be useful once one of the issues above is implemented.
Runtime and Platform Support
Support tiers describe what this project's CI actually exercises, not what may work in an untested environment:
- Parallel support: CI runs the test suite with multiple workers available.
- Single-worker support: CI runs the suite with one worker; parallel runner behavior is not validated for that combination.
- Unsupported: the engine/platform combination is not covered by CI and is not a project compatibility claim.
| Ruby engine/version | Linux | macOS | Windows | Notes |
|---|---|---|---|---|
| MRI 2.4-3.4 | Parallel support | Unsupported | Unsupported | Versioned Ruby workflows run on Linux. |
| MRI current | Parallel support | Parallel support | Parallel support | Current Ruby workflow covers all three platforms. |
| MRI head | Parallel support | Unsupported | Unsupported | CI is allowed to fail while Ruby is in development. |
| JRuby 9.2-9.4 | Parallel support | Unsupported | Unsupported | Versioned JRuby workflows run on Linux. |
| JRuby 10.0/current/head | Parallel support | Unsupported | Unsupported | Experimental/current and head jobs are non-blocking in CI. |
| TruffleRuby 23.1 | Parallel support | Unsupported | Unsupported | Experimental. |
| TruffleRuby 24.2/25.0/33.0/current | Parallel support | Unsupported | Unsupported | Linux workflows run the suite with parallel workers. |
The Windows current-Ruby job runs in parallel, but runtime-log recording is
disabled there because the runtime logger needs file locking that Windows does
not provide reliably (record_runtime = !Gem.win_platform?); see below.
TruffleRuby 22.3, 23.0 and TruffleRuby-head are not listed because no workflow
covers them. heads.yml runs ruby-head and jruby-head only, and
dep-heads.yml runs the released truffleruby engine against head-of-branch
dependencies, which is not a head engine build.
Why incremental output?
parallel_tests is great, but parallel RSpec output is hard to read:
$ bundle exec rake parallel_tests:spec[^spec/search]
.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Finished in 1 minute 6.92 seconds (files took 6.95 seconds to load)
2616 examples, 0 failures
.........................................................................................................................................F........................................................................................................................................F..............................................................................................................................................................................................................................................................................................
Finished in 1 minute 35.05 seconds (files took 6.26 seconds to load)
2158 examples, 2 failures
.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Finished in 1 minute 35.05 seconds (files took 6.26 seconds to load)
2158 examples, 0 failuresturbo_tests2 output looks like regular rspec:
$ bundle exec turbo_tests2
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................F........................................................................................................................................F..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Finished in 2 minute 25.15 seconds (files took 0 seconds to load)
6873 examples, 2 failuresπ‘ Info you can shake a stick at
| Tokens to Remember |
|
|---|---|
| Works with JRuby |
|
| Works with Truffle Ruby |
|
| Works with MRI Ruby 4 |
|
| Works with MRI Ruby 3 |
|
| Works with MRI Ruby 2 |
|
| Support & Community |
|
| Source |
|
| Documentation |
|
| Compliance |
|
| Style |
|
| Maintainer ποΈ |
|
... π |
|
Compatibility
Compatible with MRI Ruby 2.4.0+, JRuby, and TruffleRuby.
CI workflows and Appraisals are generated for MRI Ruby 2.4+.
This test floor is configured by ruby.test_minimum in .kettle-jem.yml and
may be higher than the gem's runtime compatibility floor when legacy Rubies are
not practical for the current toolchain.
The amazing test matrix is powered by the kettle-dev stack.
| Gem | Source | Role | Total downloads |
|---|---|---|---|
| appraisal2 | GitHub | multi-dependency Appraisal matrix generation | |
| appraisal2-rubocop | GitHub | RuboCop Appraisal generator integration | |
| kettle-dev | GitHub | development, release, and CI workflow tooling | |
| kettle-jem | GitHub | Appraisals & CI workflow templates | |
| kettle-soup-cover | GitHub | SimpleCov coverage policy and reporting | |
| kettle-test | GitHub | standard test runner and coverage harness | |
| rubocop-lts | GitHub | Ruby-version-aware linting |
Runtime and Platform Support
Support tiers describe what this project's CI actually exercises, not what may work in an untested environment:
- Parallel support: CI runs the test suite with multiple workers available.
- Unsupported: the engine/platform combination is not covered by CI and is not a project compatibility claim.
| Ruby engine/version | Linux | macOS | Windows | Notes |
|---|---|---|---|---|
| MRI 3.1-3.4 | Parallel support | Unsupported | Unsupported | Versioned Ruby workflows run on Linux. |
| MRI current | Parallel support | Parallel support | Unsupported | Current Ruby workflow covers the declared OS platforms. |
| MRI head | Parallel support | Unsupported | Unsupported | CI is allowed to fail while Ruby is in development. |
| JRuby (all CI lanes) | Parallel support | Unsupported | Unsupported | Engine workflows run on Linux; macOS and Windows are not exercised by CI. |
| TruffleRuby (all CI lanes) | Parallel support | Unsupported | Unsupported | Never shipped a Windows build (zero Windows assets across 66 releases scanned 2026-10-10); setup-ruby hard-fails (source) |
Federated DVCS
| Federated DVCS Repository | Status | Issues | PRs | Wiki | CI |
|---|---|---|---|---|---|
| π§ͺ galtzo-floss/turbo_tests2 on GitLab | The Truth | π | π | π | π Tiny Matrix |
| π§ galtzo-floss/turbo_tests2 on CodeBerg | An Ethical Mirror (Donate) | π | π | β | βοΈ No Matrix |
| π galtzo-floss/turbo_tests2 on GitHub | Another Mirror | π | π | π | π― Full Matrix |
Enterprise Support
Available as part of the Tidelift Subscription.
The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
- π‘Subscribe for support guarantees covering all your FLOSS dependencies
- π‘Tidelift is part of Sonar
- π‘Tidelift pays maintainers to maintain the software you depend on!
π@Pointy Haired Boss: An enterprise support subscription is "never gonna let you down", and supports open source maintainers
Alternatively:
β¨ Installation
Install the gem and add to the application's Gemfile by executing:
bundle add turbo_tests2If bundler is not being used to manage dependencies, install the gem by executing:
gem install turbo_tests2βοΈ Configuration
turbo_tests2 ships the turbo_tests2 executable by default.
If you want an opt-in compatibility command for a specific project, generate a local shim:
$ bundle exec turbo_tests2 shim install
Installed turbo_tests shim at bin/turbo_tests.That creates bin/turbo_tests, which delegates to bundle exec turbo_tests2 "$@".
Remove it with:
$ bundle exec turbo_tests2 shim remove
Removed turbo_tests shim at bin/turbo_tests.Create test databases
$ bundle exec turbo_tests2 --createπ§ Basic Usage
Show help:
$ bundle exec turbo_tests2 -h
Usage: turbo_tests2 [options]
[optional] Only selected files & folders:
turbo_tests2 spec/bar spec/baz/xxx_spec.rb
Options:
-n, --count [PROCESSES] How many processes to use, default: available CPUs
-w, --workers [PROCESSES] Alias for -n, --count
-r, --require PATH Require a file.
-f, --format FORMATTER Choose a formatter. Available formatters: progress (p), documentation (d). Default: progress
-t, --tag TAG Run examples with the specified tag.
-o, --out FILE Write output to a file instead of $stdout
--runtime-log FILE Location of previously recorded test runtimes
--example-status-log FILE Use RSpec example status persistence timings for grouping
--pattern PATTERN Run spec files matching this regex pattern
--exclude-pattern PATTERN Exclude spec files matching this regex pattern
--only-group GROUP_INDEX[,GROUP_INDEX]
Run only the selected 1-based parallel_tests group index(es)
--group-by MODE Group files by runtime, filesize, or found order
--allowed-missing PERCENT Allowed percentage of missing runtimes for runtime grouping
--unknown-runtime SECONDS Runtime in seconds to assign files missing runtime history
-v, --verbose More output
--worker-output MODE Raw worker output mode: warnings, stream, buffered, or quiet; env: TURBO_TESTS2_WORKER_OUTPUT
--fail-fast=[N]
--seed SEED Seed for RSpec
--order ORDER RSpec example order: random (default) or defined
--no-random Run examples in defined order without passing a seed
--create Create databases
--print_failed_group Prints group that had failures in it
--no-rake-hooks Do not load a Rakefile or invoke setup and cleanup hooks
--nice execute test commands with low priorityBy default, turbo_tests2 generates one random RSpec seed, prints it, and passes
that same seed to every worker process. Use --seed SEED to replay a run, or
--order defined / --no-random when you want ordered examples without a seed.
turbo_tests2 supports selected parallel_tests options explicitly. It does
not invoke the parallel_tests CLI directly, and it does not blindly pass
unknown parallel_tests flags through after --. Options after -- are parsed
only when listed as supported below.
To select or exclude files matching a regex:
bundle exec turbo_tests2 -n 4 --pattern spec/system
bundle exec turbo_tests2 -n 4 --exclude-pattern spec/systemThe compatibility separator also accepts supported options:
bundle exec turbo_tests2 -n 4 -- --pattern spec/system
bundle exec turbo_tests2 -n 4 -- --exclude-pattern spec/systemTo rerun one or more selected 1-based groups from a prior parallel split:
bundle exec turbo_tests2 -n 4 --only-group 2
bundle exec turbo_tests2 -n 4 -- --only-group 1,3To choose a supported parallel_tests grouping mode explicitly:
bundle exec turbo_tests2 -n 4 --group-by runtime
bundle exec turbo_tests2 -n 4 --group-by filesize
bundle exec turbo_tests2 -n 4 --group-by found
bundle exec turbo_tests2 -n 4 -- --group-by runtimeruntime grouping uses the configured runtime log. On platforms other than
Windows, turbo_tests2 records runtimes by default. filesize and found do
not use runtime history for the initial split, but worker runtime recording
still runs so future runtime-based runs can use the updated log.
On Windows, default file discovery uses filesize grouping and runtime recording
is disabled because the runtime logger requires file locking that is not
supported reliably there. An existing runtime log can still be selected
explicitly with --group-by runtime, but Windows runs will not update it.
Runtime grouping also supports the explicit parallel_tests tuning flags
--allowed-missing PERCENT and --unknown-runtime SECONDS:
bundle exec turbo_tests2 -n 4 --group-by runtime --allowed-missing 25
bundle exec turbo_tests2 -n 4 --group-by runtime --unknown-runtime 0.5
bundle exec turbo_tests2 -n 4 -- --allowed-missing 25 --unknown-runtime 0.5Selected group runs default to filesize grouping unless --group-by is
provided.
Supported parallel_tests Options
parallel_tests option |
Status |
turbo_tests2 equivalent |
Notes |
|---|---|---|---|
-n, --count PROCESSES
|
Supported natively |
-n, --count; -w, --workers aliases |
Parsed as a turbo_tests2 option before any -- separator. |
-p, --pattern PATTERN
|
Supported | --pattern PATTERN |
May be supplied before or after --; mapped to parallel_tests file discovery. |
--exclude-pattern PATTERN |
Supported | --exclude-pattern PATTERN |
May be supplied before or after --; mapped to parallel_tests file discovery. |
--only-group GROUP_INDEX[,GROUP_INDEX] |
Supported | --only-group GROUP_INDEX[,GROUP_INDEX] |
May be supplied before or after --; uses 1-based parallel_tests group indexes. |
--group-by runtime |
Supported | --group-by runtime |
May be supplied before or after --; uses runtime-log grouping. |
--group-by filesize |
Supported | --group-by filesize |
May be supplied before or after --; groups by file size. |
--group-by found |
Supported | --group-by found |
May be supplied before or after --; keeps discovered file order. |
--allowed-missing PERCENT |
Supported | --allowed-missing PERCENT |
May be supplied before or after --; validates 0..100. |
--unknown-runtime SECONDS |
Supported | --unknown-runtime SECONDS |
May be supplied before or after --; validates finite non-negative seconds. |
--runtime-log PATH |
Supported natively | --runtime-log FILE |
Parsed as a turbo_tests2 option before any -- separator. |
--nice |
Supported natively | --nice |
Parsed as a turbo_tests2 option before any -- separator. |
--fail-fast |
Supported natively | --fail-fast[=N] |
Uses turbo_tests2 fail-fast handling and RSpec worker arguments. |
--verbose |
Supported natively |
-v, --verbose
|
Enables turbo_tests2 verbose output. |
--test-options, -o
|
Not supported as pass-through | Use turbo_tests2 RSpec-facing flags |
turbo_tests2 exposes selected RSpec options directly, such as --seed, --order, --no-random, --tag, --format, and --out. |
--group-by default, steps, scenarios
|
Not supported | None |
turbo_tests2 targets RSpec file grouping, not every parallel_tests framework mode. |
--single, --isolate, --isolate-n
|
Not supported | None | No first-class mapping yet. |
--specify-groups |
Not supported | None | No first-class mapping yet. |
-m, --multiply-processes
|
Not supported | None | Use an explicit -n/--count value. |
-e, --exec, --exec-args, --non-parallel
|
Not supported | None |
turbo_tests2 runs RSpec workers, not arbitrary command groups. |
--suffix, --type, --ignore-tags
|
Not supported | None |
turbo_tests2 currently targets RSpec. |
--serialize-stdout, --prefix-output-with-test-env-number, --combine-stderr, --quiet, --verbose-command, --verbose-process-command, --verbose-rerun-command
|
Not supported | None |
turbo_tests2 owns worker output collection and formatter reporting. |
--no-symlinks, --allow-duplicates, --first-is-1, --highest-exit-status, --failure-exit-code, --test-file-limit
|
Not supported | None | These need explicit design and tests before they can be accepted. |
Worker Output Modes
Raw worker stdout/stderr is separate from the parent process formatter output.
The progress dot parade is reconstructed from JSON formatter events and already
streams from the parent process as workers report examples. Use
--worker-output MODE, or TURBO_TESTS2_WORKER_OUTPUT=MODE, to choose how raw
worker stdout/stderr is handled. A CLI flag takes precedence over the
environment variable.
TURBO_TESTS2_MAX_PROCESSES=N supplies a positive inclusive process ceiling
when neither --count nor --workers is present. This is intended for an
outer orchestrator such as kettle-family; explicit CLI process counts always
take precedence. As with --count, the runner also caps the actual process
count at the number of discovered test groups.
| Mode | Behavior |
|---|---|
warnings |
Default. Buffer raw worker output, print warning/deprecation lines after successful runs, and print full buffered raw output on failures. |
stream |
Stream raw worker stdout/stderr immediately without enabling verbose command logging. Buffered output is not replayed at the end. |
buffered |
Buffer raw worker output and print all buffered output after the run completes. |
quiet |
Suppress raw worker output on successful runs. Failed runs still print buffered raw output. |
Known coverage formatter chatter remains collapsed into the concise coverage summary.
Resource-Constrained CI (JVM Engines)
Worker parallelism is spawn-based, not fork-based: each worker is started as a
real subprocess (Process.spawn / Open3.popen3), never Kernel#fork. That
makes parallel workers engine-portable β MRI, JRuby, and TruffleRuby all run
the same spawn-based pool, and the default worker count is the machine's core
count (Etc.nprocessors) on every engine. There is no serial-only mode for
JVM engines unless you ask for one with TURBO_TESTS2_MAX_PROCESSES=1.
The cost of that portability on JVM engines is memory: each JRuby or
TruffleRuby worker is a full JVM subprocess, and JRuby defaults its heap to
one quarter of machine RAM. On a CI runner, Etc.nprocessors workers each
grabbing a quarter of RAM is a recipe for the kernel's OOM killer, which kills
workers silently β every worker stops messaging at once, and the stall
watchdog then reports total silence. This is a resource problem, not a
parallelism problem.
The fix is to run fewer, smaller workers. This is the canonical
resource-constrained setup, and the kettle-jem CI templates bake it into
every JRuby workflow they generate:
TURBO_TESTS2_MAX_PROCESSES=2 \
JRUBY_OPTS="-J-Xmx1280m" \
TURBO_TESTS2_WATCHDOG_SECONDS=1500 \
bundle exec turbo_tests2Or in a GitHub Actions workflow:
env:
# Fewer, smaller JVM workers on constrained runners.
TURBO_TESTS2_MAX_PROCESSES: 2
# Cap each worker JVM's heap (JRuby default: 1/4 of runner RAM).
JRUBY_OPTS: "-J-Xmx1280m"
# JVM lanes are slow; give the watchdog room without hitting the job timeout.
TURBO_TESTS2_WATCHDOG_SECONDS: 1500Guidance:
-
Cap workers (
TURBO_TESTS2_MAX_PROCESSES=2) when each worker is a heavy process: JVM engines, large test suites, or shared/undersized runners. Two JVM workers still roughly halve wall-clock time versus one. -
Cap the heap (
JRUBY_OPTS="-J-Xmx1280m", or your engine's equivalent) so total memory is bounded regardless of runner size. - Raise the watchdog (1500s) on slow engines: JIT warmup and heavy GC make silence windows longer, and you want the watchdog report, not the provider timeout, when something genuinely hangs.
- The same knobs apply to any engine where a worker process is expensive β
the principle is: bound
workers Γ per-worker memoryunder the runner's capacity.
Stall watchdog
If the worker message queue goes silent β every worker alive but none producing example/group messages β a run can otherwise hang until the CI provider kills the job (GitHub Actions: 6 hours).
TURBO_TESTS2_WATCHDOG_SECONDS=N (integer, 0 = disabled) bounds that
silence. Default is 900 as of 4.0. (3.x defaulted to 0 β disabled β
with a one-time deprecation notice; set 0 to keep the old wait-forever
behavior.)
When the watchdog fires it kills the remaining worker processes, prints the unfinished groups and worker pids, and fails the run.
Setting it:
TURBO_TESTS2_WATCHDOG_SECONDS=900 bundle exec turbo_tests2Notes:
- The clock measures silence across all workers, not per-test duration.
In parallel lanes any other worker finishing an example keeps the run
alive; only serial lanes (
TURBO_TESTS2_MAX_PROCESSES=1) can trip on a single long test. Raise the value there if you have legitimately long, silent tests. - CI jobs that hang despite the watchdog will still hit the provider
limit; also set
timeout-minuteson the CI job. Locally, an outer supervisor (process watcher, container timeout) plays the same role. - When the watchdog is disabled (
0), a 900s silence prints a one-time provider-neutral notice: with the watchdog off, whatever outer process watcher exists β a CI job timeout, a container orchestrator, or a local supervisor β is what will eventually end a hung run, usually without a useful stall report. The notice also names the most common cause of total silence in a parallel lane (silently OOM-killed workers) and the fix (capworkers x per-worker memory).
turbo_tests2 supports custom formatter such as Fuubar, but you might need to require it:
bundle exec turbo_tests2 -r fuubar -f Fuubar spec/whateverRake Hooks
If Rake and a Rakefile are present, the CLI will invoke the tasks turbo_tests2:setup and
turbo_tests2:cleanup before and after running the test suite. If no Rakefile is discoverable,
the test suite runs without hooks. These tasks can be used to do work that should only happen
once, such as removing files or collating coverage:
# lib/tasks/turbo_tests2.rake
namespace :turbo_tests2 do
task setup: :environment do
# precompile assets once, to avoid doing it per each process
Rake::Tasks["assets:precompile"]
end
task cleanup: :environment do
# keep things nice and tidy
Rake::Tasks["assets:clobber"]
end
endProjects with a discoverable Rakefile can disable this integration explicitly:
bundle exec turbo_tests2 --no-rake-hooksThis prevents the Rakefile from being loaded and skips both hooks.
SimpleCov
You can get accurate coverage reporting by having SimpleCov write the results for each process into a different directory and then have the results collated as part of cleanup:
# spec/spec_helper.rb
require "simplecov"
# Configure minimum test coverage levels
#
# Details of default values for these configuration options can be seen at
# https://github.com/simplecov-ruby/simplecov/blob/master/lib/simplecov/profiles/rails.rb
SimpleCov.start("rails") do
enable_coverage :branch
coverage_dir "coverage/#{ENV["TEST_ENV_NUMBER"]}"
formatter SimpleCov::Formatter::SimpleFormatter
end
# lib/tasks/turbo_tests2.rake
namespace :turbo_tests2 do
task setup: :environment do
# remove any existing coverage files to avoid false reporting
FileUtils.rm_rf("coverage")
end
task cleanup: :environment do
require "simplecov"
# report coverage usage based on the results of all tests
SimpleCov.collate(Dir["coverage/*/.resultset.json"]) do
enable_coverage :branch
minimum_coverage line: 100, branch: 100
end
end
end𦷠FLOSS Funding
While galtzo-floss tools are free software and will always be, the project would benefit immensely from some funding. Raising a monthly budget of... "dollars" would make the project more sustainable.
We welcome both individual and corporate sponsors! We also offer a wide array of funding channels to account for your preferences. Currently, Open Collective is our preferred funding platform.
If you're working in a company that's making significant use of galtzo-floss tools we'd appreciate it if you suggest to your company to become a galtzo-floss sponsor.
You can support the development of galtzo-floss tools via GitHub Sponsors, Liberapay, PayPal, Open Collective and Tidelift.
| π NOTE |
|---|
| If doing a sponsorship in the form of donation is problematic for your company from an accounting standpoint, we'd recommend the use of Tidelift, where you can get a support-like subscription instead. |
Open Collective for Individuals
Support us with a monthly donation and help us continue our activities. [Become a backer]
NOTE: kettle-readme-backers updates this list every day, automatically.
No backers yet. Be the first!
Open Collective for Organizations
Become a sponsor and get your logo on our README on GitHub with a link to your site. [Become a sponsor]
NOTE: kettle-readme-backers updates this list every day, automatically.
No sponsors yet. Be the first!
Another way to support open-source
Iβm driven by a passion to foster a thriving open-source community β a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. Iβm reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 π chickens, 2 πΆ dogs, 3 π° rabbits, 8 πβ cats).
If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in bundle fund.
Iβm developing a new library, floss_funding, designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.
Floss-Funding.dev: ποΈ No network calls. ποΈ No tracking. ποΈ No oversight. ποΈ Minimal crypto hashing. π‘ Easily disabled nags
π Security
See SECURITY.md.
π€ Contributing
If you need some ideas of where to help, you could work on adding more code coverage, check issues or PRs, or use the gem and think about how it could be better.
We so if you make changes, remember to update it.
See CONTRIBUTING.md for more detailed instructions.
π Release Instructions
See CONTRIBUTING.md.
Code Coverage
πͺ Code of Conduct
Everyone interacting with this project's codebases, issue trackers,
chat rooms and mailing lists agrees to follow the .
π Contributors
Made with contributors-img.
Also see GitLab Contributors: https://gitlab.com/galtzo-floss/turbo_tests2/-/graphs/main
π Versioning
This library follows for its public API where practical.
For most applications, prefer the Pessimistic Version Constraint with two digits of precision.
For example:
spec.add_dependency("turbo_tests2", "~> 3.0")Dropping support for a platform can be a breaking change for affected users. If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
To get a better understanding of how SemVer is intended to work over a project's lifetime, read this article from the creator of SemVer:
See CHANGELOG.md for a list of releases.
π License
The gem is available as open source under the terms of
the MIT .
Β© Copyright
See LICENSE.md for the official copyright notice.
- Copyright (c) 2020-2024 Illia
- Copyright (c) 2020 Ilya Zub
- Copyright (c) 2021 AMHOL
- Copyright (c) 2021 Serge Bedzhyk
- Copyright (c) 2023 Bo Anderson
- Copyright (c) 2023 Dmitiry ZubβοΈ
- Copyright (c) 2023 mrudzki
- Copyright (c) 2023-2024 Sebastien Savater
- Copyright (c) 2024 Hiroshi SHIBATA
- Copyright (c) 2025-2026 Gareth Jones
- Copyright (c) 2025-2026 Peter H. Boling
- Copyright (c) 2026 Jeff Widman
π€ A request for help
Maintainers have teeth and need to pay their dentists. After getting laid off in an RIF in March, and encountering difficulty finding a new one, I began spending most of my time building open source tools. I'm hoping to be able to pay for my kids' health insurance this month, so if you value the work I am doing, I need your support. Please consider sponsoring me or the project.
To join the community or get help, use the RubyForum or Discord.
To say "thanks!" βοΈ Join the community or ποΈ send money.
Please give the project a star β β₯.
Many parts of this project are actively managed by a kettle-jem smart template utilizing StructuredMerge.org merge contracts.
Thanks for RTFM. βΊοΈ
| Field | Value |
|---|---|
| Package | turbo_tests2 |
| Description | π turbo_tests2is an RSpec parallel test runner. It uses runtime_groups for process counts, pid bookkeeping, file grouping, and runtime balancing, and replaces interleaved worker output with incremental summarized RSpec reporting. Source code ofturbo_test2` gem is based on Discourse and Rubygems work in this area (see README.md). |
| Homepage | https://github.com/galtzo-floss/turbo_tests2 |
| Source | https://github.com/galtzo-floss/turbo_tests2 |
| License | MIT |
| Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/galtzo-floss, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/turbo_tests2, https://www.buymeacoffee.com/pboling |