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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 29daeb012f3ce90b479f7b858abff79e166f936d
4
- data.tar.gz: 78e6fd7422a46b33271de8c8f0eb81d0fc97d772
3
+ metadata.gz: 2cf8e981590ec75d716c3b173786a1d9d49751af
4
+ data.tar.gz: c48d0c459d08b67b68a5caf94d31bef4ea10e4c4
5
5
  SHA512:
6
- metadata.gz: bcbb30fb3e53e872d6b2de2fce030f93a78fbe01b7d1a238d8dff243d602f2f42ba6d11e01de4f11ac9aead3d4a90c03779bdd8f1311aa72b4c62d2d320bfef5
7
- data.tar.gz: 4e5faf9f1ac86e500fd9f5d747ed2c34ba31aabf2a8bbced66aa626bb7e2f1b7d3428cd5af714dfe09c7ae5990302409edfb691bafe1e7fa4bf99d64c01f4dcc
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
 
@@ -289,7 +289,7 @@ module Persist
289
289
  res
290
290
  end
291
291
  rescue
292
- Log.high "Error in persist. #{Open.exists?(path) ? "Erasing '#{ path }'" : ""}"
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
@@ -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
@@ -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
@@ -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.medium do
100
+ Log.info do
101
101
  now = Time.now
102
- str = "#{ Log.color :cyan, status.to_s }"
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.medium do
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.medium do
118
+ Log.info do
118
119
  now = Time.now
119
- str = "#{ Log.color :cyan, status.to_s }"
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
@@ -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
- original_log(status, message)
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.path}")
118
- log(:error, "#{$!.class}: #{$!.message}")
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.medium{"#{Log.color :magenta, "Starting task"} #{Log.color :yellow, task.name.to_s || ""} [#{Process.pid}]: #{ path }"}
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.medium{"#{Log.color :magenta, "Completed task"} #{Log.color :yellow, task.name.to_s || ""} [#{Process.pid}]: #{ path }"}
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
@@ -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}) #{p}"}
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
- puts("No status yet") and next if status.nil?
270
- puts Log.return_line + "Waiting on #{job.pid} " + [Log.color(:magenta, status.to_s),message]*" " + " " * 100
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.3
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-20 00:00:00.000000000 Z
11
+ date: 2014-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake