rake 0.9.2 → 13.0.3

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 (170) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.rdoc +43 -0
  3. data/Gemfile +10 -0
  4. data/History.rdoc +2386 -0
  5. data/MIT-LICENSE +1 -1
  6. data/README.rdoc +64 -109
  7. data/Rakefile +22 -386
  8. data/bin/bundle +105 -0
  9. data/bin/console +7 -0
  10. data/bin/rake +20 -23
  11. data/bin/rdoc +29 -0
  12. data/bin/rubocop +29 -0
  13. data/bin/setup +6 -0
  14. data/doc/command_line_usage.rdoc +65 -21
  15. data/doc/glossary.rdoc +40 -49
  16. data/doc/jamis.rb +1 -0
  17. data/doc/rake.1 +156 -0
  18. data/doc/rakefile.rdoc +127 -62
  19. data/exe/rake +27 -0
  20. data/lib/rake.rb +37 -31
  21. data/lib/rake/application.rb +507 -272
  22. data/lib/rake/backtrace.rb +24 -0
  23. data/lib/rake/clean.rb +55 -8
  24. data/lib/rake/cloneable.rb +11 -19
  25. data/lib/rake/cpu_counter.rb +107 -0
  26. data/lib/rake/default_loader.rb +5 -0
  27. data/lib/rake/dsl_definition.rb +74 -46
  28. data/lib/rake/early_time.rb +5 -1
  29. data/lib/rake/ext/core.rb +5 -6
  30. data/lib/rake/ext/string.rb +61 -52
  31. data/lib/rake/file_creation_task.rb +4 -3
  32. data/lib/rake/file_list.rb +81 -49
  33. data/lib/rake/file_task.rb +15 -8
  34. data/lib/rake/file_utils.rb +69 -47
  35. data/lib/rake/file_utils_ext.rb +18 -26
  36. data/lib/rake/invocation_chain.rb +25 -19
  37. data/lib/rake/invocation_exception_mixin.rb +1 -0
  38. data/lib/rake/late_time.rb +18 -0
  39. data/lib/rake/linked_list.rb +112 -0
  40. data/lib/rake/loaders/makefile.rb +23 -9
  41. data/lib/rake/multi_task.rb +4 -6
  42. data/lib/rake/name_space.rb +36 -23
  43. data/lib/rake/packagetask.rb +71 -34
  44. data/lib/rake/phony.rb +16 -0
  45. data/lib/rake/private_reader.rb +21 -0
  46. data/lib/rake/promise.rb +100 -0
  47. data/lib/rake/pseudo_status.rb +8 -2
  48. data/lib/rake/rake_module.rb +41 -3
  49. data/lib/rake/rake_test_loader.rb +21 -7
  50. data/lib/rake/rule_recursion_overflow_error.rb +2 -2
  51. data/lib/rake/scope.rb +43 -0
  52. data/lib/rake/task.rb +186 -79
  53. data/lib/rake/task_argument_error.rb +1 -0
  54. data/lib/rake/task_arguments.rb +50 -15
  55. data/lib/rake/task_manager.rb +89 -65
  56. data/lib/rake/tasklib.rb +2 -12
  57. data/lib/rake/testtask.rb +61 -63
  58. data/lib/rake/thread_history_display.rb +49 -0
  59. data/lib/rake/thread_pool.rb +163 -0
  60. data/lib/rake/trace_output.rb +23 -0
  61. data/lib/rake/version.rb +7 -7
  62. data/lib/rake/win32.rb +14 -18
  63. data/rake.gemspec +43 -0
  64. metadata +82 -221
  65. data/.gemtest +0 -0
  66. data/CHANGES +0 -509
  67. data/RRR +0 -9
  68. data/TODO +0 -20
  69. data/doc/rake.1.gz +0 -0
  70. data/doc/release_notes/rake-0.4.14.rdoc +0 -23
  71. data/doc/release_notes/rake-0.4.15.rdoc +0 -35
  72. data/doc/release_notes/rake-0.5.0.rdoc +0 -53
  73. data/doc/release_notes/rake-0.5.3.rdoc +0 -78
  74. data/doc/release_notes/rake-0.5.4.rdoc +0 -46
  75. data/doc/release_notes/rake-0.6.0.rdoc +0 -141
  76. data/doc/release_notes/rake-0.7.0.rdoc +0 -119
  77. data/doc/release_notes/rake-0.7.1.rdoc +0 -59
  78. data/doc/release_notes/rake-0.7.2.rdoc +0 -121
  79. data/doc/release_notes/rake-0.7.3.rdoc +0 -47
  80. data/doc/release_notes/rake-0.8.0.rdoc +0 -114
  81. data/doc/release_notes/rake-0.8.2.rdoc +0 -165
  82. data/doc/release_notes/rake-0.8.3.rdoc +0 -112
  83. data/doc/release_notes/rake-0.8.4.rdoc +0 -147
  84. data/doc/release_notes/rake-0.8.5.rdoc +0 -53
  85. data/doc/release_notes/rake-0.8.6.rdoc +0 -55
  86. data/doc/release_notes/rake-0.8.7.rdoc +0 -55
  87. data/doc/release_notes/rake-0.9.0.rdoc +0 -112
  88. data/doc/release_notes/rake-0.9.1.rdoc +0 -52
  89. data/doc/release_notes/rake-0.9.2.rdoc +0 -49
  90. data/install.rb +0 -90
  91. data/lib/rake/alt_system.rb +0 -109
  92. data/lib/rake/classic_namespace.rb +0 -9
  93. data/lib/rake/contrib/compositepublisher.rb +0 -21
  94. data/lib/rake/contrib/ftptools.rb +0 -150
  95. data/lib/rake/contrib/publisher.rb +0 -69
  96. data/lib/rake/contrib/rubyforgepublisher.rb +0 -16
  97. data/lib/rake/contrib/sshpublisher.rb +0 -45
  98. data/lib/rake/contrib/sys.rb +0 -191
  99. data/lib/rake/ext/module.rb +0 -39
  100. data/lib/rake/ext/time.rb +0 -14
  101. data/lib/rake/gempackagetask.rb +0 -13
  102. data/lib/rake/pathmap.rb +0 -1
  103. data/lib/rake/rdoctask.rb +0 -230
  104. data/lib/rake/ruby182_test_unit_fix.rb +0 -25
  105. data/lib/rake/runtest.rb +0 -21
  106. data/test/check_expansion.rb +0 -5
  107. data/test/check_no_expansion.rb +0 -5
  108. data/test/data/access/Rakefile +0 -35
  109. data/test/data/chains/Rakefile +0 -15
  110. data/test/data/comments/Rakefile +0 -18
  111. data/test/data/default/Rakefile +0 -17
  112. data/test/data/deprecated_import/Rakefile +0 -1
  113. data/test/data/dryrun/Rakefile +0 -22
  114. data/test/data/extra/Rakefile +0 -1
  115. data/test/data/file_creation_task/Rakefile +0 -31
  116. data/test/data/imports/Rakefile +0 -19
  117. data/test/data/imports/deps.mf +0 -1
  118. data/test/data/multidesc/Rakefile +0 -15
  119. data/test/data/namespace/Rakefile +0 -64
  120. data/test/data/rakelib/test1.rb +0 -4
  121. data/test/data/rbext/rakefile.rb +0 -3
  122. data/test/data/sample.mf +0 -14
  123. data/test/data/statusreturn/Rakefile +0 -6
  124. data/test/data/unittest/Rakefile +0 -1
  125. data/test/data/verbose/Rakefile +0 -34
  126. data/test/file_creation.rb +0 -34
  127. data/test/helper.rb +0 -44
  128. data/test/in_environment.rb +0 -35
  129. data/test/reqfile.rb +0 -3
  130. data/test/reqfile2.rb +0 -3
  131. data/test/shellcommand.rb +0 -3
  132. data/test/test_rake.rb +0 -38
  133. data/test/test_rake_application.rb +0 -364
  134. data/test/test_rake_application_options.rb +0 -382
  135. data/test/test_rake_clean.rb +0 -12
  136. data/test/test_rake_definitions.rb +0 -80
  137. data/test/test_rake_directory_task.rb +0 -55
  138. data/test/test_rake_dsl.rb +0 -73
  139. data/test/test_rake_early_time.rb +0 -31
  140. data/test/test_rake_extension.rb +0 -59
  141. data/test/test_rake_file_creation_task.rb +0 -62
  142. data/test/test_rake_file_list.rb +0 -633
  143. data/test/test_rake_file_list_path_map.rb +0 -8
  144. data/test/test_rake_file_task.rb +0 -104
  145. data/test/test_rake_file_utils.rb +0 -252
  146. data/test/test_rake_ftp_file.rb +0 -59
  147. data/test/test_rake_functional.rb +0 -468
  148. data/test/test_rake_invocation_chain.rb +0 -52
  149. data/test/test_rake_makefile_loader.rb +0 -23
  150. data/test/test_rake_multi_task.rb +0 -51
  151. data/test/test_rake_name_space.rb +0 -43
  152. data/test/test_rake_package_task.rb +0 -78
  153. data/test/test_rake_path_map.rb +0 -157
  154. data/test/test_rake_path_map_explode.rb +0 -31
  155. data/test/test_rake_path_map_partial.rb +0 -18
  156. data/test/test_rake_pseudo_status.rb +0 -20
  157. data/test/test_rake_rdoc_task.rb +0 -81
  158. data/test/test_rake_require.rb +0 -35
  159. data/test/test_rake_rules.rb +0 -346
  160. data/test/test_rake_task.rb +0 -271
  161. data/test/test_rake_task_argument_parsing.rb +0 -116
  162. data/test/test_rake_task_arguments.rb +0 -86
  163. data/test/test_rake_task_lib.rb +0 -9
  164. data/test/test_rake_task_manager.rb +0 -145
  165. data/test/test_rake_task_manager_argument_resolution.rb +0 -36
  166. data/test/test_rake_task_with_arguments.rb +0 -162
  167. data/test/test_rake_test_task.rb +0 -122
  168. data/test/test_rake_top_level_functions.rb +0 -76
  169. data/test/test_rake_win32.rb +0 -83
  170. data/test/test_sys.rb +0 -20
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Rake
2
3
 
