rbbt-util 5.28.7 → 5.28.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) 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 +2 -2
  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/dumper.rb +6 -2
  11. data/lib/rbbt/util/R.rb +2 -2
  12. data/lib/rbbt/util/cmd.rb +10 -0
  13. data/lib/rbbt/util/misc/bgzf.rb +1 -1
  14. data/lib/rbbt/util/misc/indiferent_hash.rb +8 -0
  15. data/lib/rbbt/util/misc/inspect.rb +11 -7
  16. data/lib/rbbt/util/named_array.rb +1 -1
  17. data/lib/rbbt/util/open.rb +18 -17
  18. data/lib/rbbt/workflow/accessor.rb +1 -1
  19. data/lib/rbbt/workflow/definition.rb +3 -1
  20. data/lib/rbbt/workflow/integration/ansible.rb +53 -0
  21. data/lib/rbbt/workflow/integration/ansible/workflow.rb +60 -0
  22. data/lib/rbbt/workflow/step.rb +21 -2
  23. data/lib/rbbt/workflow/step/accessor.rb +24 -14
  24. data/lib/rbbt/workflow/step/dependencies.rb +8 -2
  25. data/lib/rbbt/workflow/step/run.rb +22 -19
  26. data/lib/rbbt/workflow/util/archive.rb +2 -0
  27. data/lib/rbbt/workflow/util/orchestrator.rb +49 -11
  28. data/lib/rbbt/workflow/util/provenance.rb +7 -3
  29. data/share/rbbt_commands/ansible +55 -0
  30. data/share/rbbt_commands/purge_job +0 -1
  31. data/share/rbbt_commands/system/status +22 -22
  32. data/share/rbbt_commands/workflow/forget_deps +10 -3
  33. data/share/rbbt_commands/workflow/info +12 -9
  34. data/share/rbbt_commands/workflow/prov +2 -1
  35. data/test/rbbt/association/test_index.rb +6 -6
  36. data/test/rbbt/knowledge_base/test_query.rb +3 -3
  37. data/test/rbbt/knowledge_base/test_registry.rb +1 -1
  38. data/test/rbbt/persist/tsv/test_cdb.rb +0 -7
  39. data/test/rbbt/persist/tsv/test_kyotocabinet.rb +2 -8
  40. data/test/rbbt/persist/tsv/test_leveldb.rb +0 -6
  41. data/test/rbbt/persist/tsv/test_lmdb.rb +0 -6
  42. data/test/rbbt/persist/tsv/test_tokyocabinet.rb +15 -14
  43. data/test/rbbt/test_entity.rb +0 -1
  44. data/test/rbbt/test_knowledge_base.rb +3 -4
  45. data/test/rbbt/test_persist.rb +10 -6
  46. data/test/rbbt/test_workflow.rb +49 -16
  47. data/test/rbbt/tsv/test_accessor.rb +11 -0
  48. data/test/rbbt/tsv/test_attach.rb +0 -2
  49. data/test/rbbt/tsv/test_index.rb +6 -7
  50. data/test/rbbt/tsv/test_manipulate.rb +2 -3
  51. data/test/rbbt/util/R/test_model.rb +2 -1
  52. data/test/rbbt/util/R/test_plot.rb +0 -2
  53. data/test/rbbt/util/concurrency/test_processes.rb +1 -1
  54. data/test/rbbt/util/misc/test_bgzf.rb +11 -7
  55. data/test/rbbt/util/misc/test_lock.rb +0 -1
  56. data/test/rbbt/util/misc/test_multipart_payload.rb +1 -1
  57. data/test/rbbt/util/misc/test_pipes.rb +0 -5
  58. data/test/rbbt/util/test_R.rb +1 -0
  59. data/test/rbbt/util/test_log.rb +4 -6
  60. data/test/rbbt/util/test_misc.rb +0 -2
  61. data/test/rbbt/util/test_open.rb +0 -1
  62. data/test/rbbt/util/test_python.rb +17 -1
  63. data/test/rbbt/workflow/test_remote_workflow.rb +1 -1
  64. data/test/rbbt/workflow/test_step.rb +8 -3
  65. data/test/rbbt/workflow/util/test_orchestrator.rb +155 -18
  66. metadata +5 -4
  67. data/test/rbbt/workflow/remote/test_client.rb +0 -56
@@ -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.7
4
+ version: 5.28.12
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-03 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
@@ -1,56 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), '../../..', 'test_helper.rb')
2
- require 'rbbt/workflow'
3
- require 'rbbt/workflow/remote/client'
4
-
5
- class TestWFRest
6
- extend Workflow
7
-
8
- input :name, :string, "Name to greet", "World"
9
- task :hi => :string do |name|
10
- "Hello #{name}"
11
- end
12
-
13
- dep :hi
14
- task :intro => :string do
15
- step(:hi).load + ", nice to meet you"
16
- end
17
- end
18
-
19
- class TestRemote < Test::Unit::TestCase
20
-
21
- def test_ssh
22
- Log.severity = 0
23
- client = WorkflowRemoteClient.new "ssh://turbo:Translation", "Translation"
24
- job = client.job("translate", "SSH-TEST", :genes => ["TP53","KRAS"])
25
- assert_equal 2, job.run.select{|l| l =~ /ENSG/}.length
26
- end
27
-
28
- def test_rest
29
- Log.with_severity 0 do
30
-
31
- workflow_server(TestWFRest) do |client|
32
- assert_equal "Hello World", client.job(:hi, nil, {}).run.chomp
33
- assert_equal "Hello Miguel", client.job(:hi, nil, {:name => :Miguel}).run.chomp
34
- assert_equal "Hello Miguel, nice to meet you", client.job(:intro, nil, {:name => :Miguel}).run.chomp
35
- end
36
-
37
- workflow_server(TestWFRest, :Port => 1902) do |client|
38
- assert_equal "Hello World", client.job(:hi, nil, {}).run.chomp
39
- assert_equal "Hello Miguel", client.job(:hi, nil, {:name => :Miguel}).run.chomp
40
- assert_equal "Hello Miguel, nice to meet you", client.job(:intro, nil, {:name => :Miguel}).run.chomp
41
- end
42
- end
43
- end
44
-
45
- def test_rest_clean
46
- real_job = TestWFRest.job(:hi)
47
- real_job.run
48
- first_time = File.ctime(real_job.path)
49
- workflow_server(TestWFRest) do |client|
50
- assert File.ctime(real_job.path) == first_time
51
- assert_equal "Hello World", client.job(:hi, nil, {}).clean.run
52
- assert File.ctime(real_job.path) > first_time
53
- end
54
- end
55
- end
56
-