rbbt-util 3.0.2 → 3.0.3
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/lib/rbbt/util/log.rb +8 -2
- data/lib/rbbt/util/misc.rb +31 -3
- data/lib/rbbt/util/open.rb +16 -3
- data/lib/rbbt/util/persistence.rb +52 -37
- data/lib/rbbt/util/resource.rb +8 -0
- data/lib/rbbt/util/task.rb +41 -281
- data/lib/rbbt/util/task/job.rb +276 -0
- data/lib/rbbt/util/tsv/attach.rb +86 -19
- data/lib/rbbt/util/workflow.rb +18 -24
- data/test/rbbt/util/test_misc.rb +42 -10
- data/test/rbbt/util/test_task.rb +7 -6
- data/test/rbbt/util/test_tc_hash.rb +20 -2
- data/test/rbbt/util/test_workflow.rb +38 -8
- data/test/rbbt/util/tsv/test_attach.rb +17 -0
- metadata +19 -4
data/test/rbbt/util/test_misc.rb
CHANGED
@@ -4,19 +4,19 @@ require 'test/unit'
|
|
4
4
|
|
5
5
|
class TestMisc < Test::Unit::TestCase
|
6
6
|
|
7
|
-
def
|
7
|
+
def _test_pdf2text_example
|
8
8
|
assert PDF2Text.pdf2text(test_datafile('example.pdf')).read =~ /An Example Paper/i
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def _test_pdf2text_EPAR
|
12
12
|
assert PDF2Text.pdf2text("http://www.ema.europa.eu/docs/en_GB/document_library/EPAR_-_Scientific_Discussion/human/000402/WC500033103.pdf").read =~ /Tamiflu/i
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def _test_pdf2text_wrong
|
16
16
|
assert_raise CMD::CMDError do PDF2Text.pdf2text("http://www.ema.europa.eu/docs/en_GB#") end
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def _test_string2hash
|
20
20
|
assert(Misc.string2hash("--user-agent=firefox").include? "--user-agent")
|
21
21
|
assert(Misc.string2hash(":true")[:true] == true)
|
22
22
|
assert(Misc.string2hash("true")["true"] == true)
|
@@ -27,17 +27,17 @@ class TestMisc < Test::Unit::TestCase
|
|
27
27
|
assert(Misc.string2hash("a=b#c=d#:h=:j")[:h] == :j)
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def _test_named_array
|
31
31
|
a = NamedArray.name([1,2,3,4], %w(a b c d))
|
32
32
|
assert_equal(1, a['a'])
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
35
|
+
def _test_path_relative_to
|
36
36
|
assert_equal "test/foo", Misc.path_relative_to('test/test/foo', 'test')
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
40
|
-
|
39
|
+
def _test_chunk
|
40
|
+
_test =<<-EOF
|
41
41
|
This is an example file. Entries are separated by Entry
|
42
42
|
-- Entry
|
43
43
|
1
|
@@ -52,7 +52,7 @@ This is an example file. Entries are separated by Entry
|
|
52
52
|
assert_equal "1\n2\n3", Misc.chunk(test, /^-- Entry/).first.strip
|
53
53
|
end
|
54
54
|
|
55
|
-
def
|
55
|
+
def _test_hash2string
|
56
56
|
hash = {}
|
57
57
|
assert_equal hash, Misc.string2hash(Misc.hash2string(hash))
|
58
58
|
|
@@ -73,11 +73,43 @@ This is an example file. Entries are separated by Entry
|
|
73
73
|
|
74
74
|
end
|
75
75
|
|
76
|
-
def
|
76
|
+
def _test_merge
|
77
77
|
a = [[1],[2]]
|
78
78
|
a = NamedArray.name a, %w(1 2)
|
79
79
|
a.merge [3,4]
|
80
80
|
assert_equal [1,3], a[0]
|
81
81
|
end
|
82
82
|
|
83
|
+
def _test_indiferent_hash
|
84
|
+
a = {:a => 1, "b" => 2}
|
85
|
+
a.extend IndiferentHash
|
86
|
+
|
87
|
+
assert 1, a["a"]
|
88
|
+
assert 1, a[:a]
|
89
|
+
assert 2, a["b"]
|
90
|
+
assert 2, a[:b]
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_lockfile
|
94
|
+
TmpFile.with_file do |tmpfile|
|
95
|
+
pids = []
|
96
|
+
3.times do |i|
|
97
|
+
pids << Process.fork do
|
98
|
+
pid = pid.to_s
|
99
|
+
Misc.lock(tmpfile, pid) do |f, val|
|
100
|
+
Open.write(f, val)
|
101
|
+
sleep rand * 2
|
102
|
+
if pid == Open.read(tmpfile)
|
103
|
+
exit(0)
|
104
|
+
else
|
105
|
+
exit(1)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
pids.each do |pid| Process.waitpid pid; assert $?.success? end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
83
115
|
end
|
data/test/rbbt/util/test_task.rb
CHANGED
@@ -27,7 +27,7 @@ class TestTask < Test::Unit::TestCase
|
|
27
27
|
def test_task_options
|
28
28
|
TmpFile.with_file do |f|
|
29
29
|
task = Task.new(:test_task, nil, :name) do |name| Open.write(f, name) end
|
30
|
-
job = task.job(:job1,
|
30
|
+
job = task.job(:job1, "TestName")
|
31
31
|
assert_equal "job1" << "_" << Misc.hash2md5(:name => "TestName"), job.id
|
32
32
|
job.fork
|
33
33
|
job.join
|
@@ -39,13 +39,13 @@ class TestTask < Test::Unit::TestCase
|
|
39
39
|
|
40
40
|
def test_task_result
|
41
41
|
task = Task.new(:test_task, nil, :name) do |name| name end
|
42
|
-
job = task.job(:job1,
|
42
|
+
job = task.job(:job1, "TestName")
|
43
43
|
assert_equal "TestName", job.fork.join.load
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_task_info
|
47
47
|
task = Task.new(:test_task, nil, :name) do |name| name end
|
48
|
-
job = task.job(:job1,
|
48
|
+
job = task.job(:job1, "TestName")
|
49
49
|
assert_equal "TestName", job.fork.join.info[:options][:name]
|
50
50
|
end
|
51
51
|
|
@@ -54,15 +54,15 @@ class TestTask < Test::Unit::TestCase
|
|
54
54
|
step :one
|
55
55
|
name
|
56
56
|
end
|
57
|
-
job = task.job(:job1,
|
57
|
+
job = task.job(:job1, "TestName")
|
58
58
|
assert_equal "TestName", job.fork.join.info[:options][:name]
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_task_reopen
|
62
62
|
task = Task.new(:test_task, nil, :name) do |name| name end
|
63
|
-
job = task.job(:job1,
|
63
|
+
job = task.job(:job1, "TestName")
|
64
64
|
assert_equal "TestName", job.fork.join.info[:options][:name]
|
65
|
-
job = task.job(:job1,
|
65
|
+
job = task.job(:job1, "TestName")
|
66
66
|
assert_equal "TestName", job.join.info[:options][:name]
|
67
67
|
end
|
68
68
|
|
@@ -114,5 +114,6 @@ class TestTask < Test::Unit::TestCase
|
|
114
114
|
job.clean
|
115
115
|
assert (not File.exists?(job.path))
|
116
116
|
end
|
117
|
+
|
117
118
|
end
|
118
119
|
|
@@ -61,9 +61,27 @@ class TestTCHash < Test::Unit::TestCase
|
|
61
61
|
t["2"] = [[3],[4,5]]
|
62
62
|
|
63
63
|
t = TCHash.get f
|
64
|
-
|
65
|
-
|
64
|
+
assert_equal [["3"],["4","5"]], t["2"]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_non_blocking
|
69
|
+
TmpFile.with_file do |f|
|
70
|
+
t = TCHash.get f, true, :double
|
71
|
+
t["1"] = [[1],[2]]
|
72
|
+
t["2"] = [[3],[4,5]]
|
73
|
+
t.close
|
74
|
+
|
75
|
+
pid = Process.fork do
|
76
|
+
t2 = TCHash.get f, true, :double
|
77
|
+
assert_equal [["3"],["4","5"]], t2["2"]
|
78
|
+
exit
|
66
79
|
end
|
80
|
+
|
81
|
+
t2 = TCHash.get f, true, :double
|
82
|
+
assert_equal [["3"],["4","5"]], t2["2"]
|
83
|
+
|
84
|
+
Process.wait pid
|
67
85
|
end
|
68
86
|
end
|
69
87
|
end
|
@@ -13,7 +13,6 @@ module MathWF
|
|
13
13
|
self.tasks.each do |name, task| task.workflow = self end
|
14
14
|
end
|
15
15
|
|
16
|
-
MathWF.basedir = Rbbt.tmp.test.jobs.mathwf.find :user
|
17
16
|
|
18
17
|
module MathWF2
|
19
18
|
def mult(num, t)
|
@@ -22,6 +21,7 @@ module MathWF2
|
|
22
21
|
|
23
22
|
extend WorkFlow
|
24
23
|
|
24
|
+
|
25
25
|
task_option :value
|
26
26
|
task :input => :integer do |value| value end
|
27
27
|
|
@@ -35,29 +35,51 @@ module MathWF2
|
|
35
35
|
task_option :times, "Times to multiply by", :integer, 10
|
36
36
|
task_dependencies :add_1
|
37
37
|
task :times => :integer do |times| mult(input, times) end
|
38
|
+
|
39
|
+
task_dependencies []
|
40
|
+
task :persist do task.workflow.methods.include? "local_persist" end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
module ConWF
|
45
|
+
extend WorkFlow
|
46
|
+
task :one => :integer do 1 end
|
47
|
+
|
48
|
+
task_dependencies []
|
49
|
+
task :two => :integer do 2 end
|
50
|
+
|
51
|
+
task_option :init, "Initial value", :string
|
52
|
+
task_dependencies Proc.new{|jobname,run_options|
|
53
|
+
ConWF.job(run_options[:init].to_sym, jobname, {})
|
54
|
+
}
|
55
|
+
task :times_2 => :integer do
|
56
|
+
input * 2
|
57
|
+
end
|
38
58
|
end
|
39
59
|
|
40
60
|
MathWF2.jobdir = Rbbt.tmp.test.jobs.mathwf.find :user
|
61
|
+
MathWF.jobdir = Rbbt.tmp.test.jobs.mathwf.find :user
|
62
|
+
ConWF.jobdir = Rbbt.tmp.test.jobs.mathwf.find :user
|
41
63
|
|
42
64
|
class TestWorkFlow < Test::Unit::TestCase
|
43
65
|
|
44
66
|
def test_math_wf
|
45
|
-
job = MathWF.tasks[:times_2].job(:job1,
|
67
|
+
job = MathWF.tasks[:times_2].job(:job1, 1)
|
46
68
|
assert_equal 4, job.fork.join.load
|
47
|
-
job = MathWF.tasks[:times_4].job(:job1,
|
69
|
+
job = MathWF.tasks[:times_4].job(:job1, 1)
|
48
70
|
assert_equal 8, job.fork.join.load
|
49
71
|
end
|
50
72
|
|
51
73
|
def test_math_wf2
|
52
|
-
job = MathWF2.tasks[:times_2].job(:job1,
|
74
|
+
job = MathWF2.tasks[:times_2].job(:job1, 1)
|
53
75
|
job.fork.join
|
54
76
|
assert_equal 4, job.load
|
55
|
-
job = MathWF2.tasks[:times_4].job(:job1,
|
77
|
+
job = MathWF2.tasks[:times_4].job(:job1, 1)
|
56
78
|
assert_equal 8, job.fork.join.load
|
57
79
|
end
|
58
80
|
|
59
81
|
def test_math_run
|
60
|
-
job = MathWF2.job(:times_2, :job1,1)
|
82
|
+
job = MathWF2.job(:times_2, :job1, 1)
|
61
83
|
job.fork.join
|
62
84
|
assert_equal 4, job.load
|
63
85
|
end
|
@@ -84,10 +106,18 @@ class TestWorkFlow < Test::Unit::TestCase
|
|
84
106
|
assert File.exists?(job.path)
|
85
107
|
job.clean
|
86
108
|
assert (not File.exists?(job.path))
|
87
|
-
assert File.exists?(job.
|
109
|
+
assert File.exists?(job.previous_jobs.first.path)
|
88
110
|
job.recursive_clean
|
89
|
-
assert (not File.exists?(job.
|
111
|
+
assert (not File.exists?(job.previous_jobs.first.path))
|
90
112
|
end
|
91
113
|
|
114
|
+
def test_local_persist
|
115
|
+
assert MathWF2.run(:persist, :persist).load
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_conditional
|
119
|
+
assert 2, ConWF.run(:times_2, "Test", "one").load
|
120
|
+
assert 4, ConWF.run(:times_2, "Test", "two").load
|
121
|
+
end
|
92
122
|
end
|
93
123
|
|
@@ -352,5 +352,22 @@ row6,dd,dd,ee,,
|
|
352
352
|
end
|
353
353
|
|
354
354
|
end
|
355
|
+
|
356
|
+
def test_merge_rows
|
357
|
+
file1 =<<-EOF
|
358
|
+
row1,a,b,c
|
359
|
+
row1,aa,bb,cc
|
360
|
+
row2,A,B,C
|
361
|
+
row3,1,2,3
|
362
|
+
EOF
|
363
|
+
TmpFile.with_file(file1) do |input|
|
364
|
+
TmpFile.with_file() do |output|
|
365
|
+
TSV.merge_rows Open.open(input), output
|
366
|
+
assert Open.read(output) =~ /a|aa/
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
|
371
|
+
end
|
355
372
|
end
|
356
373
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 3.0.
|
9
|
+
- 3
|
10
|
+
version: 3.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Miguel Vazquez
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-03-
|
18
|
+
date: 2011-03-23 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -88,6 +88,20 @@ dependencies:
|
|
88
88
|
version: "0"
|
89
89
|
type: :runtime
|
90
90
|
version_requirements: *id005
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: lockfile
|
93
|
+
prerelease: false
|
94
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
103
|
+
type: :runtime
|
104
|
+
version_requirements: *id006
|
91
105
|
description: Utilities for handling tsv files, caches, etc
|
92
106
|
email: miguel.vazquez@fdi.ucm.es
|
93
107
|
executables:
|
@@ -119,6 +133,7 @@ files:
|
|
119
133
|
- lib/rbbt/util/simpleDSL.rb
|
120
134
|
- lib/rbbt/util/simpleopt.rb
|
121
135
|
- lib/rbbt/util/task.rb
|
136
|
+
- lib/rbbt/util/task/job.rb
|
122
137
|
- lib/rbbt/util/tc_hash.rb
|
123
138
|
- lib/rbbt/util/tmpfile.rb
|
124
139
|
- lib/rbbt/util/tsv.rb
|