turbo_tests2 3.1.2 → 3.1.4

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: 3f7e32f7c287251c9f42dc998ba6b717d2977f1f8d741de4f1f0fb774089589b
4
- data.tar.gz: fffd71116b9ce2d824896c779feaa53d467fece2e8e649074690c9e98752a035
3
+ metadata.gz: 625c5608d1ad3efd6e246de858b37368f126d0e9235684b7f39bf09e53773038
4
+ data.tar.gz: 85d87719d2f6e86a2bb0a44c5c7eeee66dcc859374b10653ae4991b99fff1c00
5
5
  SHA512:
6
- metadata.gz: 8b35cc849e52d2c7963fdfa1f51a558261cd7fc0ee00b63c04c7d4d8170fa515aaf0a51717e9bf1fb1bf2e6b2c8eaa19a67f2aac1f9bbbe7ffacdc20140ed4da
7
- data.tar.gz: d24ee3ba58ec58d7d942d1f9fc5617fa1d12e34efbc8a65dc5a1db52018af5660a287c7f9c08ce207061ba0d71ecc5727506f92b01bbcc80dda112e0251fb547
6
+ metadata.gz: 706929b3f66fa575187f9a8b087ced4ef15bb1772caf4506e0c263de558637f382e32943690ef5eae15bcba363ea4c7ab5c60013074e4b5390c130a5b24532bf
7
+ data.tar.gz: a5a332a48caf1e97183b45a6b3c48aa44a17c8dcf5a6a85f855a8757e46ba9d210fcd936e03f6c29bfe3787a37218d0ec77267ae4706e47f25c409e357a1baf5
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,34 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [3.1.4] - 2026-06-17
34
+
35
+ - TAG: [v3.1.4][3.1.4t]
36
+ - COVERAGE: 94.33% -- 666/706 lines in 16 files
37
+ - BRANCH COVERAGE: 79.11% -- 125/158 branches in 16 files
38
+ - 37.08% documented
39
+
40
+ ### Fixed
41
+
42
+ - Prevented parallel test runs from hanging when a worker process exits but its
43
+ stdout or stderr pipe remains open, a failure mode observed on JRuby
44
+ current/head jobs.
45
+
46
+ - Ensured worker stdout/stderr reader threads are force-stopped after worker
47
+ process exit if an engine keeps them blocked after pipe closure, fixing
48
+ TruffleRuby 25.0 CI failures in the worker pipe cleanup regression spec.
49
+
50
+ ## [3.1.3] - 2026-06-14
51
+
52
+ - TAG: [v3.1.3][3.1.3t]
53
+ - COVERAGE: 94.62% -- 651/688 lines in 16 files
54
+ - BRANCH COVERAGE: 79.33% -- 119/150 branches in 16 files
55
+ - 37.08% documented
56
+
57
+ ### Fixed
58
+
59
+ - Restored `docs/CNAME` so the generated documentation site keeps its custom domain.
60
+
33
61
  ## [3.1.2] - 2026-06-08
34
62
 
35
63
  - TAG: [v3.1.2][3.1.2t]
@@ -126,7 +154,11 @@ Please file a bug if you notice a violation of semantic versioning.
126
154
 
127
155
  - Initial release
128
156
 
