scout-gear 7.1.0 → 7.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +29 -0
  3. data/VERSION +1 -1
  4. data/bin/scout +5 -1
  5. data/lib/rbbt-scout.rb +5 -0
  6. data/lib/scout/concurrent_stream.rb +6 -2
  7. data/lib/scout/config.rb +168 -0
  8. data/lib/scout/exceptions.rb +4 -3
  9. data/lib/scout/indiferent_hash/options.rb +1 -0
  10. data/lib/scout/indiferent_hash.rb +4 -2
  11. data/lib/scout/log/color.rb +3 -1
  12. data/lib/scout/log/progress/report.rb +1 -0
  13. data/lib/scout/log/progress/util.rb +1 -1
  14. data/lib/scout/log/progress.rb +5 -3
  15. data/lib/scout/log.rb +3 -2
  16. data/lib/scout/misc/monitor.rb +3 -0
  17. data/lib/scout/misc/system.rb +15 -0
  18. data/lib/scout/misc.rb +1 -0
  19. data/lib/scout/named_array.rb +68 -0
  20. data/lib/scout/open/stream.rb +38 -7
  21. data/lib/scout/path/find.rb +27 -3
  22. data/lib/scout/path/util.rb +7 -4
  23. data/lib/scout/persist/serialize.rb +7 -14
  24. data/lib/scout/persist.rb +21 -1
  25. data/lib/scout/resource/produce.rb +7 -94
  26. data/lib/scout/resource/software.rb +176 -0
  27. data/lib/scout/tsv/dumper.rb +107 -0
  28. data/lib/scout/tsv/index.rb +49 -0
  29. data/lib/scout/tsv/parser.rb +203 -30
  30. data/lib/scout/tsv/path.rb +13 -0
  31. data/lib/scout/tsv/persist/adapter.rb +348 -0
  32. data/lib/scout/tsv/persist/tokyocabinet.rb +113 -0
  33. data/lib/scout/tsv/persist.rb +15 -0
  34. data/lib/scout/tsv/traverse.rb +48 -0
  35. data/lib/scout/tsv/util.rb +24 -0
  36. data/lib/scout/tsv.rb +16 -3
  37. data/lib/scout/work_queue/worker.rb +3 -3
  38. data/lib/scout/work_queue.rb +22 -7
  39. data/lib/scout/workflow/definition.rb +93 -4
  40. data/lib/scout/workflow/step/config.rb +18 -0
  41. data/lib/scout/workflow/step/dependencies.rb +40 -0
  42. data/lib/scout/workflow/step/file.rb +15 -0
  43. data/lib/scout/workflow/step/info.rb +31 -4
  44. data/lib/scout/workflow/step/provenance.rb +148 -0
  45. data/lib/scout/workflow/step.rb +68 -19
  46. data/lib/scout/workflow/task.rb +3 -2
  47. data/lib/scout/workflow/usage.rb +1 -1
  48. data/lib/scout/workflow.rb +11 -3
  49. data/lib/scout-gear.rb +1 -0
  50. data/lib/scout.rb +1 -0
  51. data/scout-gear.gemspec +34 -3
  52. data/scout_commands/find +1 -1
  53. data/scout_commands/workflow/task +16 -10
  54. data/share/software/install_helpers +523 -0
  55. data/test/scout/log/test_progress.rb +0 -2
  56. data/test/scout/misc/test_system.rb +21 -0
  57. data/test/scout/open/test_stream.rb +159 -0
  58. data/test/scout/path/test_find.rb +14 -7
  59. data/test/scout/resource/test_software.rb +24 -0
  60. data/test/scout/test_config.rb +66 -0
  61. data/test/scout/test_meta_extension.rb +10 -0
  62. data/test/scout/test_named_array.rb +19 -0
  63. data/test/scout/test_persist.rb +35 -0
  64. data/test/scout/test_tmpfile.rb +2 -2
  65. data/test/scout/test_tsv.rb +41 -1
  66. data/test/scout/test_work_queue.rb +40 -13
  67. data/test/scout/tsv/persist/test_adapter.rb +34 -0
  68. data/test/scout/tsv/persist/test_tokyocabinet.rb +92 -0
  69. data/test/scout/tsv/test_dumper.rb +44 -0
  70. data/test/scout/tsv/test_index.rb +64 -0
  71. data/test/scout/tsv/test_parser.rb +86 -0
  72. data/test/scout/tsv/test_persist.rb +36 -0
  73. data/test/scout/tsv/test_traverse.rb +9 -0
  74. data/test/scout/tsv/test_util.rb +0 -0
  75. data/test/scout/work_queue/test_worker.rb +3 -3
  76. data/test/scout/workflow/step/test_dependencies.rb +25 -0
  77. data/test/scout/workflow/step/test_info.rb +15 -17
  78. data/test/scout/workflow/step/test_load.rb +16 -18
  79. data/test/scout/workflow/step/test_provenance.rb +25 -0
  80. data/test/scout/workflow/test_step.rb +206 -10
  81. data/test/scout/workflow/test_task.rb +0 -3
  82. data/test/test_helper.rb +6 -0
  83. metadata +33 -2
