turbo_tests2 3.1.3 → 3.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cfd673d6ae8cb509b581990ab4fc6290d4108c5e3af0cf8a6e9fffe90cd373dc
4
- data.tar.gz: d145b26cd8c021afcb4a3bc7c9f4f94d6885ccdd4e8d8da500f7cb9855ba461a
3
+ metadata.gz: f90eeafc8b6c05ef14d7fba06572f211235589af1259267fad2f68827c4a28ee
4
+ data.tar.gz: '078ceb0bfa26b5f4bd62f0f80349ff58b7723f0479cd6060ee326c0035448980'
5
5
  SHA512:
6
- metadata.gz: a21f56a935b9189674f79fd83c6acb4426c96c44d9616090dc6b6ebac6d7e020745991e8ba7853e006b3e7005cde2469be0cefc784c6519e338bf9c433a06e08
7
- data.tar.gz: c94630c64ff389d5e8f1b6ec8ecd2a1d86307581e4bd740d6847449719142dde4557ad601a381d6338ac30a1a6a9d8dd29c0da14cc556ab6814fb86b2246f5b5
6
+ metadata.gz: 0bfed2e3bd0d156bb3663d0b5b4790e6a24b3c0c3d4319dc3ba1a136e1cfcf1bffddcafdc9405de84a508427576b401269b46c7c15040a8fbe2337807f9b9fac
7
+ data.tar.gz: 5fe807746ee1ee044feb9b5efeda224601e2f1076bccc895adb1723605c8c56debe37676a9c5266d76dd5077ad52205c7946a020ec5ce7918cbb9e5d4356a180
checksums.yaml.gz.sig CHANGED
@@ -1 +1,2 @@
1
- `�2�:ϒI6L[
1
+ �c����R\ph
2
+ JJ�{���S���i��Z��{>�@#��P�0K�ve\�.�^�o&� �蒑�X�{�ރ�;��E gč!ػ�����ͥň�RV�f��T�S#���JB_*x������d�8~fB��_����kЪ98q�?�:��������}V�
data/CHANGELOG.md CHANGED
@@ -30,6 +30,54 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [3.1.5] - 2026-06-23
34
+
35
+ - TAG: [v3.1.5][3.1.5t]
36
+ - COVERAGE: 97.09% -- 634/653 lines in 10 files
37
+ - BRANCH COVERAGE: 88.82% -- 135/152 branches in 10 files
38
+ - 37.08% documented
39
+
40
+ ### Added
41
+
42
+ - Added support for JRuby 10.1 and TruffleRuby 34.0.
43
+
44
+ ### Changed
45
+
46
+ - Retemplated project metadata and CI/development automation with `kettle-jem` v7.0.0.
47
+
48
+ ### Fixed
49
+
50
+ - Fixed subprocess coverage setup for SimpleCov v1 by starting coverage
51
+ explicitly in the spawn shim and detecting active coverage via Ruby's
52
+ `Coverage.running?` API.
53
+ - Fixed SimpleCov boot order so kettle-soup-cover formatter configuration loads
54
+ after SimpleCov finishes requiring its defaults.
55
+
56
+ - Added `PARALLEL_PID_FILE` to `turbo_tests2 fan` worker environments so
57
+ SimpleCov parallel result collation does not fail when workers inherit
58
+ `PARALLEL_TEST_GROUPS`.
59
+ - Made CLI integration specs assert combined stdout/stderr output so older
60
+ Ruby engines that emit warnings or RSpec load errors on stderr are covered.
61
+ - Relaxed CLI load-error detail expectations only on TruffleRuby, where some
62
+ supported versions exit nonzero but omit the RSpec load-error summary.
63
+
64
+ ## [3.1.4] - 2026-06-17
65
+
66
+ - TAG: [v3.1.4][3.1.4t]
67
+ - COVERAGE: 94.33% -- 666/706 lines in 16 files
68
+ - BRANCH COVERAGE: 79.11% -- 125/158 branches in 16 files
69
+ - 37.08% documented
70
+
71
+ ### Fixed
72
+
73
+ - Prevented parallel test runs from hanging when a worker process exits but its
74
+ stdout or stderr pipe remains open, a failure mode observed on JRuby
75
+ current/head jobs.
76
+
77
+ - Ensured worker stdout/stderr reader threads are force-stopped after worker
78
+ process exit if an engine keeps them blocked after pipe closure, fixing
79
+ TruffleRuby 25.0 CI failures in the worker pipe cleanup regression spec.
80
+
33
81
  ## [3.1.3] - 2026-06-14
34
82
 
35
83
  - TAG: [v3.1.3][3.1.3t]
@@ -137,7 +185,11 @@ Please file a bug if you notice a violation of semantic versioning.
137
185
 
138
186
  - Initial release
139
187
 
140
- [Unreleased]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.3...HEAD
188
+ [Unreleased]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.5...HEAD
189
+ [3.1.5]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.4...v3.1.5
190
+ [3.1.5t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.1.5
191
+ [3.1.4]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.3...v3.1.4
192
+ [3.1.4t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.1.4
141
193
  [3.1.3]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.2...v3.1.3
142
194
  [3.1.3t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.1.3
143
195
  [3.1.2]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.1...v3.1.2
data/CONTRIBUTING.md CHANGED
@@ -109,14 +109,14 @@ Git diff driver setup
109
109
  - Git hosting forges generally ignore external diff drivers, so pull request views may still show raw textual diffs even when local `git diff` uses semantic drivers.
110
110
 
111
111
  ```console
