turbo_tests2 3.2.7 → 3.2.9

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: cf123312410105738345f4c9dc065fc29cc5f083d59f674e271fff3195d9e601
4
- data.tar.gz: d835e84d2eecb41a7c2f712c7491ab460d7a1d1f1aadc060c0d19a5a803958ec
3
+ metadata.gz: f63573447de503c49edf269ccd4fc2428f0264be443c581368424984a8d297fd
4
+ data.tar.gz: 03ac549c607d360119b7414862675512aae32f551f20e7573ab83a410a44d71e
5
5
  SHA512:
6
- metadata.gz: efc0bacf63611b3b93150a51b2a0708a2861380797391d1c558661aa38cc3393a20f85e03a1c000ee9fc08ec3e95f3ba08be7478a93d0c87c957d4e7161a518e
7
- data.tar.gz: ea872015ab396f1cc4b0e3a61c2ec67069a9cba1744136868c3f798b50c5f561cfa517e15c183216f27c8657044b490baf7e21be4dc2c0f0d62e070f68a698b6
6
+ metadata.gz: f87df2925ae0e2d74bcb2f3995be14f3384b0ac976d371af927da8ea90681893a5c78b2bdc73f569ebffe55a368d9a9f592822997a72457e3804ace986526a4f
7
+ data.tar.gz: 4e7ebf8e0ddfdb6df6c29973dbfac46101109aa26a484045569fd630e6f8e129abf49391d1be84427c1b1b8cf7f58df98324b6f70ea19acd56cd7c74602f527d
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,43 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [3.2.9] - 2026-09-13
34
+
35
+ - TAG: [v3.2.9][3.2.9t]
36
+ - COVERAGE: 96.79% -- 905/935 lines in 10 files
37
+ - BRANCH COVERAGE: 84.75% -- 239/282 branches in 10 files
38
+ - 36.73% documented
39
+
40
+ ### Fixed
41
+
42
+ - Workers that exit unsuccessfully before reporting any results (for example
43
+ after crashing while loading) are now reported as errors outside of examples,
44
+ instead of silently dropping out of the summary.
45
+ - JSON rows are serialized with `JSON.generate`, so ActiveSupport's `#to_json`
46
+ override (which fails for ActiveSupport < 8.1 with json >= 3.0) can no longer
47
+ crash workers.
48
+
49
+ ## [3.2.8] - 2026-09-11
50
+
51
+ - TAG: [v3.2.8][3.2.8t]
52
+ - COVERAGE: 96.75% -- 892/922 lines in 10 files
53
+ - BRANCH COVERAGE: 84.98% -- 232/273 branches in 10 files
54
+ - 36.73% documented
55
+
56
+ ### Added
57
+
58
+ - Support TURBO_TESTS2_MAX_PROCESSES as an orchestration process ceiling.
59
+
60
+ ### Changed
61
+
62
+ - [kc] kettle-jem/prepare: updated 8 project files:
63
+ - dependencies (8)
64
+
65
+ - [kc] kettle-jem/template: updated 5 project files:
66
+ - code and tests (1)
67
+ - dependencies (3)
68
+ - other (1)
69
+
33
70
  ## [3.2.7] - 2026-08-29
34
71
 
35
72
  - TAG: [v3.2.7][3.2.7t]
@@ -44,23 +81,14 @@ Please file a bug if you notice a violation of semantic versioning.
44
81
 
45
82
  ### Changed
46
83
 
47
- - [kc] kettle-jem/prepare: updated 30 project files:
84
+ - [kc] kettle-jem/prepare: updated 40 project files:
48
85
  - configuration (1)
49
- - dependencies (26)
50
- - other (3)
51
-
52
- - [kc] kettle-jem/template: updated 2 project files:
53
- - dependencies (1)
54
- - other (1)
55
-
56
- - [kc] kettle-jem/prepare: updated 10 project files:
57
- - dependencies (9)
58
- - other (1)
59
-
60
- - [kc] kettle-jem/template: updated 4 project files:
86
+ - dependencies (35)
87
+ - other (4)
88
+ - [kc] kettle-jem/template: updated 6 project files:
61
89
  - code and tests (1)