@@ -0,0 +1,92 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+
6
+ class TestTSVTokyo < Test::Unit::TestCase
7
+ def test_tokyo
8
+ content =<<-'EOF'
9
+ #: :sep=/\s+/#:type=:double#:merge=:concat
10
+ #Id ValueA ValueB OtherID
11
+ row1 a|aa|aaa b Id1|Id2
12
+ row2 A B Id3
13
+ row2 a a id3
14
+ EOF
15
+
16
+ tsv = TmpFile.with_file(content) do |filename|
17
+ Persist.persist(__method__, :HDB) do
18
+ TSV.open(filename)
19
+ end
20
+ end
21
+
22
+ assert_equal %w(a aa aaa), tsv["row1"][0]
23
+
24
+ tsv_loaded = assert_nothing_raised do
25
+ TmpFile.with_file(content) do |filename|
26
+ Persist.persist(__method__, :HDB) do
27
+ raise
28
+ end
29
+ end
30
+ end
31
+
32
+ assert_equal %w(a aa aaa), tsv_loaded["row1"][0]
33
+ end
34
+
35
+ def test_custom_load
36
+ tsv = TSV.setup({}, :type => :double, :key_field => "Key", :fields => %w(Field1 Field2))
37
+
38
+ size = 100_000
39
+ (0..size).each do |i|
40
+ k = "key-#{i}"
41
+ values1 = 3.times.collect{|j| "value-#{i}-1-#{j}" }
42
+ values2 = 5.times.collect{|j| "value-#{i}-2-#{j}" }
43
+
44
+ tsv[k] = [values1, values2]
45
+ end
46
+
47
+ tc = Persist.persist(__method__, :HDB) do |file|
48
+ tsv
49
+ end
50
+
51
+ 100.times do
52
+ i = rand(size).floor
53
+ assert_equal tc["key-#{i}"], tsv["key-#{i}"]
54
+ end
55
+ end
56
+
57
+ def test_speed
58
+ tsv = TSV.setup({}, :type => :double, :key_field => "Key", :fields => %w(Field1 Field2))
59
+
60
+ size = 100_000
61
+ (0..size).each do |i|
62
+ k = "key-#{i}"
63
+ values1 = 3.times.collect{|j| "value-#{i}-1-#{j}" }
64
+ values2 = 5.times.collect{|j| "value-#{i}-2-#{j}" }
65
+
66
+ tsv[k] = [values1, values2]
67
+ end
68
+
69
+ tc = Persist.persist(__method__, :HDB) do |file|
70
+ data = ScoutCabinet.open(file, true, "HDB")
71
+ TSV.setup(data, :type => :double, :key_field => "Key", :fields => %w(Field1 Field2))
72
+ data.extend TSVAdapter
73
+ Log::ProgressBar.with_bar size do |b|
74
+ (0..size).each do |i|
75
+ b.tick
76
+ k = "key-#{i}"
77
+ values1 = 3.times.collect{|j| "value-#{i}-1-#{j}" }
78
+ values2 = 5.times.collect{|j| "value-#{i}-2-#{j}" }
79
+
80
+ data[k] = [values1, values2]
81
+ end
82
+ end
83
+ data
84
+ end
85
+
86
+ 100.times do
87
+ i = rand(size).floor
88
+ assert_equal tc["key-#{i}"], tsv["key-#{i}"]
89
+ end
90
+ end
91
+ end
92
+
@@ -0,0 +1,44 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+
6
+ class TestTSVDumper < Test::Unit::TestCase
7
+ def test_dumper
8
+ dumper = TSV::Dumper.new :key_field => "Key", :fields => %w(Field1 Field2), :type => :double
9
+ dumper.init
10
+ dumper.add "a", [["1", "11"], ["2", "22"]]
11
+ txt=<<-EOF
12
+ #: :type=:double
13
+ #Key\tField1\tField2
14
+ a\t1|11\t2|22
15
+ EOF
16
+ dumper.close
17
+ assert_equal txt, dumper.stream.read
18
+ end
19
+
20
+ def test_to_s
21
+ tsv = TSV.setup({}, :key_field => "Key", :fields => %w(Field1 Field2), :type => :double)
22
+ tsv["a"] = [["1", "11"], ["2", "22"]]
23
+ txt=<<-EOF
24
+ #: :type=:double
25
+ #Key\tField1\tField2
26
+ a\t1|11\t2|22
27
+ EOF
28
+ assert_equal txt, tsv.to_s
29
+ end
30
+
31
+ def test_raise
32
+ dumper = TSV::Dumper.new :key_field => "Key", :fields => %w(Field1 Field2), :type => :double
33
+ dumper.init
34
+ t = Thread.new do
35
+ dumper.add "a", [["1", "11"], ["2", "22"]]
36
+ dumper.abort ScoutException
37
+ end
38
+
39
+ assert_raise ScoutException do
40
+ dumper.stream.read
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,64 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ class TestTSVIndex < Test::Unit::TestCase
5
+ def test_true
6
+ content =<<-'EOF'
7
+ #: :sep=/\s+/#:type=:double#:merge=:concat
8
+ #Id ValueA ValueB OtherID
9
+ row1 a|aa|aaa b Id1|Id2
10
+ row2 A B Id3|a
11
+ row2 a b id3
12
+ EOF
13
+
14
+ TmpFile.with_file(content) do |filename|
15
+ index = TSV.index(filename, :target => "ValueB")
16
+ assert_equal 'b', index["row1"]
17
+ assert_equal 'b', index["a"]
18
+ assert_equal 'b', index["aaa"]
19
+ assert_equal 'B', index["A"]
20
+ end
21
+
22
+ TmpFile.with_file(content) do |filename|
23
+ index = TSV.index(filename, :target => "ValueB", :fields => "OtherID")
24
+ assert_equal 'B', index["a"]
25
+ assert_nil index["B"]
26
+ end
27
+ end
28
+
29
+ def test_persist
30
+ content =<<-'EOF'
31
+ #: :sep=/\s+/#:type=:double#:merge=:concat
32
+ #Id ValueA ValueB OtherID
33
+ row1 a|aa|aaa b Id1|Id2
34
+ row2 A B Id3|a
35
+ row2 a b id3
36
+ EOF
37
+ tsv = TmpFile.with_file(content) do |filename|
38
+ index = TSV.index(filename, :target => "ValueB", :persist => true)
39
+ assert_equal 'b', index["row1"]
40
+ assert_equal 'b', index["a"]
41
+ assert_equal 'b', index["aaa"]
42
+ assert_equal 'B', index["A"]
43
+ end
44
+ end
45
+
46
+ def __test_speed
47
+ content =<<-'EOF'
48
+ #: :sep=/\s+/#:type=:double#:merge=:concat
49
+ #Id ValueA ValueB OtherID
50
+ row1 a|aa|aaa b Id1|Id2
51
+ row2 A B Id3|a
52
+ row2 a b id3
53
+ EOF
54
+ tsv = TmpFile.with_file(content) do |filename|
55
+ Misc.benchmark 1000 do
56
+ TSV.index(filename, :target => "ValueB")
57
+ end
58
+ Misc.benchmark 1000 do
59
+ TSV.index(filename, :target => "ValueB", order: false)
60
+ end
61
+ end
62
+ end
63
+ end
64
+
@@ -12,6 +12,15 @@ class TestTSVParser < Test::Unit::TestCase
12
12
  assert_equal (1..10).collect{|v| v.to_s }, values
