scout-gear 5.2.0 → 7.1.0
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/.vimproject +450 -440
- data/VERSION +1 -1
- data/lib/scout/exceptions.rb +22 -2
- data/lib/scout/log/color.rb +61 -10
- data/lib/scout/log/progress/report.rb +5 -4
- data/lib/scout/log/progress/util.rb +2 -0
- data/lib/scout/log/progress.rb +2 -0
- data/lib/scout/log.rb +5 -1
- data/lib/scout/misc/digest.rb +1 -3
- data/lib/scout/misc/monitor.rb +18 -0
- data/lib/scout/open/stream.rb +50 -19
- data/lib/scout/semaphore.rb +148 -0
- data/lib/scout/tsv/parser.rb +144 -0
- data/lib/scout/tsv.rb +14 -0
- data/lib/scout/work_queue/socket.rb +119 -0
- data/lib/scout/work_queue/worker.rb +59 -0
- data/lib/scout/work_queue.rb +113 -0
- data/lib/scout/workflow/step/info.rb +2 -2
- data/lib/scout/workflow/step.rb +2 -1
- data/lib/scout/workflow/task.rb +2 -2
- data/scout-gear.gemspec +18 -3
- data/share/color/color_names +507 -0
- data/share/color/diverging_colors.hex +12 -0
- data/test/scout/log/test_color.rb +0 -0
- data/test/scout/open/test_stream.rb +1 -1
- data/test/scout/test_semaphore.rb +17 -0
- data/test/scout/test_tsv.rb +34 -0
- data/test/scout/test_work_queue.rb +121 -0
- data/test/scout/tsv/test_parser.rb +87 -0
- data/test/scout/work_queue/test_socket.rb +46 -0
- data/test/scout/work_queue/test_worker.rb +147 -0
- metadata +17 -2
@@ -0,0 +1,87 @@
|
|
1
|
+
require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
|
2
|
+
require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
|
3
|
+
|
4
|
+
require 'scout/tsv'
|
5
|
+
class TestTSVParser < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_parse_line
|
8
|
+
line = (0..10).to_a * "\t"
|
9
|
+
key, values = TSV.parse_line(line)
|
10
|
+
|
11
|
+
assert_equal "0", key
|
12
|
+
assert_equal (1..10).collect{|v| v.to_s }, values
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_parse_double
|
16
|
+
line = (0..10).collect{|v| v == 0 ? v : [v,v] * "|" } * "\t"
|
17
|
+
key, values = TSV.parse_line(line, type: :double, cast: :to_i)
|
18
|
+
|
19
|
+
assert_equal "0", key
|
20
|
+
assert_equal (1..10).collect{|v| [v,v] }, values
|
21
|
+
end
|
22
|
+
|
23
|
+
def __test_benchmark
|
24
|
+
num = 10_000
|
25
|
+
txt = num.times.inject(nil) do |acc,i|
|
26
|
+
(acc.nil? ? "" : acc << "\n") << (0..10).collect{|v| v == 0 ? i : [v,v] * "|" } * "\t"
|
27
|
+
end
|
28
|
+
|
29
|
+
txt = StringIO.new(([txt] * (10))*"\n")
|
30
|
+
Misc.benchmark 1 do
|
31
|
+
#Misc.profile do
|
32
|
+
data = TSV.parse_stream(txt, fix: true, type: :double, bar: true, merge: :concat)
|
33
|
+
assert_equal num, data.size
|
34
|
+
assert_equal 20, data['1'][0].length
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_parse_stream
|
39
|
+
lines =<<-EOF
|
40
|
+
1 2 3 4 5
|
41
|
+
11 12 13 14 15
|
42
|
+
EOF
|
43
|
+
|
44
|
+
lines = StringIO.new lines
|
45
|
+
|
46
|
+
data = TSV.parse_stream lines, sep: " "
|
47
|
+
assert_equal data["1"], %w(2 3 4 5)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_parse_stream_block
|
51
|
+
lines =<<-EOF
|
52
|
+
1 2 3 4 5
|
53
|
+
11 12 13 14 15
|
54
|
+
EOF
|
55
|
+
|
56
|
+
lines = StringIO.new lines
|
57
|
+
|
58
|
+
sum = 0
|
59
|
+
res = TSV.parse_stream(lines, sep: " ") do |k,values|
|
60
|
+
sum += values.inject(0){|acc,i| acc += i.to_i }
|
61
|
+
end
|
62
|
+
assert_equal 68, sum
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_parse_header
|
66
|
+
header =<<-EOF
|
67
|
+
#: :sep=" "
|
68
|
+
#Key ValueA ValueB
|
69
|
+
k A B
|
70
|
+
EOF
|
71
|
+
header = StringIO.new header
|
72
|
+
|
73
|
+
assert_equal "Key", TSV.parse_header(header)[1]
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_parse
|
77
|
+
header =<<-EOF
|
78
|
+
#: :sep=" "#:type=:double
|
79
|
+
#Key ValueA ValueB
|
80
|
+
k a|A b|B
|
81
|
+
EOF
|
82
|
+
header = StringIO.new header
|
83
|
+
|
84
|
+
tsv = TSV.parse(header)
|
85
|
+
assert_equal 'a', tsv['k'][0][0]
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
|
2
|
+
require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
|
3
|
+
|
4
|
+
class TestSocket < Test::Unit::TestCase
|
5
|
+
def test_simple
|
6
|
+
socket = WorkQueue::Socket.new
|
7
|
+
|
8
|
+
socket.write 1
|
9
|
+
socket.write 2
|
10
|
+
socket.write "STRING"
|
11
|
+
socket.write :string
|
12
|
+
|
13
|
+
assert_equal 1, socket.read
|
14
|
+
assert_equal 2, socket.read
|
15
|
+
assert_equal "STRING", socket.read
|
16
|
+
assert_equal :string, socket.read
|
17
|
+
|
18
|
+
socket.close_write
|
19
|
+
assert_raise ClosedStream do
|
20
|
+
socket.read
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def __test_speed
|
25
|
+
sss 0
|
26
|
+
socket = WorkQueue::Socket.new
|
27
|
+
|
28
|
+
num = 10_000
|
29
|
+
|
30
|
+
Thread.new do
|
31
|
+
num.times do |i|
|
32
|
+
socket.write nil
|
33
|
+
end
|
34
|
+
socket.write DoneProcessing.new
|
35
|
+
end
|
36
|
+
|
37
|
+
bar = Log::ProgressBar.new num
|
38
|
+
while true
|
39
|
+
i = socket.read
|
40
|
+
bar.tick
|
41
|
+
break if DoneProcessing === i
|
42
|
+
end
|
43
|
+
bar.done
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
|
2
|
+
require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
|
3
|
+
|
4
|
+
require 'scout/semaphore'
|
5
|
+
require 'scout/work_queue/socket'
|
6
|
+
class TestQueueWorker < Test::Unit::TestCase
|
7
|
+
def test_simple
|
8
|
+
worker = WorkQueue::Worker.new
|
9
|
+
TmpFile.with_file do |file|
|
10
|
+
worker.run do
|
11
|
+
Open.write file, "TEST"
|
12
|
+
end
|
13
|
+
worker.join
|
14
|
+
|
15
|
+
assert_equal "TEST", Open.read(file)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_semaphore
|
20
|
+
ScoutSemaphore.with_semaphore 1 do |sem|
|
21
|
+
|
22
|
+
TmpFile.with_file do |outfile|
|
23
|
+
2.times do
|
24
|
+
sout = Open.open_pipe do |sin|
|
25
|
+
workers = 100.times.collect{ WorkQueue::Worker.new }
|
26
|
+
workers.each do |w|
|
27
|
+
w.run do
|
28
|
+
ScoutSemaphore.synchronize(sem) do
|
29
|
+
10.times do
|
30
|
+
sin.puts Process.pid
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
WorkQueue::Worker.join(workers)
|
37
|
+
end
|
38
|
+
Open.consume_stream(sout, false, outfile)
|
39
|
+
pid_list = Open.read(outfile).split("\n")
|
40
|
+
|
41
|
+
assert_nothing_raised do
|
42
|
+
seen = []
|
43
|
+
current = nil
|
44
|
+
pid_list.each do |pid|
|
45
|
+
if pid != current
|
46
|
+
raise "Out of order" if seen.include? pid
|
47
|
+
end
|
48
|
+
current = pid
|
49
|
+
seen << pid
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_process
|
58
|
+
input = WorkQueue::Socket.new
|
59
|
+
output = WorkQueue::Socket.new
|
60
|
+
|
61
|
+
workers = 10.times.collect{ WorkQueue::Worker.new }
|
62
|
+
workers.each do |w|
|
63
|
+
w.process(input, output) do |obj|
|
64
|
+
[Process.pid, obj.inspect] * " "
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
read = Thread.new do
|
69
|
+
begin
|
70
|
+
while obj = output.read
|
71
|
+
if DoneProcessing === obj
|
72
|
+
pid = obj.pid
|
73
|
+
workers.delete_if{|w| w.pid = pid }
|
74
|
+
break if workers.empty?
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
write = Thread.new do
|
81
|
+
100.times do |i|
|
82
|
+
input.write i
|
83
|
+
end
|
84
|
+
10.times do
|
85
|
+
input.write DoneProcessing.new
|
86
|
+
end
|
87
|
+
input.close_write
|
88
|
+
end
|
89
|
+
|
90
|
+
write.join
|
91
|
+
read.join
|
92
|
+
|
93
|
+
WorkQueue::Worker.join workers
|
94
|
+
input.clean
|
95
|
+
output.clean
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_process_exception
|
99
|
+
input = WorkQueue::Socket.new
|
100
|
+
output = WorkQueue::Socket.new
|
101
|
+
|
102
|
+
workers = 10.times.collect{ WorkQueue::Worker.new }
|
103
|
+
workers.each do |w|
|
104
|
+
w.process(input, output) do |obj|
|
105
|
+
raise ScoutException
|
106
|
+
[Process.pid, obj.inspect] * " "
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
read = Thread.new do
|
111
|
+
Thread.current.report_on_exception = false
|
112
|
+
begin
|
113
|
+
while obj = output.read
|
114
|
+
if DoneProcessing === obj
|
115
|
+
pid = obj.pid
|
116
|
+
workers.delete_if{|w| w.pid = pid }
|
117
|
+
break if workers.empty?
|
118
|
+
end
|
119
|
+
raise obj if Exception === obj
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
write = Thread.new do
|
125
|
+
Thread.report_on_exception = false
|
126
|
+
100.times do |i|
|
127
|
+
input.write i
|
128
|
+
end
|
129
|
+
10.times do
|
130
|
+
input.write DoneProcessing.new
|
131
|
+
end
|
132
|
+
input.close_write
|
133
|
+
end
|
134
|
+
|
135
|
+
write.join
|
136
|
+
|
137
|
+
assert_raise ScoutException do
|
138
|
+
read.join
|
139
|
+
end
|
140
|
+
|
141
|
+
WorkQueue::Worker.join workers
|
142
|
+
input.clean
|
143
|
+
output.clean
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scout-gear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: term-ansicolor
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- lib/scout/resource/produce/rake.rb
|
139
139
|
- lib/scout/resource/scout.rb
|
140
140
|
- lib/scout/resource/util.rb
|
141
|
+
- lib/scout/semaphore.rb
|
141
142
|
- lib/scout/simple_opt.rb
|
142
143
|
- lib/scout/simple_opt/accessor.rb
|
143
144
|
- lib/scout/simple_opt/doc.rb
|
@@ -145,6 +146,11 @@ files:
|
|
145
146
|
- lib/scout/simple_opt/parse.rb
|
146
147
|
- lib/scout/simple_opt/setup.rb
|
147
148
|
- lib/scout/tmpfile.rb
|
149
|
+
- lib/scout/tsv.rb
|
150
|
+
- lib/scout/tsv/parser.rb
|
151
|
+
- lib/scout/work_queue.rb
|
152
|
+
- lib/scout/work_queue/socket.rb
|
153
|
+
- lib/scout/work_queue/worker.rb
|
148
154
|
- lib/scout/workflow.rb
|
149
155
|
- lib/scout/workflow/definition.rb
|
150
156
|
- lib/scout/workflow/documentation.rb
|
@@ -165,8 +171,11 @@ files:
|
|
165
171
|
- scout_commands/workflow/list
|
166
172
|
- scout_commands/workflow/task
|
167
173
|
- scout_commands/workflow/task_old
|
174
|
+
- share/color/color_names
|
175
|
+
- share/color/diverging_colors.hex
|
168
176
|
- test/scout/indiferent_hash/test_case_insensitive.rb
|
169
177
|
- test/scout/indiferent_hash/test_options.rb
|
178
|
+
- test/scout/log/test_color.rb
|
170
179
|
- test/scout/log/test_progress.rb
|
171
180
|
- test/scout/misc/test_digest.rb
|
172
181
|
- test/scout/misc/test_filesystem.rb
|
@@ -197,8 +206,14 @@ files:
|
|
197
206
|
- test/scout/test_path.rb
|
198
207
|
- test/scout/test_persist.rb
|
199
208
|
- test/scout/test_resource.rb
|
209
|
+
- test/scout/test_semaphore.rb
|
200
210
|
- test/scout/test_tmpfile.rb
|
211
|
+
- test/scout/test_tsv.rb
|
212
|
+
- test/scout/test_work_queue.rb
|
201
213
|
- test/scout/test_workflow.rb
|
214
|
+
- test/scout/tsv/test_parser.rb
|
215
|
+
- test/scout/work_queue/test_socket.rb
|
216
|
+
- test/scout/work_queue/test_worker.rb
|
202
217
|
- test/scout/workflow/step/test_info.rb
|
203
218
|
- test/scout/workflow/step/test_load.rb
|
204
219
|
- test/scout/workflow/task/test_inputs.rb
|