rbbt-util 5.21.129 → 5.21.130

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: f5f684d18bdb89966ce14703094359d62b64708d
4
- data.tar.gz: 7298dc99105519116914c348280ef3a2f751ef5b
3
+ metadata.gz: 6996eb266a74a60fe3d8dbe789eccdc1aef28f63
4
+ data.tar.gz: cae5ae771a6fb59164c08952b189d399343e2be7
5
5
  SHA512:
6
- metadata.gz: 9ddbbf8a627aca9d41640c4bda71fd44f3a29366cd3c0d015b23ac7c1e86b1ea964c04fc19719a10732f3fadd2506e2118dfea9aa55e782c820e595d9f639b40
7
- data.tar.gz: 78800e637163f3ddfc6cee51ea06a19a58d9e47baa87ec73327268414c72c731236f49dd1f6d0a18b25eebaf1df6f4c7063ee52fbb626441ab41c55eb24e990e
6
+ metadata.gz: 60e9b3df6233872a4cbabd811a136d0778e7ba7a57833539c802ca7a7a7d8b94d3593fa35f5523d38d008e1327b579ad39cb96b11fcb94682fc569e529d56c51
7
+ data.tar.gz: b4aaa61f8fe810af9f0a6bdcf45b95bd6903563ffe21421f7987a7701f03af6c3fcb2dcb8be5c62ebc6ea842502229f9577bb2c2f5dbf87f01818fbb71854b21
@@ -6,6 +6,7 @@ module Association
6
6
  def self.index(file, options = nil, persist_options = nil)
7
7
  options = options.nil? ? {} : options.dup
8
8
  persist_options = persist_options.nil? ? Misc.pull_keys(options, :persist) : persist_options.dup
9
+ persist_options[:serializer] ||= options[:serializer] if options.include?(:serializer)
9
10
 
10
11
  persist_options = Misc.add_defaults persist_options.dup, :persist => true, :dir => Rbbt.var.associations
11
12
  persist = persist_options[:persist]
@@ -16,6 +17,8 @@ module Association
16
17
  recycle = options[:recycle]
17
18
  undirected = options[:undirected]
18
19
 
20
+ serializer = persist_options[:serializer] || :list
21
+
19
22
  persist_options[:file] = persist_options[:file] + '.database' if persist_options[:file]
20
23
 
21
24
  database = open(file, options, persist_options.dup.merge(:engine => "HDB"))
@@ -29,12 +32,12 @@ module Association
29
32
 
30
33
  key_field = [source_field, target_field, undirected ? "undirected" : nil].compact * "~"
31
34
 
32
- TSV.setup(data, :key_field => key_field, :fields => fields[1..-1], :type => :list, :serializer => :list, :namespace => database.namespace)
35
+ TSV.setup(data, :key_field => key_field, :fields => fields[1..-1], :type => :list, :serializer => serializer, :namespace => database.namespace)
33
36
 
34
37
  data.key_field = key_field
35
38
  data.fields = fields[1..-1]
36
39
  data.type = :list
37
- data.serializer = :list
40
+ data.serializer ||= serializer
38
41
 
39
42
  database.with_unnamed do
40
43
  database.with_monitor(options[:monitor]) do
data/lib/rbbt/resource.rb CHANGED
@@ -153,7 +153,9 @@ module Resource
153
153
  when :string
154
154
  Misc.sensiblewrite(final_path, content)
155
155
  when :url
156
- Misc.sensiblewrite(final_path, Open.open(content))
156
+ options = {}
157
+ options[:noz] = true if Open.gzip?(final_path) || Open.bgzip?(final_path) || Open.zip?(final_path)
158
+ Misc.sensiblewrite(final_path, Open.open(content, options))
157
159
  when :proc
158
160
  data = case content.arity
159
161
  when 0
@@ -192,7 +194,7 @@ source "$INSTALL_HELPER_FILE"
192
194
  EOF
193
195
 
194
196
  script = preamble + "\n" + Open.read(content)
195
- install_io = CMD.cmd('bash', :in => script, :log => true, :pipe => true)
197
+ install_io = CMD.cmd('bash', :in => script, :log => true, :pipe => true, :stderr => true)
196
198
  while line = install_io.gets