13
13
  end
14
14
 
15
+ def test_parse_line_key
16
+ line = (0..10).to_a * "\t"
17
+ key, values = TSV.parse_line(line, key: 2)
18
+
19
+ assert_equal "2", key
20
+ assert_equal %w(0 1 3 4 5 6 7 8 9 10), values
21
+ end
22
+
23
+
15
24
  def test_parse_double
16
25
  line = (0..10).collect{|v| v == 0 ? v : [v,v] * "|" } * "\t"
17
26
  key, values = TSV.parse_line(line, type: :double, cast: :to_i)
@@ -84,4 +93,81 @@ k a|A b|B
84
93
  tsv = TSV.parse(header)
85
94
  assert_equal 'a', tsv['k'][0][0]
86
95
  end
96
+
97
+ def test_parse_fields
98
+ content =<<-EOF
99
+ #: :sep=" "#:type=:double
100
+ #Key ValueA ValueB
101
+ k a|A b|B
102
+ EOF
103
+ content = StringIO.new content
104
+
105
+ tsv = TSV.parse(content, fields: %w(ValueB))
106
+ assert_equal [%w(b B)], tsv['k']
107
+ assert_equal %w(ValueB), tsv.fields
108
+
109
+ content.rewind
110
+
111
+ tsv = TSV.parse(content, fields: %w(ValueB ValueA))
112
+ assert_equal [%w(b B), %w(a A)], tsv['k']
113
+ assert_equal %w(ValueB ValueA), tsv.fields
114
+
115
+ content.rewind
116
+
117
+ tsv = TSV.parse(content, fields: %w(ValueB Key))
118
+ assert_equal [%w(b B), %w(k)], tsv['k']
119
+ end
120
+
121
+ def test_parse_key
122
+ content =<<-EOF
123
+ #: :sep=" "#:type=:double
124
+ #Key ValueA ValueB
125
+ k a|A b|B
126
+ EOF
127
+ content = StringIO.new content
128
+
129
+ tsv = TSV.parse(content, key_field: "ValueB")
130
+ assert_equal %w(b B), tsv.keys
131
+ assert_equal %w(a A), tsv["B"][1]
132
+
133
+ content.rewind
134
+
135
+ tsv = TSV.parse(content, key_field: "ValueB", one2one: true, type: :double)
136
+ assert_equal %w(b B), tsv.keys
137
+ assert_equal %w(A), tsv["B"][1]
138
+
139
+ content.rewind
140
+
141
+ tsv = TSV.parse(content, key_field: "ValueB", one2one: true, type: :list)
142
+ assert_equal %w(b B), tsv.keys
143
+ assert_equal "a", tsv["b"][1]
144
+ assert_equal "A", tsv["B"][1]
145
+ assert_equal "k", tsv["b"][0]
146
+ assert_equal "k", tsv["B"][0]
147
+
148
+ content.rewind
149
+
150
+ tsv = TSV.parse(content, key_field: "ValueB", one2one: true, type: :list)
151
+ assert_equal %w(b B), tsv.keys
152
+ assert_equal "A", tsv["B"][1]
153
+ end
154
+
155
+ def test_parser_class
156
+ content =<<-EOF
157
+ Key ValueA ValueB
158
+ k a|A b|B
159
+ EOF
160
+ content = StringIO.new content
161
+
162
+ parser = TSV::Parser.new content, sep: " ", header_hash: ''
163
+
164
+ assert_equal "Key", parser.key_field
165
+
166
+ values = []
167
+ parser.traverse fields: %w(ValueB), type: :double do |k,v|
168
+ values << [k,v]
169
+ end
170
+
171
+ assert_equal [["k", [%w(b B)]]], values
172
+ end
87
173
  end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/tsv'
