rbbt-util 5.22.5 → 5.23.0

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: 1c617d4a4ffaed12ddf8a5cdf44a4ff5113e47d0
4
- data.tar.gz: 74125cd2876fff8d7c097d89eee4adb47f61a26c
3
+ metadata.gz: b7397119676c0da57371a52797ef8a3f4dc2bc0a
4
+ data.tar.gz: 973e8a7c4e2cb6eb960ed2b7c782dae0a615c0ac
5
5
  SHA512:
6
- metadata.gz: 81bf1cb9b56203f6ab747ef961fc920146e07b78e2a220fdf2e9174adfd0effbf01974e4560ff6759c2e180d4ce03ea6c2db4fc2a047e07162c342a265735b8f
7
- data.tar.gz: c4ef6e26f7683f2365f9ca15cfc045cf69a04a174d2f59a0dce0a22ede010b22f962d17d9bc03f73469338c1c47c2c6cf33a6d65173e387e6f71c633462fabfc
6
+ metadata.gz: 26497c36b05b98961b845562930dceb399c720ab399c5a71c16ccbefb6e5b9756c407ca4fd1ca5b679ef1fca5ea1c989fd1cd4b28b33d8ae983d82cdcfa99aa8
7
+ data.tar.gz: 37a2aa35faac67658a57ef32d2ab662968a4a11ba44a6a1174d79cdfd86a4315f8ee2b57b3f870b928a4e7b1138ceb5f81f12b513beff95bf00171839083bc9b
@@ -227,12 +227,12 @@ module Path
227
227
  compact.select{|file| file.exists? }.uniq
228
228
  end
229
229
 
230
- def glob_all(caller_lib = nil, search_paths = nil)
230
+ def glob_all(pattern = nil, caller_lib = nil, search_paths = nil)
231
231
  search_paths ||= @search_paths || SEARCH_PATHS
232
232
  search_paths = search_paths.dup
233
233
 
234
234
  search_paths.keys.
235
- collect{|where| Dir.glob(find(where, Path.caller_lib_dir, search_paths))}.
235
+ collect{|where| pattern ? Dir.glob(File.join(find(where, Path.caller_lib_dir, search_paths), pattern)) : Dir.glob(find(where, Path.caller_lib_dir, search_paths)) }.
236
236
  compact.flatten.collect{|file| File.expand_path(file)}.uniq.collect{|path| Path.setup(path, self.resource, self.pkgdir)}
237
237
  end
238
238
  #{{{ Methods
@@ -128,7 +128,7 @@ module TSV
128
128
  file.join
129
129
  raise "Aborted stream from Step #{file.path}" if file.aborted?
130
130
  raise "Exception in stream from Step #{file.path}: #{file.messages.last}" if file.error?
131
- get_stream(file.path)
131
+ get_stream(file.path, open_options)
132
132
  end
133
133
  end
134
134
  when Array
@@ -65,10 +65,8 @@ module CMD
65
65
 
66
66
  if IO === in_content
67
67
  in_content.close if in_content.respond_to?(:close) and not in_content.closed?
68
- in_content.join if in_content.respond_to?(:join) and not in_content.joined?
69
68
  end
70
69
 
71
-
72
70
  STDERR.reopen serr.last
73
71
  serr.last.close
74
72
 
@@ -15,6 +15,10 @@ class RbbtProcessQueue
15
15
  @process_mutex = Mutex.new
16
16
  end
17
17
 
18
+
19
+ ABORT_SIGNAL = :INT
20
+ CLOSE_SIGNAL = :PIPE
21
+
18
22
  attr_accessor :callback, :callback_queue, :callback_thread
19
23
  def callback(&block)
20
24
  if block_given?
@@ -64,8 +68,9 @@ class RbbtProcessQueue
64
68
 
65
69
  @master_pid = Process.fork do
66
70
  @close_up = false