112
- K_JEM_TEMPLATING=true bundle exec kettle-jem install
112
+ K_JEM_TEMPLATING=true kettle-jem install
113
113
  ```
114
114
 
115
115
  Troubleshooting Git diffs
116
116
  - Use `git diff --no-ext-diff` to compare against Git's built-in diff output.
117
117
  - Use `git diff --no-textconv` when a textconv projection obscures the raw file bytes you need to inspect.
118
118
  - If Git reports a missing `smorg-*` executable, rerun `bundle install` and the setup command above, then check `git config --local --get-regexp '^diff\.smorg-'`.
119
- - To remove managed local entries, run `K_JEM_TEMPLATING=true bundle exec kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-ruby.command`.
119
+ - To remove managed local entries, run `K_JEM_TEMPLATING=true kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-ruby.command`.
120
120
 
121
121
  For a quick starting point, this repository’s `mise.toml` defines the shared defaults, and `.env.local` can override them locally. Copy `.env.local.example` to `.env.local`, use `KEY=value` lines, and either activate `mise` in your shell or run commands through `mise exec -C /path/to/project -- ...`.
122
122
 
data/FUNDING.md CHANGED
@@ -6,7 +6,7 @@ Many paths lead to being a sponsor or a backer of this project. Are you on such
6
6
 
7
7
  [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal]
8
8
 
9
- [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
9
+ [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
10
10
 
11
11
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
12
12
  [⛳liberapay]: https://liberapay.com/pboling/donate
@@ -16,12 +16,8 @@ Many paths lead to being a sponsor or a backer of this project. Are you on such
16
16
  [🖇osc-sponsors-i]: https://opencollective.com/galtzo-floss/sponsors/badge.svg?style=flat
17
17
  [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
18
18
  [🖇sponsor]: https://github.com/sponsors/pboling
19
- [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
20
- [🖇polar]: https://polar.sh/pboling
21
19
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
22
20
  [🖇kofi]: https://ko-fi.com/pboling
23
- [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
24
- [🖇patreon]: https://patreon.com/galtzo
25
21
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
26
22
  [🖇buyme]: https://www.buymeacoffee.com/pboling
27
23
  [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
data/LICENSE.md CHANGED
@@ -16,7 +16,6 @@ Choose the option that best fits your use case:
16
16
  - Copyright (c) 2023-2024 Illia
17
17
  - Copyright (c) 2023 mrudzki
18
18
  - Copyright (c) 2023-2024 Sebastien Savater
19
- - Copyright (c) 2024 David Rodriguez
20
19
  - Copyright (c) 2024 Hiroshi SHIBATA
21
20
  - Copyright (c) 2025-2026 Gareth Jones
22
21
  - Copyright (c) 2025-2026 Peter H. Boling
data/README.md CHANGED
@@ -10,9 +10,9 @@
10
10
 
11
11
  `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.
12
12
 
