rbbt-util 5.28.8 → 5.28.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/entity.rb +1 -1
  3. data/lib/rbbt/fix_width_table.rb +5 -4
  4. data/lib/rbbt/hpc.rb +6 -4
  5. data/lib/rbbt/persist.rb +9 -4
  6. data/lib/rbbt/persist/tsv/adapter.rb +0 -1
  7. data/lib/rbbt/persist/tsv/fix_width_table.rb +5 -3
  8. data/lib/rbbt/resource.rb +12 -6
  9. data/lib/rbbt/resource/path.rb +1 -1
  10. data/lib/rbbt/tsv/attach.rb +7 -4
  11. data/lib/rbbt/tsv/dumper.rb +6 -2
  12. data/lib/rbbt/tsv/parallel.rb +0 -3
  13. data/lib/rbbt/util/R.rb +2 -2
  14. data/lib/rbbt/util/cmd.rb +10 -0
  15. data/lib/rbbt/util/misc/bgzf.rb +1 -1
  16. data/lib/rbbt/util/misc/indiferent_hash.rb +8 -0
  17. data/lib/rbbt/util/misc/inspect.rb +11 -7
  18. data/lib/rbbt/util/named_array.rb +1 -1
  19. data/lib/rbbt/util/open.rb +17 -16
  20. data/lib/rbbt/workflow/accessor.rb +1 -1
  21. data/lib/rbbt/workflow/definition.rb +3 -1
  22. data/lib/rbbt/workflow/integration/ansible.rb +53 -0
  23. data/lib/rbbt/workflow/integration/ansible/workflow.rb +60 -0
  24. data/lib/rbbt/workflow/step.rb +8 -0
  25. data/lib/rbbt/workflow/step/accessor.rb +23 -13
  26. data/lib/rbbt/workflow/step/dependencies.rb +8 -2
  27. data/lib/rbbt/workflow/step/run.rb +22 -19
  28. data/lib/rbbt/workflow/util/archive.rb +2 -0
  29. data/lib/rbbt/workflow/util/orchestrator.rb +49 -11
  30. data/lib/rbbt/workflow/util/provenance.rb +7 -3
  31. data/share/rbbt_commands/ansible +55 -0
  32. data/share/rbbt_commands/purge_job +0 -1
  33. data/share/rbbt_commands/system/status +22 -22
  34. data/share/rbbt_commands/workflow/forget_deps +9 -0
  35. data/share/rbbt_commands/workflow/info +12 -9
  36. data/share/rbbt_commands/workflow/prov +2 -1
  37. data/test/rbbt/association/test_index.rb +6 -6
  38. data/test/rbbt/knowledge_base/test_query.rb +3 -3
  39. data/test/rbbt/knowledge_base/test_registry.rb +1 -1
  40. data/test/rbbt/persist/tsv/test_cdb.rb +0 -7
  41. data/test/rbbt/persist/tsv/test_kyotocabinet.rb +2 -8
  42. data/test/rbbt/persist/tsv/test_leveldb.rb +0 -6
  43. data/test/rbbt/persist/tsv/test_lmdb.rb +0 -6
  44. data/test/rbbt/persist/tsv/test_tokyocabinet.rb +15 -14
  45. data/test/rbbt/test_entity.rb +0 -1
  46. data/test/rbbt/test_knowledge_base.rb +3 -4
  47. data/test/rbbt/test_persist.rb +10 -6
  48. data/test/rbbt/test_workflow.rb +49 -16
  49. data/test/rbbt/tsv/test_accessor.rb +11 -0
  50. data/test/rbbt/tsv/test_attach.rb +86 -8
  51. data/test/rbbt/tsv/test_index.rb +6 -7
  52. data/test/rbbt/tsv/test_manipulate.rb +2 -3
  53. data/test/rbbt/util/R/test_model.rb +2 -1
  54. data/test/rbbt/util/R/test_plot.rb +0 -2
  55. data/test/rbbt/util/concurrency/test_processes.rb +1 -1
  56. data/test/rbbt/util/misc/test_bgzf.rb +11 -7
  57. data/test/rbbt/util/misc/test_lock.rb +0 -1
  58. data/test/rbbt/util/misc/test_multipart_payload.rb +1 -1
  59. data/test/rbbt/util/misc/test_pipes.rb +0 -5
  60. data/test/rbbt/util/test_R.rb +1 -0
  61. data/test/rbbt/util/test_log.rb +4 -6
  62. data/test/rbbt/util/test_misc.rb +0 -2
  63. data/test/rbbt/util/test_open.rb +0 -1
  64. data/test/rbbt/util/test_python.rb +17 -1
  65. data/test/rbbt/workflow/test_remote_workflow.rb +1 -1
  66. data/test/rbbt/workflow/test_step.rb +8 -3
  67. data/test/rbbt/workflow/util/test_orchestrator.rb +155 -18
  68. metadata +5 -4
  69. data/test/rbbt/workflow/remote/test_client.rb +0 -56
