rake 11.1.2 → 11.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rake might be problematic. Click here for more details.

Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rubocop.yml +0 -9
  4. data/.travis.yml +28 -0
  5. data/CONTRIBUTING.rdoc +3 -5
  6. data/Gemfile +3 -0
  7. data/History.rdoc +1770 -273
  8. data/Rakefile +15 -68
  9. data/appveyor.yml +24 -0
  10. data/bin/console +7 -0
  11. data/bin/setup +6 -0
  12. data/doc/release_notes/README.md +4 -0
  13. data/doc/release_notes/rake-0.7.3.rdoc +0 -0
  14. data/{bin → exe}/rake +0 -6
  15. data/lib/rake.rb +1 -3
  16. data/lib/rake/application.rb +3 -6
  17. data/lib/rake/cpu_counter.rb +3 -17
  18. data/lib/rake/file_utils.rb +22 -6
  19. data/lib/rake/packagetask.rb +12 -1
  20. data/lib/rake/rake_test_loader.rb +0 -1
  21. data/lib/rake/rule_recursion_overflow_error.rb +0 -1
  22. data/lib/rake/task.rb +3 -3
  23. data/lib/rake/task_arguments.rb +2 -1
  24. data/lib/rake/testtask.rb +5 -1
  25. data/lib/rake/thread_pool.rb +0 -1
  26. data/lib/rake/version.rb +2 -0
  27. data/rake.gemspec +30 -0
  28. metadata +21 -110
  29. data/.autotest +0 -7
  30. data/.togglerc +0 -7
  31. data/Manifest.txt +0 -154
  32. data/lib/rake/contrib/.document +0 -1
  33. data/rakelib/test_times.rake +0 -25
  34. data/test/file_creation.rb +0 -34
  35. data/test/helper.rb +0 -134
  36. data/test/support/rakefile_definitions.rb +0 -476
  37. data/test/support/ruby_runner.rb +0 -34
  38. data/test/test_private_reader.rb +0 -42
  39. data/test/test_rake.rb +0 -40
  40. data/test/test_rake_application.rb +0 -659
  41. data/test/test_rake_application_options.rb +0 -468
  42. data/test/test_rake_backtrace.rb +0 -119
  43. data/test/test_rake_clean.rb +0 -61
  44. data/test/test_rake_cpu_counter.rb +0 -68
  45. data/test/test_rake_definitions.rb +0 -84
  46. data/test/test_rake_directory_task.rb +0 -76
  47. data/test/test_rake_dsl.rb +0 -40
  48. data/test/test_rake_early_time.rb +0 -31
  49. data/test/test_rake_extension.rb +0 -59
  50. data/test/test_rake_file_creation_task.rb +0 -56
  51. data/test/test_rake_file_list.rb +0 -687
  52. data/test/test_rake_file_list_path_map.rb +0 -15
  53. data/test/test_rake_file_task.rb +0 -197
  54. data/test/test_rake_file_utils.rb +0 -318
  55. data/test/test_rake_ftp_file.rb +0 -74
  56. data/test/test_rake_functional.rb +0 -484
  57. data/test/test_rake_invocation_chain.rb +0 -64
  58. data/test/test_rake_late_time.rb +0 -18
  59. data/test/test_rake_linked_list.rb +0 -84
  60. data/test/test_rake_makefile_loader.rb +0 -46
  61. data/test/test_rake_multi_task.rb +0 -64
  62. data/test/test_rake_name_space.rb +0 -57
  63. data/test/test_rake_package_task.rb +0 -79
  64. data/test/test_rake_path_map.rb +0 -168
  65. data/test/test_rake_path_map_explode.rb +0 -34
  66. data/test/test_rake_path_map_partial.rb +0 -18
  67. data/test/test_rake_pathname_extensions.rb +0 -15
  68. data/test/test_rake_pseudo_status.rb +0 -21
  69. data/test/test_rake_rake_test_loader.rb +0 -20
  70. data/test/test_rake_reduce_compat.rb +0 -26
  71. data/test/test_rake_require.rb +0 -40
  72. data/test/test_rake_rules.rb +0 -388
  73. data/test/test_rake_scope.rb +0 -44
  74. data/test/test_rake_task.rb +0 -430
  75. data/test/test_rake_task_argument_parsing.rb +0 -119
  76. data/test/test_rake_task_arguments.rb +0 -134
  77. data/test/test_rake_task_manager.rb +0 -178
  78. data/test/test_rake_task_manager_argument_resolution.rb +0 -19
  79. data/test/test_rake_task_with_arguments.rb +0 -172
  80. data/test/test_rake_test_task.rb +0 -130
  81. data/test/test_rake_thread_pool.rb +0 -145
  82. data/test/test_rake_top_level_functions.rb +0 -71
  83. data/test/test_rake_win32.rb +0 -72
  84. data/test/test_thread_history_display.rb +0 -101
  85. data/test/test_trace_output.rb +0 -52
