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 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