13
- [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
13
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
14
14
 
15
- <details>
15
+ <details markdown="1">
16
16
  <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
17
17
 
18
18
  I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
@@ -66,9 +66,9 @@ Finished in 2 minute 25.15 seconds (files took 0 seconds to load)
66
66
 
67
67
  | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
68
68
  |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
69
- | Works with JRuby | [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎jruby-9.2-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎jruby-9.3-wf] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎jruby-9.4-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
70
- | Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎truby-22.3-wf] [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎truby-23.0-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎truby-23.1-wf] <br/> [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf]|
71
- | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-4.0i]][🚎11-c-wf] [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
69
+ | Works with JRuby | [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎jruby-9.2-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎jruby-9.3-wf] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎jruby-9.4-wf] [![JRuby 10.0 Compat][💎jruby-10.0i]][🚎jruby-10.0-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
70
+ | Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎truby-22.3-wf] [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎truby-23.0-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎truby-23.1-wf] <br/> [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf]|
71
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
72
72
  | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎ruby-3.0-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎ruby-3.1-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
73
73
  | Works with MRI Ruby 2 | [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎ruby-2.4-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎ruby-2.5-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎ruby-2.6-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎ruby-2.7-wf]|
74
74
  | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
@@ -87,9 +87,24 @@ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
87
87
  may be higher than the gem's runtime compatibility floor when legacy Rubies are
88
88
  not practical for the current toolchain.
89
89
 