67
- Signal.trap(:INT) do
68
- @close_up = true
71
+
72
+ Signal.trap(CLOSE_SIGNAL) do
73
+ @close_up = true unless @closing_thread
69
74
  Misc.insist([0,0.01,0.1,0.2,0.5]) do
70
75
  raise TryAgain unless @manager_thread
71
76
  if @manager_thread.alive?
@@ -75,6 +80,25 @@ class RbbtProcessQueue
75
80
  end
76
81
  end
77
82
 
83
+ Signal.trap(:USR1) do
84
+ @count += 1
85
+ @manager_thread.raise TryAgain
86
+ end
87
+
88
+ Signal.trap(:USR2) do
89
+ @count -= 1
90
+ @manager_thread.raise TryAgain
91
+ end
92
+
93
+ Signal.trap(ABORT_SIGNAL) do
94
+ begin
95
+ @monitor_thread.raise Aborted
96
+ rescue Exception
97
+ Log.exception $!
98
+ end
99
+ end
100
+
101
+
78
102
  if @callback_queue
79
103
  Misc.purge_pipes(@queue.swrite,@queue.sread,@callback_queue.swrite, @callback_queue.sread)
80
104
  else
@@ -91,15 +115,16 @@ class RbbtProcessQueue
91
115
  begin
92
116
  Thread.current["working"] = true
93
117
  if @close_up
118
+ @close_up = false
94
119
  Log.debug "Closing up process queue #{Process.pid}"
95
120
  @count = 0
96
- Thread.new do
121
+ @closing_thread = Thread.new do
97
122
  Log.debug "Pushing closed stream #{Process.pid}"
98
123
  while true
99
124
  @queue.push ClosedStream.new unless @queue.cleaned
125
+ break if @processes.empty?
100
126
  end unless @processes.empty?
101
127
  end
102
- @close_up = false
103
128
  end
104
129
 
105
130
  begin
@@ -141,17 +166,6 @@ class RbbtProcessQueue
141
166
  end
142
167
  end
143
168
 
144
- Signal.trap(:USR1) do
145
- @count += 1
146
- @manager_thread.raise TryAgain
147
- end
148
-
149
- Signal.trap(:USR2) do
150
- @count -= 1
151
- @manager_thread.raise TryAgain
152
- end
153
-
154
-
155
169
  @callback_queue.close_read if @callback_queue
156
170
 
157
171
  num_processes.times do |i|
@@ -183,16 +197,12 @@ class RbbtProcessQueue
183
197
  end
184
198
  end
185
199
 
186
- Signal.trap(20) do
187
- begin
188
- @monitor_thread.raise Aborted.new
189
- rescue Exception
190
- Log.exception $!
191
- end
192
- end
193
200
 
194
201
  begin
195
- @monitor_thread.join
202
+
203
+ while @monitor_thread.alive?
204
+ @monitor_thread.join(1)
205
+ end
196
206
  rescue Exception
197
207
  Log.exception $!
198
208
  end
@@ -222,7 +232,7 @@ class RbbtProcessQueue
222
232
  rescue Exception
223
233
  Log.warn "Error closing callback: #{$!.message}"
224
234
  end
225
- @callback_thread.join #if @callback_thread.alive?
235
+ @callback_thread.join if @callback_thread && @callback_thread.alive?
226
236
  t.join
227
237
  end
228
238
 
@@ -240,6 +250,8 @@ class RbbtProcessQueue
240
250
  Log.error "Exception joining queue: #{$!.message}"
241
251
  raise $!
242
252
  ensure
253
+ close_callback if @callback
254
+ @callback_thread.join if @callback_thread
243
255
  if @join
244
256
  if @join.arity == 1
245
257
  @join.call(error)
@@ -253,7 +265,7 @@ class RbbtProcessQueue
253
265
 
254
266
  def join
255
267
  begin
256
- Process.kill :INT, @master_pid
268
+ Process.kill CLOSE_SIGNAL, @master_pid
257
269
  rescue Errno::ECHILD, Errno::ESRCH
