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
@@ -7,7 +7,7 @@ class TestR < Test::Unit::TestCase
7
7
  end
8
8
 
9
9
  def test_tsv_R
10
- tsv = TSV.new({:a => 1, :b => 2})
10
+ tsv = TSV.setup({:a => 1, :b => 2})
11
11
  tsv2 = tsv.R <<-EOF
12
12
  data = data + 1
13
13
  EOF
@@ -0,0 +1,22 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+ require 'rbbt/util/chain_methods'
3
+ require 'test/unit'
4
+
5
+ module TestChainedModule
6
+ extend ChainMethods
7
+
8
+ def test_chain_get_brackets(value)
9
+ self.test_chain_clean_get_brackets(value).reverse
10
+ end
11
+
12
+ self.chain_prefix = :test_chain
13
+ end
14
+
15
+ class TestChaimMethods < Test::Unit::TestCase
16
+ def test_chained_reverse_get
17
+ a = ["test", "TEST"]
18
+ TestChainedModule.setup_chain(a)
19
+ assert_equal "test".reverse, a[0]
20
+ assert_equal "TEST".reverse, a[1]
21
+ end
22
+ end
@@ -1,5 +1,4 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
- require 'rbbt-util'
3
2
  require 'rbbt/util/filecache'
4
3
  require 'test/unit'
5
4
 
@@ -4,53 +4,72 @@ require 'test/unit'
4
4
 
5
5
  class TestMisc < Test::Unit::TestCase
6
6
 
7
- def test_pdf2text_example
8
- assert PDF2Text.pdf2text(datafile_test('example.pdf')).read =~ /An Example Paper/i
7
+ def test_id_filename?
8
+ TmpFile.with_file("") do |file|
9
+ assert Misc.is_filename?(file)
10
+ assert ! Misc.is_filename?("TEST STRING")
11
+ end
9
12
  end
10
13
 
11
- def test_pdf2text_EPAR
12
- assert PDF2Text.pdf2text("http://www.ema.europa.eu/docs/en_GB/document_library/EPAR_-_Scientific_Discussion/human/000402/WC500033103.pdf").read =~ /Tamiflu/i
14
+ def test_merge_sorted_arrays
15
+ assert_equal [1,2,3,4], Misc.merge_sorted_arrays([1,3], [2,4])
13
16
  end
14
17
 
15
- def test_pdf2text_wrong
16
- assert_raise CMD::CMDError do PDF2Text.pdf2text("http://www.ema.europa.eu/docs/en_GB#").read end
18
+ def test_intersect_sorted_arrays
19
+ assert_equal [2,4], Misc.intersect_sorted_arrays([1,2,3,4], [2,4])
17
20
  end
21
+ def test_process_to_hash
22
+ list = [1,2,3,4]
23
+ assert_equal 4, Misc.process_to_hash(list){|l| l.collect{|e| e * 2}}[2]
24
+ end
25
+
26
+ # def test_pdf2text_example
27
+ # assert PDF2Text.pdf2text(datafile_test('example.pdf')).read =~ /An Example Paper/i
28
+ # end
29
+ #
30
+ # def test_pdf2text_EPAR
31
+ # assert PDF2Text.pdf2text("http://www.ema.europa.eu/docs/en_GB/document_library/EPAR_-_Scientific_Discussion/human/000402/WC500033103.pdf").read =~ /Tamiflu/i
32
+ # end
33
+ #
34
+ # def test_pdf2text_wrong
35
+ # assert_raise CMD::CMDError do PDF2Text.pdf2text("http://www.ema.europa.eu/docs/en_GB#").read end
36
+ # end
18
37
 
19
38
  def test_string2hash
20
39
  assert(Misc.string2hash("--user-agent=firefox").include? "--user-agent")
21
- assert(Misc.string2hash(":true")[:true] == true)
22
- assert(Misc.string2hash("true")["true"] == true)
23
- assert(Misc.string2hash("a=1")["a"] == 1)
24
- assert(Misc.string2hash("a=b")["a"] == 'b')
25
- assert(Misc.string2hash("a=b#c=d#:h=j")["c"] == 'd')
26
- assert(Misc.string2hash("a=b#c=d#:h=j")[:h] == 'j')
27
- assert(Misc.string2hash("a=b#c=d#:h=:j")[:h] == :j)
40
+ assert_equal(true, Misc.string2hash(":true")[:true])
41
+ assert_equal(true, Misc.string2hash("true")["true"])
42
+ assert_equal(1, Misc.string2hash("a=1")["a"])
43
+ assert_equal('b', Misc.string2hash("a=b")["a"])
44
+ assert_equal('d', Misc.string2hash("a=b#c=d#:h=j")["c"])
45
+ assert_equal('j', Misc.string2hash("a=b#c=d#:h=j")[:h])
46
+ assert_equal(:j, Misc.string2hash("a=b#c=d#:h=:j")[:h])
28
47
  end