197
199
  Log.debug line
198
200
  end
data/lib/rbbt/tsv.rb CHANGED
@@ -128,10 +128,12 @@ module TSV
128
128
  case
129
129
  when Path === stream
130
130
  stream.open do |f|
131
+ f.no_fail = false if ConcurrentStream === f
131
132
  Parser.new f, options
132
133
  end
133
134
  when (String === stream and stream.length < 300 and (Open.exists? stream or Open.remote? stream))
134
135
  Open.open(stream) do |f|
136
+ f.no_fail = false if ConcurrentStream === f
135
137
  Parser.new f, options
136
138
  end
137
139
  else
@@ -193,14 +193,14 @@ module TSV
193
193
  def serializer=(serializer)
194
194
  @serializer = serializer
195
195
  self.send(:[]=, KEY_PREFIX + 'serializer', dump_entry_value(serializer), :entry_key)
196
- @serializar_module = serializer.nil? ? TSV::CleanSerializer : SERIALIZER_ALIAS[serializer.to_sym]
196
+ @serializar_module = serializer.nil? ? TSV::CleanSerializer : (Module === serializer ? serializer : SERIALIZER_ALIAS[serializer.to_sym])
197
197
  end
198
198
 
199
199
 
200
200
  def serializer_module
201
201
  @serializer_module ||= begin
202
202
  serializer = self.serializer
203
- mod = serializer.nil? ? TSV::CleanSerializer : SERIALIZER_ALIAS[serializer.to_sym]
203
+ mod = serializer.nil? ? TSV::CleanSerializer : (Module === serializer ? serializer : SERIALIZER_ALIAS[serializer.to_sym])
204
204
  raise "No serializer_module for: #{ serializer.inspect }" if mod.nil?
205
205
  mod
206
206
  end
@@ -222,6 +222,7 @@ module TSV
222
222
  end
223
223
 
224
224
  def add_to_data_no_merge_double(data, keys, values)
225
+ keys = [keys] unless Array === keys
225
226
  keys.each do |key|
226
227
  next if data.include? key
227
228
  data[key] = values
@@ -1,6 +1,5 @@
1
1
  module TSV
2
2
 
3
-
4
3
  class CleanSerializer
5
4
  def self.dump(o); o end
6
5
  def self.load(o); o end
data/lib/rbbt/util/cmd.rb CHANGED
@@ -134,7 +134,7 @@ module CMD
134
134
  if pipe
135
135
  err_thread = Thread.new do
136
136
  while line = serr.gets
137
- Log.log line, stderr if Integer === stderr and log
137
+ Log.log "STDERR [#{pid}]: " + line, stderr if Integer === stderr and log
138
138
  end
139
139
  serr.close
140
140
  end
@@ -144,27 +144,47 @@ module CMD
144
144
  sout
145
145
  else
146
146
  err = ""
147
- Thread.new do
147
+ err_thread = Thread.new do
148
148
  while not serr.eof?
149
149
  err << serr.gets if Integer === stderr
150
150
  end
151
- serr.close
152
- end
151
+ serr.close
152
+ end
153
153
 
154
- ConcurrentStream.setup sout, :pids => pids, :threads => [in_thread, err_thread].compact, :autojoin => no_wait, :no_fail => no_fail
154
+ ConcurrentStream.setup sout, :pids => pids, :threads => [in_thread, err_thread].compact, :autojoin => no_wait, :no_fail => no_fail
155
155
 
156
- out = StringIO.new sout.read
157
- sout.close unless sout.closed?
156
+ out = StringIO.new sout.read
157
+ sout.close unless sout.closed?
158
158
 
159
- Process.waitpid pid
159
+ Process.waitpid pid
160
160
 
161
- if not $?.success? and not no_fail
162
- raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{$?.exitstatus}.\n#{err}"
163
- else
164
- Log.log err, stderr if Integer === stderr and log
165
- end
161
+ if not $?.success? and not no_fail
162
+ raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{$?.exitstatus}.\n#{err}"
163
+ else
164
+ Log.log err, stderr if Integer === stderr and log
165
+ end
166
+
167
+ out
168
+ end
169
+ end
166
170
 