5
+
6
+ class TestTSVPersist < Test::Unit::TestCase
7
+ def test_persist
8
+ content =<<-'EOF'
9
+ #: :sep=/\s+/#:type=:double#:merge=:concat
10
+ #Id ValueA ValueB OtherID
11
+ row1 a|aa|aaa b Id1|Id2
12
+ row2 A B Id3
13
+ row2 a a id3
14
+ EOF
15
+
16
+
17
+ tsv = Persist.persist("TEST Persist TSV", :tsv) do
18
+ TmpFile.with_file(content) do |filename|
19
+ TSV.open(filename)
20
+ end
21
+ end
22
+
23
+ assert_include tsv.keys, 'row1'
24
+ assert_include tsv.keys, 'row2'
25
+
26
+ assert_nothing_raised do
27
+ tsv = Persist.persist("TEST Persist TSV", :tsv) do
28
+ raise
29
+ end
30
+ end
31
+
32
+ assert_include tsv.keys, 'row1'
33
+ assert_include tsv.keys, 'row2'
34
+ end
35
+ end
36
+
@@ -0,0 +1,9 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ class TestClass < Test::Unit::TestCase
5
+ def test_true
6
+ assert true
7
+ end
8
+ end
9
+
File without changes
@@ -43,7 +43,7 @@ class TestQueueWorker < Test::Unit::TestCase
43
43
  current = nil
