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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +48 -16
- data/README.md +7 -1
- data/lib/turbo_tests/cli.rb +17 -0
- data/lib/turbo_tests/json_rows_formatter.rb +5 -1
- data/lib/turbo_tests/runner.rb +24 -0
- data/lib/turbo_tests/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +14 -14
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f63573447de503c49edf269ccd4fc2428f0264be443c581368424984a8d297fd
|
|
4
|
+
data.tar.gz: 03ac549c607d360119b7414862675512aae32f551f20e7573ab83a410a44d71e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
84
|
+
- [kc] kettle-jem/prepare: updated 40 project files:
|
|
48
85
|
- configuration (1)
|
|
49
|
-
- dependencies (
|
|
50
|
-
- other (
|
|
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 (
|
|
63
|
-
- other (
|
|
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.
|
|
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.
|
|
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
|
data/lib/turbo_tests/cli.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
data/lib/turbo_tests/runner.rb
CHANGED
|
@@ -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?
|
data/lib/turbo_tests/version.rb
CHANGED
|
@@ -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
|
+
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.
|
|
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.
|
|
111
|
+
version: '3.1'
|
|
112
112
|
- - ">="
|
|
113
113
|
- !ruby/object:Gem::Version
|
|
114
|
-
version: 3.0
|
|
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.
|
|
121
|
+
version: '3.1'
|
|
122
122
|
- - ">="
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: 3.0
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
319
|
-
changelog_uri: https://github.com/galtzo-floss/turbo_tests2/blob/v3.2.
|
|
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.
|
|
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
|