rbbt-util 2.1.0 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
+