90
- | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
91
- |------------------------------------------------|--------------------------------------------------------|
92
- | 👟 Check it out! | [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
90
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg" width="14%" align="right"/></a>
91
+
92
+ The _amazing_ test matrix is powered by the kettle-dev stack.
93
+
94
+ <details markdown="1">
95
+ <summary>How kettle-dev manages complexity in tests</summary>
96
+
97
+ | Gem | Source | Role | Daily download rank |
98
+ |-----|--------|------|---------------------|
99
+ | [appraisal2](https://bestgems.org/gems/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Daily download rank for appraisal2](https://img.shields.io/gem/rd/appraisal2.svg?style=flat-square)](https://bestgems.org/gems/appraisal2) |
100
+ | [appraisal2-rubocop](https://bestgems.org/gems/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Daily download rank for appraisal2-rubocop](https://img.shields.io/gem/rd/appraisal2-rubocop.svg?style=flat-square)](https://bestgems.org/gems/appraisal2-rubocop) |
101
+ | [kettle-dev](https://bestgems.org/gems/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Daily download rank for kettle-dev](https://img.shields.io/gem/rd/kettle-dev.svg?style=flat-square)](https://bestgems.org/gems/kettle-dev) |
102
+ | [kettle-jem](https://bestgems.org/gems/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Daily download rank for kettle-jem](https://img.shields.io/gem/rd/kettle-jem.svg?style=flat-square)](https://bestgems.org/gems/kettle-jem) |
103
+ | [kettle-soup-cover](https://bestgems.org/gems/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Daily download rank for kettle-soup-cover](https://img.shields.io/gem/rd/kettle-soup-cover.svg?style=flat-square)](https://bestgems.org/gems/kettle-soup-cover) |
104
+ | [kettle-test](https://bestgems.org/gems/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Daily download rank for kettle-test](https://img.shields.io/gem/rd/kettle-test.svg?style=flat-square)](https://bestgems.org/gems/kettle-test) |
105
+ | [rubocop-lts](https://bestgems.org/gems/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Daily download rank for rubocop-lts](https://img.shields.io/gem/rd/rubocop-lts.svg?style=flat-square)](https://bestgems.org/gems/rubocop-lts) |
106
+
107
+ </details>
93
108
 
94
109
  ### Federated DVCS
95
110
 
@@ -318,7 +333,7 @@ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day
318
333
  No sponsors yet. Be the first!
319
334
  <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
320
335
 
321
- [kettle-readme-backers]: https://github.com/galtzo-floss/turbo_tests2/blob/main/exe/kettle-readme-backers
336
+ [kettle-readme-backers]: https://github.com/galtzo-floss/turbo_tests2/blob/main/bin/kettle-readme-backers
322
337
 
323
338
  ### Another way to support open-source
324
339
 
@@ -330,7 +345,7 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
330
345
 
331
346
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
332
347
 
333
- [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
348
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
334
349
 
335
350
  ## 🔐 Security
336
351
 
@@ -376,7 +391,7 @@ Made with [contributors-img][🖐contrib-rocks].
376
391
 
377
392
  Also see GitLab Contributors: [https://gitlab.com/galtzo-floss/turbo_tests2/-/graphs/main][🚎contributors-gl]
378
393
 
379
- <details>
394
+ <details markdown="1">
380
395
  <summary>⭐️ Star History</summary>
381
396
 
382
397
  <a href="https://star-history.com/galtzo-floss/turbo_tests2&Date">
@@ -436,7 +451,6 @@ See [LICENSE.md][📄license] for the official copyright notice.
436
451
  - Copyright (c) 2023-2024 Illia
437
452
  - Copyright (c) 2023 mrudzki
438
453
  - Copyright (c) 2023-2024 Sebastien Savater
439
- - Copyright (c) 2024 David Rodriguez
440
454
  - Copyright (c) 2024 Hiroshi SHIBATA
441
455
  - Copyright (c) 2025-2026 Gareth Jones
442
456
  - Copyright (c) 2025-2026 Peter H. Boling
@@ -483,12 +497,8 @@ Thanks for RTFM. ☺️
483
497
  [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
484
498
  [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
485
499
  [🖇sponsor]: https://github.com/sponsors/pboling
486
- [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
487
- [🖇polar]: https://polar.sh/pboling
488
500
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
489
501
  [🖇kofi]: https://ko-fi.com/pboling
490
- [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
491
- [🖇patreon]: https://patreon.com/galtzo
492
502
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
493
503
  [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
494
504
  [🖇buyme]: https://www.buymeacoffee.com/pboling
@@ -578,11 +588,13 @@ Thanks for RTFM. ☺️
578
588
  [🚎jruby-9.2-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/jruby-9.2.yml
579
589
  [🚎jruby-9.3-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/jruby-9.3.yml
580
590
  [🚎jruby-9.4-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/jruby-9.4.yml
591
+ [🚎jruby-10.0-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/jruby-10.0.yml
581
592
  [🚎truby-22.3-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/truffleruby-22.3.yml
582
593
  [🚎truby-23.0-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/truffleruby-23.0.yml
583
594
  [🚎truby-23.1-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/truffleruby-23.1.yml
584
595
  [🚎truby-24.2-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/truffleruby-24.2.yml
585
596
  [🚎truby-25.0-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/truffleruby-25.0.yml
597
+ [🚎truby-33.0-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/truffleruby-33.0.yml
586
598
  [🚎2-cov-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/coverage.yml
587
599
  [🚎2-cov-wfi]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/coverage.yml/badge.svg
588
600
  [🚎3-hd-wf]: https://github.com/galtzo-floss/turbo_tests2/actions/workflows/heads.yml
@@ -612,7 +624,6 @@ Thanks for RTFM. ☺️
612
624
  [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
613
625
  [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
614
626
  [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
615
- [💎ruby-4.0i]: https://img.shields.io/badge/Ruby-4.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
616
627
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
617
628
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
618
629
  [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
@@ -620,10 +631,13 @@ Thanks for RTFM. ☺️
620
631
  [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
621
632
  [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
622
633
  [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
634
+ [💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
623
635
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
636
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
624
637
  [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge&logo=ruby&logoColor=red
625
638
  [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
626
639
  [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
640
+ [💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red
627
641
  [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
628
642
  [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
629
643
  [🤝gh-issues]: https://github.com/galtzo-floss/turbo_tests2/issues
@@ -652,7 +666,7 @@ Thanks for RTFM. ☺️
652
666
  [📌gitmoji]: https://gitmoji.dev
653
667
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
654
668
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
655
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.688-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
669
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.653-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
656
670
  [🔐security]: https://github.com/galtzo-floss/turbo_tests2/blob/main/SECURITY.md
657
671
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
658
672
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -660,7 +674,7 @@ Thanks for RTFM. ☺️
660
674
  [📄license-ref]: MIT.md
661
675
  [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
662
676
  [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
663
- [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-✓-259D6C.svg?style=flat&logo=Apache
677
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
664
678
 
665
679
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
666
680
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
@@ -680,7 +694,7 @@ Thanks for RTFM. ☺️
680
694
  | Package | turbo_tests2 |
681
695
  | Description | 🚀 turbo_tests2` is a drop-in replacement for `serpapi/turbo_tests` and `grosser/parallel_tests` with incremental summarized output. Source code of `turbo_test2` gem is based on Discourse and Rubygems work in this area (see README.md). |
682
696
  | Homepage | https://github.com/galtzo-floss/turbo_tests2 |
683
- | Source | https://github.com/galtzo-floss/turbo_tests2/tree/v3.1.3 |
697
+ | Source | https://github.com/galtzo-floss/turbo_tests2 |
684
698
  | License | `MIT` |
685
- | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/galtzo-floss, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/turbo_tests2, https://www.buymeacoffee.com/pboling |
699
+ | 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 |
686
700
  <!-- kettle-jem:metadata:end -->
@@ -194,12 +194,15 @@ module TurboTests
194
194
  end
195
195
 
196
196
  processes = ParallelTests.determine_number_of_processes(count)
197
- pids = (1..processes).map do |process_id|
198
- env = {
199
- "TEST_ENV_NUMBER" => process_id.to_s,
200
- "PARALLEL_TEST_GROUPS" => processes.to_s
201
- }
202
- Process.spawn(env, *args)
197
+ pids = ParallelTests.with_pid_file do
198
+ (1..processes).map do |process_id|
199
+ env = {
200
+ "TEST_ENV_NUMBER" => process_id.to_s,
201
+ "PARALLEL_TEST_GROUPS" => processes.to_s,
202
+ "PARALLEL_PID_FILE" => ParallelTests.pid_file_path
203
+ }
204
+ Process.spawn(env, *args)
205
+ end
203
206
  end
204
207
  statuses = pids.map { |pid| Process.wait2(pid).last }
205
208
 
@@ -263,9 +266,9 @@ module TurboTests
263
266
  begin
264
267
  require "rake"
265
268
  rescue LoadError
266
- # :nocov:
269
+ # simplecov:disable
267
270
  return # rake is optional
268
- # :nocov:
271
+ # simplecov:enable
269
272
  end
270
273
 
271
274
  # Pass an empty argv so Rake doesn't parse the current process's ARGV,
@@ -294,35 +294,44 @@ module TurboTests
294
294
  stdin.close
295
295
 
296
296
  # rubocop:disable ThreadSafety/NewThread
297
- @threads <<
297
+ stdout_thread =
298
298
  Thread.new do
299
- stdout.each_line do |line|
300
- result = line.split(env["RSPEC_FORMATTER_OUTPUT_ID"])
299
+ begin
300
+ stdout.each_line do |line|
301
+ result = line.split(env["RSPEC_FORMATTER_OUTPUT_ID"])
301
302
 
302
- initial = result.shift
303
- print(initial) unless initial.empty?
303
+ initial = result.shift
304
+ print(initial) unless initial.empty?
304
305
 
305
- message = result.shift
306
- next unless message
306
+ message = result.shift
307
+ next unless message
307
308
 
308
- message = JSON.parse(message, symbolize_names: true)
309
+ message = JSON.parse(message, symbolize_names: true)
309
310
 
310
- message[:process_id] = process_id
311
- @messages << message
311
+ message[:process_id] = process_id
312
+ @messages << message
313
+ end
314
+ rescue IOError
315
+ nil
312
316
  end
313
317
 
314
318
  @messages << {type: "exit", process_id: process_id}
315
319
  end
316
320
  # rubocop:enable ThreadSafety/NewThread
321
+ @threads << stdout_thread
317
322
 
318
- @threads << start_copy_thread(stderr, $stderr)
323
+ stderr_thread = start_copy_thread(stderr, $stderr)
324
+ @threads << stderr_thread
319
325
 
320
326
  # rubocop:disable ThreadSafety/NewThread
321
327
  @threads << Thread.new do
322
328
  begin
323
329
  status = wait_thr.value
324
330
  @messages << {type: "error"} unless status.success?
331
+ @messages << {type: "exit", process_id: process_id}
325
332
  ensure
333
+ stop_reader_thread(stdout_thread, stdout)
334
+ stop_reader_thread(stderr_thread, stderr)
326
335
  untrack_parallel_pid(wait_thr.pid, pid_file_path)
327
336
  end
328
337
  end
@@ -352,7 +361,9 @@ module TurboTests
352
361
  begin
353
362
  msg = src.readpartial(4096)
354
363
  rescue EOFError
355
- src.close
364
+ close_io(src)
365
+ break
366
+ rescue IOError
356
367
  break
357
368
  else
358
369
  dst.write(msg)
@@ -361,8 +372,18 @@ module TurboTests
361
372
  end
362
373
  end
363
374
 
375
+ def stop_reader_thread(thread, io)
376
+ return if thread.join(0.1)
377
+
378
+ close_io(io)
379
+ return if thread.join(0.1)
380
+
381
+ thread.kill
382
+ thread.join(0.1)
383
+ end
384
+
364
385
  def handle_messages
365
- exited = 0
386
+ exited_process_ids = {}
366
387
 
367
388
  loop do
368
389
  message = @messages.pop
@@ -406,9 +427,12 @@ module TurboTests
406
427
  # Do nothing
407
428
  nil
408
429
  when "exit"
409
- exited += 1
410
- @exited_process_ids << message[:process_id]
411
- break if exited == @num_processes
430
+ process_id = message[:process_id]
431
+ next if exited_process_ids.key?(process_id)
432
+
433
+ exited_process_ids[process_id] = true
434
+ @exited_process_ids << process_id
435
+ break if exited_process_ids.size == @num_processes
412
436
  else
413
437
  warn("Unhandled message in main process: #{message}")
414
438
  end
@@ -418,6 +442,12 @@ module TurboTests
418
442
  rescue Interrupt
419
443
  end
420
444
 
445
+ def close_io(io)
446
+ io.close unless io.closed?
447
+ rescue IOError
448
+ nil
449
+ end
450
+
421
451
  def fail_fast_met
422
452
  !@fail_fast.nil? && @failure_count >= @fail_fast
423
453
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module TurboTests
4
4
  module Version
5
- VERSION = "3.1.3"
5
+ VERSION = "3.1.5"
6
6
  end
7
7
  VERSION = Version::VERSION # Traditional Constant Location
8
8
  end
@@ -13,7 +13,7 @@ RSpec.shared_context("with simplecov spawn coverage") do
13
13
  original_rubyopt = ENV.fetch("RUBYOPT", nil)
14
14
  original_cov_min_hard = ENV.fetch("K_SOUP_COV_MIN_HARD", nil)
15
15
  begin
16
- if defined?(SimpleCov) && SimpleCov.running
16
+ if defined?(SimpleCov) && defined?(Coverage) && Coverage.respond_to?(:running?) && Coverage.running?
17
17
  spawn_path = simplecov_spawn_path
18
18
  raise ArgumentError, "Expected SimpleCov spawn shim at #{spawn_path}" unless File.file?(spawn_path)
19
19
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turbo_tests2
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.3
4
+ version: 3.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Illia
@@ -12,7 +12,6 @@ authors:
12
12
  - Dmitiry Zub☀️
13
13
  - mrudzki
14
14
  - Sebastien Savater
15
- - David Rodriguez
16
15
  - Hiroshi SHIBATA
17
16
  - Gareth Jones
18
17
  - Peter H. Boling
@@ -91,7 +90,7 @@ dependencies:
91
90
  version: '1.1'
92
91
  - - ">="
93
92
  - !ruby/object:Gem::Version
94
- version: 1.1.11
93
+ version: 1.1.13
95
94
  type: :runtime
96
95
  prerelease: false
97
96
  version_requirements: !ruby/object:Gem::Requirement
@@ -101,7 +100,7 @@ dependencies:
101
100
  version: '1.1'
102
101
  - - ">="
103
102
  - !ruby/object:Gem::Version
104
- version: 1.1.11
103
+ version: 1.1.13
105
104
  - !ruby/object:Gem::Dependency
106
105
  name: kettle-dev
107
106
  requirement: !ruby/object:Gem::Requirement
@@ -111,7 +110,7 @@ dependencies:
111
110
  version: '2.2'
112
111
  - - ">="
113
112
  - !ruby/object:Gem::Version
114
- version: 2.2.8
113
+ version: 2.2.15
115
114
  type: :development
116
115
  prerelease: false
117
116
  version_requirements: !ruby/object:Gem::Requirement
@@ -121,7 +120,7 @@ dependencies:
121
120
  version: '2.2'
122
121
  - - ">="
123
122
  - !ruby/object:Gem::Version
124
- version: 2.2.8
123
+ version: 2.2.15
125
124
  - !ruby/object:Gem::Dependency
126
125
  name: bundler-audit
127
126
  requirement: !ruby/object:Gem::Requirement
@@ -179,7 +178,7 @@ dependencies:
179
178
  version: '3.1'
180
179
  - - ">="
181
180
  - !ruby/object:Gem::Version
182
- version: 3.1.2
181
+ version: 3.1.3
183
182
  type: :development
184
183
  prerelease: false
185
184
  version_requirements: !ruby/object:Gem::Requirement
@@ -189,7 +188,7 @@ dependencies:
189
188
  version: '3.1'
190
189
  - - ">="
191
190
  - !ruby/object:Gem::Version
192
- version: 3.1.2
191
+ version: 3.1.3
193
192
  - !ruby/object:Gem::Dependency
194
193
  name: kettle-test
195
194
  requirement: !ruby/object:Gem::Requirement
@@ -199,7 +198,7 @@ dependencies:
199
198
  version: '2.0'
200
199
  - - ">="
201
200
  - !ruby/object:Gem::Version
202
- version: 2.0.5
201
+ version: 2.0.6
203
202
  type: :development
204
203
  prerelease: false
205
204
  version_requirements: !ruby/object:Gem::Requirement
@@ -209,7 +208,7 @@ dependencies:
209
208
  version: '2.0'
210
209
  - - ">="
211
210
  - !ruby/object:Gem::Version
212
- version: 2.0.5
211
+ version: 2.0.6
213
212
  - !ruby/object:Gem::Dependency
214
213
  name: ruby-progressbar
215
214
  requirement: !ruby/object:Gem::Requirement
@@ -253,7 +252,7 @@ dependencies:
253
252
  version: '2.0'
254
253
  - - ">="
255
254
  - !ruby/object:Gem::Version
256
- version: 2.0.1
255
+ version: 2.0.3
257
256
  type: :development
258
257
  prerelease: false
259
258
  version_requirements: !ruby/object:Gem::Requirement
@@ -263,7 +262,7 @@ dependencies:
263
262
  version: '2.0'
264
263
  - - ">="
265
264
  - !ruby/object:Gem::Version
266
- version: 2.0.1
265
+ version: 2.0.3
267
266
  description: "\U0001F680 turbo_tests2` is a drop-in replacement for `serpapi/turbo_tests`
268
267
  and `grosser/parallel_tests` with incremental summarized output. Source code of
269
268
  `turbo_test2` gem is based on Discourse and Rubygems work in this area (see README.md)."
@@ -310,10 +309,10 @@ licenses:
310
309
  - MIT
311
310
  metadata:
312
311
  homepage_uri: https://turbo-tests2.galtzo.com
313
- source_code_uri: https://github.com/galtzo-floss/turbo_tests2/tree/v3.1.3
314
- changelog_uri: https://github.com/galtzo-floss/turbo_tests2/blob/v3.1.3/CHANGELOG.md
312
+ source_code_uri: https://github.com/galtzo-floss/turbo_tests2/tree/v3.1.5
313
+ changelog_uri: https://github.com/galtzo-floss/turbo_tests2/blob/v3.1.5/CHANGELOG.md
315
314
  bug_tracker_uri: https://github.com/galtzo-floss/turbo_tests2/issues
316
- documentation_uri: https://www.rubydoc.info/gems/turbo_tests2/3.1.3
315
+ documentation_uri: https://www.rubydoc.info/gems/turbo_tests2/3.1.5
317
316
  funding_uri: https://github.com/sponsors/pboling
318
317
  wiki_uri: https://github.com/galtzo-floss/turbo_tests2/wiki
319
318
  news_uri: https://www.railsbling.com/tags/turbo_tests2
metadata.gz.sig CHANGED
Binary file