167
- out
171
+ def self.cmd_log(*args)
172
+ all_args = *args
173
+
174
+ all_args << {} unless Hash === all_args.last
175
+ all_args.last[:log] = true
176
+ all_args.last[:pipe] = true
177
+
178
+ io = cmd(*all_args)
179
+ pid = io.pids.first
180
+ while line = io.gets
181
+ if pid
182
+ Log.debug "STDOUT [#{pid}]: " + line
183
+ else
184
+ Log.debug "STDOUT: " + line
185
+ end
168
186
  end
187
+ io.join
188
+ nil
169
189
  end
170
190
  end
@@ -82,6 +82,12 @@ class RbbtProcessQueue
82
82
  rescue Exception
83
83
  Log.warn "Process monitor exception: #{$!.message}"
84
84
  @processes.each{|p| p.abort }
85
+ @processes.each{|p|
86
+ begin
87
+ p.join
88
+ rescue ProcessFailed
89
+ end
90
+ }
85
91
  @callback_thread.raise $! if @callback_thread and @callback_thread.alive?
86
92
  raise $!
87
93
  end
@@ -114,7 +114,9 @@ class RbbtProcessQueue
114
114
  Log.high "Worker #{Process.pid} respawning to #{@current}"
115
115
  end
116
116
  rescue Aborted, Interrupt
117
- Log.warn "Worker #{Process.pid} aborted"
117
+ Log.warn "Worker #{Process.pid} aborted. Current #{@current} #{Misc.pid_exists?(@current) ? "exists" : "does not exist"}"
118
+ Process.kill "INT", @current if Misc.pid_exists? @current
119
+ @callback_queue.close_write if @callback_queue
118
120
  Kernel.exit! 0
119
121
  rescue Exception
120
122
  Log.exception $!
@@ -81,8 +81,12 @@ module ConcurrentStream
81
81
  begin
82
82
  t.join #unless FalseClass === t.status
83
83
  rescue Exception
84
- Log.warn "Exception joining thread in ConcurrenStream: #{filename}"
85
- raise $!
84
+ if no_fail
85
+ Log.low "Not failing on exception joining thread in ConcurrenStream: #{filename}"
86
+ else
87
+ Log.warn "Exception joining thread in ConcurrenStream: #{filename}"
88
+ raise $!
89
+ end
86
90
  end
87
91
  end
88
92
  end
@@ -190,7 +194,7 @@ module ConcurrentStream
190
194
  end
191
195
  end
192
196
 
193
- def super(*args)
197
+ def close(*args)
194
198
  if autojoin
195
199
  begin
196
200
  super(*args)
@@ -320,12 +320,12 @@ def self.add_libdir(dir=nil)
320
320
  TSV.traverse index, options do |pos|
321
321
  elem = elems[pos.to_i]
322
322
  elems.annotate elem if elems.respond_to? :annotate
323
- begin
324
- res = yield elem
325
- rescue Interrupt
326
- Log.warn "Process #{Process.pid} was aborted"
327
- raise $!
328
- end
323
+ res = begin
324
+ yield elem
325
+ rescue Interrupt
326
+ Log.warn "Process #{Process.pid} was aborted"
327
+ raise $!
328
+ end
329
329
  res = nil unless options[:into]
330
330
  raise RbbtProcessQueue::RbbtProcessQueueWorker::Respawn, res if respawn == :always and cpus > 1
331
331
  res
@@ -23,6 +23,8 @@ class DependencyError < Aborted
23
23
  end
24
24
  end
25
25
 
26
+ class DontClose < Exception; end
27
+
26
28
  class KeepLocked < Exception
27
29
  attr_accessor :payload
28
30
  def initialize(payload)
@@ -63,16 +63,36 @@ module Misc
63
63
  current
64
64
  end
65
65
 
66
- def self.zip_fields(array)
66
+ def self._zip_fields(array, max = nil)
67
67
  return [] if array.nil? or array.empty? or (first = array.first).nil?
68
- max = array.collect{|l| l.length}.max
68
+ max = array.collect{|l| l.length}.max if max.nil?
69
69
  rest = array[1..-1].collect{|v|
70
70
  v.length == 1 & max > 1 ? v * max : v
71
71
  }