@@ -185,7 +185,7 @@ END
185
185
  inputs[:input2] = "Input2"
186
186
  num = 50
187
187
  cpus = 1
188
- Log.severity = 0
188
+
189
189
  Misc.bootstrap((0..num-1).to_a, cpus) do |n|
190
190
  puts mutipart
191
191
  TmpFile.with_file(mutipart, false) do |tmpfile|
@@ -131,7 +131,6 @@ row2 AA BB CC
131
131
  row3 AAA BBB CCC
132
132
  row1 A B C
133
133
  EOF
134
- Log.severity = 0
135
134
 
136
135
  text = text * 10000
137
136
  TmpFile.with_file(text) do |tmp|
@@ -159,7 +158,6 @@ row2 AA BB CC
159
158
  row3 AAA BBB CCC
160
159
  row1 A B C
161
160
  EOF
162
- Log.severity = 0
163
161
 
164
162
  text = text * 10000
165
163
  num = 5
@@ -200,7 +198,6 @@ line3
200
198
  line1
201
199
  EOF
202
200
 
203
- Log.severity = 0
204
201
  TmpFile.with_file(text1) do |file1|
205
202
  TmpFile.with_file(text2) do |file2|
206
203
  assert ! Misc.remove_lines(file1, file2, true).read.split("\n").include?("line1")
@@ -224,7 +221,6 @@ line1
224
221
  line5
225
222
  EOF
226
223
 
227
- Log.severity = 0
228
224
  TmpFile.with_file(text1) do |file1|
229
225
  TmpFile.with_file(text2) do |file2|
230
226
  assert Misc.select_lines(file1, file2, true).read.split("\n").include?("line1")
@@ -258,7 +254,6 @@ line3
258
254
  line4
259
255
  EOF
260
256
 
261
- Log.severity = 0
262
257
  TmpFile.with_file(text) do |file|
263
258
  io = Open.open(file)
264
259
  lines = Set.new
@@ -9,6 +9,7 @@ class TestR < Test::Unit::TestCase
9
9
  def test_tsv_R
10
10
  tsv = TSV.setup({:a => 1, :b => 2})
11
11
  tsv2 = tsv.R <<-EOF
12
+ str(data)
12
13
  data = data + 1
13
14
  EOF
14
15
  assert_equal "2", tsv2["a"].first
@@ -2,7 +2,7 @@ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helpe
2
2
  require 'rbbt/util/log'
3
3
 
4
4
  class TestLog < Test::Unit::TestCase
5
- def _test_get_level
5
+ def test_get_level
6
6
  assert_equal 0, Log.get_level(:debug)
7
7
  assert_equal 1, Log.get_level(:low)
8
8
  assert_equal 1, Log.get_level("LOW")
@@ -10,18 +10,17 @@ class TestLog < Test::Unit::TestCase
10
10
  assert_equal 0, Log.get_level(nil)
11
11
  end
12
12
 
13
- def _test_color
13
+ def test_color
14
14
  assert Log.color(:green, "green")
15
15
  end
16
16
 
