scout-gear 7.2.0 → 8.0.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 +51 -6
- data/VERSION +1 -1
- data/bin/scout +6 -3
- data/lib/rbbt-scout.rb +1 -0
- data/lib/scout/cmd.rb +1 -1
- data/lib/scout/concurrent_stream.rb +33 -29
- data/lib/scout/config.rb +1 -1
- data/lib/scout/exceptions.rb +1 -0
- data/lib/scout/log/color.rb +4 -2
- data/lib/scout/log/progress/report.rb +1 -1
- data/lib/scout/log/progress/util.rb +71 -2
- data/lib/scout/log/progress.rb +1 -1
- data/lib/scout/log/trap.rb +107 -0
- data/lib/scout/log.rb +56 -21
- data/lib/scout/meta_extension.rb +13 -6
- data/lib/scout/misc/digest.rb +1 -1
- data/lib/scout/misc/format.rb +12 -0
- data/lib/scout/misc/helper.rb +31 -0
- data/lib/scout/misc/insist.rb +1 -1
- data/lib/scout/misc/monitor.rb +12 -1
- data/lib/scout/misc/system.rb +10 -0
- data/lib/scout/misc.rb +1 -0
- data/lib/scout/named_array.rb +65 -3
- data/lib/scout/open/lock/lockfile.rb +587 -0
- data/lib/scout/open/lock.rb +28 -2
- data/lib/scout/open/remote.rb +4 -0
- data/lib/scout/open/stream.rb +111 -42
- data/lib/scout/open/util.rb +13 -3
- data/lib/scout/path/find.rb +9 -1
- data/lib/scout/path/util.rb +35 -0
- data/lib/scout/persist/serialize.rb +18 -5
- data/lib/scout/persist.rb +60 -30
- data/lib/scout/resource/path.rb +53 -0
- data/lib/scout/resource/produce.rb +0 -8
- data/lib/scout/resource/util.rb +2 -1
- data/lib/scout/semaphore.rb +8 -1
- data/lib/scout/tmpfile.rb +7 -8
- data/lib/scout/tsv/attach.rb +177 -0
- data/lib/scout/tsv/change_id.rb +40 -0
- data/lib/scout/tsv/dumper.rb +85 -54
- data/lib/scout/tsv/index.rb +188 -20
- data/lib/scout/tsv/open.rb +182 -0
- data/lib/scout/tsv/parser.rb +200 -118
- data/lib/scout/tsv/path.rb +5 -6
- data/lib/scout/tsv/persist/adapter.rb +26 -37
- data/lib/scout/tsv/persist/fix_width_table.rb +327 -0
- data/lib/scout/tsv/persist/serialize.rb +117 -0
- data/lib/scout/tsv/persist/tokyocabinet.rb +6 -3
- data/lib/scout/tsv/persist.rb +4 -2
- data/lib/scout/tsv/transformer.rb +141 -0
- data/lib/scout/tsv/traverse.rb +136 -37
- data/lib/scout/tsv/util/filter.rb +312 -0
- data/lib/scout/tsv/util/process.rb +73 -0
- data/lib/scout/tsv/util/reorder.rb +81 -0
- data/lib/scout/tsv/util/select.rb +265 -0
- data/lib/scout/tsv/util/unzip.rb +86 -0
- data/lib/scout/tsv/util.rb +126 -19
- data/lib/scout/tsv.rb +28 -5
- data/lib/scout/work_queue/socket.rb +6 -1
- data/lib/scout/work_queue/worker.rb +5 -2
- data/lib/scout/work_queue.rb +15 -8
- data/lib/scout/workflow/definition.rb +29 -2
- data/lib/scout/workflow/step/dependencies.rb +24 -4
- data/lib/scout/workflow/step/info.rb +40 -5
- data/lib/scout/workflow/step/progress.rb +14 -0
- data/lib/scout/workflow/step/provenance.rb +8 -7
- data/lib/scout/workflow/step/status.rb +45 -0
- data/lib/scout/workflow/step.rb +104 -33
- data/lib/scout/workflow/task/inputs.rb +14 -20
- data/lib/scout/workflow/task.rb +86 -47
- data/lib/scout/workflow/usage.rb +10 -6
- data/scout-gear.gemspec +30 -3
- data/scout_commands/workflow/task +37 -9
- data/scout_commands/workflow/task_old +2 -2
- data/test/scout/open/test_stream.rb +61 -59
- data/test/scout/path/test_find.rb +10 -1
- data/test/scout/resource/test_produce.rb +15 -0
- data/test/scout/test_meta_extension.rb +25 -0
- data/test/scout/test_named_array.rb +18 -0
- data/test/scout/test_persist.rb +67 -0
- data/test/scout/test_tmpfile.rb +1 -1
- data/test/scout/test_tsv.rb +222 -3
- data/test/scout/test_work_queue.rb +21 -18
- data/test/scout/tsv/persist/test_adapter.rb +11 -1
- data/test/scout/tsv/persist/test_fix_width_table.rb +134 -0
- data/test/scout/tsv/persist/test_tokyocabinet.rb +29 -1
- data/test/scout/tsv/test_attach.rb +227 -0
- data/test/scout/tsv/test_change_id.rb +98 -0
- data/test/scout/tsv/test_dumper.rb +1 -1
- data/test/scout/tsv/test_index.rb +127 -3
- data/test/scout/tsv/test_open.rb +167 -0
- data/test/scout/tsv/test_parser.rb +45 -3
- data/test/scout/tsv/test_persist.rb +9 -0
- data/test/scout/tsv/test_transformer.rb +108 -0
- data/test/scout/tsv/test_traverse.rb +195 -3
- data/test/scout/tsv/test_util.rb +24 -0
- data/test/scout/tsv/util/test_filter.rb +188 -0
- data/test/scout/tsv/util/test_process.rb +47 -0
- data/test/scout/tsv/util/test_reorder.rb +94 -0
- data/test/scout/tsv/util/test_select.rb +58 -0
- data/test/scout/tsv/util/test_unzip.rb +112 -0
- data/test/scout/work_queue/test_socket.rb +0 -1
- data/test/scout/work_queue/test_worker.rb +63 -6
- data/test/scout/workflow/step/test_load.rb +3 -3
- data/test/scout/workflow/step/test_status.rb +31 -0
- data/test/scout/workflow/task/test_inputs.rb +14 -14
- data/test/scout/workflow/test_step.rb +13 -13
- data/test/scout/workflow/test_task.rb +168 -32
- data/test/scout/workflow/test_usage.rb +33 -6
- data/test/test_helper.rb +3 -1
- metadata +29 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48f6bb392f3391e2816e701887bfd98617b1a68bc533c8b6de3307f25c84906d
|
4
|
+
data.tar.gz: 476858f63deaa7fa9fc531c7872bdaefa1d6b3ed32cdacbe41f53d1d170fcc87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c61501c8cc79b57b64cb8613efc8b00fb84908bf0d55b008c6a6a39b99ea6bffa53630a8e134c07a49cb7bc4145ec181df057b6ba1eebfd2d722b2aa2d2e63d0
|
7
|
+
data.tar.gz: 100356a04cd34eba627239668747023ee5be4455ebbee715df39dbe04e9c8dfcac7007ce310e4622cf0c7e16ee9159e6fc2d4eefcaa486c24519c7f99185facf
|
data/.vimproject
CHANGED
@@ -9,10 +9,10 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
9
9
|
find
|
10
10
|
glob
|
11
11
|
workflow=workflow{
|
12
|
-
task_old
|
13
12
|
task
|
14
13
|
list
|
15
14
|
info
|
15
|
+
task_old
|
16
16
|
}
|
17
17
|
}
|
18
18
|
lib=lib {
|
@@ -49,6 +49,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
49
49
|
report.rb
|
50
50
|
util.rb
|
51
51
|
}
|
52
|
+
trap.rb
|
52
53
|
}
|
53
54
|
tmpfile.rb
|
54
55
|
simple_opt.rb
|
@@ -70,6 +71,9 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
70
71
|
open.rb
|
71
72
|
open=open{
|
72
73
|
lock.rb
|
74
|
+
lock=lock{
|
75
|
+
lockfile.rb
|
76
|
+
}
|
73
77
|
stream.rb
|
74
78
|
remote.rb
|
75
79
|
util.rb
|
@@ -98,11 +102,13 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
98
102
|
step.rb
|
99
103
|
step=step{
|
100
104
|
info.rb
|
105
|
+
status.rb
|
101
106
|
load.rb
|
102
107
|
file.rb
|
103
108
|
config.rb
|
104
109
|
dependencies.rb
|
105
110
|
provenance.rb
|
111
|
+
progress.rb
|
106
112
|
}
|
107
113
|
task.rb
|
108
114
|
task=task{
|
@@ -120,29 +126,66 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
120
126
|
}
|
121
127
|
tsv.rb
|
122
128
|
tsv=tsv{
|
129
|
+
util.rb
|
130
|
+
util=util{
|
131
|
+
process.rb
|
132
|
+
select.rb
|
133
|
+
process.rb
|
134
|
+
unzip.rb
|
135
|
+
reorder.rb
|
136
|
+
}
|
123
137
|
parser.rb
|
124
138
|
dumper.rb
|
139
|
+
transformer.rb
|
125
140
|
persist.rb
|
126
|
-
index.rb
|
127
141
|
persist=persist{
|
128
142
|
adapter.rb
|
143
|
+
serialize.rb
|
129
144
|
tokyocabinet.rb
|
145
|
+
fix_width_table.rb
|
130
146
|
}
|
147
|
+
index.rb
|
131
148
|
traverse.rb
|
132
|
-
|
149
|
+
attach.rb
|
150
|
+
change_id.rb
|
133
151
|
path.rb
|
152
|
+
open.rb
|
134
153
|
}
|
135
154
|
}
|
136
155
|
}
|
137
156
|
test=test {
|
138
157
|
test_helper.rb
|
158
|
+
test_scout-gear.rb
|
139
159
|
scout=scout{
|
160
|
+
test_cmd.rb
|
161
|
+
test_concurrent_stream.rb
|
162
|
+
test_config.rb
|
140
163
|
test_indiferent_hash.rb
|
164
|
+
test_log.rb
|
165
|
+
test_meta_extension.rb
|
166
|
+
test_misc.rb
|
167
|
+
test_named_array.rb
|
168
|
+
test_open.rb
|
169
|
+
test_path.rb
|
170
|
+
test_persist.rb
|
171
|
+
test_resource.rb
|
172
|
+
test_semaphore.rb
|
173
|
+
test_tmpfile.rb
|
174
|
+
test_tsv.rb
|
175
|
+
test_work_queue.rb
|
176
|
+
test_workflow.rb
|
177
|
+
workflow=workflow{
|
178
|
+
test_definition.rb
|
179
|
+
test_documentation.rb
|
180
|
+
test_step.rb
|
181
|
+
test_task.rb
|
182
|
+
test_usage.rb
|
183
|
+
test_util.rb
|
184
|
+
}
|
141
185
|
indiferent_hash=indiferent_hash{
|
186
|
+
test_case_insensitive.rb
|
142
187
|
test_options.rb
|
143
188
|
}
|
144
|
-
test_log.rb
|
145
|
-
test_tmpfile.rb
|
146
189
|
}
|
147
190
|
}
|
148
191
|
share=share{
|
@@ -275,6 +318,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
275
318
|
|
276
319
|
workflow.rb
|
277
320
|
workflow=workflow{
|
321
|
+
refactor.rb
|
278
322
|
annotate.rb
|
279
323
|
|
280
324
|
definition.rb
|
@@ -356,6 +400,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
356
400
|
|
357
401
|
tsv.rb
|
358
402
|
tsv=tsv{
|
403
|
+
refactor.rb
|
359
404
|
parser.rb
|
360
405
|
dumper.rb
|
361
406
|
|
@@ -479,7 +524,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
479
524
|
test_path.rb
|
480
525
|
}
|
481
526
|
workflow=workflow{
|
482
|
-
|
527
|
+
test_soap.rb
|
483
528
|
test_doc.rb
|
484
529
|
test_step.rb
|
485
530
|
test_task.rb
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
8.0.0
|
data/bin/scout
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
$LOAD_PATH.unshift File.join(__dir__, '../lib')
|
4
4
|
|
5
|
+
ENV["SCOUT_NOCOLOR"] = "true" if ARGV.include? "--nocolor"
|
6
|
+
|
7
|
+
ENV["SCOUT_NO_PROGRESS"] = "true" if ARGV.include? "--nobar"
|
8
|
+
|
5
9
|
require 'scout-gear'
|
6
10
|
|
7
11
|
class CmdStop < Exception
|
@@ -44,7 +48,6 @@ if dev_dir
|
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
47
|
-
Log.nocolor = true if ARGV.include? "--nocolor"
|
48
51
|
|
49
52
|
require 'scout/simple_opt'
|
50
53
|
|
@@ -66,11 +69,11 @@ Log.nocolor = true if options[:nocolor]
|
|
66
69
|
locate = options.delete :locate_file
|
67
70
|
|
68
71
|
if options[:log_file]
|
69
|
-
Log.logfile(options
|
72
|
+
Log.logfile(options.delete(:log_file))
|
70
73
|
end
|
71
74
|
|
72
75
|
if options[:log]
|
73
|
-
Log.severity = options
|
76
|
+
Log.severity = options.delete(:log).to_i
|
74
77
|
else
|
75
78
|
global_severity = Log.get_level(Scout.etc.log_severity.read.strip) if Scout.etc.log_severity.exists?
|
76
79
|
if ENV["SCOUT_LOG"]
|
data/lib/rbbt-scout.rb
CHANGED
data/lib/scout/cmd.rb
CHANGED
@@ -272,7 +272,7 @@ module CMD
|
|
272
272
|
sout.close unless sout.closed?
|
273
273
|
|
274
274
|
status = wait_thr.value
|
275
|
-
if
|
275
|
+
if status && ! status.success? && ! no_fail
|
276
276
|
if !err.empty?
|
277
277
|
raise ProcessFailed.new pid, "#{cmd} failed with error status #{status.exitstatus}.\n#{err}"
|
278
278
|
else
|
@@ -9,11 +9,11 @@ module AbortedStream
|
|
9
9
|
end
|
10
10
|
|
11
11
|
module ConcurrentStream
|
12
|
-
attr_accessor :threads, :pids, :callback, :abort_callback, :filename, :joined, :aborted, :autojoin, :
|
12
|
+
attr_accessor :threads, :pids, :callback, :abort_callback, :filename, :joined, :aborted, :autojoin, :lock, :no_fail, :pair, :thread, :stream_exception, :log, :std_err, :next
|
13
13
|
|
14
14
|
def self.setup(stream, options = {}, &block)
|
15
15
|
|
16
|
-
threads, pids, callback, abort_callback, filename, autojoin,
|
16
|
+
threads, pids, callback, abort_callback, filename, autojoin, lock, no_fail, pair, next_stream = IndiferentHash.process_options options, :threads, :pids, :callback, :abort_callback, :filename, :autojoin, :lock, :no_fail, :pair, :next
|
17
17
|
stream.extend ConcurrentStream unless ConcurrentStream === stream
|
18
18
|
|
19
19
|
stream.threads ||= []
|
@@ -54,7 +54,7 @@ module ConcurrentStream
|
|
54
54
|
|
55
55
|
stream.filename = filename.nil? ? stream.inspect.split(":").last[0..-2] : filename
|
56
56
|
|
57
|
-
stream.
|
57
|
+
stream.lock = lock unless lock.nil?
|
58
58
|
|
59
59
|
stream.aborted = false
|
60
60
|
|
@@ -62,7 +62,7 @@ module ConcurrentStream
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def annotate(stream)
|
65
|
-
ConcurrentStream.setup(stream, :threads => threads, :pids => pids, :callback => callback, :abort_callback => abort_callback, :filename => filename, :autojoin => autojoin, :
|
65
|
+
ConcurrentStream.setup(stream, :threads => threads, :pids => pids, :callback => callback, :abort_callback => abort_callback, :filename => filename, :autojoin => autojoin, :lock => lock)
|
66
66
|
stream
|
67
67
|
end
|
68
68
|
|
@@ -136,11 +136,16 @@ module ConcurrentStream
|
|
136
136
|
begin
|
137
137
|
join_threads
|
138
138
|
join_pids
|
139
|
+
raise stream_exception if stream_exception
|
139
140
|
join_callback
|
140
141
|
close unless closed?
|
141
142
|
ensure
|
142
143
|
@joined = true
|
143
|
-
|
144
|
+
begin
|
145
|
+
lock.unlock if lock && lock.locked?
|
146
|
+
rescue
|
147
|
+
Log.exception $!
|
148
|
+
end
|
144
149
|
raise stream_exception if stream_exception
|
145
150
|
end
|
146
151
|
end
|
@@ -151,21 +156,17 @@ module ConcurrentStream
|
|
151
156
|
name += " - file:#{filename}" if filename
|
152
157
|
Log.low "Aborting threads (#{name}) - #{@threads.collect{|t| Log.fingerprint(t) } * ", "}"
|
153
158
|
|
154
|
-
@threads.
|
159
|
+
threads = @threads.dup
|
160
|
+
@threads.clear
|
161
|
+
threads.each do |t|
|
155
162
|
next if t == Thread.current
|
163
|
+
next if t["aborted"]
|
164
|
+
t["aborted"] = true
|
165
|
+
exception = exception.nil? ? Aborted.new : exception
|
156
166
|
Log.debug "Aborting thread #{Log.fingerprint(t)} with exception: #{exception}"
|
157
|
-
t.raise(
|
167
|
+
t.raise(exception)
|
168
|
+
t.join
|
158
169
|
end
|
159
|
-
|
160
|
-
@threads.each do |t|
|
161
|
-
next if t == Thread.current
|
162
|
-
begin
|
163
|
-
t.join unless t == Thread.current
|
164
|
-
rescue Aborted
|
165
|
-
rescue Exception
|
166
|
-
Log.debug "Thread (#{name}) exception: #{$!.message}"
|
167
|
-
end
|
168
|
-
end
|
169
170
|
end
|
170
171
|
|
171
172
|
def abort_pids
|
@@ -205,8 +206,8 @@ module ConcurrentStream
|
|
205
206
|
ensure
|
206
207
|
close unless closed?
|
207
208
|
|
208
|
-
if
|
209
|
-
|
209
|
+
if lock and lock.locked?
|
210
|
+
lock.unlock
|
210
211
|
end
|
211
212
|
end
|
212
213
|
end
|
@@ -216,12 +217,11 @@ module ConcurrentStream
|
|
216
217
|
begin
|
217
218
|
super(*args)
|
218
219
|
rescue
|
219
|
-
Log.exception $!
|
220
220
|
self.abort
|
221
221
|
self.join
|
222
222
|
stream_raise_exception $!
|
223
223
|
ensure
|
224
|
-
self.join if self.closed?
|
224
|
+
self.join if ! @stream_exception && (self.closed? || self.eof?)
|
225
225
|
end
|
226
226
|
else
|
227
227
|
super(*args)
|
@@ -231,15 +231,19 @@ module ConcurrentStream
|
|
231
231
|
def read(*args)
|
232
232
|
begin
|
233
233
|
super(*args)
|
234
|
-
rescue
|
235
|
-
|
236
|
-
raise
|
234
|
+
rescue Exception
|
235
|
+
@stream_exception ||= $!
|
236
|
+
raise @stream_exception
|
237
237
|
ensure
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
238
|
+
if ! @stream_exception && autojoin && ! closed?
|
239
|
+
begin
|
240
|
+
done = eof?
|
241
|
+
rescue Exception
|
242
|
+
self.abort($!)
|
243
|
+
raise $!
|
244
|
+
end
|
245
|
+
close if done
|
246
|
+
end
|
243
247
|
end
|
244
248
|
end
|
245
249
|
|
data/lib/scout/config.rb
CHANGED
@@ -148,7 +148,7 @@ module Scout::Config
|
|
148
148
|
end
|
149
149
|
|
150
150
|
def self.process_config(config)
|
151
|
-
if
|
151
|
+
if Path.is_filename?(config) && File.exist?(config)
|
152
152
|
Scout::Config.load_file(config)
|
153
153
|
elsif Scout.etc.config_profile[config].exists?
|
154
154
|
Scout::Config.load_file(Scout.etc.config_profile[config].find)
|
data/lib/scout/exceptions.rb
CHANGED
data/lib/scout/log/color.rb
CHANGED
@@ -2,7 +2,6 @@ require_relative 'color_class'
|
|
2
2
|
require_relative '../indiferent_hash'
|
3
3
|
|
4
4
|
require 'term/ansicolor'
|
5
|
-
require 'colorist'
|
6
5
|
|
7
6
|
module Colorize
|
8
7
|
def self.colors=(colors)
|
@@ -135,7 +134,7 @@ module Log
|
|
135
134
|
attr_accessor :nocolor
|
136
135
|
end
|
137
136
|
|
138
|
-
self.nocolor = ENV["
|
137
|
+
self.nocolor = ENV["SCOUT_NOCOLOR"] == 'true'
|
139
138
|
|
140
139
|
WHITE, DARK, GREEN, YELLOW, RED = Color::SOLARIZED.values_at :base0, :base00, :green, :yellow, :magenta
|
141
140
|
|
@@ -153,6 +152,9 @@ module Log
|
|
153
152
|
:start => cyan,
|
154
153
|
:done => green,
|
155
154
|
:error => red,
|
155
|
+
:time => cyan,
|
156
|
+
:task => yellow,
|
157
|
+
:workflow => yellow,
|
156
158
|
})
|
157
159
|
HIGHLIGHT = "\033[1m"
|
158
160
|
|
@@ -229,7 +229,7 @@ module Log
|
|
229
229
|
done_msg << Log.color(:magenta, " · " << desc)
|
230
230
|
print(io, Log.up_lines(@depth) << done_msg << Log.down_lines(@depth))
|
231
231
|
|
232
|
-
|
232
|
+
FileUtils.rm file if file and File.exist?(file)
|
233
233
|
|
234
234
|
begin
|
235
235
|
@callback.call self
|
@@ -29,7 +29,7 @@ module Log
|
|
29
29
|
|
30
30
|
def self.new_bar(max, options = {})
|
31
31
|
options, max = max, nil if Hash === max
|
32
|
-
max = options[:max] if max.nil?
|
32
|
+
max = options[:max] if options && max.nil?
|
33
33
|
cleanup_bars
|
34
34
|
BAR_MUTEX.synchronize do
|
35
35
|
Log::LAST.replace "new_bar" if Log::LAST == "progress"
|
@@ -82,7 +82,7 @@ module Log
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def self.with_bar(max = nil, options = {})
|
85
|
-
bar = new_bar(max, options)
|
85
|
+
bar = options.include?(:bar) ? options[:bar] : new_bar(max, options)
|
86
86
|
begin
|
87
87
|
error = false
|
88
88
|
keep = false
|
@@ -96,6 +96,75 @@ module Log
|
|
96
96
|
remove_bar(bar, error) if bar && ! keep
|
97
97
|
end
|
98
98
|
end
|
99
|
+
|
100
|
+
def self.guess_obj_max(obj)
|
101
|
+
begin
|
102
|
+
case obj
|
103
|
+
when (defined? Step and Step)
|
104
|
+
if obj.done?
|
105
|
+
path = obj.path
|
106
|
+
path = path.find if path.respond_to? :find
|
107
|
+
if File.exist? path
|
108
|
+
CMD.cmd("wc -l '#{path}'").read.to_i
|
109
|
+
else
|
110
|
+
nil
|
111
|
+
end
|
112
|
+
else
|
113
|
+
nil
|
114
|
+
end
|
115
|
+
when TSV
|
116
|
+
obj.length
|
117
|
+
when Array, Hash
|
118
|
+
obj.size
|
119
|
+
when File
|
120
|
+
return nil if Open.gzip?(obj.filename) or Open.bgzip?(obj.filename) or Open.remote?(obj.filename)
|
121
|
+
CMD.cmd("wc -l '#{obj.filename}'").read.to_i
|
122
|
+
when Path, String
|
123
|
+
obj = obj.find if Path === obj
|
124
|
+
if File.exist? obj
|
125
|
+
return nil if Open.gzip?(obj) or Open.bgzip?(obj)
|
126
|
+
CMD.cmd("wc -l '#{obj}'").read.to_i
|
127
|
+
else
|
128
|
+
nil
|
129
|
+
end
|
130
|
+
end
|
131
|
+
rescue Exception
|
132
|
+
nil
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.get_obj_bar(obj, bar = nil)
|
137
|
+
return nil if bar.nil? || bar == false
|
138
|
+
case bar
|
139
|
+
when String
|
140
|
+
max = guess_obj_max(obj)
|
141
|
+
Log::ProgressBar.new_bar(max, {:desc => bar})
|
142
|
+
when TrueClass
|
143
|
+
max = guess_obj_max(obj)
|
144
|
+
Log::ProgressBar.new_bar(max)
|
145
|
+
when Numeric
|
146
|
+
max = guess_obj_max(obj)
|
147
|
+
Log::ProgressBar.new_bar(bar)
|
148
|
+
when Hash
|
149
|
+
max = IndiferentHash.process_options(bar, :max) || max
|
150
|
+
Log::ProgressBar.new_bar(max, bar)
|
151
|
+
when Log::ProgressBar
|
152
|
+
bar.max ||= guess_obj_max(obj)
|
153
|
+
bar
|
154
|
+
else
|
155
|
+
if (defined? Step and Step === bar)
|
156
|
+
max = guess_obj_max(obj)
|
157
|
+
Log::ProgressBar.new_bar(max, {:desc => bar.status, :file => bar.file(:progress)})
|
158
|
+
else
|
159
|
+
bar
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.with_obj_bar(obj, bar = true, &block)
|
165
|
+
bar = get_obj_bar(obj, bar)
|
166
|
+
with_bar nil, bar: bar, &block
|
167
|
+
end
|
99
168
|
end
|
100
169
|
end
|
101
170
|
|
data/lib/scout/log/progress.rb
CHANGED
@@ -0,0 +1,107 @@
|
|
1
|
+
module Log
|
2
|
+
def self.trap_std(msg = "STDOUT", msge = "STDERR", severity = 0, severity_err = nil)
|
3
|
+
sout, sin = Misc.pipe
|
4
|
+
soute, sine = Misc.pipe
|
5
|
+
backup_stderr = STDERR.dup
|
6
|
+
backup_stdout = STDOUT.dup
|
7
|
+
old_logfile = Log.logfile
|
8
|
+
Log.logfile(backup_stderr)
|
9
|
+
|
10
|
+
severity_err ||= severity
|
11
|
+
th_log = Thread.new do
|
12
|
+
while line = sout.gets
|
13
|
+
Log.logn "#{msg}: " + line, severity
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
th_loge = Thread.new do
|
18
|
+
while line = soute.gets
|
19
|
+
Log.logn "#{msge}: " + line, severity_err
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
begin
|
24
|
+
STDOUT.reopen(sin)
|
25
|
+
STDERR.reopen(sine)
|
26
|
+
yield
|
27
|
+
ensure
|
28
|
+
STDERR.reopen backup_stderr
|
29
|
+
STDOUT.reopen backup_stdout
|
30
|
+
sin.close
|
31
|
+
sine.close
|
32
|
+
th_log.join
|
33
|
+
th_loge.join
|
34
|
+
backup_stdout.close
|
35
|
+
backup_stderr.close
|
36
|
+
Log.logfile = old_logfile
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.trap_stderr(msg = "STDERR", severity = 0)
|
41
|
+
sout, sin = Misc.pipe
|
42
|
+
backup_stderr = STDERR.dup
|
43
|
+
old_logfile = Log.logfile
|
44
|
+
Log.logfile(backup_stderr)
|
45
|
+
|
46
|
+
th_log = Thread.new do
|
47
|
+
while line = sout.gets
|
48
|
+
Log.logn "#{msg}: " + line, severity
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
begin
|
53
|
+
STDERR.reopen(sin)
|
54
|
+
yield
|
55
|
+
sin.close
|
56
|
+
ensure
|
57
|
+
STDERR.reopen backup_stderr
|
58
|
+
th_log.join
|
59
|
+
backup_stderr.close
|
60
|
+
Log.logfile = old_logfile
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self._ignore_stderr
|
65
|
+
begin
|
66
|
+
File.open('/dev/null', 'w') do |f|
|
67
|
+
backup_stderr = STDERR.dup
|
68
|
+
STDERR.reopen(f)
|
69
|
+
begin
|
70
|
+
yield
|
71
|
+
ensure
|
72
|
+
STDERR.reopen backup_stderr
|
73
|
+
backup_stderr.close
|
74
|
+
end
|
75
|
+
end
|
76
|
+
rescue Errno::ENOENT
|
77
|
+
yield
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
def self.ignore_stderr(&block)
|
83
|
+
_ignore_stderr &block
|
84
|
+
end
|
85
|
+
|
86
|
+
def self._ignore_stdout
|
87
|
+
begin
|
88
|
+
File.open('/dev/null', 'w') do |f|
|
89
|
+
backup_stdout = STDOUT.dup
|
90
|
+
STDOUT.reopen(f)
|
91
|
+
begin
|
92
|
+
yield
|
93
|
+
ensure
|
94
|
+
STDOUT.reopen backup_stdout
|
95
|
+
backup_stdout.close
|
96
|
+
end
|
97
|
+
end
|
98
|
+
rescue Errno::ENOENT
|
99
|
+
yield
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
def self.ignore_stdout(&block)
|
105
|
+
_ignore_stdout &block
|
106
|
+
end
|
107
|
+
end
|