turbo_tests 2.2.3 → 2.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/fixtures/rspec/no_method_error_spec.rb +3 -0
- data/lib/turbo_tests/cli.rb +3 -6
- data/lib/turbo_tests/reporter.rb +51 -15
- data/lib/turbo_tests/runner.rb +39 -39
- data/lib/turbo_tests/version.rb +1 -1
- metadata +3 -3
- data/.github/workflows/snyk_ruby-analysis.yml +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ce3db5b3cf918f8152cd3986f44505ab55127fcdba96194cfb5479416182b20
|
4
|
+
data.tar.gz: ae140be91a1b0db66f272fc7cc16bcc0d74d8ddc5d769ead501d8e3c5aa41aea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e80161b5d0ed9b656a59efc2c341a71e3bbc299bcedcfcf284f695aee5c34ba275c2c4b75cea33255db7f5c9c98a242048a72cd1d07534329bf3160f3766a04
|
7
|
+
data.tar.gz: 261e0183d586a59076db43f1b378ca6425b6bb79cadfca050b705c2fcde4cd847f26201d57716305d42add671c94421ab5e7b671f0324c0c3dacd2921b0114a9
|
data/Gemfile.lock
CHANGED
data/lib/turbo_tests/cli.rb
CHANGED
@@ -98,7 +98,7 @@ module TurboTests
|
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
-
|
101
|
+
exitstatus = TurboTests::Runner.run(
|
102
102
|
formatters: formatters,
|
103
103
|
tags: tags,
|
104
104
|
files: @argv.empty? ? ["spec"] : @argv,
|
@@ -109,11 +109,8 @@ module TurboTests
|
|
109
109
|
seed: seed
|
110
110
|
)
|
111
111
|
|
112
|
-
|
113
|
-
|
114
|
-
else
|
115
|
-
exit 1
|
116
|
-
end
|
112
|
+
# From https://github.com/serpapi/turbo_tests/pull/20/
|
113
|
+
exit exitstatus
|
117
114
|
end
|
118
115
|
end
|
119
116
|
end
|
data/lib/turbo_tests/reporter.rb
CHANGED
@@ -4,8 +4,8 @@ module TurboTests
|
|
4
4
|
class Reporter
|
5
5
|
attr_writer :load_time
|
6
6
|
|
7
|
-
def self.from_config(formatter_config, start_time)
|
8
|
-
reporter = new(start_time)
|
7
|
+
def self.from_config(formatter_config, start_time, seed, seed_used)
|
8
|
+
reporter = new(start_time, seed, seed_used)
|
9
9
|
|
10
10
|
formatter_config.each do |config|
|
11
11
|
name, outputs = config.values_at(:name, :outputs)
|
@@ -23,13 +23,15 @@ module TurboTests
|
|
23
23
|
attr_reader :pending_examples
|
24
24
|
attr_reader :failed_examples
|
25
25
|
|
26
|
-
def initialize(start_time)
|
26
|
+
def initialize(start_time, seed, seed_used)
|
27
27
|
@formatters = []
|
28
28
|
@pending_examples = []
|
29
29
|
@failed_examples = []
|
30
30
|
@all_examples = []
|
31
31
|
@messages = []
|
32
32
|
@start_time = start_time
|
33
|
+
@seed = seed
|
34
|
+
@seed_used = seed_used
|
33
35
|
@load_time = 0
|
34
36
|
@errors_outside_of_examples_count = 0
|
35
37
|
end
|
@@ -50,6 +52,38 @@ module TurboTests
|
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
55
|
+
# Borrowed from RSpec::Core::Reporter
|
56
|
+
# https://github.com/rspec/rspec-core/blob/5699fcdc4723087ff6139af55bd155ad9ad61a7b/lib/rspec/core/reporter.rb#L71
|
57
|
+
def report(example_groups)
|
58
|
+
start(example_groups)
|
59
|
+
begin
|
60
|
+
yield self
|
61
|
+
ensure
|
62
|
+
finish
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def start(example_groups, time=RSpec::Core::Time.now)
|
67
|
+
@start = time
|
68
|
+
@load_time = (@start - @start_time).to_f
|
69
|
+
|
70
|
+
report_number_of_tests(example_groups)
|
71
|
+
expected_example_count = example_groups.flatten(1).count
|
72
|
+
|
73
|
+
delegate_to_formatters(:seed, RSpec::Core::Notifications::SeedNotification.new(@seed, @seed_used))
|
74
|
+
delegate_to_formatters(:start, RSpec::Core::Notifications::StartNotification.new(expected_example_count, @load_time))
|
75
|
+
end
|
76
|
+
|
77
|
+
def report_number_of_tests(groups)
|
78
|
+
name = ParallelTests::RSpec::Runner.test_file_name
|
79
|
+
|
80
|
+
num_processes = groups.size
|
81
|
+
num_tests = groups.map(&:size).sum
|
82
|
+
tests_per_process = (num_processes == 0 ? 0 : num_tests.to_f / num_processes).round
|
83
|
+
|
84
|
+
puts "#{num_processes} processes for #{num_tests} #{name}s, ~ #{tests_per_process} #{name}s per process"
|
85
|
+
end
|
86
|
+
|
53
87
|
def group_started(notification)
|
54
88
|
delegate_to_formatters(:example_group_started, notification)
|
55
89
|
end
|
@@ -83,16 +117,18 @@ module TurboTests
|
|
83
117
|
@messages << message
|
84
118
|
end
|
85
119
|
|
86
|
-
def error_outside_of_examples
|
120
|
+
def error_outside_of_examples(error_message)
|
87
121
|
@errors_outside_of_examples_count += 1
|
122
|
+
message error_message
|
88
123
|
end
|
89
124
|
|
90
125
|
def finish
|
91
|
-
|
92
|
-
|
126
|
+
end_time = RSpec::Core::Time.now
|
127
|
+
|
128
|
+
@duration = end_time - @start_time
|
129
|
+
delegate_to_formatters :stop, RSpec::Core::Notifications::ExamplesNotification.new(self)
|
93
130
|
|
94
|
-
delegate_to_formatters
|
95
|
-
RSpec::Core::Notifications::NullNotification)
|
131
|
+
delegate_to_formatters :start_dump, RSpec::Core::Notifications::NullNotification
|
96
132
|
delegate_to_formatters(:dump_pending,
|
97
133
|
RSpec::Core::Notifications::ExamplesNotification.new(
|
98
134
|
self
|
@@ -110,13 +146,13 @@ module TurboTests
|
|
110
146
|
@load_time,
|
111
147
|
@errors_outside_of_examples_count
|
112
148
|
))
|
113
|
-
delegate_to_formatters(:
|
114
|
-
RSpec::Core::Notifications::
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
149
|
+
delegate_to_formatters(:seed,
|
150
|
+
RSpec::Core::Notifications::SeedNotification.new(
|
151
|
+
@seed,
|
152
|
+
@seed_used,
|
153
|
+
))
|
154
|
+
ensure
|
155
|
+
delegate_to_formatters :close, RSpec::Core::Notifications::NullNotification
|
120
156
|
end
|
121
157
|
|
122
158
|
protected
|
data/lib/turbo_tests/runner.rb
CHANGED
@@ -14,20 +14,19 @@ module TurboTests
|
|
14
14
|
formatters = opts[:formatters]
|
15
15
|
tags = opts[:tags]
|
16
16
|
|
17
|
-
|
18
|
-
start_time = opts.fetch(:start_time) { Process.clock_gettime(Process::CLOCK_MONOTONIC) }
|
17
|
+
start_time = opts.fetch(:start_time) { RSpec::Core::Time.now }
|
19
18
|
runtime_log = opts.fetch(:runtime_log, nil)
|
20
19
|
verbose = opts.fetch(:verbose, false)
|
21
20
|
fail_fast = opts.fetch(:fail_fast, nil)
|
22
21
|
count = opts.fetch(:count, nil)
|
23
|
-
seed = opts.fetch(:seed)
|
24
|
-
seed_used = !
|
22
|
+
seed = opts.fetch(:seed)
|
23
|
+
seed_used = !seed.nil?
|
25
24
|
|
26
25
|
if verbose
|
27
26
|
warn "VERBOSE"
|
28
27
|
end
|
29
28
|
|
30
|
-
reporter = Reporter.from_config(formatters, start_time)
|
29
|
+
reporter = Reporter.from_config(formatters, start_time, seed, seed_used)
|
31
30
|
|
32
31
|
new(
|
33
32
|
reporter: reporter,
|
@@ -38,7 +37,7 @@ module TurboTests
|
|
38
37
|
fail_fast: fail_fast,
|
39
38
|
count: count,
|
40
39
|
seed: seed,
|
41
|
-
seed_used: seed_used
|
40
|
+
seed_used: seed_used,
|
42
41
|
).run
|
43
42
|
end
|
44
43
|
|
@@ -50,11 +49,12 @@ module TurboTests
|
|
50
49
|
@verbose = opts[:verbose]
|
51
50
|
@fail_fast = opts[:fail_fast]
|
52
51
|
@count = opts[:count]
|
52
|
+
@seed = opts[:seed]
|
53
|
+
@seed_used = opts[:seed_used]
|
54
|
+
|
53
55
|
@load_time = 0
|
54
56
|
@load_count = 0
|
55
57
|
@failure_count = 0
|
56
|
-
@seed = opts[:seed]
|
57
|
-
@seed_used = opts[:seed_used]
|
58
58
|
|
59
59
|
@messages = Thread::Queue.new
|
60
60
|
@threads = []
|
@@ -87,26 +87,25 @@ module TurboTests
|
|
87
87
|
setup_tmp_dir
|
88
88
|
|
89
89
|
subprocess_opts = {
|
90
|
-
record_runtime: use_runtime_info
|
90
|
+
record_runtime: use_runtime_info,
|
91
91
|
}
|
92
92
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
wait_threads = tests_in_groups.map.with_index do |tests, process_id|
|
98
|
-
start_regular_subprocess(tests, process_id + 1, **subprocess_opts)
|
99
|
-
end
|
100
|
-
|
101
|
-
handle_messages
|
102
|
-
|
103
|
-
@reporter.finish
|
93
|
+
@reporter.report(tests_in_groups) do |reporter|
|
94
|
+
wait_threads = tests_in_groups.map.with_index do |tests, process_id|
|
95
|
+
start_regular_subprocess(tests, process_id + 1, **subprocess_opts)
|
96
|
+
end
|
104
97
|
|
105
|
-
|
98
|
+
handle_messages
|
106
99
|
|
107
|
-
|
100
|
+
@threads.each(&:join)
|
108
101
|
|
109
|
-
|
102
|
+
if @reporter.failed_examples.empty? && wait_threads.map(&:value).all?(&:success?)
|
103
|
+
0
|
104
|
+
else
|
105
|
+
# From https://github.com/serpapi/turbo_tests/pull/20/
|
106
|
+
wait_threads.map { |thread| thread.value.exitstatus }.max
|
107
|
+
end
|
108
|
+
end
|
110
109
|
end
|
111
110
|
|
112
111
|
private
|
@@ -157,12 +156,18 @@ module TurboTests
|
|
157
156
|
[]
|
158
157
|
end
|
159
158
|
|
159
|
+
seed_option = if @seed_used
|
160
|
+
[
|
161
|
+
"--seed", @seed,
|
162
|
+
]
|
163
|
+
else
|
164
|
+
[]
|
165
|
+
end
|
166
|
+
|
160
167
|
command = [
|
161
168
|
*command_name,
|
162
169
|
*extra_args,
|
163
|
-
|
164
|
-
"--format", "ParallelTests::RSpec::RuntimeLogger",
|
165
|
-
"--out", @runtime_log,
|
170
|
+
*seed_option,
|
166
171
|
"--format", "TurboTests::JsonRowsFormatter",
|
167
172
|
*record_runtime_options,
|
168
173
|
*tests,
|
@@ -254,12 +259,17 @@ module TurboTests
|
|
254
259
|
break
|
255
260
|
end
|
256
261
|
when "message"
|
257
|
-
|
262
|
+
if message[:message].include?("An error occurred") || message[:message].include?("occurred outside of examples")
|
263
|
+
@reporter.error_outside_of_examples(message[:message])
|
264
|
+
@error = true
|
265
|
+
else
|
266
|
+
@reporter.message(message[:message])
|
267
|
+
end
|
258
268
|
when "seed"
|
259
269
|
when "close"
|
260
270
|
when "error"
|
261
|
-
|
262
|
-
|
271
|
+
# Do nothing
|
272
|
+
nil
|
263
273
|
when "exit"
|
264
274
|
exited += 1
|
265
275
|
if exited == @num_processes
|
@@ -277,15 +287,5 @@ module TurboTests
|
|
277
287
|
def fail_fast_met
|
278
288
|
!@fail_fast.nil? && @failure_count >= @fail_fast
|
279
289
|
end
|
280
|
-
|
281
|
-
def report_number_of_tests(groups)
|
282
|
-
name = ParallelTests::RSpec::Runner.test_file_name
|
283
|
-
|
284
|
-
num_processes = groups.size
|
285
|
-
num_tests = groups.map(&:size).sum
|
286
|
-
tests_per_process = (num_processes == 0 ? 0 : num_tests.to_f / num_processes).round
|
287
|
-
|
288
|
-
puts "#{num_processes} processes for #{num_tests} #{name}s, ~ #{tests_per_process} #{name}s per process"
|
289
|
-
end
|
290
290
|
end
|
291
291
|
end
|
data/lib/turbo_tests/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turbo_tests
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Illia Zub
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -66,7 +66,6 @@ executables:
|
|
66
66
|
extensions: []
|
67
67
|
extra_rdoc_files: []
|
68
68
|
files:
|
69
|
-
- ".github/workflows/snyk_ruby-analysis.yml"
|
70
69
|
- ".github/workflows/tag_and_release.yml"
|
71
70
|
- ".github/workflows/tests.yml"
|
72
71
|
- ".gitignore"
|
@@ -80,6 +79,7 @@ files:
|
|
80
79
|
- bin/turbo_tests
|
81
80
|
- fixtures/rspec/errors_outside_of_examples_spec.rb
|
82
81
|
- fixtures/rspec/failing_spec.rb
|
82
|
+
- fixtures/rspec/no_method_error_spec.rb
|
83
83
|
- fixtures/rspec/pending_exceptions_spec.rb
|
84
84
|
- lib/turbo_tests.rb
|
85
85
|
- lib/turbo_tests/cli.rb
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# A sample workflow which checks out your Infrastructure as Code Configuration files,
|
2
|
-
# such as Kubernetes, Helm & Terraform and scans them for any security issues.
|
3
|
-
# The results are then uploaded to GitHub Security Code Scanning
|
4
|
-
#
|
5
|
-
# For more examples, including how to limit scans to only high-severity issues
|
6
|
-
# and fail PR checks, see https://github.com/snyk/actions/
|
7
|
-
|
8
|
-
name: Snyk Ruby
|
9
|
-
|
10
|
-
on:
|
11
|
-
push:
|
12
|
-
branches: [ master ]
|
13
|
-
pull_request:
|
14
|
-
# The branches below must be a subset of the branches above
|
15
|
-
branches: [ master ]
|
16
|
-
schedule:
|
17
|
-
- cron: '0 0 * * 0'
|
18
|
-
|
19
|
-
jobs:
|
20
|
-
snyk:
|
21
|
-
runs-on: ubuntu-latest
|
22
|
-
steps:
|
23
|
-
- uses: actions/checkout@v3
|
24
|
-
- name: Run Snyk to check configuration files for security issues
|
25
|
-
# Snyk can be used to break the build when it detects security issues.
|
26
|
-
# In this case we want to upload the issues to GitHub Code Scanning
|
27
|
-
continue-on-error: true
|
28
|
-
uses: snyk/actions/ruby@master
|
29
|
-
env:
|
30
|
-
# In order to use the Snyk Action you will need to have a Snyk API token.
|
31
|
-
# More details in https://github.com/snyk/actions#getting-your-snyk-token
|
32
|
-
# or you can signup for free at https://snyk.io/login
|
33
|
-
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|