29
48
 
30
49
  def test_named_array
31
- a = NamedArray.name([1,2,3,4], %w(a b c d))
50
+ a = NamedArray.setup([1,2,3,4], %w(a b c d))
32
51
  assert_equal(1, a['a'])
33
52
  end
34
53
 
35
- def test_path_relative_to
36
- assert_equal "test/foo", Misc.path_relative_to('test/test/foo', 'test')
37
- end
38
-
39
- def test_chunk
40
- test =<<-EOF
41
- This is an example file. Entries are separated by Entry
42
- -- Entry
43
- 1
44
- 2
45
- 3
46
- -- Entry
47
- 4
48
- 5
49
- 6
50
- EOF
51
-
52
- assert_equal "1\n2\n3", Misc.chunk(test, /^-- Entry/).first.strip
53
- end
54
+ # def test_path_relative_to
55
+ # assert_equal "test/foo", Misc.path_relative_to('test/test/foo', 'test')
56
+ # end
57
+
58
+ # def test_chunk
59
+ # test =<<-EOF
60
+ #This is an example file. Entries are separated by Entry
61
+ #-- Entry
62
+ #1
63
+ #2
64
+ #3
65
+ #-- Entry
66
+ #4
67
+ #5
68
+ #6
69
+ # EOF
70
+ #
71
+ # assert_equal "1\n2\n3", Misc.chunk(test, /^-- Entry/).first.strip
72
+ # end
54
73
 
55
74
  def test_hash2string
56
75
  hash = {}
@@ -71,11 +90,11 @@ This is an example file. Entries are separated by Entry
71
90
  hash = {:a => /test/}
72
91
  assert_equal({}, Misc.string2hash(Misc.hash2string(hash)))
73
92
 
74
- end
93
+ end
75
94
 
76
95
  def test_merge
77
96
  a = [[1],[2]]
78
- a = NamedArray.name a, %w(1 2)
97
+ a = NamedArray.setup a, %w(1 2)
79
98
  a.merge [3,4]
80
99
  assert_equal [1,3], a[0]
81
100
  end
@@ -112,51 +131,50 @@ This is an example file. Entries are separated by Entry
112
131
  end
113
132
  pids.each do |pid| Process.waitpid pid; assert $?.success? end
114
133
  end
115
-
116
- end
117
-
118
- def test_divide
119
- assert_equal 2, Misc.divide(%w(1 2 3 4 5 6 7 8 9),2).length
120
- end
121
-
122
- def test_process_to_hash
123
- list = [1,2,3,4]
124
- assert_equal 4, Misc.process_to_hash(list){|l| l.collect{|e| e * 2}}[2]
125
- end
126
-
127
- def test_add_method
128
- a = "Test"
129
- Misc.add_method a, :invert do self.reverse end
130
- assert_equal "Test".reverse, a.invert
131
134
  end
132
135
 