17
- def _test_no_stderr
17
+ def test_no_stderr
18
18
  Log.ignore_stderr do
19
19
  STDERR.puts "NOPRINT"
20
20
  end
21
21
  end
22
22
 
23
- def _test_trap_stderr
24
- Log.severity = 0
23
+ def test_trap_stderr
25
24
  Log.trap_stderr do
26
25
  STDERR.puts "NOPRINT"
27
26
  STDERR.puts "NOPRINT"
@@ -40,7 +39,6 @@ class TestLog < Test::Unit::TestCase
40
39
  end
41
40
 
42
41
  def test_trap_std
43
- Log.severity = 0
44
42
  Log.trap_std do
45
43
  STDERR.puts "NOPRINT STDERR"
46
44
  STDOUT.puts "NOPRINT STDOUT"
@@ -475,7 +475,6 @@ eum fugiat quo voluptas nulla pariatur?"
475
475
  end
476
476
 
477
477
  def test_bootstrap
478
- Log.severity = 0
479
478
  res = Misc.bootstrap((1..10).to_a, 2, :bar => "Test bootstrap ticks", :respawn => :always, :into => []) do |num|
480
479
  sleep 1 + rand(2)
481
480
  num
@@ -550,7 +549,6 @@ eum fugiat quo voluptas nulla pariatur?"
550
549
  end
551
550
 
552
551
  def __test_bench_log
553
- Log.severity = 1
554
552
  Misc.benchmark(1000) do
555
553
  Log.info { "Hola" }
556
554
  end
@@ -169,7 +169,6 @@ class TestOpen < Test::Unit::TestCase
169
169
  end
170
170
 
171
171
  def test_write_stream_repo
172
- Log.severity = 0
173
172
  TmpFile.with_file do |tmpdir|
174
173
  tmpdir = Rbbt.tmp.repo_dir.find
175
174
  repo = File.join(tmpdir, 'repo')
@@ -42,7 +42,6 @@ def python_test(a, b):
42
42
  end
43
43
 
44
44
  def test_run_log
45
- Log.severity = 0
46
45
  TmpFile.with_file do |tmpdir|
47
46
  code =<<-EOF
48
47
  import sys
@@ -66,3 +65,20 @@ def python_print():
66
65
  end
67
66
  end
68
67
 
68
+ def test_keras
69
+ defined = RbbtPython.run do
70
+ pyimport "keras.models", as: :km
71
+ defined?(km.Sequential)
72
+ end
73
+ assert defined
74
+ end
75
+
76
+ def test_keras_import
77
+ defined = RbbtPython.run do
78
+ pyfrom "keras.models", import: :Sequential
79
+ defined?(self::Sequential)
80
+ end
81
+ assert defined
82
+ end
83
+ end
84
+
@@ -88,7 +88,7 @@ class TestRemoteWorkflow < Test::Unit::TestCase
88
88
  end
89
89
 
90
90
 
91
- def _test_ssh
91
+ def test_ssh
92
92
  Log.severity = 0
93
93
  client = RemoteWorkflow.new "ssh://#{ENV["HOSTNAME"]}:Translation", "Translation"
94
94
  job = client.job("translate", "SSH-TEST-1", :genes => ["TP53","KRAS"])
@@ -1,8 +1,10 @@
1
1
  require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
+ require 'rbbt/workflow'
2
3
  require 'rbbt/workflow/task'
3
4
  require 'rbbt/workflow/step'
4
5
  require 'rbbt/tsv'
5
6
  require 'rbbt'
7
+ require 'rbbt-util'
6
8
 
7
9
  class TestStep < Test::Unit::TestCase
8
10
 
@@ -23,8 +25,9 @@ class TestStep < Test::Unit::TestCase
23
25
  str2 = "TEST2"
24
26
  TmpFile.with_file do |tmpfile|
25
27
 
26
- task1 = Task.setup :result_type => nil do
28
+ task1 = Task.setup :result_type => :string do
27
29
  Open.write(tmpfile, str);
30
+ "done"
28
31
  end
29
32
  step1 = Step.new tmpfile + 'step1', task1
30
33
 
@@ -50,9 +53,10 @@ class TestStep < Test::Unit::TestCase
50
53
  def __test_dependency_log_relay
51
54
  str = "TEST"
52
55
  TmpFile.with_file do |tmpfile|
53
- task1 = Task.setup :result_type => nil, :name => :task1 do
56
+ task1 = Task.setup :result_type => :string, :name => :task1 do
54
57
  log(:starting_task1, "Starting Task1")
55
58
  Open.write(tmpfile, str);
59
+ "done"
56
60
  end
57
61
  step1 = Step.new tmpfile + 'step1', task1
58
62
 
@@ -69,9 +73,10 @@ class TestStep < Test::Unit::TestCase
69
73
  def test_log_relay_step
70
74
  str = "TEST"
71
75
  TmpFile.with_file do |tmpfile|
72
- task1 = Task.setup :result_type => nil, :name => :task1 do
76
+ task1 = Task.setup :result_type => :string, :name => :task1 do
73
77
  log(:starting_task1, "Starting Task1")
74
78
  Open.write(tmpfile, str);
79
+ "done"
75
80
  end
76
81
  step1 = Step.new tmpfile + 'step1', task1
77
82
 
@@ -17,6 +17,7 @@ module TestWF
17
17
  sleep(TestWF::MULT * (rand(10) + 2))
18
18
  end
19
19
 
20
+ dep :a
20
21
  dep :b
21
22
  task :c => :text do
22
23
  sleep(TestWF::MULT * (rand(10) + 2))
@@ -26,16 +27,21 @@ module TestWF
26
27
  task :d => :text do
27
28
  sleep(TestWF::MULT * (rand(10) + 2))
28
29
  end
30
+
31
+ dep :c
32
+ task :e => :text do
33
+ sleep(TestWF::MULT * (rand(10) + 2))
34
+ end
29
35
  end
30
36
 
31
37
  class TestClass < Test::Unit::TestCase
32
- def _test_orchestrate
38
+ def test_orchestrate_resources
33
39
 
34
40
  jobs =[]
35
41
 
36
42
  num = 10
37
43
  num.times do |i|
38
- jobs.concat %w(test1 _test2).collect{|name| TestWF.job(:d, name + " #{i}") }
44
+ jobs.concat %w(TEST1 TEST2).collect{|name| TestWF.job(:d, name + " #{i}") }
39
45
  end
40
46
  jobs.each do |j| j.recursive_clean end
41
47
 
@@ -81,13 +87,13 @@ TestWF:
81
87
  assert Misc.mean(second_cpus.values) < 30
82
88
  end
83
89
 
84
- def test_orchestrate_size
90
+ def test_orchestrate_erase
85
91
 
86
92
  jobs =[]
87
93
 
88
94
  num = 10
89
95
  num.times do |i|
90
- jobs.concat %w(test1 _test2).collect{|name| TestWF.job(:d, name + " #{i}") }
96
+ jobs.concat %w(TEST1 TEST2).collect{|name| TestWF.job(:d, name + " #{i}") }
91
97
  end
92
98
  jobs.each do |j| j.recursive_clean end
93
99
 
@@ -98,9 +104,11 @@ default_resources:
98
104
  IO: 1
99
105
  TestWF:
100
106
  a:
107
+ erase: true
101
108
  resources:
102
109
  cpus: 7
103
110
  b:
111
+ erase: true
104
112
  resources:
105
113
  cpus: 2
106
114
  c:
@@ -112,25 +120,154 @@ TestWF:
112
120
  EOF
113
121
 
114
122
  orchestrator = Workflow::Orchestrator.new(TestWF::MULT, "cpus" => 30, "IO" => 4, "size" => 10 )
115
- Log.with_severity 0 do
123
+ Log.with_severity 3 do
116
124
  orchestrator.process(rules, jobs)
117
125
  end
118
126
 
