rbbt-util 5.21.129 → 5.21.130

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