72
72
  first = first * max if first.length == 1 and max > 1
73
+
73
74
  first.zip(*rest)
74
75
  end
75
76
 
77
+ def self.zip_fields(array)
78
+ if array.length < 10000
79
+ _zip_fields(array)
80
+ else
81
+ zipped_slices = []
82
+ max = array.collect{|l| l.length}.max
83
+ array.each_slice(10000) do |slice|
84
+ zipped_slices << _zip_fields(slice, max)
85
+ end
86
+ new = zipped_slices.first
87
+ zipped_slices[1..-1].each do |rest|
88
+ rest.each_with_index do |list,i|
89
+ new[i].concat list
90
+ end
91
+ end
92
+ new
93
+ end
94
+ end
95
+
76
96
  def self.choose(array, select)
77
97
  array.zip(select).select{|e,s| s }.collect{|e,s| e }
78
98
  end
@@ -32,6 +32,17 @@ module Misc
32
32
  Log.debug{"Creating pipe #{[res.last.inspect,res.first.inspect] * " => "}"}
33
33
  res
34
34
  end
35
+
36
+ def self.with_fifo(path = nil, &block)
37
+ begin
38
+ erase = path.nil?
39
+ path = TmpFile.tmp_file if path.nil?
40
+ File.mkfifo path
41
+ yield path
42
+ ensure
43
+ FileUtils.rm path if erase
44
+ end
45
+ end
35
46
 
36
47
  def self.release_pipes(*pipes)
37
48
  PIPE_MUTEX.synchronize do
@@ -73,6 +84,7 @@ module Misc
73
84
  end
74
85
  Kernel.exit! 0
75
86
  }
87
+ sin.close
76
88
 
77
89
  ConcurrentStream.setup sout, :pids => [pid]
78
90
  else
@@ -207,6 +219,8 @@ module Misc
207
219
  ConcurrentStream.setup sout, :threads => splitter_thread, :filename => filename, :_pair => stream
208
220
  end
209
221
 
222
+ out_pipes.first.autojoin = true
223
+
210
224
  out_pipes.first.callback = Proc.new do
211
225
  stream.join
212
226
  in_pipes[1..-1].each do |sin|
@@ -78,7 +78,7 @@ end
78
78
  old_pwd = FileUtils.pwd
79
79
  res = nil
80
80
  begin
81
- FileUtils.mkdir_p dir unless File.exist? dir
81
+ FileUtils.mkdir_p dir unless File.exist?(dir)
82
82
  FileUtils.cd dir
83
83
  res = yield
84
84
  ensure
@@ -393,27 +393,26 @@ module Open
393
393
  io = gunzip(io) if ((String === url and gzip?(url)) and not options[:noz]) or options[:gzip]
394
394
  io = bgunzip(io) if ((String === url and bgzip?(url)) and not options[:noz]) or options[:bgzip]
395
395
 
396
+ class << io;
397
+ attr_accessor :filename
398
+ end
399
+
400
+ io.filename = url.to_s
401
+
396
402
  if block_given?
397
403
  begin
398
404
  return yield(io)
405
+ rescue DontClose
399
406
  rescue Exception
400
407
  io.abort if io.respond_to? :abort
401
408
  io.join if io.respond_to? :join
402
409
  raise $!
403
410
  ensure
404
- io.join if io.respond_to? :join
405
411
  io.close if io.respond_to? :close and not io.closed?
412
+ io.join if io.respond_to? :join
406
413
  end
407
- else
408
- io
409
414
  end
410
415
 
411
- class << io;
412
- attr_accessor :filename
413
- end
414
-
415
- io.filename = url.to_s
416
-
417
416
  io
418
417
  end
419
418
 
@@ -770,7 +770,7 @@ module Workflow
770
770
  rec_dependency = all_d.flatten.select{|d| d.task_name.to_sym == v }.first
771
771
 
772
772
  if rec_dependency.nil?
773
- if inputs.include? v
773
+ if _inputs.include? v
774
774
  _inputs[i] = _inputs.delete(v)
775
775
  else
776
776
  _inputs[i] = v unless _inputs.include? i
