rbbt-util 2.1.0 → 3.0.2

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.
Files changed (46) hide show
  1. data/bin/rbbt_query.rb +63 -0
  2. data/lib/rbbt-util.rb +5 -5
  3. data/lib/rbbt.rb +2 -11
  4. data/lib/rbbt/util/cmd.rb +1 -1
  5. data/lib/rbbt/util/fix_width_table.rb +9 -3
  6. data/lib/rbbt/util/log.rb +23 -7
  7. data/lib/rbbt/util/misc.rb +121 -15
  8. data/lib/rbbt/util/open.rb +14 -4
  9. data/lib/rbbt/util/persistence.rb +52 -21
  10. data/lib/rbbt/util/rake.rb +108 -21
  11. data/lib/rbbt/util/resource.rb +338 -0
  12. data/lib/rbbt/util/simpleDSL.rb +1 -1
  13. data/lib/rbbt/util/simpleopt.rb +1 -1
  14. data/lib/rbbt/util/task.rb +340 -0
  15. data/lib/rbbt/util/tc_hash.rb +19 -2
  16. data/lib/rbbt/util/tsv.rb +15 -10
  17. data/lib/rbbt/util/tsv/accessor.rb +16 -7
  18. data/lib/rbbt/util/tsv/attach.rb +220 -17
  19. data/lib/rbbt/util/tsv/index.rb +6 -1
  20. data/lib/rbbt/util/tsv/manipulate.rb +4 -5
  21. data/lib/rbbt/util/tsv/parse.rb +45 -21
  22. data/lib/rbbt/util/tsv/resource.rb +74 -0
  23. data/lib/rbbt/util/workflow.rb +99 -75
  24. data/test/rbbt/util/test_filecache.rb +2 -2
  25. data/test/rbbt/util/test_misc.rb +7 -2
  26. data/test/rbbt/util/test_persistence.rb +40 -5
  27. data/test/rbbt/util/test_resource.rb +92 -0
  28. data/test/rbbt/util/test_task.rb +118 -0
  29. data/test/rbbt/util/test_tsv.rb +5 -1
  30. data/test/rbbt/util/test_workflow.rb +77 -62
  31. data/test/rbbt/util/tsv/test_attach.rb +95 -7
  32. data/test/rbbt/util/tsv/test_index.rb +0 -1
  33. data/test/rbbt/util/tsv/test_manipulate.rb +20 -0
  34. data/test/rbbt/util/tsv/test_resource.rb +9 -0
  35. data/test/test_helper.rb +10 -0
  36. data/test/test_rbbt.rb +2 -37
  37. metadata +16 -18
  38. data/lib/rbbt/util/data_module.rb +0 -93
  39. data/lib/rbbt/util/path.rb +0 -155
  40. data/lib/rbbt/util/pkg_config.rb +0 -78
  41. data/lib/rbbt/util/pkg_data.rb +0 -119
  42. data/lib/rbbt/util/pkg_software.rb +0 -145
  43. data/test/rbbt/util/test_data_module.rb +0 -50
  44. data/test/rbbt/util/test_path.rb +0 -10
  45. data/test/rbbt/util/test_pkg_data.rb +0 -129
  46. data/test/test_pkg.rb +0 -28