3
4
  # Error indicating an ill-formed task declaration.
@@ -1,30 +1,43 @@
1
+ # frozen_string_literal: true
1
2
  module Rake
2
3
 
3
- ####################################################################
4
+ ##
4
5
  # TaskArguments manage the arguments passed to a task.
5
6
  #
6
7
  class TaskArguments
7
8
  include Enumerable
8
9
 
10
+ # Argument names
9
11
  attr_reader :names
10
12
 
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.
13
+ # Create a TaskArgument object with a list of argument +names+ and a set
14
+ # of associated +values+. +parent+ is the parent argument object.
14
15
  def initialize(names, values, parent=nil)
15
16
  @names = names
16
17
  @parent = parent
17
18
  @hash = {}
19
+ @values = values
18
20
  names.each_with_index { |name, i|
19
- @hash[name.to_sym] = values[i] unless values[i].nil?
21
+ next if values[i].nil? || values[i] == ""
22
+ @hash[name.to_sym] = values[i]
20
23
  }
21
24
  end
22
25
 
26
+ # Retrieve the complete array of sequential values
27
+ def to_a
28
+ @values.dup
29
+ end
30
+
31
+ # Retrieve the list of values not associated with named arguments
32
+ def extras
33
+ @values[@names.length..-1] || []
34
+ end
35
+
23
36
  # Create a new argument scope using the prerequisite argument