62
- - dependencies (1)
63
- - other (1)
90
+ - dependencies (2)
91
+ - other (2)
64
92
  - workflows (1)
65
93
 
66
94
  ### Fixed
@@ -574,7 +602,11 @@ Please file a bug if you notice a violation of semantic versioning.
574
602
 
575
603
  - Initial release
576
604
 
577
- [Unreleased]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.2.7...HEAD
605
+ [Unreleased]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.2.9...HEAD
606
+ [3.2.9]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.2.8...v3.2.9
607
+ [3.2.9t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.2.9
608
+ [3.2.8]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.2.7...v3.2.8
609
+ [3.2.8t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.2.8
578
610
  [3.2.7]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.2.6...v3.2.7
579
611
  [3.2.7t]: https://github.com/galtzo-floss/turbo_tests2/releases/tag/v3.2.7
580
612
  [3.2.6]: https://github.com/galtzo-floss/turbo_tests2/compare/v3.2.5...v3.2.6
data/README.md CHANGED
@@ -316,6 +316,12 @@ streams from the parent process as workers report examples. Use
316
316
  worker stdout/stderr is handled. A CLI flag takes precedence over the
317
317
  environment variable.
318
318
 
319
+ `TURBO_TESTS2_MAX_PROCESSES=N` supplies a positive inclusive process ceiling
320
+ when neither `--count` nor `--workers` is present. This is intended for an
321
+ outer orchestrator such as `kettle-family`; explicit CLI process counts always
322
+ take precedence. As with `--count`, the runner also caps the actual process
323
+ count at the number of discovered test groups.
324
+
319
325
  | Mode | Behavior |
320
326
  |------|----------|
321
327
  | `warnings` | Default. Buffer raw worker output, print warning/deprecation lines after successful runs, and print full buffered raw output on failures. |
@@ -769,7 +775,7 @@ Thanks for RTFM. ☺️
769
775
  [📌gitmoji]: https://gitmoji.dev
770
776
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
771
777
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
772
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.914-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
778
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.935-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
773
779
  [🔐security]: https://github.com/galtzo-floss/turbo_tests2/blob/main/SECURITY.md
774
780
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
775
781
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -175,6 +175,11 @@ module TurboTests
175
175
  return TurboTests::Runner.create(count)
176
176
  end
177
177
 
178
+ # Family orchestration supplies an inclusive ceiling for the complete
179
+ # test process pool. A command-line count remains the explicit operator
180
+ # choice, so it always wins over the inherited budget.
181
+ count ||= max_processes_from_environment
182
+
178
183
  requires.each { |f| require(f) }
179
184
 
180
185
  if formatters.empty?
@@ -238,6 +243,18 @@ module TurboTests
238
243
  ]
239
244
  end
240
245
 
246
+ def max_processes_from_environment
247
+ value = ENV.fetch("TURBO_TESTS2_MAX_PROCESSES", "").strip
248
+ return if value.empty?
249
+
250
+ count = Integer(value, 10)
251
+ return count if count.positive?
252
+
253
+ raise OptionParser::InvalidArgument, "invalid TURBO_TESTS2_MAX_PROCESSES #{value.inspect}; expected a positive integer"
254
+ rescue ArgumentError
255
+ raise OptionParser::InvalidArgument, "invalid TURBO_TESTS2_MAX_PROCESSES #{value.inspect}; expected a positive integer"
256
+ end
257
+
241
258
  def parse_parallel_args(args, parallel_options)
242
259
  OptionParser.new do |opts|
243
260
  opts.on("--pattern PATTERN", "Run spec files matching this regex pattern") do |pattern|
@@ -210,7 +210,9 @@ module TurboTests
210
210
  end
211
211
 
212
212
  def output_row(obj)
213
- output.puts "#{ENV.fetch("RSPEC_FORMATTER_OUTPUT_ID", "")}#{json_ready(obj).to_json}"
213
+ # JSON.generate instead of #to_json: ActiveSupport overrides #to_json, and its
214
+ # encoder can fail (e.g. ActiveSupport < 8.1 with json >= 3.0).
215
+ output.puts "#{ENV.fetch("RSPEC_FORMATTER_OUTPUT_ID", "")}#{JSON.generate(json_ready(obj))}"
214
216
  output.flush
215
217
  end
216
218
 
@@ -222,6 +224,8 @@ module TurboTests
222
224
  obj.map { |value| json_ready(value) }
223
225
  when String
224
226
  obj.dup.force_encoding(Encoding::UTF_8).scrub
227
+ when Symbol
228
+ obj.id2name
225
229
  else
226
230
  obj
227
231
  end
@@ -235,6 +235,8 @@ module TurboTests
235
235
  @worker_output_mutex = Mutex.new
236
236
  @deferred_run_options_messages = Hash.new { |hash, message| hash[message] = [] }
237
237
  @error = false
238
+ @closed_process_ids = {}
239
+ @failed_worker_statuses = {}
238
240
  @print_failed_group = opts[:print_failed_group]
239
241
  @worker_output_mode = self.class.normalize_worker_output_mode(opts.fetch(:worker_output, DEFAULT_WORKER_OUTPUT_MODE))
240
242
  end
@@ -282,6 +284,8 @@ module TurboTests
282
284
 
283
285
  @threads.each(&:join)
284
286
 
287
+ report_workers_without_results
288
+
285
289
  report_failed_group(tests_in_groups) if @print_failed_group
286
290
 
287
291
  Signal.trap(:INT, old_signal)
@@ -452,6 +456,7 @@ module TurboTests
452
456
  @threads << Thread.new do
453
457
  begin
454
458
  status = wait_thr.value
459
+ @failed_worker_statuses.store(process_id, status) unless status.success?
455
460
  @messages << {type: "error", process_id: process_id} unless status.success?
456
461
  @messages << {type: "exit", process_id: process_id}
457
462
  ensure
@@ -539,6 +544,7 @@ module TurboTests
539
544
  return unless message.is_a?(Hash) && message[:type].is_a?(String)
540
545
 
541
546
  message[:process_id] = process_id
547
+ @closed_process_ids.store(process_id, true) if message[:type] == "close"
542
548
  message
543
549
  rescue JSON::ParserError
544
550
  nil
@@ -756,6 +762,24 @@ module TurboTests
756
762
  !@fail_fast.nil? && @failure_count >= @fail_fast
757
763
  end
758
764
 
765
+ # A worker that exits unsuccessfully without its formatter closing (for example
766
+ # one that crashed while loading spec_helper or while RSpec set up) reports no
767
+ # examples at all. Surface it as an error outside of examples so the summary
768
+ # reflects the failure instead of only counting the workers that reported.
769
+ def report_workers_without_results
770
+ return if fail_fast_met || @interrupt_handled
771
+
772
+ @failed_worker_statuses.keys.sort.each do |process_id|
773
+ next if @closed_process_ids[process_id]
774
+
775
+ status = @failed_worker_statuses[process_id]
776
+ @reporter.error_outside_of_examples(
777
+ "Worker #{process_id} exited with status #{status.exitstatus.inspect} before reporting results; see its output above."
778
+ )
779
+ @error = true
780
+ end
781
+ end
782
+
759
783
  def report_failed_group(tests_in_groups)
760
784
  @wait_threads.map(&:value).each_with_index do |value, index|
761
785
  next if value.success?
@@ -4,7 +4,7 @@ module TurboTests
4
4
  # Version namespace for this gem.
5
5
  module Version
6
6
  # Current gem version.
7
- VERSION = "3.2.7"
7
+ VERSION = "3.2.9"
8
8
  end
9
9
  # Current gem version exposed at the traditional constant location.
10
10
  VERSION = Version::VERSION # Traditional Constant Location
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.2.7
4
+ version: 3.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Illia
@@ -108,20 +108,20 @@ dependencies:
108
108
  requirements:
109
109
  - - "~>"
110
110
  - !ruby/object:Gem::Version
111
- version: '3.0'
111
+ version: '3.1'
112
112
  - - ">="
113
113
  - !ruby/object:Gem::Version
114
- version: 3.0.17
114
+ version: 3.1.0
115
115
  type: :development
116
116
  prerelease: false
117
117
  version_requirements: !ruby/object:Gem::Requirement
118
118
  requirements:
119
119
  - - "~>"
120
120
  - !ruby/object:Gem::Version
121
- version: '3.0'
121
+ version: '3.1'
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 3.0.17
124
+ version: 3.1.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: bundler-audit
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -199,7 +199,7 @@ dependencies:
199
199
  version: '3.2'
200
200
  - - ">="
201
201
  - !ruby/object:Gem::Version
202
- version: 3.2.2
202
+ version: 3.2.3
203
203
  type: :development
204
204
  prerelease: false
205
205
  version_requirements: !ruby/object:Gem::Requirement
@@ -209,7 +209,7 @@ dependencies:
209
209
  version: '3.2'
210
210
  - - ">="
211
211
  - !ruby/object:Gem::Version
212
- version: 3.2.2
212
+ version: 3.2.3
213
213
  - !ruby/object:Gem::Dependency
214
214
  name: kettle-test
215
215
  requirement: !ruby/object:Gem::Requirement
@@ -253,7 +253,7 @@ dependencies:
253
253
  version: '1.0'
254
254
  - - ">="
255
255
  - !ruby/object:Gem::Version
256
- version: 1.0.8
256
+ version: 1.0.9
257
257
  type: :development
258
258
  prerelease: false
259
259
  version_requirements: !ruby/object:Gem::Requirement
@@ -263,7 +263,7 @@ dependencies:
263
263
  version: '1.0'
264
264
  - - ">="
265
265
  - !ruby/object:Gem::Version
266
- version: 1.0.8
266
+ version: 1.0.9
267
267
  - !ruby/object:Gem::Dependency
268
268
  name: gitmoji-regex
269
269
  requirement: !ruby/object:Gem::Requirement
@@ -273,7 +273,7 @@ dependencies:
273
273
  version: '2.0'
274
274
  - - ">="
275
275
  - !ruby/object:Gem::Version
276
- version: 2.0.12
276
+ version: 2.0.13
277
277
  type: :development
278
278
  prerelease: false
279
279
  version_requirements: !ruby/object:Gem::Requirement
@@ -283,7 +283,7 @@ dependencies:
283
283
  version: '2.0'
284
284
  - - ">="
285
285
  - !ruby/object:Gem::Version
286
- version: 2.0.12
286
+ version: 2.0.13
287
287
  description: "\U0001F680 turbo_tests2` is an RSpec parallel test runner built on `parallel_tests`.
288
288
  It uses `parallel_tests` for process counts, file grouping, and runtime balancing,
289
289
  then replaces interleaved worker output with incremental summarized RSpec reporting.
@@ -315,10 +315,10 @@ licenses:
315
315
  - MIT
316
316
  metadata:
317
317
  homepage_uri: https://turbo-tests2.galtzo.com
318
- source_code_uri: https://github.com/galtzo-floss/turbo_tests2/tree/v3.2.7
319
- changelog_uri: https://github.com/galtzo-floss/turbo_tests2/blob/v3.2.7/CHANGELOG.md
318
+ source_code_uri: https://github.com/galtzo-floss/turbo_tests2/tree/v3.2.9
319
+ changelog_uri: https://github.com/galtzo-floss/turbo_tests2/blob/v3.2.9/CHANGELOG.md
320
320
  bug_tracker_uri: https://github.com/galtzo-floss/turbo_tests2/issues
321
- documentation_uri: https://www.rubydoc.info/gems/turbo_tests2/3.2.7
321
+ documentation_uri: https://www.rubydoc.info/gems/turbo_tests2/3.2.9
322
322
  funding_uri: https://github.com/sponsors/pboling
323
323
  wiki_uri: https://github.com/galtzo-floss/turbo_tests2/wiki
324
324
  news_uri: https://www.railsbling.com/tags/turbo_tests2
metadata.gz.sig CHANGED
Binary file