133
- def test_redefine_method
134
- a = "Test"
135
- worked = false
136
- Misc.redefine_method a, :reverse, :old_reverse do worked = true; self.old_reverse end
137
- assert_equal "Test".reverse, a.reverse
138
- assert worked
139
- end
140
-
141
- def test_merge_sorted_arrays
142
- assert_equal [1,2,3,4], Misc.merge_sorted_arrays([1,3], [2,4])
143
- end
144
-
145
- def test_intersect_sorted_arrays
146
- assert_equal [2,4], Misc.intersect_sorted_arrays([1,2,3,4], [2,4])
147
- end
148
-
149
-
150
- def test_in_dir
151
- TmpFile.with_file do |dir|
152
- FileUtils.mkdir_p dir
153
- Open.write(File.join(dir, 'test_file_in_dir'), 'test_file_in_dir')
154
- Misc.in_dir(dir) do
155
- assert Dir.glob("*").include? 'test_file_in_dir'
156
- end
157
- assert Dir.glob(File.join(dir, "*")).include?(File.join(dir, 'test_file_in_dir'))
158
- assert(! Dir.glob("*").include?('test_file_in_dir'))
159
- end
160
- end
136
+ # def test_divide
137
+ # assert_equal 2, Misc.divide(%w(1 2 3 4 5 6 7 8 9),2).length
138
+ # end
139
+ #
140
+ # def test_process_to_hash
141
+ # list = [1,2,3,4]
142
+ # assert_equal 4, Misc.process_to_hash(list){|l| l.collect{|e| e * 2}}[2]
143
+ # end
144
+
145
+ # def test_add_method
146
+ # a = "Test"
147
+ # Misc.add_method a, :invert do self.reverse end
148
+ # assert_equal "Test".reverse, a.invert
149
+ # end
150
+ #
151
+ # def test_redefine_method
152
+ # a = "Test"
153
+ # worked = false
154
+ # Misc.redefine_method a, :reverse, :old_reverse do worked = true; self.old_reverse end
155
+ # assert_equal "Test".reverse, a.reverse
156
+ # assert worked
157
+ # end
158
+ #
159
+ # def test_merge_sorted_arrays
160
+ # assert_equal [1,2,3,4], Misc.merge_sorted_arrays([1,3], [2,4])
161
+ # end
162
+ #
163
+ # def test_intersect_sorted_arrays
164
+ # assert_equal [2,4], Misc.intersect_sorted_arrays([1,2,3,4], [2,4])
165
+ # end
166
+ #
167
+ #
168
+ # def test_in_dir
169
+ # TmpFile.with_file do |dir|
170
+ # FileUtils.mkdir_p dir
171
+ # Open.write(File.join(dir, 'test_file_in_dir'), 'test_file_in_dir')
172
+ # Misc.in_dir(dir) do
173
+ # assert Dir.glob("*").include? 'test_file_in_dir'
174
+ # end
175
+ # assert Dir.glob(File.join(dir, "*")).include?(File.join(dir, 'test_file_in_dir'))
176
+ # assert(! Dir.glob("*").include?('test_file_in_dir'))
177
+ # end
178
+ # end
161
179
 
162
180
  end
@@ -70,6 +70,7 @@ class TestOpen < Test::Unit::TestCase
70
70
 
71
71
  end
72
72
 
73
+
73
74
  def test_gzip
74
75
  content =<<-EOF
75
76
  1
@@ -8,7 +8,7 @@ class TestTmpFile < Test::Unit::TestCase
8
8
  assert(TmpFile.tmp_file("test") =~ /tmp\/test\d+$/)
9
9
  end
10
10
 
11
- def _test_do_tmp_file
11
+ def test_do_tmp_file
12
12
  content = "Hello World!"
13
13
  TmpFile.with_file(content) do |file|
14
14
  assert_equal content, File.open(file).read