@@ -1,34 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
-
3
- class TestRakePathMapExplode < Rake::TestCase
4
- def setup
5
- super
6
-
7
- String.class_eval { public :pathmap_explode }
8
- end
9
-
10
- def teardown
11
- String.class_eval { protected :pathmap_explode }
12
-
13
- super
14
- end
15
-
16
- def test_explode
17
- assert_equal ['a'], 'a'.pathmap_explode
18
- assert_equal ['a', 'b'], 'a/b'.pathmap_explode
19
- assert_equal ['a', 'b', 'c'], 'a/b/c'.pathmap_explode
20
- assert_equal ['/', 'a'], '/a'.pathmap_explode
21
- assert_equal ['/', 'a', 'b'], '/a/b'.pathmap_explode
22
- assert_equal ['/', 'a', 'b', 'c'], '/a/b/c'.pathmap_explode
23
-
24
- if File::ALT_SEPARATOR
25
- assert_equal ['c:.', 'a'], 'c:a'.pathmap_explode
26
- assert_equal ['c:.', 'a', 'b'], 'c:a/b'.pathmap_explode
27
- assert_equal ['c:.', 'a', 'b', 'c'], 'c:a/b/c'.pathmap_explode
28
- assert_equal ['c:/', 'a'], 'c:/a'.pathmap_explode
29
- assert_equal ['c:/', 'a', 'b'], 'c:/a/b'.pathmap_explode
30
- assert_equal ['c:/', 'a', 'b', 'c'], 'c:/a/b/c'.pathmap_explode
31
- end
32
- end
33
- end
34
-
@@ -1,18 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
-
3
- class TestRakePathMapPartial < Rake::TestCase
4
- def test_pathmap_partial
5
- @path = "1/2/file"
6
- def @path.call(n)
7
- pathmap_partial(n)
8
- end
9
- assert_equal("1", @path.call(1))
10
- assert_equal("1/2", @path.call(2))
11
- assert_equal("1/2", @path.call(3))
12
- assert_equal(".", @path.call(0))
13
- assert_equal("2", @path.call(-1))
14
- assert_equal("1/2", @path.call(-2))
15
- assert_equal("1/2", @path.call(-3))
16
- end
17
- end
18
-
@@ -1,15 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
- require 'rake/ext/pathname'
3
-
4
- class TestRakePathnameExtensions < Rake::TestCase
5
- def test_ext_works_on_pathnames
6
- pathname = Pathname.new("abc.foo")
7
- assert_equal Pathname.new("abc.bar"), pathname.ext("bar")
8
- end
9
-
10
- def test_path_map_works_on_pathnames
11
- pathname = Pathname.new("this/is/a/dir/abc.rb")
12
- assert_equal Pathname.new("abc.rb"), pathname.pathmap("%f")
13
- assert_equal Pathname.new("this/is/a/dir"), pathname.pathmap("%d")
14
- end
15
- end
@@ -1,21 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
-
3
- class TestRakePseudoStatus < Rake::TestCase
4
- def test_with_zero_exit_status
5
- s = Rake::PseudoStatus.new
6
- assert_equal 0, s.exitstatus
7
- assert_equal 0, s.to_i
8
- assert_equal 0, s >> 8
9
- refute s.stopped?
10
- assert s.exited?
11
- end
12
-
13
- def test_with_99_exit_status
14
- s = Rake::PseudoStatus.new(99)
15
- assert_equal 99, s.exitstatus
16
- assert_equal 25344, s.to_i
17
- assert_equal 99, s >> 8
18
- refute s.stopped?
19
- assert s.exited?
20
- end
21
- end
@@ -1,20 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
-
3
- class TestRakeRakeTestLoader < Rake::TestCase
4
-
5
- def test_pattern
6
- orig_loaded_features = $:.dup
7
- FileUtils.touch 'foo.rb'
8
- FileUtils.touch 'test_a.rb'
9
- FileUtils.touch 'test_b.rb'
10
-
11
- ARGV.replace %w[foo.rb test_*.rb -v]
12
-
13
- load File.join(@rake_lib, 'rake/rake_test_loader.rb')
14
-
15
- assert_equal %w[-v], ARGV
16
- ensure
17
- $:.replace orig_loaded_features
18
- end
19
-
20
- end
@@ -1,26 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
- require 'open3'
3
-
4
- class TestRakeReduceCompat < Rake::TestCase
5
- include RubyRunner
6
-
7
- def invoke_normal(task_name)
8
- rake task_name.to_s
9
- @out
10
- end
11
-
12
- def test_no_deprecated_dsl
13
- rakefile %q{
14
- task :check_task do
15
- Module.new { p defined?(task) }
16
- end
17
-
18
- task :check_file do
19
- Module.new { p defined?(file) }
20
- end
21
- }
22
-
23
- assert_equal "nil", invoke_normal(:check_task).chomp
24
- assert_equal "nil", invoke_normal(:check_file).chomp
25
- end
26
- end
@@ -1,40 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
-
3
- class TestRakeRequire < Rake::TestCase
4
-
5
- def test_can_load_rake_library
6
- rakefile_rakelib
7
- app = Rake::Application.new
8
-
9
- assert app.instance_eval {
10
- rake_require("test2", ['rakelib'], [])
11
- }
12
- end
13
-
14
- def test_wont_reload_rake_library
15
- rakefile_rakelib
16
- app = Rake::Application.new
17
-
18
- paths = ['rakelib']
19
- loaded_files = []
20
- app.rake_require("test2", paths, loaded_files)
21
-
22
- assert ! app.instance_eval {
23
- rake_require("test2", paths, loaded_files)
24
- }
25
- end
26
-
27
- def test_throws_error_if_library_not_found
28
- rakefile_rakelib
29
-
30
- app = Rake::Application.new
31
- ex = assert_raises(LoadError) {
32
- assert app.instance_eval {
33
- rake_require("testx", ['rakelib'], [])
34
- }
35
- }
36
- assert_match(/(can *not|can't)\s+find/i, ex.message)
37
- assert_match(/testx/, ex.message)
38
- end
39
- end
40
-
@@ -1,388 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
- require 'fileutils'
3
-
4
- class TestRakeRules < Rake::TestCase
5
- include Rake
6
-
7
- SRCFILE = "abc.c"
8
- SRCFILE2 = "xyz.c"
9
- FTNFILE = "abc.f"
10
- OBJFILE = "abc.o"
11
- FOOFILE = "foo"
12
- DOTFOOFILE = ".foo"
13
-
14
- def setup
15
- super
16
-
17
- Task.clear
18
- @runs = []
19
- end
20
-
21
- def test_multiple_rules1
22
- create_file(FTNFILE)
23
- delete_file(SRCFILE)
24
- delete_file(OBJFILE)
25
- rule(/\.o$/ => ['.c']) do @runs << :C end
26
- rule(/\.o$/ => ['.f']) do @runs << :F end
27
- t = Task[OBJFILE]
28
- t.invoke
29
- Task[OBJFILE].invoke
30
- assert_equal [:F], @runs
31
- end
32
-
33
- def test_multiple_rules2
34
- create_file(FTNFILE)
35
- delete_file(SRCFILE)
36
- delete_file(OBJFILE)
37
- rule(/\.o$/ => ['.f']) do @runs << :F end
38
- rule(/\.o$/ => ['.c']) do @runs << :C end
39
- Task[OBJFILE].invoke
40
- assert_equal [:F], @runs
41
- end
42
-
43
- def test_create_with_source
44
- create_file(SRCFILE)
45
- rule(/\.o$/ => ['.c']) do |t|
46
- @runs << t.name
47
- assert_equal OBJFILE, t.name
48
- assert_equal SRCFILE, t.source
49
- end
50
- Task[OBJFILE].invoke
51
- assert_equal [OBJFILE], @runs
52
- end
53
-
54
- def test_single_dependent
55
- create_file(SRCFILE)
56
- rule(/\.o$/ => '.c') do |t|
57
- @runs << t.name
58
- end
59
- Task[OBJFILE].invoke
60
- assert_equal [OBJFILE], @runs
61
- end
62
-
63
- def test_rule_can_be_created_by_string
64
- create_file(SRCFILE)
65
- rule '.o' => ['.c'] do |t|
66
- @runs << t.name
67
- end
68
- Task[OBJFILE].invoke
69
- assert_equal [OBJFILE], @runs
70
- end
71
-
72
- def test_rule_prereqs_can_be_created_by_string
73
- create_file(SRCFILE)
74
- rule '.o' => '.c' do |t|
75
- @runs << t.name
76
- end
77
- Task[OBJFILE].invoke
78
- assert_equal [OBJFILE], @runs
79
- end
80
-
81
- def test_plain_strings_as_dependents_refer_to_files
82
- create_file(SRCFILE)
83
- rule '.o' => SRCFILE do |t|
84
- @runs << t.name
85
- end
86
- Task[OBJFILE].invoke
87
- assert_equal [OBJFILE], @runs
88
- end
89
-
90
- def test_file_names_beginning_with_dot_can_be_tricked_into_referring_to_file
91
- verbose(false) do
92
- create_file('.foo')
93
- rule '.o' => "./.foo" do |t|
94
- @runs << t.name
95
- end
96
- Task[OBJFILE].invoke
97
- assert_equal [OBJFILE], @runs
98
- end
99
- end
100
-
101
- def test_file_names_beginning_with_dot_can_be_wrapped_in_lambda
102
- verbose(false) do
103
-
104
- create_file(".foo")
105
- rule '.o' => lambda { ".foo" } do |t|
106
- @runs << "#{t.name} - #{t.source}"
107
- end
108
- Task[OBJFILE].invoke
109
- assert_equal ["#{OBJFILE} - .foo"], @runs
110
- end
111
- end
112
-
113
- def test_file_names_containing_percent_can_be_wrapped_in_lambda
114
- verbose(false) do
115
- create_file("foo%x")
116
- rule '.o' => lambda { "foo%x" } do |t|
117
- @runs << "#{t.name} - #{t.source}"
118
- end
119
- Task[OBJFILE].invoke
120
- assert_equal ["#{OBJFILE} - foo%x"], @runs
121
- end
122
- end
123
-
124
- def test_non_extension_rule_name_refers_to_file
125
- verbose(false) do
126
- create_file("abc.c")
127
- rule "abc" => '.c' do |t|
128
- @runs << t.name
129
- end
130
- Task["abc"].invoke
131
- assert_equal ["abc"], @runs
132
- end
133
- end
134
-
135
- def test_pathmap_automatically_applies_to_name
136
- verbose(false) do
137
- create_file("zzabc.c")
138
- rule ".o" => 'zz%{x,a}n.c' do |t|
139
- @runs << "#{t.name} - #{t.source}"
140
- end
141
- Task["xbc.o"].invoke
142
- assert_equal ["xbc.o - zzabc.c"], @runs
143
- end
144
- end
145
-
146
- def test_plain_strings_are_just_filenames
147
- verbose(false) do
148
- create_file("plainname")
149
- rule ".o" => 'plainname' do |t|
150
- @runs << "#{t.name} - #{t.source}"
151
- end
152
- Task["xbc.o"].invoke
153
- assert_equal ["xbc.o - plainname"], @runs
154
- end
155
- end
156
-
157
- def test_rule_runs_when_explicit_task_has_no_actions
158
- create_file(SRCFILE)
159
- create_file(SRCFILE2)
160
- delete_file(OBJFILE)
161
- rule '.o' => '.c' do |t|
162
- @runs << t.source
163
- end
164
- file OBJFILE => [SRCFILE2]
165
- Task[OBJFILE].invoke
166
- assert_equal [SRCFILE], @runs
167
- end
168
-
169
- def test_close_matches_on_name_do_not_trigger_rule
170
- create_file("x.c")
171
- rule '.o' => ['.c'] do |t|
172
- @runs << t.name
173
- end
174
- assert_raises(RuntimeError) { Task['x.obj'].invoke }
175
- assert_raises(RuntimeError) { Task['x.xyo'].invoke }
176
- end
177
-
178
- def test_rule_rebuilds_obj_when_source_is_newer
179
- create_timed_files(OBJFILE, SRCFILE)
180
- rule(/\.o$/ => ['.c']) do
181
- @runs << :RULE
182
- end
183
- Task[OBJFILE].invoke
184
- assert_equal [:RULE], @runs
185
- end
186
-
187
- def test_rule_with_two_sources_runs_if_both_sources_are_present
188
- create_timed_files(OBJFILE, SRCFILE, SRCFILE2)
189
- rule OBJFILE => [lambda { SRCFILE }, lambda { SRCFILE2 }] do
190
- @runs << :RULE
191
- end
192
- Task[OBJFILE].invoke
193
- assert_equal [:RULE], @runs
194
- end
195
-
196
- def test_rule_with_two_sources_but_one_missing_does_not_run
197
- create_timed_files(OBJFILE, SRCFILE)
198
- delete_file(SRCFILE2)
199
- rule OBJFILE => [lambda { SRCFILE }, lambda { SRCFILE2 }] do
200
- @runs << :RULE
201
- end
202
- Task[OBJFILE].invoke
203
- assert_equal [], @runs
204
- end
205
-
206
- def test_rule_with_two_sources_builds_both_sources
207
- task 'x.aa'
208
- task 'x.bb'
209
- rule '.a' => '.aa' do
210
- @runs << "A"
211
- end
212
- rule '.b' => '.bb' do
213
- @runs << "B"
214
- end
215
- rule ".c" => ['.a', '.b'] do
216
- @runs << "C"
217
- end
218
- Task["x.c"].invoke
219
- assert_equal ["A", "B", "C"], @runs.sort
220
- end
221
-
222
- def test_second_rule_runs_when_first_rule_doesnt
223
- create_timed_files(OBJFILE, SRCFILE)
224
- delete_file(SRCFILE2)
225
- rule OBJFILE => [lambda { SRCFILE }, lambda { SRCFILE2 }] do
226
- @runs << :RULE1
227
- end
228
- rule OBJFILE => [lambda { SRCFILE }] do
229
- @runs << :RULE2
230
- end
231
- Task[OBJFILE].invoke
232
- assert_equal [:RULE2], @runs
233
- end
234
-
235
- def test_second_rule_doest_run_if_first_triggers
236
- create_timed_files(OBJFILE, SRCFILE, SRCFILE2)
237
- rule OBJFILE => [lambda { SRCFILE }, lambda { SRCFILE2 }] do
238
- @runs << :RULE1
239
- end
240
- rule OBJFILE => [lambda { SRCFILE }] do
241
- @runs << :RULE2
242
- end
243
- Task[OBJFILE].invoke
244
- assert_equal [:RULE1], @runs
245
- end
246
-
247
- def test_second_rule_doest_run_if_first_triggers_with_reversed_rules
248
- create_timed_files(OBJFILE, SRCFILE, SRCFILE2)
249
- rule OBJFILE => [lambda { SRCFILE }] do
250
- @runs << :RULE1
251
- end
252
- rule OBJFILE => [lambda { SRCFILE }, lambda { SRCFILE2 }] do
253
- @runs << :RULE2
254
- end
255
- Task[OBJFILE].invoke
256
- assert_equal [:RULE1], @runs
257
- end
258
-
259
- def test_rule_with_proc_dependent_will_trigger
260
- mkdir_p("src/jw")
261
- create_file("src/jw/X.java")
262
- rule %r(classes/.*\.class) => [
263
- proc { |fn| fn.pathmap("%{classes,src}d/%n.java") }
264
- ] do |task|
265
- assert_equal task.name, 'classes/jw/X.class'
266
- assert_equal task.source, 'src/jw/X.java'
267
- @runs << :RULE
268
- end
269
- Task['classes/jw/X.class'].invoke
270
- assert_equal [:RULE], @runs
271
- ensure
272
- rm_r("src", :verbose=>false) rescue nil
273
- end
274
-
275
- def test_proc_returning_lists_are_flattened_into_prereqs
276
- ran = false
277
- mkdir_p("flatten")
278
- create_file("flatten/a.txt")
279
- task 'flatten/b.data' do |t|
280
- ran = true
281
- touch t.name, :verbose => false
282
- end
283
- rule '.html' =>
284
- proc { |fn|
285
- [
286
- fn.ext("txt"),
287
- "flatten/b.data"
288
- ]
289
- } do |task|
290
- end
291
- Task['flatten/a.html'].invoke
292
- assert ran, "Should have triggered flattened dependency"
293
- ensure
294
- rm_r("flatten", :verbose=>false) rescue nil
295
- end
296
-
297
- def test_recursive_rules_will_work_as_long_as_they_terminate
298
- actions = []
299
- create_file("abc.xml")
300
- rule '.y' => '.xml' do actions << 'y' end
301
- rule '.c' => '.y' do actions << 'c'end
302
- rule '.o' => '.c' do actions << 'o'end
303
- rule '.exe' => '.o' do actions << 'exe'end
304
- Task["abc.exe"].invoke
305
- assert_equal ['y', 'c', 'o', 'exe'], actions
306
- end
307
-
308
- def test_recursive_rules_that_dont_terminate_will_overflow
309
- create_file("a.a")
310
- prev = 'a'
311
- ('b'..'z').each do |letter|
312
- rule ".#{letter}" => ".#{prev}" do |t| puts "#{t.name}" end
313
- prev = letter
314
- end
315
- ex = assert_raises(Rake::RuleRecursionOverflowError) {
316
- Task["a.z"].invoke
317
- }
318
- assert_match(/a\.z => a.y/, ex.message)
319
- end
320
-
321
- def test_rules_with_bad_dependents_will_fail
322
- rule "a" => [1] do |t| puts t.name end
323
- assert_raises(RuntimeError) do Task['a'].invoke end
324
- end
325
-
326
- def test_string_rule_with_args
327
- delete_file(OBJFILE)
328
- create_file(SRCFILE)
329
- rule '.o', [:a] => SRCFILE do |t, args|
330
- assert_equal 'arg', args.a
331
- end
332
- Task[OBJFILE].invoke('arg')
333
- end
334
-
335
- def test_regex_rule_with_args
336
- delete_file(OBJFILE)
337
- create_file(SRCFILE)
338
- rule(/.o$/, [:a] => SRCFILE) do |t, args|
339
- assert_equal 'arg', args.a
340
- end
341
- Task[OBJFILE].invoke('arg')
342
- end
343
-
344
- def test_string_rule_with_args_and_lambda_prereq
345
- delete_file(OBJFILE)
346
- create_file(SRCFILE)
347
- rule '.o', [:a] => [lambda{SRCFILE}]do |t, args|
348
- assert_equal 'arg', args.a
349
- end
350
- Task[OBJFILE].invoke('arg')
351
- end
352
-
353
- def test_regex_rule_with_args_and_lambda_prereq
354
- delete_file(OBJFILE)
355
- create_file(SRCFILE)
356
- rule(/.o$/, [:a] => [lambda{SRCFILE}]) do |t, args|
357
- assert_equal 'arg', args.a
358
- end
359
- Task[OBJFILE].invoke('arg')
360
- end
361
-
362
- def test_rule_with_method_prereq
363
- create_file(".foo")
364
- obj = Object.new
365
- def obj.find_prereq
366
- ".foo"
367
- end
368
- rule '.o' => obj.method(:find_prereq) do |t|
369
- @runs << "#{t.name} - #{t.source}"
370
- end
371
- Task[OBJFILE].invoke
372
- assert_equal ["#{OBJFILE} - .foo"], @runs
373
- end
374
-
375
- def test_rule_with_one_arg_method_prereq
376
- create_file(SRCFILE)
377
- obj = Object.new
378
- def obj.find_prereq(task_name)
379
- task_name.ext(".c")
380
- end
381
- rule '.o' => obj.method(:find_prereq) do |t|
382
- @runs << "#{t.name} - #{t.source}"
383
- end
384
- Task[OBJFILE].invoke
385
- assert_equal ["#{OBJFILE} - abc.c"], @runs
386
- end
387
-
388
- end