129
- [Unreleased]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.2...HEAD
157
+ [Unreleased]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.4...HEAD
158
+ [3.1.4]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.3...v3.1.4
159
+ [3.1.4t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.1.4
160
+ [3.1.3]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.2...v3.1.3
161
+ [3.1.3t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.1.3
130
162
  [3.1.2]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.1...v3.1.2
131
163
  [3.1.2t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.1.2
132
164
  [3.1.1]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.1.0...v3.1.1
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/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
@@ -436,7 +436,6 @@ See [LICENSE.md][📄license] for the official copyright notice.
436
436
  - Copyright (c) 2023-2024 Illia
437
437
  - Copyright (c) 2023 mrudzki
438
438
  - Copyright (c) 2023-2024 Sebastien Savater
439
- - Copyright (c) 2024 David Rodriguez
440
439
  - Copyright (c) 2024 Hiroshi SHIBATA
441
440
  - Copyright (c) 2025-2026 Gareth Jones
442
441
  - Copyright (c) 2025-2026 Peter H. Boling
@@ -652,7 +651,7 @@ Thanks for RTFM. ☺️
652
651
  [📌gitmoji]: https://gitmoji.dev
653
652
  [📌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
653
  [🧮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
654
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.700-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
656
655
  [🔐security]: https://github.com/galtzo-floss/turbo_tests2/blob/main/SECURITY.md
657
656
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
658
657
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -660,7 +659,7 @@ Thanks for RTFM. ☺️
660
659
  [📄license-ref]: MIT.md
661
660
  [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
662
661
  [📄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
662
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
664
663
 
665
664
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
666
665
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
@@ -680,7 +679,7 @@ Thanks for RTFM. ☺️
680
679
  | Package | turbo_tests2 |
681
680
  | 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
681
  | Homepage | https://github.com/galtzo-floss/turbo_tests2 |
683
- | Source | https://github.com/galtzo-floss/turbo_tests2/tree/v3.1.1 |
682
+ | Source | https://github.com/galtzo-floss/turbo_tests2 |
684
683
  | License | `MIT` |
685
684
  | 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 |
686
685
  <!-- kettle-jem:metadata:end -->
@@ -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.2"
5
+ VERSION = "3.1.4"
6
6
  end
7
7
  VERSION = Version::VERSION # Traditional Constant Location
8
8
  end
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.2
4
+ version: 3.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Illia
@@ -10,10 +10,8 @@ authors:
10
10
  - Serge Bedzhyk
11
11
  - Bo Anderson
12
12
  - Dmitiry Zub☀️
13
- - Illia
14
13
  - mrudzki
15
14
  - Sebastien Savater
16
- - David Rodriguez
17
15
  - Hiroshi SHIBATA
18
16
  - Gareth Jones
19
17
  - Peter H. Boling
@@ -92,7 +90,7 @@ dependencies:
92
90
  version: '1.1'
93
91
  - - ">="
94
92
  - !ruby/object:Gem::Version
95
- version: 1.1.11
93
+ version: 1.1.12
96
94
  type: :runtime
97
95
  prerelease: false
98
96
  version_requirements: !ruby/object:Gem::Requirement
@@ -102,27 +100,27 @@ dependencies:
102
100
  version: '1.1'
103
101
  - - ">="
104
102
  - !ruby/object:Gem::Version
105
- version: 1.1.11
103
+ version: 1.1.12
106
104
  - !ruby/object:Gem::Dependency
107
105
  name: kettle-dev
108
106
  requirement: !ruby/object:Gem::Requirement
109
107
  requirements:
110
108
  - - "~>"
111
109
  - !ruby/object:Gem::Version
112
- version: '2.1'
110
+ version: '2.2'
113
111
  - - ">="
114
112
  - !ruby/object:Gem::Version
115
- version: 2.1.1
113
+ version: 2.2.10
116
114
  type: :development
117
115
  prerelease: false
118
116
  version_requirements: !ruby/object:Gem::Requirement
119
117
  requirements:
120
118
  - - "~>"
121
119
  - !ruby/object:Gem::Version
122
- version: '2.1'
120
+ version: '2.2'
123
121
  - - ">="
124
122
  - !ruby/object:Gem::Version
125
- version: 2.1.1
123
+ version: 2.2.10
126
124
  - !ruby/object:Gem::Dependency
127
125
  name: bundler-audit
128
126
  requirement: !ruby/object:Gem::Requirement
@@ -180,7 +178,7 @@ dependencies:
180
178
  version: '3.1'
181
179
  - - ">="
182
180
  - !ruby/object:Gem::Version
183
- version: 3.1.1
181
+ version: 3.1.2
184
182
  type: :development
185
183
  prerelease: false
186
184
  version_requirements: !ruby/object:Gem::Requirement
@@ -190,7 +188,7 @@ dependencies:
190
188
  version: '3.1'
191
189
  - - ">="
192
190
  - !ruby/object:Gem::Version
193
- version: 3.1.1
191
+ version: 3.1.2
194
192
  - !ruby/object:Gem::Dependency
195
193
  name: kettle-test
196
194
  requirement: !ruby/object:Gem::Requirement
@@ -200,7 +198,7 @@ dependencies:
200
198
  version: '2.0'
201
199
  - - ">="
202
200
  - !ruby/object:Gem::Version
203
- version: 2.0.3
201
+ version: 2.0.5
204
202
  type: :development
205
203
  prerelease: false
206
204
  version_requirements: !ruby/object:Gem::Requirement
@@ -210,7 +208,7 @@ dependencies:
210
208
  version: '2.0'
211
209
  - - ">="
212
210
  - !ruby/object:Gem::Version
213
- version: 2.0.3
211
+ version: 2.0.5
214
212
  - !ruby/object:Gem::Dependency
215
213
  name: ruby-progressbar
216
214
  requirement: !ruby/object:Gem::Requirement
@@ -254,7 +252,7 @@ dependencies:
254
252
  version: '2.0'
255
253
  - - ">="
256
254
  - !ruby/object:Gem::Version
257
- version: 2.0.1
255
+ version: 2.0.2
258
256
  type: :development
259
257
  prerelease: false
260
258
  version_requirements: !ruby/object:Gem::Requirement
@@ -264,7 +262,7 @@ dependencies:
264
262
  version: '2.0'
265
263
  - - ">="
266
264
  - !ruby/object:Gem::Version
267
- version: 2.0.1
265
+ version: 2.0.2
268
266
  description: "\U0001F680 turbo_tests2` is a drop-in replacement for `serpapi/turbo_tests`
269
267
  and `grosser/parallel_tests` with incremental summarized output. Source code of
270
268
  `turbo_test2` gem is based on Discourse and Rubygems work in this area (see README.md)."
@@ -311,10 +309,10 @@ licenses:
311
309
  - MIT
312
310
  metadata:
313
311
  homepage_uri: https://turbo-tests2.galtzo.com
314
- source_code_uri: https://github.com/galtzo-floss/turbo_tests2/tree/v3.1.2
315
- changelog_uri: https://github.com/galtzo-floss/turbo_tests2/blob/v3.1.2/CHANGELOG.md
312
+ source_code_uri: https://github.com/galtzo-floss/turbo_tests2/tree/v3.1.4
313
+ changelog_uri: https://github.com/galtzo-floss/turbo_tests2/blob/v3.1.4/CHANGELOG.md
316
314
  bug_tracker_uri: https://github.com/galtzo-floss/turbo_tests2/issues
317
- documentation_uri: https://www.rubydoc.info/gems/turbo_tests2/3.1.2
315
+ documentation_uri: https://www.rubydoc.info/gems/turbo_tests2/3.1.4
318
316
  funding_uri: https://github.com/sponsors/pboling
319
317
  wiki_uri: https://github.com/galtzo-floss/turbo_tests2/wiki
320
318
  news_uri: https://www.railsbling.com/tags/turbo_tests2
metadata.gz.sig CHANGED
Binary file