rbbt-util 3.2.1 → 4.0.0

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