@@ -0,0 +1,118 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
+ require 'rbbt/util/task'
3
+
4
+ Task.basedir = Rbbt.tmp.test.taskjobs.find :user
5
+
6
+ class TestTask < Test::Unit::TestCase
7
+ def test_task
8
+ $true
9
+ task = Task.new(:test_task) do $true = true end
10
+ job = task.job(:job1)
11
+ job.start
12
+
13
+ assert $true
14
+ end
15
+
16
+ def test_task_fork
17
+ TmpFile.with_file do |f|
18
+ task = Task.new(:test_task) do Open.write(f, "Test") end
19
+ job = task.job(:job1)
20
+ job.fork
21
+ job.join
22
+
23
+ assert File.exists? f
24
+ end
25
+ end
26
+
27
+ def test_task_options
28
+ TmpFile.with_file do |f|
29
+ task = Task.new(:test_task, nil, :name) do |name| Open.write(f, name) end
30
+ job = task.job(:job1, :name => "TestName")
31
+ assert_equal "job1" << "_" << Misc.hash2md5(:name => "TestName"), job.id
32
+ job.fork
33
+ job.join
34
+
35
+ assert File.exists? f
36
+ assert_equal "TestName", File.open(f).read
37
+ end
38
+ end
39
+
40
+ def test_task_result
41
+ task = Task.new(:test_task, nil, :name) do |name| name end
42
+ job = task.job(:job1, :name => "TestName")
43
+ assert_equal "TestName", job.fork.join.load
44
+ end
45
+
46
+ def test_task_info
47
+ task = Task.new(:test_task, nil, :name) do |name| name end
48
+ job = task.job(:job1, :name => "TestName")
49
+ assert_equal "TestName", job.fork.join.info[:options][:name]
50
+ end
51
+
52
+ def test_task_status
53
+ task = Task.new(:test_task, nil, :name) do |name|
54
+ step :one
55
+ name
56
+ end
57
+ job = task.job(:job1, :name => "TestName")
58
+ assert_equal "TestName", job.fork.join.info[:options][:name]
59
+ end
60
+
61
+ def test_task_reopen
62
+ task = Task.new(:test_task, nil, :name) do |name| name end
63
+ job = task.job(:job1, :name => "TestName")
64
+ assert_equal "TestName", job.fork.join.info[:options][:name]
65
+ job = task.job(:job1, :name => "TestName")
66
+ assert_equal "TestName", job.join.info[:options][:name]
67
+ end
68
+
69
+ def test_marshal_persistence
70
+ task = Task.new(:test_task, :marshal) do
71
+ {:a => :b}
72
+ end
73
+ job = task.job(:job1).fork.join
74
+ assert Hash === job.load
75
+ assert_equal :b, job.load[:a]
76
+ end
77
+
78
+ def test_yaml_persistence
79
+ task = Task.new(:test_task, :yaml) do
80
+ {:a => :b}
81
+ end
82
+ job = task.job(:job1).fork.join
83
+ assert Hash === job.load
84
+ assert_equal :b, job.load[:a]
85
+ assert_equal :b, YAML.load(job.open)[:a]
86
+ end
87
+
88
+ def test_tsv_persistence
89
+ task = Task.new(:test_task, :tsv) do
90
+ tsv = TSV.new({})
91
+ tsv.key_field = "A"
92
+ tsv.fields = ["B"]
93
+ tsv.type = :list
94
+ tsv["a"] = ["b"]
95
+ tsv
96
+ end
97
+ job = task.job(:job1).fork.join
98
+ assert TSV === job.load
99
+ assert_equal "b", job.load["a"]["B"]
100
+ end
101
+
102
+ def test_clean
103
+ task = Task.new(:test_task, :tsv) do
104
+ tsv = TSV.new({})
105
+ tsv.key_field = "A"
106
+ tsv.fields = ["B"]
107
+ tsv.type = :list
108
+ tsv["a"] = ["b"]
109
+ tsv
110
+ end
111
+ job = task.job(:job1).fork.join
112
+
113
+ assert File.exists?(job.path)
114
+ job.clean
115
+ assert (not File.exists?(job.path))
116
+ end
117
+ end
118
+
@@ -178,7 +178,11 @@ row2 A B
178
178
  assert !tsv1.case_insensitive
179
179
  assert tsv1.include? "A"
180
180
  end
181
-
181
+ def test_create_array
182
+ tsv = TSV.new(%w(a b c))
183
+ assert_equal %w(a b c).sort, tsv.keys.sort
184
+ assert_equal [[]] * tsv.keys.length, tsv.values
185
+ end
182
186
  end
183
187
  end
184
188
 