24
37
  # names.
25
38
  def new_scope(names)
26
- values = names.collect { |n| self[n] }
27
- self.class.new(names, values, self)
39
+ values = names.map { |n| self[n] }
40
+ self.class.new(names, values + extras, self)
28
41
  end
29
42
 
30
43
  # Find an argument value by name or index.
@@ -39,29 +52,51 @@ module Rake
39
52
  @hash = defaults.merge(@hash)
40
53
  end
41
54
 
55
+ # Enumerates the arguments and their values
42
56
  def each(&block)
43
57
  @hash.each(&block)
44
58
  end
45
59
 
46
- def method_missing(sym, *args, &block)
60
+ # Extracts the argument values at +keys+
61
+ def values_at(*keys)
62
+ keys.map { |k| lookup(k) }
63
+ end
64
+
65
+ # Returns the value of the given argument via method_missing
66
+ def method_missing(sym, *args)
47
67
  lookup(sym.to_sym)
48
68
  end
49
69
 
70
+ # Returns a Hash of arguments and their values
50
71
  def to_hash
51
- @hash
72
+ @hash.dup
73
+ end
74
+
75
+ def to_s # :nodoc:
76
+ inspect
77
+ end
78
+
79
+ def inspect # :nodoc:
80
+ inspection = @hash.map do |k,v|
81
+ "#{k.to_s}: #{v.to_s}"
82
+ end.join(", ")
83
+
84
+ "#<#{self.class} #{inspection}>"
52
85
  end