@@ -140,6 +140,10 @@ build(){
140
140
  echo `pwd`
141
141
  ls
142
142
 
143
+ if [ -f Makefile.am -a -n -f configure ]; then
144
+ autoreconf
145
+ fi
146
+
143
147
  if [ -f aclocal.m4 ]; then
144
148
  autoconf
145
149
  fi
@@ -75,9 +75,7 @@ begin
75
75
  exit 0
76
76
  end
77
77
 
78
- puts "Error: Command not understood"
79
- puts
80
- break
78
+ raise ParameterException, "Error: Command not understood: #{command}"
81
79
  end
82
80
  end
83
81
  end
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
 
2
3
  require 'rbbt-util'
3
4
  require 'rbbt/util/simpleopt'
@@ -22,6 +23,7 @@ $ rbbt workflow server [options] <Workflow>
22
23
  -R--requires* Require a list of files
23
24
  --views* Directory with view templates
24
25
  --stream Activate streaming of workflow tasks
26
+ --export_all Export all workflow tasks (use with caution!)
25
27
  --export* Export workflow tasks (asynchronous)
26
28
  --export_asynchronous* Export workflow tasks as asynchronous
27
29
  --export_synchronous* Export workflow tasks as synchronous
@@ -83,6 +85,10 @@ TmpFile.with_file do |app_dir|
83
85
  ENV["RACK_ENV"] = options[:environment] if options.include?(:environment)
84
86
  ENV["RBBT_VIEWS_DIR"] = options[:views] if options.include?(:views)
85
87
 
88
+ if options[:export_all]
89
+ ENV["RBBT_WORKFLOW_EXPORT_ALL"] = 'true'
90
+ end
91
+
86
92
  if options[:stream]
87
93
  raise "No streaming available for any server other than puma" unless true or options[:server].include? 'puma'
88
94
  ENV["RBBT_WORKFLOW_TASK_STREAM"] = 'true'
@@ -171,6 +171,7 @@ eum fugiat quo voluptas nulla pariatur?"
171
171
  sleep 0.5
172
172
  sin.puts "LINE #{ i }"
173
173
  end
174
+ sin.close
174
175
  end
175
176
 
176
177
  time = Time.now
@@ -240,12 +241,14 @@ eum fugiat quo voluptas nulla pariatur?"
240
241
  sin.puts line.strip.reverse
241
242
  end
242
243
  end
244
+ stream2.close
243
245
 
244
246
  stream5 = Misc.open_pipe(true) do |sin|
245
247
  while line = stream3.gets
246
248
  sin.puts line.strip.downcase
247
249
  end
248
250
  end
251
+ stream3.close
249
252
 
250
253
  lines1 = []
251
254
  th1 = Thread.new do
@@ -369,6 +372,13 @@ eum fugiat quo voluptas nulla pariatur?"
369
372
  assert_equal current, Misc.zip_fields(Misc.zip_fields(current))
370
373
  end
371
374
 
375
+ def test_zip_fields_large
376
+ current = (1..1500).to_a.collect{|i| ["A#{i}", "B#{i}"]}
377
+ assert_equal current, Misc.zip_fields(Misc.zip_fields(current))
378
+ current = (1..150000).to_a.collect{|i| ["A#{i}", "B#{i}"]}
379
+ assert_equal current, Misc.zip_fields(Misc.zip_fields(current))
380
+ end
381
+
372
382
  def test_zip_fields_comp
373
383
  current = [[:a,1], [:b,2], [:c]]
374
384
  assert_equal [[:a, :b, :c],[1,2,nil]], Misc.zip_fields(current)
@@ -423,7 +433,8 @@ eum fugiat quo voluptas nulla pariatur?"
423
433
  end
424
434
 
425
435
  def test_tarize
426
- path = File.expand_path('/home/mvazquezg/git/rbbt-util/lib')
436
+ dir = Path.caller_lib_dir(__FILE__)
437
+ path = File.expand_path(dir)
427
438
  stream = Misc.tarize(path)
428
439
  TmpFile.with_file do |res|
429
440
  Misc.in_dir(res) do
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.21.129
4
+ version: 5.21.130
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-05-14 00:00:00.000000000 Z
11
+ date: 2018-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake