minitest-distributed 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +48 -0
  3. data/.gitignore +8 -0
  4. data/.rubocop.yml +63 -0
  5. data/.travis.yml +6 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +12 -0
  8. data/Gemfile.lock +53 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +115 -0
  11. data/Rakefile +12 -0
  12. data/bin/console +15 -0
  13. data/bin/rake +29 -0
  14. data/bin/rubocop +29 -0
  15. data/bin/setup +8 -0
  16. data/bin/srb +29 -0
  17. data/lib/minitest/distributed.rb +36 -0
  18. data/lib/minitest/distributed/configuration.rb +53 -0
  19. data/lib/minitest/distributed/coordinators/coordinator_interface.rb +29 -0
  20. data/lib/minitest/distributed/coordinators/memory_coordinator.rb +67 -0
  21. data/lib/minitest/distributed/coordinators/redis_coordinator.rb +387 -0
  22. data/lib/minitest/distributed/enqueued_runnable.rb +88 -0
  23. data/lib/minitest/distributed/filters/exclude_filter.rb +35 -0
  24. data/lib/minitest/distributed/filters/filter_interface.rb +25 -0
  25. data/lib/minitest/distributed/filters/include_filter.rb +35 -0
  26. data/lib/minitest/distributed/reporters/distributed_progress_reporter.rb +76 -0
  27. data/lib/minitest/distributed/reporters/distributed_summary_reporter.rb +48 -0
  28. data/lib/minitest/distributed/reporters/redis_coordinator_warnings_reporter.rb +61 -0
  29. data/lib/minitest/distributed/result_aggregate.rb +67 -0
  30. data/lib/minitest/distributed/result_type.rb +28 -0
  31. data/lib/minitest/distributed/test_runner.rb +37 -0
  32. data/lib/minitest/distributed/test_selector.rb +54 -0
  33. data/lib/minitest/distributed/version.rb +8 -0
  34. data/lib/minitest/distributed_plugin.rb +51 -0
  35. data/minitest-distributed.gemspec +50 -0
  36. data/sorbet/config +2 -0
  37. data/sorbet/rbi/minitest.rbi +238 -0
  38. data/sorbet/rbi/rbconfig.rbi +6 -0
  39. data/sorbet/rbi/redis.rbi +70 -0
  40. data/sorbet/rbi/winsize.rbi +7 -0
  41. metadata +142 -0