53
86
 
54
- def to_s
55
- @hash.inspect
87
+ # Returns true if +key+ is one of the arguments
88
+ def has_key?(key)
89
+ @hash.has_key?(key)
56
90
  end
91
+ alias key? has_key?
57
92
 
58
- def inspect
59
- to_s
93
+ def fetch(*args, &block)
94
+ @hash.fetch(*args, &block)
60
95
  end
61
96
 
62
97
  protected
63
98
 
64
- def lookup(name)
99
+ def lookup(name) # :nodoc:
65
100
  if @hash.has_key?(name)
66
101
  @hash[name]
67
102
  elsif @parent
@@ -70,5 +105,5 @@ module Rake
70
105
  end
71
106
  end
72
107
 
73
- EMPTY_TASK_ARGS = TaskArguments.new([], [])
108
+ EMPTY_TASK_ARGS = TaskArguments.new([], []) # :nodoc:
74
109
  end
@@ -1,37 +1,47 @@
1
+ # frozen_string_literal: true
1
2
  module Rake
2
3
 
3
4
  # The TaskManager module is a mixin for managing tasks.
4
5
  module TaskManager
5
6
  # Track the last comment made in the Rakefile.
6
7
  attr_accessor :last_description
7
- alias :last_comment :last_description # Backwards compatibility
8
8
 
9
- def initialize
9
+ def initialize # :nodoc:
10
10
  super
11
11
  @tasks = Hash.new
12
12
  @rules = Array.new
13
- @scope = Array.new
13
+ @scope = Scope.make
14
14
  @last_description = nil
15
15
  end
16
16
 
17
- def create_rule(*args, &block)
18
- pattern, _, deps = resolve_args(args)
19
- pattern = Regexp.new(Regexp.quote(pattern) + '$') if String === pattern
20
- @rules << [pattern, deps, block]
17
+ def create_rule(*args, &block) # :nodoc:
18
+ pattern, args, deps, order_only = resolve_args(args)
19
+ pattern = Regexp.new(Regexp.quote(pattern) + "$") if String === pattern
20
+ @rules << [pattern, args, deps, order_only, block]
21
21
  end
22
22
 
23
- def define_task(task_class, *args, &block)
24
- task_name, arg_names, deps = resolve_args(args)
23
+ def define_task(task_class, *args, &block) # :nodoc:
24
+ task_name, arg_names, deps, order_only = resolve_args(args)
25
+
26
+ original_scope = @scope
27
+ if String === task_name and
28
+ not task_class.ancestors.include? Rake::FileTask
29
+ task_name, *definition_scope = *(task_name.split(":").reverse)
30
+ @scope = Scope.make(*(definition_scope + @scope.to_a))
31
+ end
32
+
25
33
  task_name = task_class.scope_name(@scope, task_name)
26
- deps = [deps] unless deps.respond_to?(:to_ary)
27
- deps = deps.collect {|d| d.to_s }
28
34
  task = intern(task_class, task_name)
29
35
  task.set_arg_names(arg_names) unless arg_names.empty?
30
36
  if Rake::TaskManager.record_task_metadata
31
37
  add_location(task)
32
38
  task.add_description(get_description(task))
33
39
  end