258
270
  Log.debug "Cannot kill #{@master_pid}: #{$!.message}"
259
271
  end
@@ -264,20 +276,16 @@ class RbbtProcessQueue
264
276
  close_callback if @callback
265
277
  @queue.swrite.close unless @queue.swrite.closed?
266
278
  end
267
- @callback_thread.join if @callback_thread
279
+ #@callback_thread.join if @callback_thread
268
280
  self.clean
269
281
  end
270
282
 
271
283
  def _abort
272
284
  begin
273
- Process.kill 20, @master_pid
285
+ Process.kill ABORT_SIGNAL, @master_pid
286
+ pid, status = Process.waitpid2 @master_pid
274
287
  rescue Errno::ECHILD, Errno::ESRCH
275
- Log.debug "Cannot kill #{@master_pid}: #{$!.message}"
276
- end
277
-
278
- begin
279
- _join
280
- rescue ProcessFailed
288
+ Log.warn "Cannot kill #{@master_pid}: #{$!.message}"
281
289
  end
282
290
  end
283
291
 
@@ -61,5 +61,10 @@ module Log
61
61
  Log.exception $!
62
62
  end
63
63
  end
64
+
65
+ def pos(pos)
66
+ step = pos - (@ticks || 0)
67
+ tick(step)
68
+ end
64
69
  end
65
70
  end
@@ -18,10 +18,10 @@ module ConcurrentStream
18
18
  stream.pids ||= []
19
19
  stream.threads.concat(Array === threads ? threads : [threads]) unless threads.nil?
20
20
  stream.pids.concat(Array === pids ? pids : [pids]) unless pids.nil? or pids.empty?
21
- stream.autojoin = autojoin
22
- stream.no_fail = no_fail
21
+ stream.autojoin = autojoin unless autojoin.nil?
22
+ stream.no_fail = no_fail unless no_fail.nil?
23
23
 
24
- stream.pair = pair if pair
24
+ stream.pair = pair unless pair.nil?
25
25
 
26
26
  callback = block if block_given?
27
27
  if callback
@@ -50,7 +50,7 @@ module ConcurrentStream
50
50
 
51
51
  stream.filename = filename unless filename.nil?
52
52
 
53
- stream.lockfile = lockfile if lockfile
53
+ stream.lockfile = lockfile unless lockfile.nil?
54
54
 
55
55
  stream.aborted = false
56
56
 
@@ -219,4 +219,12 @@ module ConcurrentStream
219
219
  end
220
220
  end
221
221
 
222
+ def raise(exception)
223
+ threads.each do |thread|
224
+ thread.raise exception
225
+ end
226
+
227
+ self.abort
228
+ end
229
+
222
230
  end
@@ -266,9 +266,9 @@ module Misc
266
266
  end
267
267
 
268
268
 
269
- def self.sort_mutations(mutations)
269
+ def self.sort_mutations_strict(mutations)
270
270
  mutations.collect do |mutation|
271
- chr,pos,mut = mutation.split ":"
271
+ chr, pos, mut = mutation.split ":"
272
272
  chr.sub!(/^chr/i,'')
273
273
  chr = 22 if chr == "Y"
274
274
  chr = 23 if chr == "X"
@@ -293,6 +293,10 @@ module Misc
293
293
  end.collect{|p| p.last }
294
294
  end
295
295
 
296
+ class << self
297
+ alias sort_mutations sort_mutations_strict
298
+ end
299
+
296
300
  def self.ensembl_server(organism)
297
301
  date = organism.split("/")[1]
298
302
  if date.nil?
@@ -302,8 +306,12 @@ module Misc
302
306
  end
303
307
  end
304
308
 
309
+ def self.sort_genomic_locations_strict(stream, sep = ":")
310
+ sort_stream(stream, '#', "-k1,1V -k2,2n -t#{sep}")
311
+ end
312
+
305
313
  def self.sort_genomic_locations(stream)