@@ -0,0 +1,103 @@
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 TestSOAPWF
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
+ export_synchronous :double
47
+ export_asynchronous :repeat2
48
+ end
49
+
50
+ TestSOAPWF.workdir = Rbbt.tmp.test.workflow
51
+
52
+ class TestSOAP < Test::Unit::TestCase
53
+
54
+ def setup
55
+ port= 77177
56
+ $server = WorkflowSOAP.new TestSOAPWF, "Test WF", 'localhost', port
57
+ Thread.new do
58
+ $server.start
59
+ end
60
+ Open.write(Rbbt.tmp.test.wsdl.TestWS.find(:user), $server.wsdl)
61
+
62
+ $driver = SimpleWS.get_driver('http://localhost:' + port.to_s, "TestSOAPWF")
63
+ end
64
+
65
+ def teardown
66
+ $server.shutdown
67
+ FileUtils.rm_rf(Rbbt.tmp.test.wsdl.TestWS.find(:user))
68
+ end
69
+
70
+ def test_wsdl
71
+ assert $server.wsdl =~ /jobid/
72
+ end
73
+
74
+ def test_check_status
75
+ str = "TEST"
76
+ job = TestSOAPWF.job(:repeat2, nil, :number => 3)
77
+ id = TestSOAPWF.id_for job.path
78
+ job.run
79
+ assert $driver.done id
80
+ end
81
+
82
+ def test_launch_job
83
+ str = "TEST"
84
+ id = $driver.repeat2("Default", 3)
85
+ while not $driver.done id
86
+ sleep 1
87
+ end
88
+ assert $driver.status(id) == "done"
89
+ end
90
+
91
+ def test_load_job
92
+ str = "TEST"
93
+ id = $driver.repeat2("Default", 3)
94
+ while not $driver.done id
95
+ sleep 1
96
+ end
97
+ assert_equal ["TEST"] * 6 * "\n", $driver.load_string(id)
98
+ end
99
+
100
+ def test_synchronous
101
+ assert_equal 6, $driver.double(3)
102
+ end
103
+ end
@@ -0,0 +1,142 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
2
+ require 'rbbt/workflow/task'
3
+ require 'rbbt/workflow/step'
4
+ require 'rbbt'
5
+
6
+ class TestStrp < Test::Unit::TestCase
7
+
8
+ def test_step
9
+ task = Task.setup do "TEST" end
10
+ task2 = Task.setup do raise "Persistence ignored" end
11
+ TmpFile.with_file do |tmp|
12
+ step = Step.new tmp, task
13
+ assert_equal "TEST", step.run
14
+ assert File.exists? tmp
15
+ step = Step.new tmp, task2
16
+ assert_equal "TEST", step.run
17
+ end
18
+ end
19
+
20
+ def test_dependency
21
+ str = "TEST"
22
+ str2 = "TEST2"
23
+ TmpFile.with_file do |tmpfile|
24
+
25
+ task1 = Task.setup :result_type => nil do
26
+ Open.write(tmpfile, str);
27
+ end
28
+ step1 = Step.new tmpfile + 'step1', task1
29
+
30
+ task2 = Task.setup :result_type => :string do
31
+ Open.read(tmpfile)
32
+ end
33
+ step2 = Step.new tmpfile + 'step2', task2, [], [step1]
34
+
35
+ step2.run
36
+ assert_equal "TEST", Open.read(tmpfile + 'step2')
37
+
38
+ task2 = Task.setup :result_type => :string do
39
+ str2
40
+ end
41
+ step2 = Step.new tmpfile + 'step2', task2, [], step1
42
+
43
+ step1.clean
44
+ sleep 1
45
+ step2.run
46
+ assert_equal "TEST2", Open.read(tmpfile + 'step2')
47
+ end
48
+ end
49
+
50
+ def test_exec
51
+ TmpFile.with_file do |lock|
52
+ task = Task.setup do "TEST" end
53
+ TmpFile.with_file do |tmp|
54
+ step = Step.new tmp, task
55
+ assert_equal "TEST", step.exec
56
+ end
57
+ end
58
+ end
59
+
60
+
61
+ def test_fork
62
+ TmpFile.with_file do |lock|
63
+ task = Task.setup do while not File.exists?(lock) do sleep 1; end; "TEST" end
64
+ TmpFile.with_file do |tmp|
65
+ step = Step.new tmp, task
66
+ job = step.fork
67
+ assert !job.done?
68
+ assert_raise RuntimeError do step.fork end
69
+ sleep 1
70
+ Open.write(lock, "open")
71
+ assert_equal "TEST", job.join.load
72
+ assert job.done?
73
+ end
74
+ end
75
+ end
76
+
77
+ def test_abort
78
+ TmpFile.with_file do |lock|
79
+ task = Task.setup do while not File.exists?(lock) do sleep 1; end; "TEST" end
80
+ TmpFile.with_file do |tmp|
81
+ step = Step.new tmp, task
82
+ job = step.fork
83
+ assert !job.done?
84
+ assert_raise RuntimeError do step.fork end
85
+ sleep 1
86
+ while not job.abort do sleep 1 end
87
+ Open.write(lock, "open")
88
+ job.join
89
+ assert job.error?
90
+ end
91
+ end
92
+ end
93
+
94
+ def test_files
95
+ TmpFile.with_file do |lock|
96
+ task = Task.setup do
97
+ Open.write(file("test"),"TEST")
98
+ end
99
+ TmpFile.with_file do |tmp|
100
+ step = Step.new tmp, task
101
+ job = step.fork
102
+ while not job.done? do sleep 1 end
103
+ assert_equal "TEST", Open.read(job.file("test"))
104
+ end
105
+ end
106
+ end
107
+
108
+ def test_messages
109
+ TmpFile.with_file do |lock|
110
+ task = Task.setup do
111
+ message "WRITE"
112
+ Open.write(file("test"),"TEST")
113
+ end
114
+ TmpFile.with_file do |tmp|
115
+ step = Step.new tmp, task
116
+ job = step.fork
117
+ while not job.done? do sleep 1 end
118
+ assert_equal "TEST", Open.read(job.file("test"))
119
+ assert_equal "WRITE", job.messages.last
120
+ end
121
+ end
122
+ end
123
+
124
+ def test_subdir
125
+ TmpFile.with_file do |lock|
126
+ task = Task.setup do
127
+ message "WRITE"
128
+ Open.write(file("test"),"TEST")
129
+ end
130
+
131
+ TmpFile.with_file do |tmp|
132
+ step = Step.new File.join(tmp, 'subdir1', 'subdir2'), task
133
+ job = step.fork
134
+ while not job.done? do sleep 1 end
135
+ assert_equal "TEST", Open.read(job.file("test"))
136
+ assert_equal "WRITE", job.messages.last
137
+ end
138
+ end
139
+ end
140
+
141
+
142
+ end