34
- task.enhance(deps, &block)
40
+ task.enhance(Task.format_deps(deps), &block)
41
+ task | order_only unless order_only.nil?
42
+ task
43
+ ensure
44
+ @scope = original_scope
35
45
  end
36
46
 
37
47
  # Lookup a task. Return an existing task if found, otherwise
@@ -46,16 +56,35 @@ module Rake
46
56
  self.lookup(task_name, scopes) or
47
57
  enhance_with_matching_rule(task_name) or
48
58
  synthesize_file_task(task_name) or
49
- fail "Don't know how to build task '#{task_name}'"
59
+ fail generate_message_for_undefined_task(task_name)
60
+ end
61
+
62
+ def generate_message_for_undefined_task(task_name)
63
+ message = "Don't know how to build task '#{task_name}' "\
64
+ "(See the list of available tasks with `#{Rake.application.name} --tasks`)"
65
+ message + generate_did_you_mean_suggestions(task_name)
66
+ end
67
+
68
+ def generate_did_you_mean_suggestions(task_name)
69
+ return "" unless defined?(::DidYouMean::SpellChecker)
70
+
71
+ suggestions = ::DidYouMean::SpellChecker.new(dictionary: @tasks.keys).correct(task_name.to_s)
72
+ if ::DidYouMean.respond_to?(:formatter)# did_you_mean v1.2.0 or later
73
+ ::DidYouMean.formatter.message_for(suggestions)
74
+ elsif defined?(::DidYouMean::Formatter) # before did_you_mean v1.2.0
75
+ ::DidYouMean::Formatter.new(suggestions).to_s
76
+ else
77
+ ""
78
+ end
50
79
  end
51
80
 
52
- def synthesize_file_task(task_name)
81
+ def synthesize_file_task(task_name) # :nodoc:
53
82
  return nil unless File.exist?(task_name)
54
83
  define_task(Rake::FileTask, task_name)
55
84
  end
56
85
 
57
- # Resolve the arguments for a task/rule. Returns a triplet of
58
- # [task_name, arg_name_list, prerequisites].
86
+ # Resolve the arguments for a task/rule. Returns a tuple of
87
+ # [task_name, arg_name_list, prerequisites, order_only_prerequisites].
59
88
  def resolve_args(args)
60
89
  if args.last.is_a?(Hash)
61
90
  deps = args.pop
@@ -72,7 +101,6 @@ module Rake
72
101
  #
73
102
  # task :t
74
103
  # task :t, [:a]
75
- # task :t, :a (deprecated)
76
104
  #
77
105
  def resolve_args_without_dependencies(args)
78
106
  task_name = args.shift
@@ -81,7 +109,7 @@ module Rake
81
109
  else
82
110
  arg_names = args
83
111
  end
84
- [task_name, arg_names, []]
112
+ [task_name, arg_names, [], nil]
85
113
  end
86
114
  private :resolve_args_without_dependencies
87
115
 
@@ -90,33 +118,29 @@ module Rake
90
118
  #
91
119
  # The patterns recognized by this argument resolving function are:
92
120
  #
121
+ # task :t, order_only: [:e]
93
122
  # task :t => [:d]
123
+ # task :t => [:d], order_only: [:e]
94
124
  # task :t, [a] => [:d]
95
- # task :t, :needs => [:d] (deprecated)
96
- # task :t, :a, :needs => [:d] (deprecated)
125
+ # task :t, [a] => [:d], order_only: [:e]
97
126
  #
98
127
  def resolve_args_with_dependencies(args, hash) # :nodoc:
99
- fail "Task Argument Error" if hash.size != 1
100
- key, value = hash.map { |k, v| [k,v] }.first
128
+ fail "Task Argument Error" if
129
+ hash.size != 1 &&
130
+ (hash.size != 2 || !hash.key?(:order_only))
131
+ order_only = hash.delete(:order_only)
132
+ key, value = hash.map { |k, v| [k, v] }.first
101
133
  if args.empty?
102
134
  task_name = key
103
135
  arg_names = []