306
- sort_stream(stream, '#', '-k1,1 -k2,2n -t:')
314
+ sort_stream(stream, '#', "-k1,1 -k2,2n -t#{sep}")
307
315
  end
308
316
 
309
317
  def self.intersect_streams_read(io, sep=":")
@@ -319,18 +327,46 @@ module Misc
319
327
  [line,chr, start, eend, rest]
320
328
  end
321
329
 
322
- def self.intersect_streams_cmp_chr(chr1, chr2)
323
- if chr1 =~ /^\d+$/ and chr2 =~ /^\d+$/
324
- chr1 <=> chr2
325
- elsif chr1 =~ /^\d+$/
330
+ def self.chr_cmp_strict(chr1, chr2)
331
+ if (m1 = chr1.match(/(\d+)$/)) && (m2 = chr2.match(/(\d+)$/))
332
+ m1[1].to_i <=> m2[1].to_i
333
+ elsif chr1 =~ /\d+$/
326
334
  -1
327
- elsif chr2 =~ /^\d+$/
335
+ elsif chr2 =~ /\d+$/
328
336
  1
329
337
  else
330
338
  chr1 <=> chr2
331
339
  end
332
340
  end
333
341
 
342
+ def self.genomic_location_cmp(gpos1, gpos2, sep = ":")
343
+ chr1, _sep, pos1 = gpos1.partition(sep)
344
+ chr2, _sep, pos2 = gpos2.partition(sep)
345
+ cmp = chr1 <=> chr2
346
+ case cmp
347
+ when 0
348
+ pos1.to_i <=> pos2.to_i
349
+ else
350
+ cmp
351
+ end
352
+ end
353
+
354
+ def self.genomic_location_cmp_strict(gpos1, gpos2, sep = ":")
355
+ chr1, _sep, pos1 = gpos1.partition(sep)
356
+ chr2, _sep, pos2 = gpos2.partition(sep)
357
+ cmp = chr_cmp_strict(chr1, chr2)
358
+ case cmp
359
+ when 0
360
+ pos1.to_i <=> pos2.to_i
361
+ else
362
+ cmp
363
+ end
364
+ end
365
+
366
+ def self.intersect_streams_cmp_chr(chr1, chr2)
367
+ chr1 <=> chr2
368
+ end
369
+
334
370
  def self.intersect_streams(f1, f2, out, sep=":")
335
371
  finish = false
336
372
  return if f1.eof? or f2.eof?
@@ -404,7 +440,7 @@ module Misc
404
440
  max_size = 0
405
441
  nio = Misc.open_pipe do |sin|
406
442
  while line = io.gets
407
- chr, start, eend, id, *rest = line.split("\t")
443
+ chr, start, eend, id, *rest = line.chomp.split("\t")
408
444
  l = id.length
409
445
  max_size = l if max_size < l
410
446
  chr = chr.sub('chr','')
@@ -422,6 +458,7 @@ module Misc
422
458
  end
423
459
 
424
460
  TSV.traverse tmpfile, :type => :array, :bar => "Creating BED index for #{Misc.fingerprint source}" do |line|
461
+ next if line.empty?
425
462
  chr, start, eend, id, *rest = line.split("\t")
426
463
  key = [chr, start, eend] * ":"
427
464
  sharder[key] = id
@@ -197,7 +197,10 @@ module Misc
197
197
  rescue IOError
198
198
  end
199
199
 
200
+ stream.close unless stream.closed?
201
+ stream.join if stream.respond_to? :join
200
202
  in_pipes.first.close
203
+ #Log.medium "Tee done #{Misc.fingerprint stream}"
201
204
  rescue Aborted, Interrupt
202
205
  stream.abort if stream.respond_to? :abort
203
206
  out_pipes.each do |sout|
@@ -219,10 +222,11 @@ module Misc
219
222
  ConcurrentStream.setup sout, :threads => splitter_thread, :filename => filename, :_pair => stream
220
223
  end
221
224
 
222
- out_pipes.first.autojoin = true
225
+ main_pipe = out_pipes.first
226
+ main_pipe.autojoin = true
223
227
 