@@ -1,78 +1,93 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
- require 'rbbt'
3
- require 'rbbt/util/tsv'
4
- require 'rbbt/util/tmpfile'
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
5
2
  require 'rbbt/util/workflow'
6
3
 
7
- class TestWorkflow < Test::Unit::TestCase
8
-
9
- def workflow
10
- TmpFile.with_file do |dir|
11
- old_pdw = FileUtils.pwd
12
- begin
13
- FileUtils.mkdir dir
14
- cd dir
15
- yield dir
16
- ensure
17
- cd old_pdw
18
- end
19
- end
4
+ module MathWF
5
+ extend WorkFlow
6
+ self.tasks[:input] = Task.new(:input, :marshal, :value) do |value| value end
7
+ self.tasks[:add_1] = Task.new(:add_1, :marshal) do input + 1 end
8
+ self.tasks[:add_1].dependencies << :input
9
+ self.tasks[:times_2] = Task.new(:times_2, :marshal) do input * 2 end
10
+ self.tasks[:times_2].dependencies << :add_1
11
+ self.tasks[:times_4] = Task.new(:times_4, :marshal) do input * 4 end
12
+ self.tasks[:times_4].dependencies << :add_1
13
+ self.tasks.each do |name, task| task.workflow = self end
14
+ end
15
+
16
+ MathWF.basedir = Rbbt.tmp.test.jobs.mathwf.find :user
17
+
18
+ module MathWF2
19
+ def mult(num, t)
20
+ num * t
20
21
  end
21
22
 
22
- def _test_run
23
- workflow do |dir|
24
- WorkFlow.run do
25
- file :foo do |t|
26
- touch t.name
27
- end
28
- end
29
- assert File.exists? File.join(dir, 'foo')
30
- end
23
+ extend WorkFlow
24
+
25
+ task_option :value
26
+ task :input => :integer do |value| value end
27
+
28
+ task :add_1 => :integer do input + 1 end
29
+
30
+ task :times_2 => :integer do input * 2 end
31
+
32
+ task_dependencies :add_1
33
+ task :times_4 => :integer do input * 4 end
34
+
35
+ task_option :times, "Times to multiply by", :integer, 10
36
+ task_dependencies :add_1
37
+ task :times => :integer do |times| mult(input, times) end
38
+ end
39
+
40
+ MathWF2.jobdir = Rbbt.tmp.test.jobs.mathwf.find :user
41
+
42
+ class TestWorkFlow < Test::Unit::TestCase
43
+
44
+ def test_math_wf
45
+ job = MathWF.tasks[:times_2].job(:job1, :value => 1)
46
+ assert_equal 4, job.fork.join.load
47
+ job = MathWF.tasks[:times_4].job(:job1, :value => 1)
48
+ assert_equal 8, job.fork.join.load
31
49
  end
32
50
 
33
- def _test_step
34
- jobid = 'jobid'
35
- target_step = 'last'
36
- workflow do |dir|
37
-
38
- WorkFlow.run(File.join(target_step, jobid)) do
39
- self.extend WorkFlow::Runner
40
-
41
- step :first do
42
- "Test"
43
- end
44
-
45
- step :last do
46
- data.reverse
47
- end
48
- end
49
- assert File.exists? File.join(dir, target_step, 'jobid')
50
- assert_equal 'tseT', Open.read(File.join(dir, target_step, 'jobid'))
51
- end
51
+ def test_math_wf2
52
+ job = MathWF2.tasks[:times_2].job(:job1, :value => 1)
53
+ job.fork.join
54
+ assert_equal 4, job.load
55
+ job = MathWF2.tasks[:times_4].job(:job1, :value => 1)
56
+ assert_equal 8, job.fork.join.load
52
57
  end
53
58
 
54
- def test_input
55
- jobid = 'jobid'
56
- target_step = 'last'
57
- message = "Message"
59
+ def test_math_run
60
+ job = MathWF2.job(:times_2, :job1,1)
61
+ job.fork.join
62
+ assert_equal 4, job.load
63
+ end
58
64
 