119
- data = Workflow.trace jobs, :plot_data => true
120
- eend = data.column("End.second").values.collect{|v| v.to_f}.max
121
- second_cpus = TSV.setup({}, "Second~CPUS#:type=:single#:cast=:to_f")
122
- (0..eend.to_i).each do |second|
123
- tasks = data.select("Start.second"){|s| s <= second}.select("End.second"){|s| s > second}
124
- cpus = 0
125
- tasks.through :key, ["Workflow", "Task"] do |k, values|
126
- workflow, task = values
127
- cpus += rules[workflow][task.to_s]["resources"]["cpus"]
128
- end
129
- second_cpus[second] = cpus
127
+ jobs.each do |job|
128
+ assert job.step(:c).dependencies.empty?
129
+ assert job.step(:c).info[:archived_info].keys.select{|k| k.include?("TestWF/a/")}.any?
130
+ assert job.step(:c).info[:archived_info].keys.select{|k| k.include?("TestWF/b/")}.any?
131
+ end
132
+
133
+ end
134
+
135
+ def test_orchestrate_default
136
+
137
+ jobs =[]
138
+
139
+ num = 3
140
+ num.times do |i|
141
+ jobs.concat %w(TEST1 TEST2).collect{|name| TestWF.job(:d, name + " #{i}") }
142
+ end
143
+ jobs.each do |j| j.recursive_clean end
144
+
145
+ rules = YAML.load <<-EOF
146
+ defaults:
147
+ erase: true
148
+ log: 4
149
+ default_resources:
150
+ IO: 1
151
+ TestWF:
152
+ a:
153
+ erase: true
154
+ resources:
155
+ cpus: 7
156
+ b:
157
+ erase: true
158
+ resources:
159
+ cpus: 2
160
+ c:
161
+ erase: false
162
+ resources:
163
+ cpus: 10
164
+ d:
165
+ resources:
166
+ cpus: 15
167
+ EOF
168
+
169
+ orchestrator = Workflow::Orchestrator.new(TestWF::MULT, "cpus" => 30, "IO" => 4, "size" => 10 )
170
+ Log.with_severity 3 do
171
+ orchestrator.process(rules, jobs)
172
+ end
173
+
174
+ jobs.each do |job|
175
+ assert job.step(:c).dependencies.empty?
176
+ assert job.step(:c).info[:archived_info].keys.select{|k| k.include?("TestWF/a/")}.any?
177
+ assert job.step(:c).info[:archived_info].keys.select{|k| k.include?("TestWF/b/")}.any?
178
+ end
179
+
180
+ end
181
+
182
+ def test_orchestrate_top_level
183
+
184
+ jobs =[]
185
+
186
+ num = 3
187
+ num.times do |i|
188
+ jobs.concat %w(TEST1 TEST2).collect{|name| TestWF.job(:d, name + " #{i}") }
189
+ jobs.concat %w(TEST1 TEST2).collect{|name| TestWF.job(:c, name + " #{i}") }
190
+ end
191
+ jobs.each do |j| j.recursive_clean end
192
+
193
+ rules = YAML.load <<-EOF
194
+ defaults:
195
+ erase: true
196
+ log: 4
197
+ default_resources:
198
+ IO: 1
199
+ TestWF:
200
+ a:
201
+ resources:
202
+ cpus: 7
203
+ b:
204
+ resources:
205
+ cpus: 2
206
+ c:
207
+ resources:
208
+ cpus: 10
209
+ d:
210
+ resources:
211
+ cpus: 15
212
+ EOF
213
+
214
+ orchestrator = Workflow::Orchestrator.new(TestWF::MULT, "cpus" => 30, "IO" => 4, "size" => 10 )
215
+ Log.with_severity 3 do
216
+ orchestrator.process(rules, jobs)
217
+ end
218
+
219
+ jobs.each do |job|
220
+ next unless job.task_name.to_s == 'd'
221
+ assert job.step(:c).dependencies.empty?
222
+ assert job.step(:c).info[:archived_info].keys.select{|k| k.include?("TestWF/a/")}.any?
223
+ assert job.step(:c).info[:archived_info].keys.select{|k| k.include?("TestWF/b/")}.any?
224
+ end
225
+
226
+ end
227
+
228
+ def test_orchestrate_top_level_double_dep
229
+
230
+ jobs =[]
231
+
232
+ num = 10
233
+ num.times do |i|
234
+ jobs.concat %w(TEST1 TEST2).collect{|name| TestWF.job(:e, name + " #{i}") }
235
+ jobs.concat %w(TEST1 TEST2).collect{|name| TestWF.job(:d, name + " #{i}") }
236
+ end
237
+ jobs.each do |j| j.recursive_clean end
238
+
239
+ rules = YAML.load <<-EOF
240
+ defaults:
241
+ erase: true
242
+ log: 4
243
+ default_resources:
244
+ IO: 1
245
+ TestWF:
246
+ a:
247
+ resources:
248
+ cpus: 7
249
+ b:
250
+ resources:
251
+ cpus: 2
252
+ c:
253
+ resources:
254
+ cpus: 10
255
+ d:
256
+ resources:
257
+ cpus: 15
258
+ EOF
259
+
260
+ orchestrator = Workflow::Orchestrator.new(TestWF::MULT, "cpus" => 30, "IO" => 4, "size" => 10 )
261
+ Log.with_severity 3 do
262
+ orchestrator.process(rules, jobs)
263
+ end
264
+
265
+ jobs.each do |job|
266
+ next unless job.task_name.to_s == 'd' || job.task_name.to_s == 'e'
267
+ assert job.info[:archived_info].keys.select{|k| k.include?("TestWF/c/")}.any?
268
+ assert job.info[:archived_info].keys.select{|k| k.include?("TestWF/c/")}.any?
130
269
  end