224
- out_pipes.first.callback = Proc.new do
225
- stream.join
228
+ main_pipe.callback = Proc.new do
229
+ stream.join if stream.respond_to? :join
226
230
  in_pipes[1..-1].each do |sin|
227
231
  sin.close unless sin.closed?
228
232
  end
@@ -246,7 +250,7 @@ module Misc
246
250
  rest
247
251
  end
248
252
 
249
- def Misc.dup_stream (stream)
253
+ def self.dup_stream(stream)
250
254
  dup_stream_multiple(stream, 1).first
251
255
  end
252
256
 
@@ -314,6 +318,8 @@ module Misc
314
318
  into.close if into and into_close and not into.closed?
315
319
  into.join if into and into_close and into.respond_to?(:joined?) and not into.joined?
316
320
  block.call if block_given?
321
+
322
+ #Log.medium "Done consuming stream #{Misc.fingerprint io}"
317
323
  rescue Aborted
318
324
  Log.medium "Consume stream aborted #{Misc.fingerprint io}"
319
325
  io.abort if io.respond_to? :abort
@@ -514,7 +520,7 @@ module Misc
514
520
  end
515
521
  end
516
522
 
517
- def self._paste_streams(streams, output, lines = nil, sep = "\t", header = nil)
523
+ def self._paste_streams(streams, output, lines = nil, sep = "\t", header = nil, &block)
518
524
  output.puts header if header
519
525
  streams = streams.collect do |stream|
520
526
  if defined? Step and Step === stream
@@ -542,7 +548,11 @@ module Misc
542
548
  sizes = parts.collect{|p| p.nil? ? 0 : p.length }
543
549
  last_min = nil
544
550
  while lines.compact.any?
545
- min = keys.compact.sort.first
551
+ if block_given?
552
+ min = keys.compact.sort(&block).first
553
+ else
554
+ min = keys.compact.sort.first
555
+ end
546
556
  str = []
547
557
  keys.each_with_index do |key,i|
548
558
  case key
@@ -576,11 +586,11 @@ module Misc
576
586
  end
577
587
  end
578
588
 
579
- def self.paste_streams(streams, lines = nil, sep = "\t", header = nil)
589
+ def self.paste_streams(streams, lines = nil, sep = "\t", header = nil, &block)
580
590
  sep ||= "\t"
581
591
  num_streams = streams.length
582
592
  Misc.open_pipe do |sin|
583
- self._paste_streams(streams, sin, lines, sep, header)
593
+ self._paste_streams(streams, sin, lines, sep, header, &block)
584
594
  end
585
595
  end
586
596
 
@@ -667,11 +677,14 @@ module Misc
667
677
  end
668
678
  end
669
679
 
680
+ def self.sort_mutation_stream_strict(stream, sep=":")
681
+ CMD.cmd("grep '#{sep}' | sort -u | sed 's/^M:/MT:/' | env LC_ALL=C sort -V -k1,1 -k2,2n -k3,3n -t'#{sep}'", :in => stream, :pipe => true, :no_fail => true)
682
+ end
683
+
670
684
  def self.sort_mutation_stream(stream, sep=":")
671
685
  CMD.cmd("grep '#{sep}' | sort -u | sed 's/^M:/MT:/' | env LC_ALL=C sort -k1,1 -k2,2n -k3,3n -t'#{sep}'", :in => stream, :pipe => true, :no_fail => true)
672
686
  end
673
687
 
674
-
675
688
  def self.swap_quoted_character(stream, charout="\n", charin=" ", quote='"')
676
689
  io = Misc.open_pipe do |sin|
677
690
  begin
@@ -698,4 +711,27 @@ module Misc
698
711
  swap_quoted_character(stream, "\n", " ", quote)
699
712
  end
700
713
 
