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.
- 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
|
|