rbbt-util 3.2.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/README.rdoc +65 -0
  2. data/bin/run_workflow.rb +142 -69
  3. data/lib/rbbt-util.rb +3 -3
  4. data/lib/rbbt.rb +12 -3
  5. data/lib/rbbt/annotations.rb +215 -0
  6. data/lib/rbbt/{util/fix_width_table.rb → fix_width_table.rb} +17 -13
  7. data/lib/rbbt/persist.rb +164 -0
  8. data/lib/rbbt/persist/tsv.rb +135 -0
  9. data/lib/rbbt/resource.rb +100 -0
  10. data/lib/rbbt/resource/path.rb +180 -0
  11. data/lib/rbbt/resource/rake.rb +48 -0
  12. data/lib/rbbt/resource/util.rb +111 -0
  13. data/lib/rbbt/resource/with_key.rb +28 -0
  14. data/lib/rbbt/tsv.rb +134 -0
  15. data/lib/rbbt/tsv/accessor.rb +345 -0
  16. data/lib/rbbt/tsv/attach.rb +183 -0
  17. data/lib/rbbt/tsv/attach/util.rb +277 -0
  18. data/lib/rbbt/{util/tsv/filters.rb → tsv/filter.rb} +76 -37
  19. data/lib/rbbt/tsv/index.rb +453 -0
  20. data/lib/rbbt/tsv/manipulate.rb +361 -0
  21. data/lib/rbbt/tsv/parser.rb +231 -0
  22. data/lib/rbbt/tsv/serializers.rb +79 -0
  23. data/lib/rbbt/tsv/util.rb +67 -0
  24. data/lib/rbbt/util/R.rb +3 -3
  25. data/lib/rbbt/util/chain_methods.rb +64 -0
  26. data/lib/rbbt/util/cmd.rb +17 -13
  27. data/lib/rbbt/util/excel2tsv.rb +4 -3
  28. data/lib/rbbt/util/log.rb +1 -0
  29. data/lib/rbbt/util/misc.rb +296 -285
  30. data/lib/rbbt/util/open.rb +9 -2
  31. data/lib/rbbt/util/persistence.rb +1 -1
  32. data/lib/rbbt/util/task/job.rb +3 -1
  33. data/lib/rbbt/workflow.rb +193 -0
  34. data/lib/rbbt/workflow/accessor.rb +249 -0
  35. data/lib/rbbt/workflow/annotate.rb +60 -0
  36. data/lib/rbbt/workflow/soap.rb +100 -0
  37. data/lib/rbbt/workflow/step.rb +102 -0
  38. data/lib/rbbt/workflow/task.rb +76 -0
  39. data/test/rbbt/resource/test_path.rb +12 -0
  40. data/test/rbbt/test_annotations.rb +106 -0
  41. data/test/rbbt/{util/test_fix_width_table.rb → test_fix_width_table.rb} +8 -9
  42. data/test/rbbt/test_resource.rb +66 -0
  43. data/test/rbbt/test_tsv.rb +332 -0
  44. data/test/rbbt/test_workflow.rb +102 -0
  45. data/test/rbbt/tsv/test_accessor.rb +163 -0
  46. data/test/rbbt/{util/tsv → tsv}/test_attach.rb +86 -43
  47. data/test/rbbt/{util/tsv/test_filters.rb → tsv/test_filter.rb} +31 -13
  48. data/test/rbbt/tsv/test_index.rb +284 -0
  49. data/test/rbbt/{util/tsv → tsv}/test_manipulate.rb +35 -105
  50. data/test/rbbt/util/test_R.rb +1 -1
  51. data/test/rbbt/util/test_chain_methods.rb +22 -0
  52. data/test/rbbt/util/test_filecache.rb +0 -1
  53. data/test/rbbt/util/test_misc.rb +97 -79
  54. data/test/rbbt/util/test_open.rb +1 -0
  55. data/test/rbbt/util/test_tmpfile.rb +1 -1
  56. data/test/rbbt/workflow/test_soap.rb +103 -0
  57. data/test/rbbt/workflow/test_step.rb +142 -0
  58. data/test/rbbt/workflow/test_task.rb +84 -0
  59. data/test/test_helper.rb +7 -7
  60. metadata +80 -54
  61. data/lib/rbbt/util/rake.rb +0 -176
  62. data/lib/rbbt/util/resource.rb +0 -355
  63. data/lib/rbbt/util/task.rb +0 -183
  64. data/lib/rbbt/util/tc_hash.rb +0 -324
  65. data/lib/rbbt/util/tsv.rb +0 -236
  66. data/lib/rbbt/util/tsv/accessor.rb +0 -312
  67. data/lib/rbbt/util/tsv/attach.rb +0 -416
  68. data/lib/rbbt/util/tsv/index.rb +0 -419
  69. data/lib/rbbt/util/tsv/manipulate.rb +0 -300
  70. data/lib/rbbt/util/tsv/misc.rb +0 -41
  71. data/lib/rbbt/util/tsv/parse.rb +0 -324
  72. data/lib/rbbt/util/tsv/resource.rb +0 -88
  73. data/lib/rbbt/util/workflow.rb +0 -135
  74. data/lib/rbbt/util/workflow/soap.rb +0 -116
  75. data/test/rbbt/util/test_persistence.rb +0 -201
  76. data/test/rbbt/util/test_rake.rb +0 -54
  77. data/test/rbbt/util/test_resource.rb +0 -77
  78. data/test/rbbt/util/test_task.rb +0 -133
  79. data/test/rbbt/util/test_tc_hash.rb +0 -144
  80. data/test/rbbt/util/test_tsv.rb +0 -221
  81. data/test/rbbt/util/test_workflow.rb +0 -135
  82. data/test/rbbt/util/tsv/test_accessor.rb +0 -150
  83. data/test/rbbt/util/tsv/test_index.rb +0 -241
  84. data/test/rbbt/util/tsv/test_parse.rb +0 -87
  85. data/test/rbbt/util/tsv/test_resource.rb +0 -9