714
+ def self.line_monitor_stream(stream, &block)
715
+ monitor, out = tee_stream stream
716
+ monitor_thread = Thread.new do
717
+ begin
718
+ while line = monitor.gets
719
+ block.call line
720
+ end
721
+ rescue
722
+ Log.exception $!
723
+ monitor.raise $!
724
+ monitor.close unless monitor.closed?
725
+ monitor.join if monitor.respond_to?(:join) && ! monitor.aborted?
726
+ out.raise $! if out.respond_to?(:raise)
727
+ ensure
728
+ monitor.close unless monitor.closed?
729
+ monitor.join if monitor.respond_to?(:join) && ! monitor.aborted?
730
+ end
731
+ end
732
+
733
+ stream.annotate out if stream.respond_to? :annotate
734
+ ConcurrentStream.setup out, :threads => monitor_thread
735
+ end
736
+
701
737
  end
@@ -236,6 +236,13 @@ module Open
236
236
  end
237
237
  end
238
238
 
239
+ def self.mkdir(target)
240
+ target = target.find if Path === target
241
+ if not File.exists?(target)
242
+ FileUtils.mkdir_p target
243
+ end
244
+ end
245
+
239
246
  def self.ln_s(source, target, options = {})
240
247
  source = source.find if Path === source
241
248
  target = target.find if Path === target
@@ -346,6 +353,14 @@ module Open
346
353
  CMD.cmd('zcat', :in => stream, :pipe => true, :no_fail => true, :no_wait => true)
347
354
  end
348
355
 
356
+ def self.gzip(stream)
357
+ CMD.cmd('gzip', :in => stream, :pipe => true, :no_fail => true, :no_wait => true)
358
+ end
359
+
360
+ def self.bgzip(stream)
361
+ CMD.cmd('bgzip', :in => stream, :pipe => true, :no_fail => true, :no_wait => true)
362
+ end
363
+
349
364
  def self.unzip(stream)
350
365
  TmpFile.with_file(stream.read) do |filename|
351
366
  StringIO.new(CMD.cmd("unzip '{opt}' #{filename}", "-p" => true, :pipe => true).read)
@@ -299,7 +299,6 @@ module Workflow
299
299
  taskname = taskname.to_sym
300
300
  return remote_tasks[taskname].job(taskname, jobname, inputs) if remote_tasks and remote_tasks.include? taskname
301
301
 
302
- jobname = DEFAULT_NAME if jobname.nil? or jobname.empty?
303
302
 
304
303
  task = tasks[taskname]
305
304
  raise "Task not found: #{ taskname }" if task.nil?
@@ -326,7 +325,15 @@ module Workflow
326
325
  raise ParameterException, "Inputs #{Misc.humanize_list(missing_inputs)} are required but were not provided or are nil"
327
326
  end
328
327
 
329
- dependencies = real_dependencies(task, jobname, defaults.merge(inputs), task_dependencies[taskname] || [])
328
+ if task.input_options
329
+ jobname_input = task.input_options.select{|i,o| o[:jobname]}.collect{|i,o| i }.first
330
+ else
331
+ jobname_input = nil
332
+ end
333
+
334
+ if jobname_input && jobname && inputs[jobname_input].nil?
335
+ inputs[jobname_input] = jobname
336
+ end
330
337
 
331
338
  real_inputs = {}
332
339
 
@@ -339,6 +346,14 @@ module Workflow
339
346
  real_inputs[k] = v
340
347
  end
341
348
 
349
+ jobname_input_value = inputs[jobname_input] || defaults[jobname_input]
350
+ if jobname_input && jobname.nil? && String === jobname_input_value && ! jobname_input_value.include?('/')
351
+ jobname = jobname_input_value
352
+ end
353
+
354
+ jobname = DEFAULT_NAME if jobname.nil? or jobname.empty?
355
+
356
+ dependencies = real_dependencies(task, jobname, defaults.merge(inputs), task_dependencies[taskname] || [])
342
357
  overriden = dependencies.select{|dep| dep.overriden }.any?
343
358
 
344
359
  if real_inputs.empty? and not Workflow::TAG == :inputs and not overriden