59
- workflow do |dir|
65
+ def test_math_defaults
66
+ assert MathWF2.tasks[:times].option_defaults.include? :times
60
67
 
61
- WorkFlow.run(File.join(target_step, jobid), message) do
62
- self.extend WorkFlow::Runner
68
+ job = MathWF2.job(:times, :job1, 1)
69
+ job.fork.join
70
+ assert job.done?
71
+ puts job.messages
72
+ assert File.exists? job.path
73
+ assert_equal 20, job.load
63
74
 
64
- step :first, :marshal do
65
- input
66
- end
67
75
 
68
- step :last do
69
- data.reverse
70
- end
71
- end
76
+ job = MathWF2.job(:times, :job1, 1, :times => 20)
77
+ job.fork.join
78
+ assert_equal 40, job.load
79
+ end
72
80
 
73
- assert File.exists? File.join(dir, target_step, 'jobid')
74
- assert_equal message.reverse, Open.read(File.join(dir, target_step, 'jobid'))
75
- end
81
+ def test_recursive_clean
82
+ job = MathWF2.job(:times, :job1, 1, :times => 20)
83
+ job.fork.join
84
+ assert File.exists?(job.path)
85
+ job.clean
86
+ assert (not File.exists?(job.path))
87
+ assert File.exists?(job.dependencies.first.first.path)
88
+ job.recursive_clean
89
+ assert (not File.exists?(job.dependencies.first.first.path))
76
90
  end
91
+
77
92
  end
78
93
 
@@ -206,22 +206,21 @@ row1 e
206
206
  row2 E
207
207
  EOF
208
208
 
209
- Rbbt.claim "data", StringIO.new(content1), "Test1"
210
- Rbbt.claim "data", StringIO.new(content2), "Test2"
211
- Rbbt.claim "identifiers", StringIO.new(content_index), "Test2"
209
+ Rbbt.tmp.test.test1.data.define_as_string content1
210
+ Rbbt.tmp.test.test2.data.define_as_string content2
211
+ Rbbt.tmp.test.test2.identifiers.define_as_string content_index
212
212
 
213
213
  tsv1 = tsv2 = nil
214
214
 
215
- tsv1 = Rbbt.files.Test1.data.tsv :double, :sep => /\s+/
216
- tsv2 = Rbbt.files.Test2.data.tsv :double, :sep => /\s+/
215
+ tsv1 = Rbbt.tmp.test.test1.data.tsv :double, :sep => /\s+/
216
+ tsv2 = Rbbt.tmp.test.test2.data.tsv :double, :sep => /\s+/
217
217
 
218
- tsv2.identifiers = Rbbt.files.Test2.identifiers.produce
218
+ tsv2.identifiers = Rbbt.tmp.test.test2.identifiers.produce
219
219
 
220
220
  tsv1.attach tsv2, "OtherID", :in_namespace => false
221
221
 
222
222
  assert_equal tsv1.fields,%w(ValueA ValueB OtherID)
223
223
  assert_equal %w(Id1 Id2), tsv1["row1"]["OtherID"]
224
-
225
224
  end
226
225
 
227
226
  def test_find_path
@@ -264,5 +263,94 @@ row2 E
264
263
 
265
264
  assert_equal %w(ValueA ValueB ValueE), tsv1.fields
266
265
  end