104
- deps = value
105
- elsif key == :needs
106
- Rake.application.deprecate(
107
- "task :t, arg, :needs => [deps]",
108
- "task :t, [args] => [deps]",
109
- caller.detect { |c| c !~ /\blib\/rake\b/ })
110
- task_name = args.shift
111
- arg_names = args
112
- deps = value
136
+ deps = value || []
113
137
  else
114
138
  task_name = args.shift
115
- arg_names = key
116
- deps = value
139
+ arg_names = key || args.shift|| []
140
+ deps = value || []
117
141
  end
118
142
  deps = [deps] unless deps.respond_to?(:to_ary)
119
- [task_name, arg_names, deps]
143
+ [task_name, arg_names, deps, order_only]
120
144
  end
121
145
  private :resolve_args_with_dependencies
122
146
 
@@ -127,9 +151,10 @@ module Rake
127
151
  def enhance_with_matching_rule(task_name, level=0)
128
152
  fail Rake::RuleRecursionOverflowError,
129
153
  "Rule Recursion Too Deep" if level >= 16
130
- @rules.each do |pattern, extensions, block|
131
- if pattern.match(task_name)
132
- task = attempt_rule(task_name, extensions, block, level)
154
+ @rules.each do |pattern, args, extensions, order_only, block|
155
+ if pattern && pattern.match(task_name)
156
+ task = attempt_rule(task_name, pattern, args, extensions, block, level)
157
+ task | order_only unless order_only.nil?
133
158
  return task if task
134
159
  end
135
160
  end
@@ -147,7 +172,7 @@ module Rake
147
172
  # List of all the tasks defined in the given scope (and its
148
173
  # sub-scopes).
149
174
  def tasks_in_scope(scope)
150
- prefix = scope.join(":")
175
+ prefix = scope.path
151
176
  tasks.select { |t|
152
177
  /^#{prefix}:/ =~ t.name
153
178
  }
@@ -168,11 +193,11 @@ module Rake
168
193
  initial_scope ||= @scope
169
194
  task_name = task_name.to_s
170
195
  if task_name =~ /^rake:/
171
- scopes = []
172
- task_name = task_name.sub(/^rake:/, '')
196
+ scopes = Scope.make
197
+ task_name = task_name.sub(/^rake:/, "")
173
198
  elsif task_name =~ /^(\^+)/
174
- scopes = initial_scope[0, initial_scope.size - $1.size]
175
- task_name = task_name.sub(/^(\^+)/, '')
199
+ scopes = initial_scope.trim($1.size)
200
+ task_name = task_name.sub(/^(\^+)/, "")
176
201
  else
177
202
  scopes = initial_scope
178
203
  end
@@ -181,12 +206,12 @@ module Rake
181
206
 
182
207
  # Lookup the task name
183
208
  def lookup_in_scope(name, scope)
184
- n = scope.size
185
- while n >= 0
186
- tn = (scope[0,n] + [name]).join(':')
209
+ loop do
210
+ tn = scope.path_with_task_name(name)
187
211
  task = @tasks[tn]
188
212
  return task if task
189
- n -= 1
213
+ break if scope.empty?
214
+ scope = scope.tail
190
215
  end
191
216
  nil
192
217
  end
@@ -195,19 +220,19 @@ module Rake
195
220
  # Return the list of scope names currently active in the task
196
221
  # manager.
197
222
  def current_scope
198
- @scope.dup
223
+ @scope
199
224
  end
200
225
 
201
226
  # Evaluate the block in a nested namespace named +name+. Create
202
227
  # an anonymous namespace if +name+ is nil.
203
228
  def in_namespace(name)
204
229
  name ||= generate_name
205
- @scope.push(name)
230
+ @scope = Scope.new(name, @scope)
206
231
  ns = NameSpace.new(self, @scope)
207
232
  yield(ns)
208
233
  ns
209
234
  ensure
210
- @scope.pop
235
+ @scope = @scope.tail
211
236
  end
212
237
 
213
238
  private
@@ -224,7 +249,7 @@ module Rake
224
249
  locations = caller
225
250
  i = 0
226
251
  while locations[i]
227
- return locations[i+1] if locations[i] =~ /rake\/dsl_definition.rb/
252
+ return locations[i + 1] if locations[i] =~ /rake\/dsl_definition.rb/
228
253
  i += 1
229
254
  end
230
255
  nil
@@ -237,19 +262,20 @@ module Rake
237
262
  "_anon_#{@seed}"
238
263
  end
239
264
 
240
- def trace_rule(level, message)
241
- $stderr.puts "#{" "*level}#{message}" if Rake.application.options.trace_rules
265
+ def trace_rule(level, message) # :nodoc:
266
+ options.trace_output.puts "#{" " * level}#{message}" if
267
+ Rake.application.options.trace_rules
242
268
  end
243
269
 
244
270
  # Attempt to create a rule given the list of prerequisites.
245
- def attempt_rule(task_name, extensions, block, level)
246
- sources = make_sources(task_name, extensions)
247
- prereqs = sources.collect { |source|
271
+ def attempt_rule(task_name, task_pattern, args, extensions, block, level)
272
+ sources = make_sources(task_name, task_pattern, extensions)
273
+ prereqs = sources.map { |source|
248
274
  trace_rule level, "Attempting Rule #{task_name} => #{source}"
249
275
  if File.exist?(source) || Rake::Task.task_defined?(source)
250
276
  trace_rule level, "(#{task_name} => #{source} ... EXIST)"
251
277
  source
252
- elsif parent = enhance_with_matching_rule(source, level+1)
278
+ elsif parent = enhance_with_matching_rule(source, level + 1)
253
279
  trace_rule level, "(#{task_name} => #{source} ... ENHANCE)"
254
280
  parent.name
255
281
  else
@@ -257,25 +283,26 @@ module Rake
257
283
  return nil
258
284
  end
259
285
  }
260
- task = FileTask.define_task({task_name => prereqs}, &block)
286
+ task = FileTask.define_task(task_name, { args => prereqs }, &block)
261
287
  task.sources = prereqs
262
288
  task
263
289
  end
264
290
 
265
291
  # Make a list of sources from the list of file name extensions /
266
292
  # translation procs.
267
- def make_sources(task_name, extensions)
268
- result = extensions.collect { |ext|
293
+ def make_sources(task_name, task_pattern, extensions)
294
+ result = extensions.map { |ext|
269
295
  case ext
270
296
  when /%/
271
297
  task_name.pathmap(ext)
272
298
  when %r{/}
273
299
  ext
274
300
  when /^\./
275
- task_name.ext(ext)
301
+ source = task_name.sub(task_pattern, ext)
302
+ source == ext ? task_name.ext(ext) : source
276
303
  when String
277
304
  ext
278
- when Proc
305
+ when Proc, Method
279
306
  if ext.arity == 1
280
307
  ext.call(task_name)
281
308
  else
@@ -288,9 +315,6 @@ module Rake
288
315
  result.flatten
289
316
  end
290
317
 
291
-
292
- private
293
-
294
318
  # Return the current description, clearing it in the process.
295
319
  def get_description(task)
296
320
  desc = @last_description
@@ -299,7 +323,7 @@ module Rake
299
323
  end
300
324
 
301
325
  class << self
302
- attr_accessor :record_task_metadata
326
+ attr_accessor :record_task_metadata # :nodoc:
303
327
  TaskManager.record_task_metadata = false
304
328
  end
305
329
  end
data/lib/rake/tasklib.rb CHANGED
@@ -1,4 +1,5 @@
1
- require 'rake'
1
+ # frozen_string_literal: true
2
+ require "rake"
2
3
 
3
4
  module Rake
4
5
 
@@ -6,17 +7,6 @@ module Rake
6
7
  class TaskLib
7
8
  include Cloneable
8
9
  include Rake::DSL
9
-
10
- # Make a symbol by pasting two strings together.
11
- #
12
- # NOTE: DEPRECATED! This method is kinda stupid. I don't know why
13
- # I didn't just use string interpolation. But now other task
14
- # libraries depend on this so I can't remove it without breaking
15
- # other people's code. So for now it stays for backwards
16
- # compatibility. BUT DON'T USE IT.
17
- def paste(a,b) # :nodoc:
18
- (a.to_s + b.to_s).intern
19
- end
20
10
  end
21
11
 
22
12
  end