rbbt-util 5.9.3 → 5.9.4
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/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
|