flatware 2.3.1 → 2.3.2
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
- data/README.md +3 -3
- data/lib/flatware/cli.rb +2 -2
- data/lib/flatware/sink/signal.rb +45 -14
- data/lib/flatware/sink.rb +11 -5
- data/lib/flatware/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4e66ab27a1e76fc9ca919c9b9de35006f88317cb6b5bf6f1b136b1b7eabc368
|
4
|
+
data.tar.gz: d16310a202a40d0e1a4147d31e1c97c8cc590f5d1b009b2576cefb9e79e47735
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e1b6e794216a3724966e1465990d89a6d8d33f2ef2d58248b7ccb35e16451ad3f675c9b4f630135b9d4fbc61a75e4be32b844ee8758f1e9975dc80ffd13b32a
|
7
|
+
data.tar.gz: 341abe2ae2e05e2105f3de801fb8e8bd044028bc75a21529d4f5b2d1aab20b943d0b4d860cfff432e1f234d91dbd662db23c664543e3dd2ad2b8b2b95d315738
|
data/README.md
CHANGED
@@ -40,13 +40,13 @@ $ flatware rspec
|
|
40
40
|
|
41
41
|
The rspec runner can balance worker loads, making your suite even faster.
|
42
42
|
|
43
|
-
It forms
|
43
|
+
It forms balanced groups of spec files according to their last run times, if you've set `example_status_persistence_file_path` [in your RSpec config](https://relishapp.com/rspec/rspec-core/v/3-8/docs/command-line/only-failures).
|
44
44
|
|
45
|
-
For this to work the configuration option must be loaded before any specs are run. The `.rspec` file is one way to
|
45
|
+
For this to work the configuration option must be loaded before any specs are run. The `.rspec` file is one way to achieve this:
|
46
46
|
|
47
47
|
--require spec_helper
|
48
48
|
|
49
|
-
But beware, if you're using ActiveRecord in your suite you'll need to avoid doing things that cause it to establish a database connection in `spec_helper.rb`. If ActiveRecord connects before flatware forks off workers, each will die messily. All of this will just work if you're following [the
|
49
|
+
But beware, if you're using ActiveRecord in your suite you'll need to avoid doing things that cause it to establish a database connection in `spec_helper.rb`. If ActiveRecord connects before flatware forks off workers, each will die messily. All of this will just work if you're following [the recommended pattern of splitting your helpers into `spec_helper` and `rails_helper`](https://github.com/rspec/rspec-rails/blob/v3.8.2/lib/generators/rspec/install/templates/spec/rails_helper.rb). Another option is to use [the configurable hooks](
|
50
50
|
#faster-startup-with-activerecord
|
51
51
|
).
|
52
52
|
|
data/lib/flatware/cli.rb
CHANGED
@@ -17,7 +17,7 @@ module Flatware
|
|
17
17
|
aliases: '-w',
|
18
18
|
type: :numeric,
|
19
19
|
default: processors,
|
20
|
-
desc: 'Number of
|
20
|
+
desc: 'Number of concurrent processes to run'
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
@@ -90,6 +90,6 @@ if loaded_flatware_gem_count.zero?
|
|
90
90
|
warn(
|
91
91
|
format(<<~MESSAGE, gem_list: flatware_gems.join(' or ')))
|
92
92
|
The flatware gem is a dependency of flatware runners for rspec and cucumber.
|
93
|
-
Install %<gem_list>s for more
|
93
|
+
Install %<gem_list>s for more useful commands.
|
94
94
|
MESSAGE
|
95
95
|
end
|
data/lib/flatware/sink/signal.rb
CHANGED
@@ -1,46 +1,77 @@
|
|
1
1
|
module Flatware
|
2
2
|
module Sink
|
3
3
|
class Signal
|
4
|
-
|
4
|
+
Message = Struct.new(:message)
|
5
|
+
|
6
|
+
attr_reader :formatter
|
7
|
+
|
8
|
+
def initialize(formatter, &on_interrupt)
|
9
|
+
@formatter = formatter
|
5
10
|
Thread.main[:signals] = Queue.new
|
6
11
|
|
7
12
|
@on_interrupt = on_interrupt
|
8
13
|
end
|
9
14
|
|
10
|
-
def interruped?
|
11
|
-
!signals.empty?
|
12
|
-
end
|
13
|
-
|
14
15
|
def listen
|
15
16
|
Thread.new(&method(:handle_signals))
|
16
17
|
|
17
18
|
::Signal.trap('INT') { signals << :int }
|
18
|
-
::Signal.trap('CLD')
|
19
|
+
::Signal.trap('CLD') do
|
20
|
+
signals << :cld if child_failed?
|
21
|
+
end
|
19
22
|
|
20
23
|
self
|
21
24
|
end
|
22
25
|
|
23
|
-
def self.listen(&block)
|
24
|
-
new(&block).listen
|
26
|
+
def self.listen(formatter, &block)
|
27
|
+
new(formatter, &block).listen
|
25
28
|
end
|
26
29
|
|
27
30
|
private
|
28
31
|
|
32
|
+
def child_status
|
33
|
+
_worker_pid, status = begin
|
34
|
+
Process.wait2(-1, Process::WNOHANG)
|
35
|
+
rescue Errno::ECHILD
|
36
|
+
[]
|
37
|
+
end
|
38
|
+
status
|
39
|
+
end
|
40
|
+
|
41
|
+
def child_statuses
|
42
|
+
statuses = []
|
43
|
+
loop do
|
44
|
+
status = child_status
|
45
|
+
return statuses unless status
|
46
|
+
|
47
|
+
statuses << status
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def child_failed?
|
52
|
+
child_statuses.any? { |status| !status.success? }
|
53
|
+
end
|
54
|
+
|
29
55
|
def handle_signals
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
56
|
+
signal_message(signals.pop) do
|
57
|
+
Process.waitall
|
58
|
+
@on_interrupt.call
|
59
|
+
end
|
60
|
+
|
34
61
|
abort
|
35
62
|
end
|
36
63
|
|
37
64
|
def signal_message(signal)
|
38
|
-
format(<<~MESSAGE, { cld: 'A worker died', int: 'Interrupted' }.fetch(signal))
|
65
|
+
formatter.message(Message.new(format(<<~MESSAGE, { cld: 'A worker died', int: 'Interrupted' }.fetch(signal))))
|
39
66
|
|
40
67
|
%s!
|
41
68
|
|
42
|
-
|
69
|
+
Waiting for workers to finish their current jobs...
|
43
70
|
MESSAGE
|
71
|
+
|
72
|
+
yield
|
73
|
+
|
74
|
+
formatter.message(Message.new('done.'))
|
44
75
|
end
|
45
76
|
|
46
77
|
def signals
|
data/lib/flatware/sink.rb
CHANGED
@@ -25,6 +25,7 @@ module Flatware
|
|
25
25
|
@checkpoints = []
|
26
26
|
@completed_jobs = []
|
27
27
|
@formatter = formatter
|
28
|
+
@interrupted = false
|
28
29
|
@jobs = group_jobs(jobs, worker_count).freeze
|
29
30
|
@queue = @jobs.dup
|
30
31
|
@sink = sink
|
@@ -32,16 +33,16 @@ module Flatware
|
|
32
33
|
end
|
33
34
|
|
34
35
|
def start
|
35
|
-
|
36
|
+
Signal.listen(formatter, &method(:on_interrupt))
|
36
37
|
formatter.jobs jobs
|
37
38
|
DRb.start_service(sink, self, verbose: Flatware.verbose?)
|
38
39
|
DRb.thread.join
|
39
|
-
!failures?
|
40
|
+
!(failures? || interrupted?)
|
40
41
|
end
|
41
42
|
|
42
43
|
def ready(worker)
|
43
44
|
job = queue.shift
|
44
|
-
if job && !(remaining_work.empty? ||
|
45
|
+
if job && !(remaining_work.empty? || interrupted?)
|
45
46
|
workers << worker
|
46
47
|
job
|
47
48
|
else
|
@@ -73,8 +74,13 @@ module Flatware
|
|
73
74
|
|
74
75
|
private
|
75
76
|
|
76
|
-
def
|
77
|
-
@
|
77
|
+
def on_interrupt
|
78
|
+
@interrupted = true
|
79
|
+
summarize_remaining
|
80
|
+
end
|
81
|
+
|
82
|
+
def interrupted?
|
83
|
+
@interrupted
|
78
84
|
end
|
79
85
|
|
80
86
|
def check_finished!
|
data/lib/flatware/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flatware
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Dunn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|