vergissberlin 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +10 -1
  3. data/bin/vergissberlin +1 -1
  4. data/lib/vergissberlin/version.rb +1 -1
  5. data/test/test_test.rb +7 -0
  6. data/test/utils.rb +37 -0
  7. data/vendor/bundle/bin/rake +23 -0
  8. data/vendor/bundle/bin/vergissberlin +23 -0
  9. data/vendor/bundle/build_info/capistrano_colors-0.5.5.info +1 -0
  10. data/vendor/bundle/build_info/rake-10.0.4.info +1 -0
  11. data/vendor/bundle/gems/capistrano_colors-0.5.5/Manifest +7 -0
  12. data/vendor/bundle/gems/capistrano_colors-0.5.5/README.rdoc +130 -0
  13. data/vendor/bundle/gems/capistrano_colors-0.5.5/Rakefile +1 -0
  14. data/vendor/bundle/gems/capistrano_colors-0.5.5/capistrano_colors.gemspec +33 -0
  15. data/vendor/bundle/gems/capistrano_colors-0.5.5/lib/capistrano_colors/configuration.rb +70 -0
  16. data/vendor/bundle/gems/capistrano_colors-0.5.5/lib/capistrano_colors/logger.rb +72 -0
  17. data/vendor/bundle/gems/capistrano_colors-0.5.5/lib/capistrano_colors.rb +18 -0
  18. data/vendor/bundle/gems/rake-10.0.4/CHANGES +530 -0
  19. data/vendor/bundle/gems/rake-10.0.4/MIT-LICENSE +21 -0
  20. data/vendor/bundle/gems/rake-10.0.4/README.rdoc +187 -0
  21. data/vendor/bundle/gems/rake-10.0.4/Rakefile +375 -0
  22. data/vendor/bundle/gems/rake-10.0.4/TODO +21 -0
  23. data/vendor/bundle/gems/rake-10.0.4/bin/rake +33 -0
  24. data/vendor/bundle/gems/rake-10.0.4/install.rb +90 -0
  25. data/vendor/bundle/gems/rake-10.0.4/lib/rake/alt_system.rb +109 -0
  26. data/vendor/bundle/gems/rake-10.0.4/lib/rake/application.rb +681 -0
  27. data/vendor/bundle/gems/rake-10.0.4/lib/rake/backtrace.rb +19 -0
  28. data/vendor/bundle/gems/rake-10.0.4/lib/rake/clean.rb +32 -0
  29. data/vendor/bundle/gems/rake-10.0.4/lib/rake/cloneable.rb +16 -0
  30. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/compositepublisher.rb +21 -0
  31. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/ftptools.rb +151 -0
  32. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/publisher.rb +73 -0
  33. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/rubyforgepublisher.rb +16 -0
  34. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/sshpublisher.rb +50 -0
  35. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/sys.rb +1 -0
  36. data/vendor/bundle/gems/rake-10.0.4/lib/rake/default_loader.rb +10 -0
  37. data/vendor/bundle/gems/rake-10.0.4/lib/rake/dsl_definition.rb +156 -0
  38. data/vendor/bundle/gems/rake-10.0.4/lib/rake/early_time.rb +18 -0
  39. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ext/core.rb +27 -0
  40. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ext/module.rb +0 -0
  41. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ext/string.rb +168 -0
  42. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ext/time.rb +15 -0
  43. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_creation_task.rb +24 -0
  44. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_list.rb +410 -0
  45. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_task.rb +47 -0
  46. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_utils.rb +114 -0
  47. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_utils_ext.rb +143 -0
  48. data/vendor/bundle/gems/rake-10.0.4/lib/rake/gempackagetask.rb +1 -0
  49. data/vendor/bundle/gems/rake-10.0.4/lib/rake/invocation_chain.rb +51 -0
  50. data/vendor/bundle/gems/rake-10.0.4/lib/rake/invocation_exception_mixin.rb +16 -0
  51. data/vendor/bundle/gems/rake-10.0.4/lib/rake/loaders/makefile.rb +40 -0
  52. data/vendor/bundle/gems/rake-10.0.4/lib/rake/multi_task.rb +13 -0
  53. data/vendor/bundle/gems/rake-10.0.4/lib/rake/name_space.rb +25 -0
  54. data/vendor/bundle/gems/rake-10.0.4/lib/rake/packagetask.rb +185 -0
  55. data/vendor/bundle/gems/rake-10.0.4/lib/rake/pathmap.rb +1 -0
  56. data/vendor/bundle/gems/rake-10.0.4/lib/rake/phony.rb +15 -0
  57. data/vendor/bundle/gems/rake-10.0.4/lib/rake/private_reader.rb +20 -0
  58. data/vendor/bundle/gems/rake-10.0.4/lib/rake/promise.rb +99 -0
  59. data/vendor/bundle/gems/rake-10.0.4/lib/rake/pseudo_status.rb +24 -0
  60. data/vendor/bundle/gems/rake-10.0.4/lib/rake/rake_module.rb +37 -0
  61. data/vendor/bundle/gems/rake-10.0.4/lib/rake/rake_test_loader.rb +22 -0
  62. data/vendor/bundle/gems/rake-10.0.4/lib/rake/rdoctask.rb +1 -0
  63. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ruby182_test_unit_fix.rb +25 -0
  64. data/vendor/bundle/gems/rake-10.0.4/lib/rake/rule_recursion_overflow_error.rb +20 -0
  65. data/vendor/bundle/gems/rake-10.0.4/lib/rake/runtest.rb +22 -0
  66. data/vendor/bundle/gems/rake-10.0.4/lib/rake/task.rb +368 -0
  67. data/vendor/bundle/gems/rake-10.0.4/lib/rake/task_argument_error.rb +7 -0
  68. data/vendor/bundle/gems/rake-10.0.4/lib/rake/task_arguments.rb +78 -0
  69. data/vendor/bundle/gems/rake-10.0.4/lib/rake/task_manager.rb +296 -0
  70. data/vendor/bundle/gems/rake-10.0.4/lib/rake/tasklib.rb +22 -0
  71. data/vendor/bundle/gems/rake-10.0.4/lib/rake/testtask.rb +198 -0
  72. data/vendor/bundle/gems/rake-10.0.4/lib/rake/thread_history_display.rb +48 -0
  73. data/vendor/bundle/gems/rake-10.0.4/lib/rake/thread_pool.rb +155 -0
  74. data/vendor/bundle/gems/rake-10.0.4/lib/rake/trace_output.rb +22 -0
  75. data/vendor/bundle/gems/rake-10.0.4/lib/rake/version.rb +13 -0
  76. data/vendor/bundle/gems/rake-10.0.4/lib/rake/win32.rb +55 -0
  77. data/vendor/bundle/gems/rake-10.0.4/lib/rake.rb +71 -0
  78. data/vendor/bundle/gems/rake-10.0.4/test/file_creation.rb +34 -0
  79. data/vendor/bundle/gems/rake-10.0.4/test/helper.rb +562 -0
  80. data/vendor/bundle/gems/rake-10.0.4/test/test_private_reader.rb +42 -0
  81. data/vendor/bundle/gems/rake-10.0.4/test/test_rake.rb +40 -0
  82. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_application.rb +515 -0
  83. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_application_options.rb +455 -0
  84. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_backtrace.rb +89 -0
  85. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_clean.rb +14 -0
  86. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_definitions.rb +80 -0
  87. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_directory_task.rb +57 -0
  88. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_dsl.rb +40 -0
  89. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_early_time.rb +31 -0
  90. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_extension.rb +59 -0
  91. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_creation_task.rb +56 -0
  92. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_list.rb +628 -0
  93. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_list_path_map.rb +8 -0
  94. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_task.rb +122 -0
  95. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_utils.rb +305 -0
  96. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_ftp_file.rb +59 -0
  97. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_functional.rb +496 -0
  98. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_invocation_chain.rb +52 -0
  99. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_makefile_loader.rb +44 -0
  100. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_multi_task.rb +59 -0
  101. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_name_space.rb +43 -0
  102. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_package_task.rb +79 -0
  103. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_path_map.rb +157 -0
  104. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_path_map_explode.rb +34 -0
  105. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_path_map_partial.rb +18 -0
  106. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_pseudo_status.rb +21 -0
  107. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_rake_test_loader.rb +21 -0
  108. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_reduce_compat.rb +30 -0
  109. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_require.rb +40 -0
  110. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_rules.rb +327 -0
  111. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task.rb +340 -0
  112. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_argument_parsing.rb +103 -0
  113. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_arguments.rb +88 -0
  114. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_lib.rb +9 -0
  115. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_manager.rb +157 -0
  116. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_manager_argument_resolution.rb +19 -0
  117. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_with_arguments.rb +171 -0
  118. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_test_task.rb +120 -0
  119. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_thread_pool.rb +122 -0
  120. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_top_level_functions.rb +71 -0
  121. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_win32.rb +72 -0
  122. data/vendor/bundle/gems/rake-10.0.4/test/test_thread_history_display.rb +91 -0
  123. data/vendor/bundle/gems/rake-10.0.4/test/test_trace_output.rb +50 -0
  124. data/vendor/bundle/specifications/capistrano_colors-0.5.5.gemspec +32 -0
  125. data/vendor/bundle/specifications/rake-10.0.4.gemspec +35 -0
  126. data/vergissberlin.gemspec +4 -2
  127. metadata +125 -2