@@ -325,12 +325,14 @@ class Step
325
325
 
326
326
  def exception(ex, msg = nil)
327
327
  ex_class = ex.class.to_s
328
- set_info :backtrace, ex.backtrace
329
- set_info :exception, {:class => ex_class, :message => ex.message, :backtrace => ex.backtrace}
328
+ backtrace = ex.backtrace if ex.respond_to?(:backtrace)
329
+ message = ex.message if ex.respond_to?(:message)
330
+ set_info :backtrace, backtrace
331
+ set_info :exception, {:class => ex_class, :message => message, :backtrace => backtrace}
330
332
  if msg.nil?
331
- log :error, "#{ex_class} -- #{ex.message}"
333
+ log :error, "#{ex_class} -- #{message}"
332
334
  else
333
- log :error, "#{msg} -- #{ex.message}"
335
+ log :error, "#{msg} -- #{message}"
334
336
  end
335
337
  self._abort
336
338
  end
@@ -575,6 +577,53 @@ class Step
575
577
  end
576
578
  end
577
579
 
580
+ def monitor_stream(stream, options = {}, &block)
581
+ case options[:bar]
582
+ when TrueClass
583
+ bar = progress_bar
584
+ when Hash
585
+ bar = progress_bar options[:bar]
586
+ when Numeric
587
+ bar = progress_bar :max => options[:bar]
588
+ else
589
+ bar = options[:bar]
590
+ end
591
+
592
+ out = if bar.nil?
593
+ Misc.line_monitor_stream stream, &block
594
+ elsif (block.nil? || block.arity == 0)
595
+ Misc.line_monitor_stream stream do
596
+ bar.tick
597
+ end
598
+ elsif block.arity == 1
599
+ Misc.line_monitor_stream stream do |line|
600
+ bar.tick
601
+ block.call line
602
+ end
603
+ elsif block.arity == 2
604
+ Misc.line_monitor_stream stream do |line|
605
+ block.call line, bar
606
+ end
607
+ end
608
+
609
+ ConcurrentStream.setup(out, :abort_callback => Proc.new{
610
+ Log::ProgressBar.remove_bar(bar, true) if bar
611
+ }, :callback => Proc.new{
612
+ Log::ProgressBar.remove_bar(bar) if bar
613
+ })
614
+
615
+ bgzip = (options[:compress] || options[:gzip]).to_s == 'bgzip'
616
+ bgzip = true if options[:bgzip]
617
+
618
+ gzip = true if options[:compress] || options[:gzip]
619
+ if bgzip
620
+ Open.bgzip(out)
621
+ elsif gzip
622
+ Open.gzip(out)
623
+ else
624
+ out
625
+ end
626
+ end
578
627
  end
579
628
 
580
629
  module Workflow
@@ -1040,4 +1089,5 @@ module Workflow
1040
1089
  [exec_exports, synchronous_exports, asynchronous_exports, stream_exports].compact.flatten.uniq
1041
1090
  end
1042
1091
 
1092
+
1043
1093
  end
@@ -354,7 +354,7 @@ class Step
354
354
  ConcurrentStream.setup stream, :callback => callback, :abort_callback => abort_callback
355
355
 
356
356
  if AbortedStream === stream
357
- exception = stream.exception || Aborted
357
+ exception = stream.exception || Aborted.new("Aborted stream: #{Misc.fingerprint stream}")
358
358
  self.exception exception
359
359
  _clean_finished
360
360
  raise exception
@@ -281,7 +281,7 @@ end
281
281
 
282
282
  usage workflow, task and exit 0 if help
283
283
 
284
- name = options.delete(:jobname) || "Default"
284
+ name = options.delete(:jobname)
285
285
 
286
286
  # get job args
287
287
  sopt_option_string = SOPT_options(workflow, task)
@@ -34,7 +34,6 @@ class TestTSV < Test::Unit::TestCase
34
34
  end
35
35
 
36
36
  def __test_rake
