rbbt-util 5.9.3 → 5.9.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/rbbt +6 -3
- data/lib/rbbt/persist.rb +1 -1
- data/lib/rbbt/tsv/attach.rb +1 -1
- data/lib/rbbt/tsv/attach/util.rb +1 -1
- data/lib/rbbt/util/log.rb +13 -3
- data/lib/rbbt/workflow/accessor.rb +7 -5
- data/lib/rbbt/workflow/step.rb +10 -9
- data/lib/rbbt/workflow/usage.rb +4 -4
- data/share/rbbt_commands/tsv/info +5 -5
- data/share/rbbt_commands/workflow/task +24 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cf8e981590ec75d716c3b173786a1d9d49751af
|
4
|
+
data.tar.gz: c48d0c459d08b67b68a5caf94d31bef4ea10e4c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7687ee59c28372845dfb2d9d3606c2aa3409fcc299566530dcec737b48ef764bfadb49504d5dd0256fac2f85d8ddf10a5780642034ed6f05ccfa2a73e5b187c1
|
7
|
+
data.tar.gz: f47bb2989be8fa6f39e15551caf8cd35d4506ba07092b61716e6b7a14efff001b5e12509e34266fd572f0f22cef07f4d138cd3e518c4243e6e493792027ab6b6
|
data/bin/rbbt
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'rbbt'
|
4
4
|
require 'rbbt/util/simpleopt'
|
5
|
+
require 'highline'
|
6
|
+
|
7
|
+
Log.tty_size = HighLine::SystemExtensions.terminal_size.first
|
5
8
|
|
6
9
|
options = SOPT.setup <<EOF
|
7
10
|
Ruby bioinformatics toolkit
|
@@ -96,13 +99,13 @@ end
|
|
96
99
|
def print_error(error, backtrace = nil)
|
97
100
|
puts Log.color :red, "Error:"
|
98
101
|
puts
|
99
|
-
puts error
|
100
102
|
if backtrace
|
101
|
-
puts
|
102
103
|
puts Log.color :red, "Backtrace:"
|
103
104
|
puts
|
104
|
-
puts backtrace * "\n"
|
105
|
+
puts backtrace.reverse * "\n"
|
106
|
+
puts
|
105
107
|
end
|
108
|
+
puts Log.color :red, error
|
106
109
|
puts
|
107
110
|
end
|
108
111
|
|
data/lib/rbbt/persist.rb
CHANGED
@@ -289,7 +289,7 @@ module Persist
|
|
289
289
|
res
|
290
290
|
end
|
291
291
|
rescue
|
292
|
-
Log.high "Error in persist
|
292
|
+
Log.high "Error in persist: #{path}#{Open.exists?(path) ? Log.color(:red, " Erasing") : ""}"
|
293
293
|
FileUtils.rm path if Open.exists? path
|
294
294
|
raise $!
|
295
295
|
end
|
data/lib/rbbt/tsv/attach.rb
CHANGED
@@ -197,7 +197,7 @@ module TSV
|
|
197
197
|
attach_source_key other, other.key_field, :fields => fields, :one2one => one2one
|
198
198
|
else
|
199
199
|
index = TSV.find_traversal(self, other, options)
|
200
|
-
raise "Cannot traverse identifiers" if index.nil?
|
200
|
+
raise FieldNotFoundError, "Cannot traverse identifiers" if index.nil?
|
201
201
|
Log.debug "Attachment with index: #{other.key_field}"
|
202
202
|
attach_index other, index, fields
|
203
203
|
end
|
data/lib/rbbt/tsv/attach/util.rb
CHANGED
@@ -307,7 +307,7 @@ module TSV
|
|
307
307
|
in_namespace = options[:in_namespace]
|
308
308
|
|
309
309
|
identifiers1 = tsv1.identifier_files || []
|
310
|
-
identifiers1 += options[:identifiers] if options[:identifiers]
|
310
|
+
identifiers1 += [options[:identifiers]].flatten if options[:identifiers]
|
311
311
|
identifiers2 = tsv2.identifier_files || []
|
312
312
|
|
313
313
|
identifiers1.unshift tsv1
|
data/lib/rbbt/util/log.rb
CHANGED
@@ -13,11 +13,21 @@ module Log
|
|
13
13
|
ERROR = 6
|
14
14
|
|
15
15
|
class << self
|
16
|
-
attr_accessor :logfile, :severity, :nocolor
|
16
|
+
attr_accessor :logfile, :severity, :nocolor, :tty_size
|
17
17
|
end
|
18
18
|
self.nocolor = ENV["RBBT_NOCOLOR"] == 'true'
|
19
19
|
|
20
20
|
|
21
|
+
def self.with_severity(level)
|
22
|
+
orig = Log.severity
|
23
|
+
begin
|
24
|
+
Log.severity = level
|
25
|
+
yield
|
26
|
+
ensure
|
27
|
+
Log.severity = orig
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
21
31
|
def self.logfile
|
22
32
|
@logfile = nil
|
23
33
|
end
|
@@ -39,7 +49,7 @@ module Log
|
|
39
49
|
if str.nil?
|
40
50
|
color
|
41
51
|
else
|
42
|
-
color + str + self.color(0)
|
52
|
+
color + str.to_s + self.color(0)
|
43
53
|
end
|
44
54
|
end
|
45
55
|
|
@@ -103,7 +113,7 @@ module Log
|
|
103
113
|
end
|
104
114
|
|
105
115
|
def self.exception(e)
|
106
|
-
error(e.message)
|
116
|
+
error([e.class.to_s, e.message].compact * ": ")
|
107
117
|
error("BACKTRACE:\n" + e.backtrace * "\n")
|
108
118
|
end
|
109
119
|
|
@@ -97,16 +97,17 @@ class Step
|
|
97
97
|
def self.log(status, message, path, &block)
|
98
98
|
if block_given?
|
99
99
|
start = Time.now
|
100
|
-
Log.
|
100
|
+
Log.info do
|
101
101
|
now = Time.now
|
102
|
-
str =
|
102
|
+
str = Log.color :reset
|
103
|
+
str << "#{ Log.color :cyan, status.to_s }"
|
103
104
|
str << ": #{ message }" if message
|
104
105
|
str << " -- #{Log.color :blue, path.to_s}" if path
|
105
106
|
str
|
106
107
|
end
|
107
108
|
res = yield
|
108
109
|
eend = Time.now
|
109
|
-
Log.
|
110
|
+
Log.info do
|
110
111
|
now = Time.now
|
111
112
|
str = "#{ Log.color :cyan, status.to_s } +#{Log.color :green, "%.1g" % (eend - start)}"
|
112
113
|
str << " -- #{Log.color :blue, path.to_s}" if path
|
@@ -114,9 +115,10 @@ class Step
|
|
114
115
|
end
|
115
116
|
res
|
116
117
|
else
|
117
|
-
Log.
|
118
|
+
Log.info do
|
118
119
|
now = Time.now
|
119
|
-
str =
|
120
|
+
str = Log.color :reset
|
121
|
+
str << "#{ Log.color :cyan, status.to_s }"
|
120
122
|
str << ": #{ message }" if message
|
121
123
|
str << " -- #{Log.color :blue, path.to_s}" if path
|
122
124
|
str
|
data/lib/rbbt/workflow/step.rb
CHANGED
@@ -42,7 +42,9 @@ class Step
|
|
42
42
|
attr_accessor :relay_step
|
43
43
|
alias original_log log
|
44
44
|
def log(status, message = nil)
|
45
|
-
|
45
|
+
Log.with_severity 10 do
|
46
|
+
original_log(status, message)
|
47
|
+
end
|
46
48
|
relay_step.log([task.name.to_s, status.to_s] * ">", message.nil? ? nil : [task.name.to_s, message] * ">")
|
47
49
|
end
|
48
50
|
end
|
@@ -104,9 +106,12 @@ class Step
|
|
104
106
|
Open.rm info_file if Open.exists? info_file
|
105
107
|
|
106
108
|
set_info :pid, Process.pid
|
109
|
+
set_info :issued, Time.now
|
107
110
|
|
108
111
|
set_info :dependencies, dependencies.collect{|dep| [dep.task.name, dep.name]}
|
112
|
+
log(:preparing, "Preparing job")
|
109
113
|
dependencies.each{|dependency|
|
114
|
+
Log.info "#{Log.color :magenta, "Checking dependency"} #{Log.color :yellow, task.name.to_s || ""} => #{Log.color :yellow, dependency.task.name.to_s || ""}"
|
110
115
|
begin
|
111
116
|
dependency.relay_log self
|
112
117
|
dependency.clean if not dependency.done? and dependency.error?
|
@@ -114,15 +119,12 @@ class Step
|
|
114
119
|
rescue Exception
|
115
120
|
backtrace = $!.backtrace
|
116
121
|
set_info :backtrace, backtrace
|
117
|
-
log(:error, "Exception processing dependency #{dependency.
|
118
|
-
|
119
|
-
log(:error, "backtrace: #{$!.backtrace.first}")
|
120
|
-
Log.exception $!
|
121
|
-
raise "Exception processing dependency #{dependency.path}"
|
122
|
+
log(:error, "Exception processing dependency #{Log.color :yellow, dependency.task.name.to_s} -- #{$!.class}: #{$!.message}")
|
123
|
+
raise $!
|
122
124
|
end
|
123
125
|
}
|
124
126
|
|
125
|
-
Log.
|
127
|
+
Log.info{"#{Log.color :magenta, "Starting task"} #{Log.color :yellow, task.name.to_s || ""} [#{Process.pid}]: #{ Log.color :blue, path }"}
|
126
128
|
set_info :status, :started
|
127
129
|
|
128
130
|
set_info :started, (start_time = Time.now)
|
@@ -157,14 +159,13 @@ class Step
|
|
157
159
|
|
158
160
|
set_info :backtrace, backtrace
|
159
161
|
log(:error, "#{$!.class}: #{$!.message}")
|
160
|
-
log(:error, "backtrace: #{$!.backtrace.first}")
|
161
162
|
raise $!
|
162
163
|
end
|
163
164
|
|
164
165
|
set_info :status, :done
|
165
166
|
set_info :done, (done_time = Time.now)
|
166
167
|
set_info :time_elapsed, done_time - start_time
|
167
|
-
Log.
|
168
|
+
Log.info{"#{Log.color :magenta, "Completed task"} #{Log.color :yellow, task.name.to_s || ""} [#{Process.pid}]: #{ Log.color :blue, path }"}
|
168
169
|
|
169
170
|
res
|
170
171
|
end
|
data/lib/rbbt/workflow/usage.rb
CHANGED
@@ -22,19 +22,19 @@ module Task
|
|
22
22
|
puts SOPT.input_doc(inputs, input_types, input_descriptions, input_defaults, true)
|
23
23
|
puts
|
24
24
|
|
25
|
-
puts "Returns: " << Log.color(:blue, result_type.to_s) << "\n"
|
26
|
-
puts
|
27
|
-
|
28
25
|
if deps and deps.any?
|
29
26
|
puts "From dependencies:"
|
30
27
|
puts
|
31
28
|
deps.each do |dep|
|
32
|
-
puts " #{dep.name}:"
|
29
|
+
puts " #{Log.color :magenta, dep.name.to_s}:"
|
33
30
|
puts
|
34
31
|
puts SOPT.input_doc((dep.inputs - self.inputs), dep.input_types, dep.input_descriptions, dep.input_defaults, true)
|
35
32
|
puts
|
36
33
|
end
|
37
34
|
end
|
35
|
+
|
36
|
+
puts "Returns: " << Log.color(:blue, result_type.to_s) << "\n"
|
37
|
+
puts
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -44,18 +44,18 @@ else
|
|
44
44
|
|
45
45
|
puts "File: #{ file }"
|
46
46
|
puts "Type: #{header.type}"
|
47
|
-
puts "Key: #{header.key_field}"
|
47
|
+
puts "Key: #{Log.color :yellow, header.key_field}"
|
48
48
|
puts "Fields: "
|
49
49
|
if header.fields.nil?
|
50
50
|
else
|
51
51
|
header.fields.each_with_index do |f,i|
|
52
|
-
puts " - #{i + 1}: " << f
|
52
|
+
puts " - #{Log.color :cyan, i + 1}: " << Log.color(:yellow, f)
|
53
53
|
end
|
54
54
|
end
|
55
|
-
puts "Rows: #{`wc -l #{ file }|cut -f 1 -d' '`}" unless Open.remote? file
|
56
|
-
puts "First line:"
|
55
|
+
puts "Rows: #{Log.color :blue, `wc -l #{ file }|cut -f 1 -d' '`}" unless Open.remote? file
|
57
56
|
parts = []
|
58
|
-
header.first_line.split(header.sep).each_with_index{|p,i| parts << "(#{i})
|
57
|
+
header.first_line.split(header.sep).each_with_index{|p,i| parts << (Log.color(:cyan, "(#{i}) ") << p.strip) }
|
59
58
|
puts parts * "\t"
|
59
|
+
puts
|
60
60
|
end
|
61
61
|
|
@@ -142,7 +142,8 @@ the job dependencies recursively.
|
|
142
142
|
-pf--printpath Print the path of the job result:
|
143
143
|
-cl--clean Clean the last step of the job so that it gets recomputed:
|
144
144
|
-rcl--recursive_clean Clean the last step and its dependencies to recompute the job completely:
|
145
|
-
--fork Run job asyncronously:
|
145
|
+
--fork Run job asyncronously and monitor progress. It monitors detached processes as well:
|
146
|
+
--detach Run job asyncronously and detach process:
|
146
147
|
--exec Run job with no persistence:
|
147
148
|
-O--output* Save job result into file:
|
148
149
|
-jf--job_file* Output one of the job produced files:
|
@@ -160,6 +161,7 @@ task = ARGV.shift
|
|
160
161
|
# Set log, fork, clean, recursive_clean and help
|
161
162
|
help = !!options.delete(:help)
|
162
163
|
do_fork = !!options.delete(:fork)
|
164
|
+
detach = !!options.delete(:detach)
|
163
165
|
do_exec = !!options.delete(:exec)
|
164
166
|
clean = !!options.delete(:clean)
|
165
167
|
recursive_clean = !!options.delete(:recursive_clean)
|
@@ -221,10 +223,12 @@ workflow.workdir = Path.setup(File.expand_path(options.delete(:workdir))) if opt
|
|
221
223
|
|
222
224
|
#- get job
|
223
225
|
|
226
|
+
|
224
227
|
job = workflow.job(task.name, name, job_options)
|
225
228
|
|
226
229
|
# clean job
|
227
230
|
if clean
|
231
|
+
job.abort if job.running?
|
228
232
|
job.clean
|
229
233
|
sleep 1
|
230
234
|
job = workflow.job(task.name, name, job_options)
|
@@ -262,21 +266,33 @@ begin
|
|
262
266
|
|
263
267
|
if do_fork
|
264
268
|
job.fork
|
269
|
+
if detach
|
270
|
+
Process.detach job.pid
|
271
|
+
puts Log.color(:magenta, "Issued: ") + Log.color(:magenta, job.pid.to_s) + ' -- ' + job.path
|
272
|
+
exit 0
|
273
|
+
end
|
265
274
|
puts
|
275
|
+
puts
|
266
276
|
while not job.done?
|
267
|
-
message = job.messages ? job.messages.last : "no message"
|
268
|
-
status = job.status
|
269
|
-
|
270
|
-
|
277
|
+
message = (job.messages and job.messages.any?) ? job.messages.last.strip : "no message"
|
278
|
+
status = job.status || "no status"
|
279
|
+
time = Time.now - job.info[:issued] if job.info and job.info.include? :issued
|
280
|
+
size = Log.tty_size
|
281
|
+
size = 100 if size.nil?
|
282
|
+
puts Log.return_line << " " * size << Log.return_line
|
283
|
+
puts Log.return_line << " " * size << Log.return_line
|
284
|
+
puts "#{Log.color :blue, job.path}"
|
285
|
+
puts "Waiting on #{Log.color :blue, job.info[:pid] || job.pid} (+#{time.to_i if time}) " << [Log.color(:cyan, status.to_s),message.strip].compact*" "
|
271
286
|
sleep 2
|
272
287
|
end
|
273
|
-
Signal.trap(:INT){ job.abort }
|
288
|
+
#Signal.trap(:INT){ job.abort }
|
274
289
|
raise job.messages.last if job.error?
|
275
290
|
res = job.load
|
276
291
|
else
|
277
292
|
res = job.run(true)
|
278
293
|
end
|
279
294
|
|
295
|
+
puts res
|
280
296
|
|
281
297
|
if options.delete(:provenance)
|
282
298
|
pp job.provenance
|
@@ -306,7 +322,6 @@ rescue ParameterException
|
|
306
322
|
exit -1
|
307
323
|
end
|
308
324
|
|
309
|
-
|
310
325
|
if options.delete(:list_job_files)
|
311
326
|
out.puts job.files * "\n"
|
312
327
|
exit 0
|
@@ -317,8 +332,9 @@ if job_file = options.delete(:job_file)
|
|
317
332
|
out.puts Path === file ? file.read : file
|
318
333
|
exit 0
|
319
334
|
end
|
335
|
+
ddd 1
|
320
336
|
|
321
|
-
if Step === res
|
337
|
+
if Step === res and not res.exec
|
322
338
|
out.puts Open.read(res.path) if File.exists? res.path
|
323
339
|
else
|
324
340
|
out.puts res
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.9.
|
4
|
+
version: 5.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|