flatware 2.2.1 → 2.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/lib/flatware/cli.rb +2 -2
- data/lib/flatware/sink/signal.rb +82 -0
- data/lib/flatware/sink.rb +9 -23
- data/lib/flatware/version.rb +1 -1
- metadata +3 -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
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Flatware
|
2
|
+
module Sink
|
3
|
+
class Signal
|
4
|
+
Message = Struct.new(:message)
|
5
|
+
|
6
|
+
attr_reader :formatter
|
7
|
+
|
8
|
+
def initialize(formatter, &on_interrupt)
|
9
|
+
@formatter = formatter
|
10
|
+
Thread.main[:signals] = Queue.new
|
11
|
+
|
12
|
+
@on_interrupt = on_interrupt
|
13
|
+
end
|
14
|
+
|
15
|
+
def listen
|
16
|
+
Thread.new(&method(:handle_signals))
|
17
|
+
|
18
|
+
::Signal.trap('INT') { signals << :int }
|
19
|
+
::Signal.trap('CLD') do
|
20
|
+
signals << :cld if child_failed?
|
21
|
+
end
|
22
|
+
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.listen(formatter, &block)
|
27
|
+
new(formatter, &block).listen
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
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
|
+
|
55
|
+
def handle_signals
|
56
|
+
signal_message(signals.pop) do
|
57
|
+
Process.waitall
|
58
|
+
@on_interrupt.call
|
59
|
+
end
|
60
|
+
|
61
|
+
abort
|
62
|
+
end
|
63
|
+
|
64
|
+
def signal_message(signal)
|
65
|
+
formatter.message(Message.new(format(<<~MESSAGE, { cld: 'A worker died', int: 'Interrupted' }.fetch(signal))))
|
66
|
+
|
67
|
+
%s!
|
68
|
+
|
69
|
+
Waiting for workers to finish their current jobs...
|
70
|
+
MESSAGE
|
71
|
+
|
72
|
+
yield
|
73
|
+
|
74
|
+
formatter.message(Message.new('done.'))
|
75
|
+
end
|
76
|
+
|
77
|
+
def signals
|
78
|
+
Thread.main[:signals]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/flatware/sink.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'drb/drb'
|
2
2
|
require 'set'
|
3
|
+
require 'flatware/sink/signal'
|
3
4
|
|
4
5
|
module Flatware
|
5
6
|
module Sink
|
@@ -24,6 +25,7 @@ module Flatware
|
|
24
25
|
@checkpoints = []
|
25
26
|
@completed_jobs = []
|
26
27
|
@formatter = formatter
|
28
|
+
@interrupted = false
|
27
29
|
@jobs = group_jobs(jobs, worker_count).freeze
|
28
30
|
@queue = @jobs.dup
|
29
31
|
@sink = sink
|
@@ -31,16 +33,16 @@ module Flatware
|
|
31
33
|
end
|
32
34
|
|
33
35
|
def start
|
34
|
-
|
36
|
+
Signal.listen(formatter, &method(:on_interrupt))
|
35
37
|
formatter.jobs jobs
|
36
38
|
DRb.start_service(sink, self, verbose: Flatware.verbose?)
|
37
39
|
DRb.thread.join
|
38
|
-
!failures?
|
40
|
+
!(failures? || interrupted?)
|
39
41
|
end
|
40
42
|
|
41
43
|
def ready(worker)
|
42
44
|
job = queue.shift
|
43
|
-
if job && !(remaining_work.empty? ||
|
45
|
+
if job && !(remaining_work.empty? || interrupted?)
|
44
46
|
workers << worker
|
45
47
|
job
|
46
48
|
else
|
@@ -72,29 +74,13 @@ module Flatware
|
|
72
74
|
|
73
75
|
private
|
74
76
|
|
75
|
-
def
|
76
|
-
|
77
|
-
|
78
|
-
Thread.new(&method(:handle_interrupt))
|
79
|
-
|
80
|
-
trap 'INT' do
|
81
|
-
Thread.main[:signals] << :int
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def handle_interrupt
|
86
|
-
Thread.main[:signals].pop
|
87
|
-
puts 'Interrupted!'
|
77
|
+
def on_interrupt
|
78
|
+
@interrupted = true
|
88
79
|
summarize_remaining
|
89
|
-
puts "\n\nCleaning up. Please wait...\n"
|
90
|
-
Process.waitall
|
91
|
-
puts 'done.'
|
92
|
-
abort
|
93
80
|
end
|
94
81
|
|
95
|
-
def
|
96
|
-
|
97
|
-
signals && !signals.empty?
|
82
|
+
def interrupted?
|
83
|
+
@interrupted
|
98
84
|
end
|
99
85
|
|
100
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.2
|
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
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- lib/flatware/serialized_exception.rb
|
46
46
|
- lib/flatware/sink.rb
|
47
47
|
- lib/flatware/sink/client.rb
|
48
|
+
- lib/flatware/sink/signal.rb
|
48
49
|
- lib/flatware/version.rb
|
49
50
|
- lib/flatware/worker.rb
|
50
51
|
homepage: http://github.com/briandunn/flatware
|