@@ -1,11 +1,11 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
- require 'rbbt/util/fix_width_table'
3
- require 'rbbt/util/tsv'
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../', 'test_helper.rb')
2
+ require 'rbbt/fix_width_table'
3
+ require 'rbbt/tsv'
4
+ require 'rbbt/tsv/manipulate'
4
5
 
5
6
  class TestFixWidthTable < Test::Unit::TestCase
6
7
  def load_data(data)
7
- Log.debug("Data:\n#{Open.read(data)}")
8
- tsv = TSV.new(data, :list, :sep=>":", :cast => proc{|e| e =~ /(\s*)(_*)/; ($1.length..($1.length + $2.length - 1))})
8
+ tsv = TSV.open(data, :list, :sep=>":", :cast => proc{|e| e =~ /(\s*)(_*)/; ($1.length..($1.length + $2.length - 1))})
9
9
  tsv.add_field "Start" do |key, values|
10
10
  values["Range"].first
11
11
  end
@@ -50,7 +50,7 @@ class TestFixWidthTable < Test::Unit::TestCase
50
50
 
51
51
  def test_point
52
52
  data =<<-EOF
53
- #: :sep=/\\s+/#:type=:single#:cast=to_i
53
+ #: :sep=/\\s+/#:type=:single#:cast=:to_i
54
54
  #ID Pos
55
55
  a 1
56
56
  b 10
@@ -61,8 +61,7 @@ f 11
61
61
  g 25
62
62
  EOF
63
63
  TmpFile.with_file(data) do |datafile|
64
- tsv = TSV.new datafile
65
- ddd tsv
64
+ tsv = TSV.open datafile
66
65
  TmpFile.with_file do |filename|
67
66
  f = FixWidthTable.new filename, 100, false
68
67
  f.add_point tsv
@@ -88,7 +87,7 @@ f: ___
88
87
  g: ____
89
88
  EOF
90
89
  TmpFile.with_file(data) do |datafile|
91
- tsv = TSV.new load_data(datafile)
90
+ tsv = load_data(datafile)
92
91
  TmpFile.with_file do |filename|
93
92
  f = FixWidthTable.new filename, 100, true
94
93
  f.add_range tsv
@@ -0,0 +1,66 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+ require 'rbbt/resource'
3
+ require 'rbbt/util/tmpfile'
4
+ require 'test/unit'
5
+
6
+ module TestResource
7
+ extend Resource
8
+
9
+ claim tmp.test.google, :url, "http://google.com"
10
+ claim tmp.test.string, :string, "TEST"
11
+ claim tmp.test.proc, :proc do
12
+ "PROC TEST"
13
+ end
14
+
15
+ claim tmp.test.rakefiles.foo , :string , <<-EOF
16
+ file 'foo' do |t|
17
+ Open.write(t.name, "TEST")
18
+ end
19
+ EOF
20
+
21
+ claim tmp.test.work.footest, :rake, tmp.test.rakefiles.foo
22
+ end
23
+
24
+ class TestTSV < Test::Unit::TestCase
25
+
26
+ def test_rake
27
+ TestResource.tmp.test.work.footest.foo.read == "TEST"
28
+ assert TestResource.tmp.test.work.footest.foo.read == "TEST"
29
+ end
30
+
31
+ def test_proc
32
+ assert TestResource.tmp.test.proc.read == "PROC TEST"
33
+ end
34
+
35
+ def test_string
36
+ assert TestResource.tmp.test.string.read == "TEST"
37
+ end
38
+
39
+ def test_url
40
+ assert TestResource[].tmp.test.google.read =~ /google/
41
+ end
42
+
43
+
44
+ def test_resolve
45
+ assert_equal File.join(ENV['HOME'], '.rbbt/etc/foo'), Path.setup('etc/foo').find(:user)
46
+ assert_equal File.join(ENV['HOME'], '.phgx/etc/foo'), Path.setup('etc/foo', 'phgx').find(:user)
47
+
48
+ assert_equal File.join('/', 'etc/rbbt/foo'), Path.setup('etc/foo').find(:global)
49
+ assert_equal File.join('/', 'etc/phgx/foo'), Path.setup('etc/foo', 'phgx').find(:global)
50
+
51
+ assert_equal File.join('/usr/local', 'etc/rbbt/foo'), Path.setup('etc/foo').find(:local)
52
+ assert_equal File.join('/usr/local', 'etc/phgx/foo'), Path.setup('etc/foo', 'phgx').find(:local)
53
+
54
+ assert_equal File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '../../', 'etc/foo')), Path.setup('etc/foo').find(:lib)
55
+ assert_equal File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '../../', 'etc/foo')), Path.setup('etc/foo').find(:lib)
56
+
57
+ assert_equal File.join(ENV['HOME'], '.rbbt/etc/foo'), Path.setup('etc/foo').find()
58
+ assert_equal File.join(ENV['HOME'], '.phgx/etc/foo'), Path.setup('etc/foo', 'phgx').find()
59
+ end
60
+
61
+ def test_libdir
62
+ assert File.exists? TestResource[].share.lib.R["util.R"].find :lib
63
+ assert File.exists? TestResource[].share.lib.R["util.R"].find
64
+ end
65
+
66
+ end
@@ -0,0 +1,332 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+ require 'rbbt/tsv'
3
+ require 'rbbt/util/tmpfile'
4
+ require 'test/unit'
5
+
6
+ class TestTSV < Test::Unit::TestCase
7
+
8
+ def test_extend
9
+ a = {
10
+ "one" => "1",
11
+ "two" => "2"
12
+ }
13
+
14
+ a.extend TSV
15
+
16
+ assert a.methods.include? "key_field="
17
+
18
+ a.key_field = "Number"
19
+
20
+ assert_equal "1", a["one"]
21
+ end
22
+
23
+ def test_tsv
24
+ content =<<-EOF
25
+ #Id ValueA ValueB OtherID
26
+ row1 a|aa|aaa b Id1|Id2
27
+ row2 A B Id3
28
+ EOF
29
+
30
+ TmpFile.with_file(content) do |filename|
31
+ tsv = TSV.open(filename, :sep => /\s+/)
32
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
33
+ assert_equal ["ValueA", "ValueB", "OtherID"], tsv.fields
34
+ assert_equal :double, tsv.type
35
+ assert_equal "Id", tsv.key_field
36
+
37
+ tsv = TSV.open(filename, :sep => /\s+/, :key_field => "Id")
38
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
39
+ assert_equal ["ValueA", "ValueB", "OtherID"], tsv.fields
40
+ assert_equal :double, tsv.type
41
+ assert_equal "Id", tsv.key_field
42
+
43
+ end
44
+ end
45
+
46
+ def test_headerless
47
+ content =<<-EOF
48
+ row1 a|aa|aaa b Id1|Id2
49
+ row2 A B Id3
50
+ EOF
51
+
52
+ TmpFile.with_file(content) do |filename|
53
+ tsv = TSV.open(filename, :sep => /\s+/)
54
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
55
+ assert_equal :double, tsv.type
56
+ end
57
+ end
58
+
59
+ def test_headerless_fields
60
+ content =<<-EOF
61
+ #Id ValueA ValueB OtherID
62
+ row1 a|aa|aaa b Id1|Id2
63
+ row2 A B Id3
64
+ EOF
65
+
66
+ TmpFile.with_file(content) do |filename|
67
+ tsv = TSV.open(filename, :sep => /\s+/, :fields => 1)
68
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
69
+ assert_equal :double, tsv.type
70
+ assert_equal [%w(a aa aaa)], tsv["row1"]
71
+ end
72
+ end
73
+
74
+ def test_headerless_fields
75
+ content =<<-EOF
76
+ row1 a|aa|aaa b Id1|Id2
77
+ row2 A B Id3
78
+ EOF
79
+
80
+ TmpFile.with_file(content) do |filename|
81
+ tsv = TSV.open(filename, :sep => /\s+/, :fields => 1)
82
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
83
+ assert_equal :double, tsv.type
84
+ assert_equal [%w(a aa aaa)], tsv["row1"]
85
+ end
86
+ end
87
+
88
+ def test_tsv_persistence
89
+ content =<<-EOF
90
+ #Id ValueA ValueB OtherID
91
+ row1 a|aa|aaa b Id1|Id2
92
+ row2 A B Id3
93
+ EOF
94
+
95
+ TmpFile.with_file(content) do |filename|
96
+ tsv = TSV.open(filename, :sep => /\s+/, :persist => true)
97
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
98
+ assert_equal ["ValueA", "ValueB", "OtherID"], tsv.fields
99
+ assert_equal :double, tsv.type
100
+ assert_equal "Id", tsv.key_field
101
+ assert TokyoCabinet::HDB === tsv
102
+
103
+ FileUtils.rm filename
104
+ tsv = TSV.open(filename, :sep => /\s+/, :persist => true)
105
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
106
+ assert_equal ["ValueA", "ValueB", "OtherID"], tsv.fields
107
+ assert_equal :double, tsv.type
108
+ assert_equal "Id", tsv.key_field
109
+ assert TokyoCabinet::HDB === tsv
110
+
111
+ end
112
+ end
113
+
114
+ def test_tsv_field_selection
115
+ content =<<-EOF
116
+ #Id ValueA ValueB OtherID
117
+ row1 a|aa|aaa b Id1|Id2
118
+ row2 A B Id3
119
+ EOF
120
+
121
+ TmpFile.with_file(content) do |filename|
122
+ tsv = TSV.open(filename, :sep => /\s+/, :key_field => 0)
123
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
124
+
125
+ tsv = TSV.open(filename, :sep => /\s+/, :key_field => "Id")
126
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
127
+
128
+ tsv = TSV.open(filename, :sep => /\s+/, :fields => 1)
129
+ assert_equal ["a", "aa", "aaa"], tsv["row1"].first
130
+
131
+ tsv = TSV.open(filename, :sep => /\s+/, :fields => 2)
132
+ assert_equal ["b"], tsv["row1"].first
133
+
134
+ tsv = TSV.open(filename, :sep => /\s+/, :fields => [1,2])
135
+ assert_equal ["a", "aa", "aaa"], tsv["row1"].first
136
+ assert_equal ["b"], tsv["row1"].last
137
+
138
+ tsv = TSV.open(filename, :sep => /\s+/, :fields => [1,3])
139
+ assert_equal ["a", "aa", "aaa"], tsv["row1"].first
140
+ assert_equal ["Id1", "Id2"], tsv["row1"].last
141
+
142
+ tsv = TSV.open(filename, :sep => /\s+/, :key_field => "OtherID")
143
+ assert_equal ["row1"], tsv["Id1"].first
144
+ assert_equal tsv["Id2"], tsv["Id1"]
145
+
146
+ tsv = TSV.open(filename, :sep => /\s+/, :key_field => "OtherID", :fields => "Id")
147
+ assert_equal ["row1"], tsv["Id1"].first
148
+ assert_equal tsv["Id2"], tsv["Id1"]
149
+
150
+ tsv = TSV.open(filename, :sep => /\s+/, :key_field => "OtherID", :fields => ["ValueA",2])
151
+ assert_equal ["a", "aa", "aaa"], tsv["Id1"].first
152
+ assert_equal tsv["Id2"], tsv["Id1"]
153
+ end
154
+ end
155
+
156
+ def test_tsv_cast
157
+ content =<<-EOF
158
+ #Id Value
159
+ row1 1|2|3
160
+ row2 4
161
+ EOF
162
+
163
+ TmpFile.with_file(content) do |filename|
164
+ tsv = TSV.open(filename, :sep => /\s+/, :cast => :to_i)
165
+ assert_equal [1,2,3], tsv["row1"][0]
166
+ tsv = TSV.open(filename, :sep => /\s+/, :cast => :to_f)
167
+ assert_equal [1.0,2.0,3.0], tsv["row1"][0]
168
+ end
169
+ end
170
+
171
+ def test_tsv_single
172
+ content =<<-EOF
173
+ #Id Value
174
+ row1 1
175
+ row2 4
176
+ EOF
177
+
178
+ TmpFile.with_file(content) do |filename|
179
+ tsv = TSV.open(filename, :sep => /\s+/, :cast => :to_i, :type => :single, :fields => "Value")
180
+ assert_equal 1, tsv["row1"]
181
+ end
182
+ end
183
+
184
+ def test_tsv_serializer
185
+ content =<<-EOF
186
+ #Id Value
187
+ row1 1
188
+ row2 4
189
+ EOF
190
+
191
+ TmpFile.with_file(content) do |filename|
192
+ tsv = TSV.open(filename, :sep => /\s+/, :cast => :to_i, :type => :single, :serializer => :integer)
193
+ assert_equal 1, tsv["row1"]
194
+ assert String === tsv.tsv_clean_get_brackets("row1")
195
+ end
196
+ end
197
+
198
+ def test_tsv_header_options
199
+ content =<<-EOF
200
+ #: :sep=/\\s+/
201
+ #Id Value
202
+ 1 a
203
+ 2 b
204
+ EOF
205
+
206
+ TmpFile.with_file(content) do |filename|
207
+ tsv = TSV.open(filename)
208
+ assert_equal [["a"]], tsv["1"]
209
+ end
210
+ end
211
+
212
+ def test_tsv_fastimport
213
+ content =<<-EOF
214
+ #Id ValueA ValueB OtherID
215
+ row1 a|aa|aaa b Id1|Id2
216
+ row2 A B Id3
217
+ EOF
218
+
219
+ TmpFile.with_file(content.gsub(/ +/,"\t")) do |filename|
220
+ tsv = TSV.open(filename, :persist => true)
221
+ assert_equal ["a", "aa", "aaa"], tsv["row1"][0]
222
+ assert_equal ["ValueA", "ValueB", "OtherID"], tsv.fields
223
+ assert_equal :double, tsv.type
224
+ assert_equal "Id", tsv.key_field
225
+ end
226
+ end
227
+
228
+ def test_header_type
229
+ content =<<-EOF
230
+ #: :sep=/\\s+/#:type=:single
231
+ #Id Value
232
+ 1 a
233
+ 2 b
234
+ EOF
235
+
236
+ TmpFile.with_file(content) do |filename|
237
+ tsv = TSV.open(filename)
238
+ assert_equal :single, tsv.type
239
+ assert_equal "a", tsv["1"]
240
+ end
241
+
242
+ end
243
+
244
+ def test_single_cast
245
+ content =<<-EOF
246
+ #: :sep=/\\s+/#:type=:single#:cast=:to_i
247
+ #Id Value
248
+ a 1
249
+ b 2
250
+ EOF
251
+
252
+ TmpFile.with_file(content) do |filename|
253
+ tsv = TSV.open(filename)
254
+ assert_equal :single, tsv.type
255
+ assert_equal 1, tsv["a"]
256
+ end
257
+ end
258
+
259
+ def test_key_field
260
+ content =<<-EOF
261
+ #: :sep=/\\s+/#:type=:single
262
+ #Id Value
263
+ a 1
264
+ b 2
265
+ EOF
266
+
267
+ TmpFile.with_file(content) do |filename|
268
+ tsv = TSV.open(filename, :key_field => "Value")
269
+ assert_equal %w(Id), tsv.fields
270
+ assert_equal "Value", tsv.key_field
271
+ assert_equal "a", tsv["1"]
272
+ end
273
+ end
274
+
275
+ def test_fix
276
+ content =<<-EOF
277
+ #: :sep=/\\s+/#:type=:single
278
+ #Id Value
279
+ a 1
280
+ b 2
281
+ EOF
282
+
283
+ TmpFile.with_file(content) do |filename|
284
+ tsv = TSV.open(filename, :key_field => "Value", :fix => Proc.new{|l| if l =~ /1/;then "a 3" else l end})
285
+ assert_equal "a", tsv["3"]
286
+ end
287
+ end
288
+
289
+ def test_select
290
+ content =<<-EOF
291
+ #: :sep=/\\s+/#:type=:single
292
+ #Id Value
293
+ a 1
294
+ b 2
295
+ EOF
296
+
297
+ TmpFile.with_file(content) do |filename|
298
+ tsv = TSV.open(filename, :key_field => "Value", :select => Proc.new{|l| ! l =~ /1/})
299
+ assert(! tsv.include?("3"))
300
+ end
301
+ end
302
+
303
+ def test_grep
304
+ content =<<-EOF
305
+ #: :sep=/\\s+/#:type=:single
306
+ #Id Value
307
+ a 1
308
+ b 2
309
+ EOF
310
+
311
+ TmpFile.with_file(content) do |filename|
312
+ tsv = TSV.open(filename, :key_field => "Value", :grep => "#\\|2")
313
+ assert(! tsv.include?("3"))
314
+ end
315
+ end
316
+
317
+ def test_json
318
+ content =<<-EOF
319
+ #: :sep=/\\s+/#:type=:single
320
+ #Id Value
321
+ a 1
322
+ b 2
323
+ EOF
324
+
325
+ require 'json'
326
+ TmpFile.with_file(content) do |filename|
327
+ tsv = TSV.open(filename, :key_field => "Value", :grep => "#\\|2")
328
+ end
329
+
330
+ end
331
+
332
+ end
@@ -0,0 +1,102 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+ require 'rbbt/workflow'
3
+ require 'rbbt/workflow/soap'
4
+ require 'rbbt/util/tmpfile'
5
+ require 'test/unit'
6
+
7
+ module TestWF
8
+ extend Workflow
9
+
10
+ str = "TEST"
11
+ task :str => :string do
12
+ str
13
+ end
14
+
15
+ dep :str
16
+ task :reverse => :string do
17
+ step(:str).load.reverse
18
+ end
19
+
20
+ dep :str
21
+ task :downcase => :string do
22
+ step(:str).load.downcase
23
+ end
24
+
25
+ dep :str
26
+ input :times, :integer, "Times to repeat"
27
+ task :repeat => :string do |times|
28
+ [step(:str).load] * times * "\n"
29
+ end
30
+
31
+ input :number, :float, "Number to doble"
32
+ def self.double(number)
33
+ 2 * number
34
+ end
35
+ task :double => :float
36
+
37
+ desc <<-EOT
38
+ Returns numer * 2 lines containing TEST
39
+ EOT
40
+ dep :str
41
+ dep :double
42
+ task :repeat2 => :string do
43
+ [step(:str).load] * step(:double).load * "\n"
44
+ end
45
+
46
+ dep :str, :repeat, :repeat2
47
+ task :double_dep => :array do
48
+ [] << step(:str).load << step(:repeat).load << step(:repeat2).load
49
+ end
50
+
51
+ export_synchronous :double
52
+ export_asynchronous :repeat2
53
+ end
54
+
55
+ TestWF.workdir = Rbbt.tmp.test.workflow
56
+
57
+ class TestWorkflow < Test::Unit::TestCase
58
+
59
+ def test_job
60
+ str = "TEST"
61
+ job = TestWF.job(:repeat2, "Default", :number => 3).fork
62
+ while not job.done?
63
+ sleep 1
64
+ end
65
+
66
+ raise job.messages.last if job.error?
67
+
68
+ assert_equal ["TEST"] * 6 * "\n", job.load
69
+ end
70
+
71
+ def test_with_subdir
72
+ str = "TEST"
73
+ job = TestWF.job(:repeat2, "Default", :number => 3).fork
74
+ while not job.done?
75
+ sleep 1
76
+ end
77
+
78
+ raise job.messages.last if job.error?
79
+
80
+ assert_equal ["TEST"] * 6 * "\n", job.load
81
+ end
82
+
83
+ def test_search
84
+ str = "TEST"
85
+ job1 = TestWF.job(:repeat2, "subdir/Default", :number => 3).fork
86
+ job2 = TestWF.job(:repeat2, "subdir/Other", :number => 3).fork
87
+ job3 = TestWF.job(:repeat2, "Default", :number => 3).fork
88
+
89
+ while not job1.done? and not job2.done? and not job3.done?
90
+ sleep 1
91
+ end
92
+
93
+ assert_equal [job1.name, job2.name].sort, TestWF.jobs(:repeat2, "subdir/").sort
94
+ assert_equal [job1.name].sort, TestWF.jobs(:repeat2, "subdir/Default")
95
+ assert_equal [job1.name, job2.name, job3.name].sort, TestWF.jobs(:repeat2).sort
96
+ end
97
+
98
+ def test_double_dep
99
+ assert_equal ["TEST", "TEST\nTEST", "TEST\nTEST\nTEST\nTEST"], TestWF.job(:double_dep, "foo", :times => 2, :number => 2).run
100
+ end
101
+
102
+ end