37
- iii TestResource.tmp.test.work.footest.foo.find
38
37
  TestResource.tmp.test.work.footest.foo.read == "TEST"
39
38
  assert TestResource.tmp.test.work.footest.foo.read == "TEST"
40
39
  end
@@ -124,12 +124,27 @@ for this dependency
124
124
  step(:t1).load + step(:t2).load
125
125
  end
126
126
 
127
+ input :name, :string, "Name", nil, :jobname => true
128
+ task :call_name => :string do |name|
129
+ "Hi #{name}"
130
+ end
131
+
127
132
  end
128
133
 
129
134
  TestWF.workdir = Rbbt.tmp.test.workflow
130
135
 
131
136
  class TestWorkflow < Test::Unit::TestCase
132
137
 
138
+ def test_as_jobname
139
+ job = TestWF.job(:call_name, "Miguel")
140
+ assert_equal "Hi Miguel", job.run
141
+ assert_equal "Miguel", job.clean_name
142
+
143
+ job = TestWF.job(:call_name, nil, :name => "Miguel")
144
+ assert_equal "Hi Miguel", job.run
145
+ assert_equal "Miguel", job.clean_name
146
+ end
147
+
133
148
  def test_update_on_input_dependency_update
134
149
  send_input_dep_to_reverse_job = TestWF.job(:send_input_dep_to_reverse, nil, :name => "Miguel")
135
150
  send_input_dep_to_reverse_job.clean
@@ -68,7 +68,23 @@ class TestProgress < Test::Unit::TestCase
68
68
  sleep 0.2
69
69
  end
70
70
  end
71
+ end
72
+
73
+ def test_pos
74
+ size = 10000
71
75
 
76
+ Log::ProgressBar.with_bar(size, :desc => "Bar 1") do |bar|
77
+ bar.init
78
+ nums = []
79
+ 100.times do
80
+ nums << rand(size)
81
+ end
82
+ nums.sort.each do |num|
83
+ bar.pos num
84
+ sleep 0.1
85
+ end
86
+ bar.tick
87
+ end
72
88
  end
73
89
 
74
90
  end
@@ -78,7 +78,6 @@ class TestMiscOmics < Test::Unit::TestCase
78
78
  end
79
79
  end
80
80
 
81
-
82
81
  io = Misc.open_pipe do |sin|
83
82
  sin.write text
84
83
  end
@@ -131,13 +131,17 @@ row2 AA BB CC
131
131
  row3 AAA BBB CCC
132
132
  row1 A B C
133
133
  EOF
134
+ Log.severity = 0
134
135
 
135
136
  text = text * 10000
136
137
  TmpFile.with_file(text) do |tmp|
137
138
  io = Open.open(tmp)
138
139
  dup = Misc.dup_stream(io)
139
- Misc.consume_stream io, true
140
- assert_equal text, dup.read
140
+ new_text = StringIO.new ""
141
+ Misc.consume_stream dup, true, new_text
142
+ Misc.consume_stream io, false
143
+ new_text.rewind
144
+ assert_equal text, new_text.read
141
145
  end
142
146
 
143
147
 
@@ -244,7 +248,25 @@ line4
244
248
  out.rewind
245
249
  assert_equal text, out.read
246
250
  end
251
+ end
247
252
 
253
+ def test_monitor
254
+ text =<<-EOF
255
+ line1
256
+ line2
257
+ line3
258
+ line4
259
+ EOF
248
260
 
261
+ Log.severity = 0
262
+ TmpFile.with_file(text) do |file|
263
+ io = Open.open(file)
264
+ lines = Set.new
265
+ io2 = Misc.line_monitor_stream io do |line|
266
+ lines << line
267
+ end
268
+ Misc.consume_stream(io2, false)
269
+ assert_equal text, lines.to_a * ""
270
+ end
249
271
  end
250
272
  end
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.22.5
4
+ version: 5.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-17 00:00:00.000000000 Z
11
+ date: 2018-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake