minitest-distributed 0.2.7 → 0.2.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +43 -0
- data/.github/workflows/ruby.yml +38 -9
- data/.rubocop.yml +1 -0
- data/Gemfile +1 -0
- data/README.md +5 -5
- data/bin/rake +4 -2
- data/bin/rubocop +4 -2
- data/bin/srb +4 -2
- data/dev.yml +7 -0
- data/docker-compose.yml +11 -0
- data/lib/minitest/distributed/configuration.rb +5 -0
- data/lib/minitest/distributed/coordinators/redis_coordinator.rb +40 -11
- data/lib/minitest/distributed/enqueued_runnable.rb +1 -1
- data/lib/minitest/distributed/reporters/junitxml_reporter.rb +6 -4
- data/lib/minitest/distributed/reporters/test_order_reporter.rb +36 -0
- data/lib/minitest/distributed/result_type.rb +3 -1
- data/lib/minitest/distributed/test_selector.rb +11 -1
- data/lib/minitest/distributed/version.rb +1 -1
- data/lib/minitest/distributed_plugin.rb +7 -0
- data/lib/minitest/test_order_plugin.rb +21 -0
- data/minitest-distributed.gemspec +1 -1
- data/sorbet/config +1 -0
- data/sorbet/rbi/gems/ast.rbi +49 -0
- data/sorbet/rbi/gems/connection_pool.rbi +55 -0
- data/sorbet/rbi/gems/minitest-distributed.rbi +15 -0
- data/sorbet/rbi/gems/minitest.rbi +426 -0
- data/sorbet/rbi/gems/parallel.rbi +86 -0
- data/sorbet/rbi/gems/parser.rbi +1477 -0
- data/sorbet/rbi/gems/rainbow.rbi +122 -0
- data/sorbet/rbi/gems/rake.rbi +647 -0
- data/sorbet/rbi/gems/redis-client.rbi +311 -0
- data/sorbet/rbi/gems/redis.rbi +409 -0
- data/sorbet/rbi/gems/regexp_parser.rbi +984 -0
- data/sorbet/rbi/gems/rexml.rbi +599 -0
- data/sorbet/rbi/gems/rubocop-ast.rbi +1398 -0
- data/sorbet/rbi/gems/rubocop-minitest.rbi +406 -0
- data/sorbet/rbi/gems/rubocop-rake.rbi +85 -0
- data/sorbet/rbi/gems/rubocop-sorbet.rbi +218 -0
- data/sorbet/rbi/gems/rubocop.rbi +9351 -0
- data/sorbet/rbi/gems/ruby-progressbar.rbi +304 -0
- data/sorbet/rbi/gems/toxiproxy.rbi +112 -0
- data/sorbet/rbi/gems/unicode-display_width.rbi +23 -0
- data/sorbet/rbi/minitest.rbi +5 -1
- data/sorbet/rbi/rails.rbi +1 -0
- data/sorbet/rbi/rbconfig.rbi +1 -1
- metadata +29 -5
- data/sorbet/rbi/redis.rbi +0 -106
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dc9ad4333958d6197869544c8fd47f6bc0f6ccdb5fe2203fe4af1ed348164ed
|
4
|
+
data.tar.gz: fad3b8564ad602cf2209ebff92b1ddeef601f2ae3ccdfc94d67820e077a05943
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 833c450f354affcdab9f7d3939dd5ac5de52de2a586758cf46b8b21a60073712dca466d2847aa6a918eea2e68d8013e6d53dee1fc335fc7dcca97edca7785cce
|
7
|
+
data.tar.gz: 6d35405c22570d2c9c9628e35330ce2e198d77ec8610e88568d07e7b3d7453323872db88e7b99de11148e396e56487be3c98c540110127cbaaa53ab21307da0a
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
name: Bug report
|
3
|
+
about: Create a report to help us improve
|
4
|
+
title: "[BUG]"
|
5
|
+
labels: bug
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
**Describe the issue**
|
11
|
+
A clear and concise description of the issue you're facing.
|
12
|
+
|
13
|
+
**To Reproduce**
|
14
|
+
Steps to reproduce the behaviour:
|
15
|
+
1. Go to '...'
|
16
|
+
2. Click on '....'
|
17
|
+
3. Scroll down to '....'
|
18
|
+
4. See error
|
19
|
+
|
20
|
+
**Expected behaviour**
|
21
|
+
A clear and concise description of what you expected to happen.
|
22
|
+
|
23
|
+
**Screenshots**
|
24
|
+
If applicable, add screenshots to help explain your problem.
|
25
|
+
|
26
|
+
**What team are you on?**
|
27
|
+
Please provide the name of your team.
|
28
|
+
|
29
|
+
**Helpful links (Logs, Link to Build, Repo, PR etc.)**
|
30
|
+
Please provide any helpful links for investigating the issue.
|
31
|
+
|
32
|
+
**Is there a Slack thread related to this bug?**
|
33
|
+
After submitting this issue, you can use: @spy github issues create_comment repo=minitest-distributed issue_id=$NEW_ISSUE_ID on any relevant Slack threads to save that information here.
|
34
|
+
|
35
|
+
**Additional context**
|
36
|
+
Add any other context about the problem here.
|
37
|
+
|
38
|
+
If possible, assign appropriate severity level, priority (high, medium, low) and difficulty (easy, normal, difficult) labels to the issue.
|
39
|
+
SEV-1 <24-72h - Critical issue that actively impacts multiple users/products.
|
40
|
+
SEV-2 <14 days - Limited impact app or major inconvenience to app users, workarounds available.
|
41
|
+
SEV-3 <60 days - Minor issue requiring action, but not affecting a users ability to use the app.
|
42
|
+
SEV-4 <180 days - Minimal impact but something the team wants to fix eventually.
|
43
|
+
SEV-5 No timeline - Cosmetic issue or bugs, no effect on user's ability to use tooling.
|
data/.github/workflows/ruby.yml
CHANGED
@@ -10,13 +10,35 @@ name: Ruby
|
|
10
10
|
on: push
|
11
11
|
|
12
12
|
jobs:
|
13
|
+
test_32:
|
14
|
+
runs-on: shopify-ubuntu-latest
|
15
|
+
container: ruby:3.2
|
16
|
+
|
17
|
+
services:
|
18
|
+
redis:
|
19
|
+
image: redis
|
20
|
+
toxiproxy:
|
21
|
+
image: ghcr.io/shopify/toxiproxy:2.5.0
|
22
|
+
|
23
|
+
steps:
|
24
|
+
- uses: actions/checkout@v2
|
25
|
+
- name: Install dependencies
|
26
|
+
run: gem install bundler && bundle install
|
27
|
+
- name: Run tests
|
28
|
+
run: bin/rake test
|
29
|
+
env:
|
30
|
+
REDIS_URL: redis://toxiproxy:22220
|
31
|
+
TOXIPROXY_HOST: http://toxiproxy:8474
|
32
|
+
|
13
33
|
test_31:
|
14
|
-
runs-on: ubuntu-latest
|
34
|
+
runs-on: shopify-ubuntu-latest
|
15
35
|
container: ruby:3.1
|
16
36
|
|
17
37
|
services:
|
18
38
|
redis:
|
19
39
|
image: redis
|
40
|
+
toxiproxy:
|
41
|
+
image: ghcr.io/shopify/toxiproxy:2.5.0
|
20
42
|
|
21
43
|
steps:
|
22
44
|
- uses: actions/checkout@v2
|
@@ -25,15 +47,18 @@ jobs:
|
|
25
47
|
- name: Run tests
|
26
48
|
run: bin/rake test
|
27
49
|
env:
|
28
|
-
REDIS_URL: redis://
|
50
|
+
REDIS_URL: redis://toxiproxy:22220
|
51
|
+
TOXIPROXY_HOST: http://toxiproxy:8474
|
29
52
|
|
30
53
|
test_30:
|
31
|
-
runs-on: ubuntu-latest
|
54
|
+
runs-on: shopify-ubuntu-latest
|
32
55
|
container: ruby:3.0
|
33
56
|
|
34
57
|
services:
|
35
58
|
redis:
|
36
59
|
image: redis
|
60
|
+
toxiproxy:
|
61
|
+
image: ghcr.io/shopify/toxiproxy:2.5.0
|
37
62
|
|
38
63
|
steps:
|
39
64
|
- uses: actions/checkout@v2
|
@@ -42,15 +67,18 @@ jobs:
|
|
42
67
|
- name: Run tests
|
43
68
|
run: bin/rake test
|
44
69
|
env:
|
45
|
-
REDIS_URL: redis://
|
70
|
+
REDIS_URL: redis://toxiproxy:22220
|
71
|
+
TOXIPROXY_HOST: http://toxiproxy:8474
|
46
72
|
|
47
73
|
test_27:
|
48
|
-
runs-on: ubuntu-latest
|
74
|
+
runs-on: shopify-ubuntu-latest
|
49
75
|
container: ruby:2.7
|
50
76
|
|
51
77
|
services:
|
52
78
|
redis:
|
53
79
|
image: redis
|
80
|
+
toxiproxy:
|
81
|
+
image: ghcr.io/shopify/toxiproxy:2.5.0
|
54
82
|
|
55
83
|
steps:
|
56
84
|
- uses: actions/checkout@v2
|
@@ -59,10 +87,11 @@ jobs:
|
|
59
87
|
- name: Run tests
|
60
88
|
run: bin/rake test
|
61
89
|
env:
|
62
|
-
REDIS_URL: redis://
|
90
|
+
REDIS_URL: redis://toxiproxy:22220
|
91
|
+
TOXIPROXY_HOST: http://toxiproxy:8474
|
63
92
|
|
64
93
|
typecheck:
|
65
|
-
runs-on: ubuntu-latest
|
94
|
+
runs-on: shopify-ubuntu-latest
|
66
95
|
container: ruby:2.7
|
67
96
|
steps:
|
68
97
|
- uses: actions/checkout@v2
|
@@ -72,8 +101,8 @@ jobs:
|
|
72
101
|
run: bin/srb tc
|
73
102
|
|
74
103
|
lint:
|
75
|
-
runs-on: ubuntu-latest
|
76
|
-
container: ruby:2
|
104
|
+
runs-on: shopify-ubuntu-latest
|
105
|
+
container: ruby:3.2
|
77
106
|
steps:
|
78
107
|
- uses: actions/checkout@v2
|
79
108
|
- name: Install dependencies
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[About this repo](#about-this-repo) | [Commands](#commands) | [How to use this repo](#how-to-use-this-repo) | [Contribute to this repo](#contribute-to-this-repo) | [License](#license)
|
6
6
|
|
7
7
|
## About this repo
|
8
|
-
**Introduction:**
|
8
|
+
**Introduction:**
|
9
9
|
|
10
10
|
`minitest-distributed` is a plugin for [minitest](https://github.com/seattlerb/minitest)
|
11
11
|
for executing tests on a distributed set of unreliable workers.
|
@@ -87,11 +87,11 @@ them to fail.
|
|
87
87
|
- `--worker-id=IDENTIFIER` or `ENV[MINITEST_WORKER_ID]`: The ID of the worker,
|
88
88
|
which should be unique to the cluster. We will default to a UUID if this is
|
89
89
|
not set, which generally is fine.
|
90
|
-
- `--exclude-file=PATH_TO_FILE`: Specify a file of tests to be excluded
|
91
|
-
from running. The file should include test identifiers seperated by
|
90
|
+
- `--exclude-file=PATH_TO_FILE`: Specify a file of tests to be excluded
|
91
|
+
from running. The file should include test identifiers seperated by
|
92
92
|
newlines.
|
93
93
|
- `--include-file=PATH_TO_FILE`: Specify a file of tests to be included in
|
94
|
-
the test run. The file should include test identifiers seperated by
|
94
|
+
the test run. The file should include test identifiers seperated by
|
95
95
|
newlines.
|
96
96
|
|
97
97
|
**Limitations**
|
@@ -124,7 +124,7 @@ To bootstrap a local development environment:
|
|
124
124
|
- Start a Redis server by running `redis-server`, assuming you have Redis
|
125
125
|
installed locally and the binary is on your `PATH`. Alternatively, you can
|
126
126
|
set the `REDIS_URL` environment variable to point to a Redis instance running
|
127
|
-
elsewhere.
|
127
|
+
elsewhere. You can also use `docker-compose up` with the provided `docker-compose.yml`.
|
128
128
|
- Now, run `bin/rake test` to run the tests, and verify everything is working.
|
129
129
|
- You can also run `bin/console` for an interactive prompt that will allow you
|
130
130
|
to experiment.
|
data/bin/rake
CHANGED
@@ -9,8 +9,10 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
-
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
+
"../../Gemfile",
|
14
|
+
Pathname.new(__FILE__).realpath,
|
15
|
+
)
|
14
16
|
|
15
17
|
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
18
|
|
data/bin/rubocop
CHANGED
@@ -9,8 +9,10 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
-
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
+
"../../Gemfile",
|
14
|
+
Pathname.new(__FILE__).realpath,
|
15
|
+
)
|
14
16
|
|
15
17
|
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
18
|
|
data/bin/srb
CHANGED
@@ -9,8 +9,10 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
-
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
+
"../../Gemfile",
|
14
|
+
Pathname.new(__FILE__).realpath,
|
15
|
+
)
|
14
16
|
|
15
17
|
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
18
|
|
data/dev.yml
ADDED
data/docker-compose.yml
ADDED
@@ -79,6 +79,10 @@ module Minitest
|
|
79
79
|
configuration.include_file = file_path
|
80
80
|
end
|
81
81
|
|
82
|
+
opts.on("--[no-]shuffle-suites", "Shuffle test suites as well") do |enabled|
|
83
|
+
configuration.shuffle_suites = enabled
|
84
|
+
end
|
85
|
+
|
82
86
|
configuration
|
83
87
|
end
|
84
88
|
end
|
@@ -97,6 +101,7 @@ module Minitest
|
|
97
101
|
prop :progress, T::Boolean, default: false
|
98
102
|
prop :exclude_file, T.nilable(String)
|
99
103
|
prop :include_file, T.nilable(String)
|
104
|
+
prop :shuffle_suites, T::Boolean, default: true
|
100
105
|
|
101
106
|
sig { returns(Coordinators::CoordinatorInterface) }
|
102
107
|
def coordinator
|
@@ -83,9 +83,18 @@ module Minitest
|
|
83
83
|
sig { override.returns(ResultAggregate) }
|
84
84
|
def combined_results
|
85
85
|
@combined_results ||= begin
|
86
|
-
stats_as_string = redis.mget(
|
87
|
-
key("
|
88
|
-
key("
|
86
|
+
stats_as_string = redis.mget(
|
87
|
+
key("runs"),
|
88
|
+
key("assertions"),
|
89
|
+
key("passes"),
|
90
|
+
key("failures"),
|
91
|
+
key("errors"),
|
92
|
+
key("skips"),
|
93
|
+
key("requeues"),
|
94
|
+
key("discards"),
|
95
|
+
key("acks"),
|
96
|
+
key("size"),
|
97
|
+
)
|
89
98
|
|
90
99
|
ResultAggregate.new(
|
91
100
|
max_failures: configuration.max_failures,
|
@@ -279,8 +288,14 @@ module Minitest
|
|
279
288
|
|
280
289
|
sig { params(block: Integer).returns(T::Array[EnqueuedRunnable]) }
|
281
290
|
def claim_fresh_runnables(block:)
|
282
|
-
result = redis.xreadgroup(
|
283
|
-
|
291
|
+
result = redis.xreadgroup(
|
292
|
+
group_name,
|
293
|
+
configuration.worker_id,
|
294
|
+
stream_key,
|
295
|
+
">",
|
296
|
+
block: block,
|
297
|
+
count: configuration.test_batch_size,
|
298
|
+
)
|
284
299
|
EnqueuedRunnable.from_redis_stream_claim(result.fetch(stream_key, []), configuration: configuration)
|
285
300
|
end
|
286
301
|
|
@@ -293,8 +308,13 @@ module Minitest
|
|
293
308
|
def xclaim_messages(pending_messages, max_idle_time_ms:)
|
294
309
|
return [] if pending_messages.empty?
|
295
310
|
|
296
|
-
claimed = redis.xclaim(
|
297
|
-
|
311
|
+
claimed = redis.xclaim(
|
312
|
+
stream_key,
|
313
|
+
group_name,
|
314
|
+
configuration.worker_id,
|
315
|
+
max_idle_time_ms,
|
316
|
+
pending_messages.keys,
|
317
|
+
)
|
298
318
|
|
299
319
|
EnqueuedRunnable.from_redis_stream_claim(claimed, pending_messages, configuration: configuration)
|
300
320
|
end
|
@@ -421,10 +441,19 @@ module Minitest
|
|
421
441
|
pipeline.incrby(key("size"), results.size)
|
422
442
|
end
|
423
443
|
|
424
|
-
@combined_results = ResultAggregate.new(
|
425
|
-
|
426
|
-
|
427
|
-
|
444
|
+
@combined_results = ResultAggregate.new(
|
445
|
+
max_failures: configuration.max_failures,
|
446
|
+
runs: updated[0],
|
447
|
+
assertions: updated[1],
|
448
|
+
passes: updated[2],
|
449
|
+
failures: updated[3],
|
450
|
+
errors: updated[4],
|
451
|
+
skips: updated[5],
|
452
|
+
requeues: updated[6],
|
453
|
+
discards: updated[7],
|
454
|
+
acks: updated[8],
|
455
|
+
size: updated[9],
|
456
|
+
)
|
428
457
|
end
|
429
458
|
|
430
459
|
sig { params(name: String).returns(String) }
|
@@ -203,7 +203,7 @@ module Minitest
|
|
203
203
|
sig do
|
204
204
|
params(
|
205
205
|
initial_result: Minitest::Result,
|
206
|
-
block: T.proc.params(arg0: Minitest::Result).returns(EnqueuedRunnable::Result::Commit)
|
206
|
+
block: T.proc.params(arg0: Minitest::Result).returns(EnqueuedRunnable::Result::Commit),
|
207
207
|
).returns(EnqueuedRunnable::Result)
|
208
208
|
end
|
209
209
|
def commit_result(initial_result, &block)
|
@@ -78,11 +78,10 @@ module Minitest
|
|
78
78
|
def add_tests_to(testsuites, suite, results)
|
79
79
|
# TODO: make path relative to project root
|
80
80
|
relative_path = T.must(results.first).source_location.first
|
81
|
-
lineno = T.must(results.first).source_location.last
|
82
81
|
|
83
82
|
testsuite = testsuites.add_element(
|
84
83
|
"testsuite",
|
85
|
-
{ "name" => suite, "filepath" => relative_path }.merge(aggregate_suite_results(results))
|
84
|
+
{ "name" => suite, "filepath" => relative_path }.merge(aggregate_suite_results(results)),
|
86
85
|
)
|
87
86
|
|
88
87
|
results.each do |test|
|
@@ -93,6 +92,7 @@ module Minitest
|
|
93
92
|
"time" => test.time,
|
94
93
|
# 'run-command' => ... # TODO
|
95
94
|
}
|
95
|
+
lineno = test.source_location.last
|
96
96
|
attributes["lineno"] = lineno if lineno != -1
|
97
97
|
|
98
98
|
testcase_tag = testsuite.add_element("testcase", attributes)
|
@@ -107,9 +107,11 @@ module Minitest
|
|
107
107
|
# noop
|
108
108
|
when ResultType::Error, ResultType::Failed
|
109
109
|
failure = T.must(result.failure)
|
110
|
-
failure_tag = testcase.add_element(
|
110
|
+
failure_tag = testcase.add_element(
|
111
|
+
"failure",
|
111
112
|
"type" => result_type.serialize,
|
112
|
-
"message" => truncate_message(failure.message)
|
113
|
+
"message" => truncate_message(failure.message),
|
114
|
+
)
|
113
115
|
failure_tag.add_text(REXML::CData.new(result.to_s))
|
114
116
|
else
|
115
117
|
T.absurd(result_type)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Minitest
|
5
|
+
module Distributed
|
6
|
+
module Reporters
|
7
|
+
class TestOrderReporter < Minitest::Reporter
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig { params(io: IO, options: T::Hash[Symbol, T.untyped]).void }
|
11
|
+
def initialize(io, options)
|
12
|
+
super
|
13
|
+
@path = T.let(options.fetch(:test_order_file), String)
|
14
|
+
@file = T.let(nil, T.nilable(File))
|
15
|
+
end
|
16
|
+
|
17
|
+
sig { void }
|
18
|
+
def start
|
19
|
+
@file = File.open(@path, "w+")
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { override.params(klass: Class, name: String).void }
|
24
|
+
def prerecord(klass, name)
|
25
|
+
T.must(@file).puts("#{klass}##{name}")
|
26
|
+
T.must(@file).flush
|
27
|
+
end
|
28
|
+
|
29
|
+
sig { override.void }
|
30
|
+
def report
|
31
|
+
T.must(@file).close
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -27,7 +27,9 @@ module Minitest
|
|
27
27
|
"\n\nThe test took %0.3fs to run, longer than the test timeout which is configured to be %0.1fs.\n" \
|
28
28
|
"Another worker likely claimed ownership of this test, and will commit the result instead.\n" \
|
29
29
|
"For best results, make sure that all your tests finish within %0.1fs.",
|
30
|
-
result.time,
|
30
|
+
result.time,
|
31
|
+
test_timeout_seconds,
|
32
|
+
test_timeout_seconds,
|
31
33
|
)
|
32
34
|
end
|
33
35
|
|
@@ -36,11 +36,21 @@ module Minitest
|
|
36
36
|
|
37
37
|
sig { returns(T::Array[Minitest::Runnable]) }
|
38
38
|
def discover_tests
|
39
|
-
|
39
|
+
runnables.flat_map do |runnable|
|
40
40
|
runnable.runnable_methods.map { |method_name| runnable.new(method_name) }
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
sig { returns(T::Array[T.class_of(Minitest::Runnable)]) }
|
45
|
+
def runnables
|
46
|
+
if options[:distributed].shuffle_suites
|
47
|
+
srand(Minitest.seed)
|
48
|
+
Minitest::Runnable.runnables.shuffle
|
49
|
+
else
|
50
|
+
Minitest::Runnable.runnables
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
44
54
|
sig { params(tests: T::Array[Minitest::Runnable]).returns(T::Array[Minitest::Runnable]) }
|
45
55
|
def select_tests(tests)
|
46
56
|
return tests if filters.empty?
|
@@ -8,10 +8,17 @@ module Minitest
|
|
8
8
|
extend T::Sig
|
9
9
|
|
10
10
|
def plugin_distributed_options(opts, options)
|
11
|
+
continuous_integration = ENV.fetch("CI", "false") == "true"
|
12
|
+
options[:disable_distributed] = !continuous_integration
|
13
|
+
|
11
14
|
opts.on("--disable-distributed", "Disable the distributed plugin") do
|
12
15
|
options[:disable_distributed] = true
|
13
16
|
end
|
14
17
|
|
18
|
+
opts.on("--enable-distributed", "Enable the distributed plugin") do
|
19
|
+
options[:disable_distributed] = false
|
20
|
+
end
|
21
|
+
|
15
22
|
options[:distributed] = Minitest::Distributed::Configuration.from_command_line_options(opts, options)
|
16
23
|
end
|
17
24
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Minitest
|
5
|
+
class << self
|
6
|
+
def plugin_test_order_options(opts, options)
|
7
|
+
options[:test_order_file] = ENV["MINITEST_TEST_ORDER"]
|
8
|
+
|
9
|
+
opts.on("--test_order=PATH", "Log order of tests executed to provided file.") do |path|
|
10
|
+
options[:test_order_file] = path
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def plugin_test_order_init(options)
|
15
|
+
return if options[:test_order_file].nil?
|
16
|
+
|
17
|
+
require_relative "distributed/reporters/test_order_reporter"
|
18
|
+
reporter << Minitest::Distributed::Reporters::TestOrderReporter.new(options[:io], options)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/sorbet/config
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
# This file is autogenerated. Do not edit it by hand. Regenerate it with:
|
2
|
+
# srb rbi gems
|
3
|
+
|
4
|
+
# typed: strict
|
5
|
+
#
|
6
|
+
# If you would like to make changes to this file, great! Please create the gem's shim here:
|
7
|
+
#
|
8
|
+
# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ast/all/ast.rbi
|
9
|
+
#
|
10
|
+
# ast-2.4.2
|
11
|
+
|
12
|
+
module AST
|
13
|
+
end
|
14
|
+
class AST::Node
|
15
|
+
def +(array); end
|
16
|
+
def <<(element); end
|
17
|
+
def ==(other); end
|
18
|
+
def append(element); end
|
19
|
+
def assign_properties(properties); end
|
20
|
+
def children; end
|
21
|
+
def clone; end
|
22
|
+
def concat(array); end
|
23
|
+
def deconstruct; end
|
24
|
+
def dup; end
|
25
|
+
def eql?(other); end
|
26
|
+
def fancy_type; end
|
27
|
+
def hash; end
|
28
|
+
def initialize(type, children = nil, properties = nil); end
|
29
|
+
def inspect(indent = nil); end
|
30
|
+
def original_dup; end
|
31
|
+
def to_a; end
|
32
|
+
def to_ast; end
|
33
|
+
def to_s(indent = nil); end
|
34
|
+
def to_sexp(indent = nil); end
|
35
|
+
def to_sexp_array; end
|
36
|
+
def type; end
|
37
|
+
def updated(type = nil, children = nil, properties = nil); end
|
38
|
+
end
|
39
|
+
class AST::Processor
|
40
|
+
include AST::Processor::Mixin
|
41
|
+
end
|
42
|
+
module AST::Processor::Mixin
|
43
|
+
def handler_missing(node); end
|
44
|
+
def process(node); end
|
45
|
+
def process_all(nodes); end
|
46
|
+
end
|
47
|
+
module AST::Sexp
|
48
|
+
def s(type, *children); end
|
49
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# This file is autogenerated. Do not edit it by hand. Regenerate it with:
|
2
|
+
# srb rbi gems
|
3
|
+
|
4
|
+
# typed: strict
|
5
|
+
#
|
6
|
+
# If you would like to make changes to this file, great! Please create the gem's shim here:
|
7
|
+
#
|
8
|
+
# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/connection_pool/all/connection_pool.rbi
|
9
|
+
#
|
10
|
+
# connection_pool-2.3.0
|
11
|
+
|
12
|
+
class ConnectionPool
|
13
|
+
def available; end
|
14
|
+
def checkin; end
|
15
|
+
def checkout(options = nil); end
|
16
|
+
def initialize(options = nil, &block); end
|
17
|
+
def reload(&block); end
|
18
|
+
def self.wrap(options, &block); end
|
19
|
+
def shutdown(&block); end
|
20
|
+
def size; end
|
21
|
+
def then(options = nil); end
|
22
|
+
def with(options = nil); end
|
23
|
+
end
|
24
|
+
class ConnectionPool::TimedStack
|
25
|
+
def <<(obj, options = nil); end
|
26
|
+
def connection_stored?(options = nil); end
|
27
|
+
def current_time; end
|
28
|
+
def empty?; end
|
29
|
+
def fetch_connection(options = nil); end
|
30
|
+
def initialize(size = nil, &block); end
|
31
|
+
def length; end
|
32
|
+
def max; end
|
33
|
+
def pop(timeout = nil, options = nil); end
|
34
|
+
def push(obj, options = nil); end
|
35
|
+
def shutdown(reload: nil, &block); end
|
36
|
+
def shutdown_connections(options = nil); end
|
37
|
+
def store_connection(obj, options = nil); end
|
38
|
+
def try_create(options = nil); end
|
39
|
+
end
|
40
|
+
class ConnectionPool::Wrapper < BasicObject
|
41
|
+
def initialize(options = nil, &block); end
|
42
|
+
def method_missing(name, *args, **kwargs, &block); end
|
43
|
+
def pool_available; end
|
44
|
+
def pool_shutdown(&block); end
|
45
|
+
def pool_size; end
|
46
|
+
def respond_to?(id, *args); end
|
47
|
+
def with(&block); end
|
48
|
+
def wrapped_pool; end
|
49
|
+
end
|
50
|
+
class ConnectionPool::Error < RuntimeError
|
51
|
+
end
|
52
|
+
class ConnectionPool::PoolShuttingDownError < ConnectionPool::Error
|
53
|
+
end
|
54
|
+
class ConnectionPool::TimeoutError < Timeout::Error
|
55
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This file is autogenerated. Do not edit it by hand. Regenerate it with:
|
2
|
+
# srb rbi gems
|
3
|
+
|
4
|
+
# typed: strict
|
5
|
+
#
|
6
|
+
# If you would like to make changes to this file, great! Please create the gem's shim here:
|
7
|
+
#
|
8
|
+
# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/minitest-distributed/all/minitest-distributed.rbi
|
9
|
+
#
|
10
|
+
# minitest-distributed-0.2.8
|
11
|
+
|
12
|
+
module Minitest
|
13
|
+
def self.plugin_junitxml_init(options); end
|
14
|
+
def self.plugin_junitxml_options(opts, options); end
|
15
|
+
end
|