@@ -0,0 +1,6 @@
1
+ # typed: true
2
+ module RbConfig
3
+ sig { returns(String) }
4
+ def self.ruby
5
+ end
6
+ end
@@ -0,0 +1,70 @@
1
+ # typed: true
2
+
3
+ class Redis
4
+ class Error < StandardError
5
+ end
6
+
7
+ class CommandError < Error
8
+ end
9
+
10
+ sig { params(options: T::Hash[Symbol, T.untyped]).void }
11
+ def initialize(options); end
12
+
13
+ sig { void }
14
+ def flushdb; end
15
+
16
+ sig { params(block: T.proc.void).returns(T::Array[T.untyped]) }
17
+ def pipelined(&block); end
18
+
19
+ sig { params(block: T.proc.void).returns(T::Array[T.untyped]) }
20
+ def multi(&block); end
21
+
22
+ sig { params(script: String, keys: T::Array[String], argv: T::Array[String]).returns(T.untyped) }
23
+ def eval(script, keys: [], argv: []); end
24
+
25
+ sig { params(script_sha: String, keys: T::Array[String], argv: T::Array[String]).returns(T.untyped) }
26
+ def evalsha(script_sha, keys: [], argv: []); end
27
+
28
+ sig { params(action: Symbol, script: String).returns(String) }
29
+ def script(action, script); end
30
+
31
+ sig { params(key: String).returns(String) }
32
+ def get(key); end
33
+
34
+ sig { params(keys: String).void }
35
+ def del(*keys); end
36
+
37
+ sig { params(keys: String).returns(T::Array[T.nilable(String)]) }
38
+ def mget(*keys); end
39
+
40
+ sig { params(key: String, value: T.untyped).void }
41
+ def set(key, value); end
42
+
43
+ sig { params(key: String, value: T.untyped).returns(T::Boolean) }
44
+ def setnx(key, value); end
45
+
46
+ sig { params(key_value_pairs: T.untyped).returns(T::Boolean) }
47
+ def mset(*key_value_pairs); end
48
+
49
+ sig { params(key_value_pairs: T.untyped).returns(T::Boolean) }
50
+ def msetnx(*key_value_pairs); end
51
+
52
+ sig { params(key: String).void }
53
+ def incr(key); end
54
+
55
+ sig { params(key: String, value: T.untyped).void }
56
+ def lpush(key, value); end
57
+
58
+ sig { params(key: String, start: Integer, stop: Integer).void }
59
+ def lrange(key, start, stop); end
60
+
61
+ sig { params(key: String, amount: Integer).void }
62
+ def incrby(key, amount); end
63
+
64
+ def xadd(*); end
65
+ def xack(*); end
66
+ def xgroup(*); end
67
+ def xpending(*); end
68
+ def xreadgroup(*); end
69
+ def xclaim(*); end
70
+ end
@@ -0,0 +1,7 @@
1
+ class IO
2
+ sig { returns([Integer, Integer]) }
3
+ def winsize; end
4
+
5
+ sig { returns(IO) }
6
+ def self.console; end
7
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minitest-distributed
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Willem van Bergen
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-06-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.12'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: redis
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sorbet-runtime
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: |
56
+ minitest-distributed is a plugin for minitest for executing tests on a
57
+ distributed set of unreliable workers.
58
+
59
+ When a test suite grows large enough, it inevitable gets too slow to run
60
+ on a single machine to give timely feedback to developers. This plugins
61
+ combats this issue by distributing the full test suite to a set of workers.
62
+ Every worker is a consuming from a single queue, so the tests get evenly
63
+ distributed and all workers will finish around the same time. Redis is used
64
+ as coordinator, but when using this plugin without having access to Redis,
65
+ it will use an in-memory coordinator.
66
+
67
+ Using multiple (virtual) machines for a test run is an (additional) source
68
+ of flakiness. To combat flakiness, minitest-distributed implements resiliency
69
+ patterns, like re-running a test on a different worker on failure, and
70
+ a circuit breaker for misbehaving workers.
71
+ email:
72
+ - willem@vanbergen.org
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".github/workflows/ruby.yml"
78
+ - ".gitignore"
79
+ - ".rubocop.yml"
80
+ - ".travis.yml"
81
+ - CODE_OF_CONDUCT.md
82
+ - Gemfile
83
+ - Gemfile.lock
84
+ - LICENSE.txt
85
+ - README.md
86
+ - Rakefile
87
+ - bin/console
88
+ - bin/rake
89
+ - bin/rubocop
90
+ - bin/setup
91
+ - bin/srb
92
+ - lib/minitest/distributed.rb
93
+ - lib/minitest/distributed/configuration.rb
94
+ - lib/minitest/distributed/coordinators/coordinator_interface.rb
95
+ - lib/minitest/distributed/coordinators/memory_coordinator.rb
96
+ - lib/minitest/distributed/coordinators/redis_coordinator.rb
97
+ - lib/minitest/distributed/enqueued_runnable.rb
98
+ - lib/minitest/distributed/filters/exclude_filter.rb
99
+ - lib/minitest/distributed/filters/filter_interface.rb
100
+ - lib/minitest/distributed/filters/include_filter.rb
101
+ - lib/minitest/distributed/reporters/distributed_progress_reporter.rb
102
+ - lib/minitest/distributed/reporters/distributed_summary_reporter.rb
103
+ - lib/minitest/distributed/reporters/redis_coordinator_warnings_reporter.rb
104
+ - lib/minitest/distributed/result_aggregate.rb
105
+ - lib/minitest/distributed/result_type.rb
106
+ - lib/minitest/distributed/test_runner.rb
107
+ - lib/minitest/distributed/test_selector.rb
108
+ - lib/minitest/distributed/version.rb
109
+ - lib/minitest/distributed_plugin.rb
110
+ - minitest-distributed.gemspec
111
+ - sorbet/config
112
+ - sorbet/rbi/minitest.rbi
113
+ - sorbet/rbi/rbconfig.rbi
114
+ - sorbet/rbi/redis.rbi
115
+ - sorbet/rbi/winsize.rbi
116
+ homepage: https://github.com/Shopify/minitest-distributed
117
+ licenses:
118
+ - MIT
119
+ metadata:
120
+ allowed_push_host: https://rubygems.org
121
+ homepage_uri: https://github.com/Shopify/minitest-distributed
122
+ source_code_uri: https://github.com/Shopify/minitest-distributed
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 2.3.0
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubygems_version: 3.0.3
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Distributed test executor plugin for Minitest
142
+ test_files: []