44
44
  pid_list.each do |pid|
45
45
  if pid != current
46
- raise "Out of order" if seen.include? pid
46
+ raise "Out of order #{Log.fingerprint seen} #{ pid }" if seen.include? pid
47
47
  end
48
48
  current = pid
49
49
  seen << pid
@@ -113,7 +113,7 @@ class TestQueueWorker < Test::Unit::TestCase
113
113
  while obj = output.read
114
114
  if DoneProcessing === obj
115
115
  pid = obj.pid
116
- workers.delete_if{|w| w.pid = pid }
116
+ @worker_mutex.synchronize{ @workers.delete_if{|w| w.pid = pid } }
117
117
  break if workers.empty?
118
118
  end
119
119
  raise obj if Exception === obj
@@ -134,7 +134,7 @@ class TestQueueWorker < Test::Unit::TestCase
134
134
 
135
135
  write.join
136
136
 
137
- assert_raise ScoutException do
137
+ assert_raise WorkerException do
138
138
  read.join
139
139
  end
140
140
 
@@ -0,0 +1,25 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/named_array'
5
+ class TestStepDependencies < Test::Unit::TestCase
6
+ def test_recursive_inputs
7
+ tmpfile = tmpdir.test_step
8
+ step1 = Step.new tmpfile.step1, NamedArray.setup(["12"], %w(input1)) do |s|
9
+ s.length
10
+ end
11
+
12
+ step2 = Step.new tmpfile.step2, NamedArray.setup([2], %w(input2)) do |times|
13
+ step1 = dependencies.first
14
+ (step1.inputs.first + " has " + step1.load.to_s + " characters") * times
15
+ end
16
+
17
+ step2.dependencies = [step1]
18
+
19
+ assert_equal 2, step2.inputs["input2"]
20
+ assert_equal "12", step2.recursive_inputs["input1"]
21
+ assert_equal 2, step2.inputs[:input2]
22
+ assert_equal "12", step2.recursive_inputs[:input1]
23
+ end
24
+ end
25
+
@@ -4,27 +4,25 @@ require 'scout/workflow'
4
4
 
5
5
  class TestStepInfo < Test::Unit::TestCase
6
6
  def test_dependency