131
270
 
132
- assert Misc.mean(second_cpus.values) > 15
133
- assert Misc.mean(second_cpus.values) < 30
134
271
  end
135
272
  end
136
273
 
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.28.8
4
+ version: 5.28.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-02 00:00:00.000000000 Z
11
+ date: 2020-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -318,6 +318,8 @@ files:
318
318
  - lib/rbbt/workflow/definition.rb
319
319
  - lib/rbbt/workflow/doc.rb
320
320
  - lib/rbbt/workflow/examples.rb
321
+ - lib/rbbt/workflow/integration/ansible.rb
322
+ - lib/rbbt/workflow/integration/ansible/workflow.rb
321
323
  - lib/rbbt/workflow/integration/cromwell.rb
322
324
  - lib/rbbt/workflow/integration/nextflow.rb
323
325
  - lib/rbbt/workflow/remote_workflow.rb
@@ -347,6 +349,7 @@ files:
347
349
  - share/config.ru
348
350
  - share/install/software/lib/install_helpers
349
351
  - share/rbbt_commands/alias
352
+ - share/rbbt_commands/ansible
350
353
  - share/rbbt_commands/app/install
351
354
  - share/rbbt_commands/app/start
352
355
  - share/rbbt_commands/app/template
@@ -513,7 +516,6 @@ files:
513
516
  - test/rbbt/util/test_simpleDSL.rb
514
517
  - test/rbbt/util/test_simpleopt.rb
515
518
  - test/rbbt/util/test_tmpfile.rb
516
- - test/rbbt/workflow/remote/test_client.rb
517
519
  - test/rbbt/workflow/step/test_dependencies.rb
518
520
  - test/rbbt/workflow/test_doc.rb
519
521
  - test/rbbt/workflow/test_remote_workflow.rb
@@ -552,7 +554,6 @@ test_files:
552
554
  - test/rbbt/workflow/test_doc.rb
553
555
  - test/rbbt/workflow/test_schedule.rb
554
556
  - test/rbbt/workflow/test_step.rb
555
- - test/rbbt/workflow/remote/test_client.rb
556
557
  - test/rbbt/workflow/step/test_dependencies.rb
557
558
  - test/rbbt/workflow/test_task.rb
558
559
  - test/rbbt/resource/test_path.rb