@@ -0,0 +1,22 @@
1
+ require 'test/unit'
2
+ require 'test/unit/assertions'
3
+ require 'rake/file_list'
4
+
5
+ module Rake
6
+ include Test::Unit::Assertions
7
+
8
+ def run_tests(pattern='test/test*.rb', log_enabled=false)
9
+ FileList.glob(pattern).each { |fn|
10
+ $stderr.puts fn if log_enabled
11
+ begin
12
+ require fn
13
+ rescue Exception => ex
14
+ $stderr.puts "Error in #{fn}: #{ex.message}"
15
+ $stderr.puts ex.backtrace
16
+ assert false
17
+ end
18
+ }
19
+ end
20
+
21
+ extend self
22
+ end
@@ -0,0 +1,368 @@
1
+ require 'rake/invocation_exception_mixin'
2
+
3
+ module Rake
4
+
5
+ # #########################################################################
6
+ # A Task is the basic unit of work in a Rakefile. Tasks have associated
7
+ # actions (possibly more than one) and a list of prerequisites. When
8
+ # invoked, a task will first ensure that all of its prerequisites have an
9
+ # opportunity to run and then it will execute its own actions.
10
+ #
11
+ # Tasks are not usually created directly using the new method, but rather
12
+ # use the +file+ and +task+ convenience methods.
13
+ #
14
+ class Task
15
+ # List of prerequisites for a task.
16
+ attr_reader :prerequisites
17
+
18
+ # List of actions attached to a task.
19
+ attr_reader :actions
20
+
21
+ # Application owning this task.
22
+ attr_accessor :application
23
+
24
+ # Comment for this task. Restricted to a single line of no more than 50
25
+ # characters.
26
+ attr_reader :comment
27
+
28
+ # Full text of the (possibly multi-line) comment.
29
+ attr_reader :full_comment
30
+
31
+ # Array of nested namespaces names used for task lookup by this task.
32
+ attr_reader :scope
33
+
34
+ # File/Line locations of each of the task definitions for this
35
+ # task (only valid if the task was defined with the detect
36
+ # location option set).
37
+ attr_reader :locations
38
+
39
+ # Return task name
40
+ def to_s
41
+ name
42
+ end
43
+
44
+ def inspect
45
+ "<#{self.class} #{name} => [#{prerequisites.join(', ')}]>"
46
+ end
47
+
48
+ # List of sources for task.
49
+ attr_writer :sources
50
+ def sources
51
+ @sources ||= []
52
+ end
53
+
54
+ # List of prerequisite tasks
55
+ def prerequisite_tasks
56
+ prerequisites.collect { |pre| lookup_prerequisite(pre) }
57
+ end
58
+
59
+ def lookup_prerequisite(prerequisite_name)
60
+ application[prerequisite_name, @scope]
61
+ end
62
+ private :lookup_prerequisite
63
+
64
+ # List of all unique prerequisite tasks including prerequisite tasks'
65
+ # prerequisites.
66
+ # Includes self when cyclic dependencies are found.
67
+ def all_prerequisite_tasks
68
+ seen = {}
69
+ collect_prerequisites(seen)
70
+ seen.values
71
+ end
72
+
73
+ def collect_prerequisites(seen)
74
+ prerequisite_tasks.each do |pre|
75
+ next if seen[pre.name]
76
+ seen[pre.name] = pre
77
+ pre.collect_prerequisites(seen)
78
+ end
79
+ end
80
+ protected :collect_prerequisites
81
+
82
+ # First source from a rule (nil if no sources)
83
+ def source
84
+ @sources.first if defined?(@sources)
85
+ end
86
+
87
+ # Create a task named +task_name+ with no actions or prerequisites. Use
88
+ # +enhance+ to add actions and prerequisites.
89
+ def initialize(task_name, app)
90
+ @name = task_name.to_s
91
+ @prerequisites = []
92
+ @actions = []
93
+ @already_invoked = false
94
+ @full_comment = nil
95
+ @comment = nil
96
+ @lock = Monitor.new
97
+ @application = app
98
+ @scope = app.current_scope
99
+ @arg_names = nil
100
+ @locations = []
101
+ end
102
+
103
+ # Enhance a task with prerequisites or actions. Returns self.
104
+ def enhance(deps=nil, &block)
105
+ @prerequisites |= deps if deps
106
+ @actions << block if block_given?
107
+ self
108
+ end
109
+
110
+ # Name of the task, including any namespace qualifiers.
111
+ def name
112
+ @name.to_s
113
+ end
114
+
115
+ # Name of task with argument list description.
116
+ def name_with_args # :nodoc:
117
+ if arg_description
118
+ "#{name}#{arg_description}"
119
+ else
120
+ name
121
+ end
122
+ end
123
+
124
+ # Argument description (nil if none).
125
+ def arg_description # :nodoc:
126
+ @arg_names ? "[#{arg_names.join(',')}]" : nil
127
+ end
128
+
129
+ # Name of arguments for this task.
130
+ def arg_names
131
+ @arg_names || []
132
+ end
133
+
134
+ # Reenable the task, allowing its tasks to be executed if the task
135
+ # is invoked again.
136
+ def reenable
137
+ @already_invoked = false
138
+ end
139
+
140
+ # Clear the existing prerequisites and actions of a rake task.
141
+ def clear
142
+ clear_prerequisites
143
+ clear_actions
144
+ clear_comments
145
+ self
146
+ end
147
+
148
+ # Clear the existing prerequisites of a rake task.
149
+ def clear_prerequisites
150
+ prerequisites.clear
151
+ self
152
+ end
153
+
154
+ # Clear the existing actions on a rake task.
155
+ def clear_actions
156
+ actions.clear
157
+ self
158
+ end
159
+
160
+ # Clear the existing comments on a rake task.
161
+ def clear_comments
162
+ @full_comment = nil
163
+ @comment = nil
164
+ self
165
+ end
166
+
167
+ # Invoke the task if it is needed. Prerequisites are invoked first.
168
+ def invoke(*args)
169
+ task_args = TaskArguments.new(arg_names, args)
170
+ invoke_with_call_chain(task_args, InvocationChain::EMPTY)
171
+ end
172
+
173
+ # Same as invoke, but explicitly pass a call chain to detect
174
+ # circular dependencies.
175
+ def invoke_with_call_chain(task_args, invocation_chain) # :nodoc:
176
+ new_chain = InvocationChain.append(self, invocation_chain)
177
+ @lock.synchronize do
178
+ if application.options.trace
179
+ application.trace "** Invoke #{name} #{format_trace_flags}"
180
+ end
181
+ return if @already_invoked
182
+ @already_invoked = true
183
+ invoke_prerequisites(task_args, new_chain)
184
+ execute(task_args) if needed?
185
+ end
186
+ rescue Exception => ex
187
+ add_chain_to(ex, new_chain)
188
+ raise ex
189
+ end
190
+ protected :invoke_with_call_chain
191
+
192
+ def add_chain_to(exception, new_chain)
193
+ exception.extend(InvocationExceptionMixin) unless exception.respond_to?(:chain)
194
+ exception.chain = new_chain if exception.chain.nil?
195
+ end
196
+ private :add_chain_to
197
+
198
+ # Invoke all the prerequisites of a task.
199
+ def invoke_prerequisites(task_args, invocation_chain) # :nodoc:
200
+ if application.options.always_multitask
201
+ invoke_prerequisites_concurrently(task_args, invocation_chain)
202
+ else
203
+ prerequisite_tasks.each { |p|
204
+ prereq_args = task_args.new_scope(p.arg_names)
205
+ p.invoke_with_call_chain(prereq_args, invocation_chain)
206
+ }
207
+ end
208
+ end
209
+
210
+ # Invoke all the prerequisites of a task in parallel.
211
+ def invoke_prerequisites_concurrently(task_args, invocation_chain) # :nodoc:
212
+ futures = prerequisite_tasks.collect do |p|
213
+ prereq_args = task_args.new_scope(p.arg_names)
214
+ application.thread_pool.future(p) do |r|
215
+ r.invoke_with_call_chain(prereq_args, invocation_chain)
216
+ end
217
+ end
218
+ futures.each { |f| f.value }
219
+ end
220
+
221
+ # Format the trace flags for display.
222
+ def format_trace_flags
223
+ flags = []
224
+ flags << "first_time" unless @already_invoked
225
+ flags << "not_needed" unless needed?
226
+ flags.empty? ? "" : "(" + flags.join(", ") + ")"
227
+ end
228
+ private :format_trace_flags
229
+
230
+ # Execute the actions associated with this task.
231
+ def execute(args=nil)
232
+ args ||= EMPTY_TASK_ARGS
233
+ if application.options.dryrun
234
+ application.trace "** Execute (dry run) #{name}"
235
+ return
236
+ end
237
+ if application.options.trace
238
+ application.trace "** Execute #{name}"
239
+ end
240
+ application.enhance_with_matching_rule(name) if @actions.empty?
241
+ @actions.each do |act|
242
+ case act.arity
243
+ when 1
244
+ act.call(self)
245
+ else
246
+ act.call(self, args)
247
+ end
248
+ end
249
+ end
250
+
251
+ # Is this task needed?
252
+ def needed?
253
+ true
254
+ end
255
+
256
+ # Timestamp for this task. Basic tasks return the current time for their
257
+ # time stamp. Other tasks can be more sophisticated.
258
+ def timestamp
259
+ Time.now
260
+ end
261
+
262
+ # Add a description to the task. The description can consist of an option
263
+ # argument list (enclosed brackets) and an optional comment.
264
+ def add_description(description)
265
+ return if ! description
266
+ comment = description.strip
267
+ add_comment(comment) if comment && ! comment.empty?
268
+ end
269
+
270
+ # Writing to the comment attribute is the same as adding a description.
271
+ def comment=(description)
272
+ add_description(description)
273
+ end
274
+
275
+ # Add a comment to the task. If a comment already exists, separate
276
+ # the new comment with " / ".
277
+ def add_comment(comment)
278
+ if @full_comment
279
+ @full_comment << " / "
280
+ else
281
+ @full_comment = ''
282
+ end
283
+ @full_comment << comment
284
+ if @full_comment =~ /\A([^.]+?\.)( |$)/
285
+ @comment = $1
286
+ else
287
+ @comment = @full_comment
288
+ end
289
+ end
290
+ private :add_comment
291
+
292
+ # Set the names of the arguments for this task. +args+ should be
293
+ # an array of symbols, one for each argument name.
294
+ def set_arg_names(args)
295
+ @arg_names = args.map { |a| a.to_sym }
296
+ end
297
+
298
+ # Return a string describing the internal state of a task. Useful for
299
+ # debugging.
300
+ def investigation
301
+ result = "------------------------------\n"
302
+ result << "Investigating #{name}\n"
303
+ result << "class: #{self.class}\n"
304
+ result << "task needed: #{needed?}\n"
305
+ result << "timestamp: #{timestamp}\n"
306
+ result << "pre-requisites: \n"
307
+ prereqs = prerequisite_tasks
308
+ prereqs.sort! {|a,b| a.timestamp <=> b.timestamp}
309
+ prereqs.each do |p|
310
+ result << "--#{p.name} (#{p.timestamp})\n"
311
+ end
312
+ latest_prereq = prerequisite_tasks.collect { |pre| pre.timestamp }.max
313
+ result << "latest-prerequisite time: #{latest_prereq}\n"
314
+ result << "................................\n\n"
315
+ return result
316
+ end
317
+
318
+ # ----------------------------------------------------------------
319
+ # Rake Module Methods
320
+ #
321
+ class << self
322
+
323
+ # Clear the task list. This cause rake to immediately forget all the
324
+ # tasks that have been assigned. (Normally used in the unit tests.)
325
+ def clear
326
+ Rake.application.clear
327
+ end
328
+
329
+ # List of all defined tasks.
330
+ def tasks
331
+ Rake.application.tasks
332
+ end
333
+
334
+ # Return a task with the given name. If the task is not currently
335
+ # known, try to synthesize one from the defined rules. If no rules are
336
+ # found, but an existing file matches the task name, assume it is a file
337
+ # task with no dependencies or actions.
338
+ def [](task_name)
339
+ Rake.application[task_name]
340
+ end
341
+
342
+ # TRUE if the task name is already defined.
343
+ def task_defined?(task_name)
344
+ Rake.application.lookup(task_name) != nil
345
+ end
346
+
347
+ # Define a task given +args+ and an option block. If a rule with the
348
+ # given name already exists, the prerequisites and actions are added to
349
+ # the existing task. Returns the defined task.
350
+ def define_task(*args, &block)
351
+ Rake.application.define_task(self, *args, &block)
352
+ end
353
+
354
+ # Define a rule for synthesizing tasks.
355
+ def create_rule(*args, &block)
356
+ Rake.application.create_rule(*args, &block)
357
+ end
358
+
359
+ # Apply the scope to the task name according to the rules for
360
+ # this kind of task. Generic tasks will accept the scope as
361
+ # part of the name.
362
+ def scope_name(scope, task_name)
363
+ (scope + [task_name]).join(':')
364
+ end
365
+
366
+ end # class << Rake::Task
367
+ end # class Rake::Task
368
+ end
@@ -0,0 +1,7 @@
1
+ module Rake
2
+
3
+ # Error indicating an ill-formed task declaration.
4
+ class TaskArgumentError < ArgumentError
5
+ end
6
+
7
+ end
@@ -0,0 +1,78 @@
1
+ module Rake
2
+
3
+ ####################################################################
4
+ # TaskArguments manage the arguments passed to a task.
5
+ #
6
+ class TaskArguments
7
+ include Enumerable
8
+
9
+ attr_reader :names
10
+
11
+ # Create a TaskArgument object with a list of named arguments
12
+ # (given by :names) and a set of associated values (given by
13
+ # :values). :parent is the parent argument object.
14
+ def initialize(names, values, parent=nil)
15
+ @names = names
16
+ @parent = parent
17
+ @hash = {}
18
+ names.each_with_index { |name, i|
19
+ @hash[name.to_sym] = values[i] unless values[i].nil?
20
+ }
21
+ end
22
+
23
+ # Create a new argument scope using the prerequisite argument
24
+ # names.
25
+ def new_scope(names)
26
+ values = names.collect { |n| self[n] }
27
+ self.class.new(names, values, self)
28
+ end
29
+
30
+ # Find an argument value by name or index.
31
+ def [](index)
32
+ lookup(index.to_sym)
33
+ end
34
+
35
+ # Specify a hash of default values for task arguments. Use the
36
+ # defaults only if there is no specific value for the given
37
+ # argument.
38
+ def with_defaults(defaults)
39
+ @hash = defaults.merge(@hash)
40
+ end
41
+
42
+ def each(&block)
43
+ @hash.each(&block)
44
+ end
45
+
46
+ def values_at(*keys)
47
+ keys.map { |k| lookup(k) }
48
+ end
49
+
50
+ def method_missing(sym, *args)
51
+ lookup(sym.to_sym)
52
+ end
53
+
54
+ def to_hash
55
+ @hash
56
+ end
57
+
58
+ def to_s
59
+ @hash.inspect
60
+ end
61
+
62
+ def inspect
63
+ to_s
64
+ end
65
+
66
+ protected
67
+
68
+ def lookup(name)
69
+ if @hash.has_key?(name)
70
+ @hash[name]
71
+ elsif @parent
72
+ @parent.lookup(name)
73
+ end
74
+ end
75
+ end
76
+
77
+ EMPTY_TASK_ARGS = TaskArguments.new([], [])
78
+ end