266
+
267
+ def test_paste
268
+ file1 =<<-EOF
269
+ row6 dd dd ee
270
+ row1 a b c
271
+ row2 A B C
272
+ row3 1 2 3
273
+ EOF
274
+ file2 =<<-EOF
275
+ row20 rr rr
276
+ row1 d e
277
+ row2 D E
278
+ row4 x y z
279
+ EOF
280
+ result =<<-EOF
281
+ row1 a b c d e
282
+ row2 A B C D E
283
+ row20 rr rr
284
+ row3 1 2 3
285
+ row4 x y z
286
+ row6 dd dd ee
287
+ EOF
288
+
289
+ TmpFile.with_file do |f|
290
+ TSV.paste(StringIO.new(file1), StringIO.new(file2), f, " ")
291
+ assert_equal result, Open.read(f)
292
+ end
293
+ end
294
+
295
+ def test_paste
296
+ file1 =<<-EOF
297
+ row6 dd dd ee
298
+ row1 a b c
299
+ row2 A B C
300
+ row3 1 2 3
301
+ EOF
302
+ file2 =<<-EOF
303
+ row20 rr rr
304
+ row1 d e
305
+ row2 D E
306
+ row4 x y
307
+ EOF
308
+ result =<<-EOF
309
+ row1 a b c d e
310
+ row2 A B C D E
311
+ row20 rr rr
312
+ row3 1 2 3
313
+ row4 x y
314
+ row6 dd dd ee
315
+ EOF
316
+
317
+ TmpFile.with_file do |f|
318
+ tsv1 = TSV.new StringIO.new(file1), :sep => " "
319
+ tsv2 = TSV.new StringIO.new(file2), :sep => " "
320
+ tsv_r = tsv1.paste tsv2
321
+ assert_equal result, tsv_r.to_s(tsv_r.keys.sort, true).gsub(/\t/,' ')
322
+ end
323
+ end
324
+
325
+ def test_paste_merge
326
+ file1 =<<-EOF
327
+ row6,dd,dd,ee
328
+ row1,a,b,c
329
+ row1,aa,bb,cc
330
+ row2,A,B,C
331
+ row3,1,2,3
332
+ EOF
333
+ file2 =<<-EOF
334
+ row20,rr,rr
335
+ row1,d,e
336
+ row2,D,E
337
+ row4,x,y
338
+ EOF
339
+ result =<<-EOF
340
+ row1,aa|a,bb|b,cc|c,d,e
341
+ row2,A,B,C,D,E
342
+ row20,,,,rr,rr
343
+ row3,1,2,3,,
344
+ row4,,,,x,y
345
+ row6,dd,dd,ee,,
346
+ EOF
347
+
348
+ TmpFile.with_file do |f|
349
+ TSV.paste_merge StringIO.new(file1), StringIO.new(file2), f, ','
350
+
351
+ assert_equal result, Open.read(f)
352
+ end
353
+
354
+ end
267
355
  end
268
356
 
@@ -94,7 +94,6 @@ C B Id3
94
94
 
95
95
  assert_equal "C", tsv1["row2"]["ValueC"].first
96
96
  assert %w(c cc ccc).include? tsv1["row1"]["ValueC"].first
97
- ddd tsv1
98
97
  assert_equal %w(Id1 Id2), tsv1["row1"]["OtherID"].sort
99
98
  end
100
99
 
@@ -222,5 +222,25 @@ row3 a C Id4
222
222
 
223
223
  end
224
224
 
225
+ def test_add_field_double_with_list_result
226
+ content =<<-EOF
227
+ #Id LetterValue:ValueA LetterValue:ValueB OtherID
228
+ row1 a|aa|aaa b Id1|Id2
229
+ row2 A B Id3
230
+ row3 a C Id4
231
+ EOF
232
+
233
+ TmpFile.with_file(content) do |filename|
234
+ tsv = TSV.new(filename + '#:sep=/\s+/')
235
+
236
+ tsv.add_field "Test" do
237
+ "test"
238
+ end
239
+
240
+ assert Array === tsv["row1"]["Test"]
241
+ end
242
+
243
+ end
244
+
225
245
  end
226
246
 
@@ -0,0 +1,9 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../../..', 'test_helper.rb')
2
+ require 'rbbt/util/tsv/resource'
3
+
4
+ class TestTSVResource < Test::Unit::TestCase
5
+ def test_true
6
+ assert true
7
+ end
8
+ end
9
+