7
- sss 0 do
8
- TmpFile.with_file do |tmpdir|
9
- Path.setup(tmpdir)
10
- tmpfile = tmpdir.test_step
11
- step1 = Step.new tmpfile.step1, ["12"] do |s|
12
- s.length
13
- end
7
+ TmpFile.with_file do |tmpdir|
8
+ Path.setup(tmpdir)
9
+ tmpfile = tmpdir.test_step
10
+ step1 = Step.new tmpfile.step1, ["12"] do |s|
11
+ s.length
12
+ end
14
13
 
15
- assert_equal 2, step1.exec
16
- assert_equal 2, step1.run
14
+ assert_equal 2, step1.exec
15
+ assert_equal 2, step1.run
17
16
 
18
- step2 = Step.new tmpfile.step2 do
19
- step1 = dependencies.first
20
- step1.inputs.first + " has " + step1.load.to_s + " characters"
21
- end
17
+ step2 = Step.new tmpfile.step2 do
18
+ step1 = dependencies.first
19
+ step1.inputs.first + " has " + step1.load.to_s + " characters"
20
+ end
22
21
 
23
- step2.dependencies = [step1]
22
+ step2.dependencies = [step1]
24
23
 
25
- assert_equal "12 has 2 characters", step2.run
26
- assert_equal "12 has 2 characters", step2.run
27
- end
24
+ assert_equal "12 has 2 characters", step2.run
25
+ assert_equal "12 has 2 characters", step2.run
28
26
  end
29
27
  end
30
28
  end
@@ -5,29 +5,27 @@ require 'scout/workflow/step'
5
5
 
6
6
  class TestStepLoad < Test::Unit::TestCase
7
7
  def test_dependency
8
- sss 0 do
9
- tmpfile = tmpdir.test_step
10
- step1 = Step.new tmpfile.step1, ["12"] do |s|
11
- s.length
12
- end
8
+ tmpfile = tmpdir.test_step
9
+ step1 = Step.new tmpfile.step1, ["12"] do |s|
10
+ s.length
11
+ end
13
12
 
14
- step2 = Step.new tmpfile.step2 do
15
- step1 = dependencies.first
16
- step1.inputs.first + " has " + step1.load.to_s + " characters"
17
- end
13
+ step2 = Step.new tmpfile.step2 do
14
+ step1 = dependencies.first
15
+ step1.inputs.first + " has " + step1.load.to_s + " characters"
16
+ end
18
17
 
19
- step2.dependencies = [step1]
18
+ step2.dependencies = [step1]
20
19
 
21
- step2.recursive_clean
22
- step2.run
20
+ step2.recursive_clean
21
+ step2.run
23
22
 
24
- new_step2 = Step.load(step2.path)
23
+ new_step2 = Step.load(step2.path)
25
24
 
26
- assert_equal "12 has 2 characters", new_step2.load
27
- assert_equal "12 has 2 characters", new_step2.run
28
- assert_equal 2, new_step2.dependencies.first.run
29
- assert_equal "12", new_step2.dependencies.first.inputs.first
30
- end
25
+ assert_equal "12 has 2 characters", new_step2.load
26
+ assert_equal "12 has 2 characters", new_step2.run
27
+ assert_equal 2, new_step2.dependencies.first.run
28
+ assert_equal "12", new_step2.dependencies.first.inputs.first
31
29
  end
32
30
 
33
31
  def test_relocate
@@ -0,0 +1,25 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/workflow'
5
+ class TestStepProvenance < Test::Unit::TestCase
6
+ def test_true
7
+ tmpfile = tmpdir.test_step
8
+ step1 = Step.new tmpfile.step1, ["12"] do |s|
9
+ s.length
10
+ end
11
+
12
+ step2 = Step.new tmpfile.step2 do
13
+ step1 = dependencies.first
14
+ step1.inputs.first + " has " + step1.load.to_s + " characters"
15
+ end
16
+
17
+ step2.dependencies = [step1]
18
+
19
+ step2.run
20
+
21
+ assert_include Step.prov_report(step2), 'step1'
22
+ assert_include Step.prov_report(step2), 'step2'
23
+ end
24
+ end
25
+