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.
- data/bin/rbbt_query.rb +63 -0
- data/lib/rbbt-util.rb +5 -5
- data/lib/rbbt.rb +2 -11
- data/lib/rbbt/util/cmd.rb +1 -1
- data/lib/rbbt/util/fix_width_table.rb +9 -3
- data/lib/rbbt/util/log.rb +23 -7
- data/lib/rbbt/util/misc.rb +121 -15
- data/lib/rbbt/util/open.rb +14 -4
- data/lib/rbbt/util/persistence.rb +52 -21
- data/lib/rbbt/util/rake.rb +108 -21
- data/lib/rbbt/util/resource.rb +338 -0
- data/lib/rbbt/util/simpleDSL.rb +1 -1
- data/lib/rbbt/util/simpleopt.rb +1 -1
- data/lib/rbbt/util/task.rb +340 -0
- data/lib/rbbt/util/tc_hash.rb +19 -2
- data/lib/rbbt/util/tsv.rb +15 -10
- data/lib/rbbt/util/tsv/accessor.rb +16 -7
- data/lib/rbbt/util/tsv/attach.rb +220 -17
- data/lib/rbbt/util/tsv/index.rb +6 -1
- data/lib/rbbt/util/tsv/manipulate.rb +4 -5
- data/lib/rbbt/util/tsv/parse.rb +45 -21
- data/lib/rbbt/util/tsv/resource.rb +74 -0
- data/lib/rbbt/util/workflow.rb +99 -75
- data/test/rbbt/util/test_filecache.rb +2 -2
- data/test/rbbt/util/test_misc.rb +7 -2
- data/test/rbbt/util/test_persistence.rb +40 -5
- data/test/rbbt/util/test_resource.rb +92 -0
- data/test/rbbt/util/test_task.rb +118 -0
- data/test/rbbt/util/test_tsv.rb +5 -1
- data/test/rbbt/util/test_workflow.rb +77 -62
- data/test/rbbt/util/tsv/test_attach.rb +95 -7
- data/test/rbbt/util/tsv/test_index.rb +0 -1
- data/test/rbbt/util/tsv/test_manipulate.rb +20 -0
- data/test/rbbt/util/tsv/test_resource.rb +9 -0
- data/test/test_helper.rb +10 -0
- data/test/test_rbbt.rb +2 -37
- metadata +16 -18
- data/lib/rbbt/util/data_module.rb +0 -93
- data/lib/rbbt/util/path.rb +0 -155
- data/lib/rbbt/util/pkg_config.rb +0 -78
- data/lib/rbbt/util/pkg_data.rb +0 -119
- data/lib/rbbt/util/pkg_software.rb +0 -145
- data/test/rbbt/util/test_data_module.rb +0 -50
- data/test/rbbt/util/test_path.rb +0 -10
- data/test/rbbt/util/test_pkg_data.rb +0 -129
- 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
|
+
|
data/test/rbbt/util/test_tsv.rb
CHANGED
@@ -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__)
|
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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
55
|
-
|
56
|
-
|
57
|
-
|
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
|
-
|
65
|
+
def test_math_defaults
|
66
|
+
assert MathWF2.tasks[:times].option_defaults.include? :times
|
60
67
|
|
61
|
-
|
62
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
76
|
+
job = MathWF2.job(:times, :job1, 1, :times => 20)
|
77
|
+
job.fork.join
|
78
|
+
assert_equal 40, job.load
|
79
|
+
end
|
72
80
|
|
73
|
-
|
74
|
-
|
75
|
-
|
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.
|
210
|
-
Rbbt.
|
211
|
-
Rbbt.
|
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.
|
216
|
-
tsv2 = Rbbt.
|
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.
|
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
|
|
@@ -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
|
|