Skip to content

Commit 5e6c6f4

Browse files
authored
Merge pull request #269 from take-cheeze/order_only
Add order only dependency.
2 parents 7eff2ab + 449766f commit 5e6c6f4

4 files changed

+55
-17
lines changed

lib/rake/task.rb

+17-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class Task
1717
attr_reader :prerequisites
1818
alias prereqs prerequisites
1919

20+
# List of order only prerequisites for a task.
21+
attr_reader :order_only_prerequisites
22+
2023
# List of actions attached to a task.
2124
attr_reader :actions
2225

@@ -56,7 +59,7 @@ def sources
5659

5760
# List of prerequisite tasks
5861
def prerequisite_tasks
59-
prerequisites.map { |pre| lookup_prerequisite(pre) }
62+
(prerequisites + order_only_prerequisites).map { |pre| lookup_prerequisite(pre) }
6063
end
6164

6265
def lookup_prerequisite(prerequisite_name) # :nodoc:
@@ -105,6 +108,7 @@ def initialize(task_name, app)
105108
@arg_names = nil
106109
@locations = []
107110
@invocation_exception = nil
111+
@order_only_prerequisites = []
108112
end
109113

110114
# Enhance a task with prerequisites or actions. Returns self.
@@ -360,6 +364,18 @@ def investigation
360364
return result
361365
end
362366

367+
# Format dependencies parameter to pass to task.
368+
def self.format_deps(deps)
369+
deps = [deps] unless deps.respond_to?(:to_ary)
370+
deps.map { |d| Rake.from_pathname(d).to_s }
371+
end
372+
373+
# Add order only dependencies.
374+
def |(deps)
375+
@order_only_prerequisites |= Task.format_deps(deps) - @prerequisites
376+
self
377+
end
378+
363379
# ----------------------------------------------------------------
364380
# Rake Module Methods
365381
#

lib/rake/task_manager.rb

+14-10
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ def initialize # :nodoc:
1515
end
1616

1717
def create_rule(*args, &block) # :nodoc:
18-
pattern, args, deps = resolve_args(args)
18+
pattern, args, deps, order_only = resolve_args(args)
1919
pattern = Regexp.new(Regexp.quote(pattern) + "$") if String === pattern
20-
@rules << [pattern, args, deps, block]
20+
@rules << [pattern, args, deps, order_only, block]
2121
end
2222

2323
def define_task(task_class, *args, &block) # :nodoc:
24-
task_name, arg_names, deps = resolve_args(args)
24+
task_name, arg_names, deps, order_only = resolve_args(args)
2525

2626
original_scope = @scope
2727
if String === task_name and
@@ -31,15 +31,15 @@ def define_task(task_class, *args, &block) # :nodoc:
3131
end
3232

3333
task_name = task_class.scope_name(@scope, task_name)
34-
deps = [deps] unless deps.respond_to?(:to_ary)
35-
deps = deps.map { |d| Rake.from_pathname(d).to_s }
3634
task = intern(task_class, task_name)
3735
task.set_arg_names(arg_names) unless arg_names.empty?
3836
if Rake::TaskManager.record_task_metadata
3937
add_location(task)
4038
task.add_description(get_description(task))
4139
end
42-
task.enhance(deps, &block)
40+
task.enhance(Task.format_deps(deps), &block)
41+
task | order_only unless order_only.nil?
42+
task
4343
ensure
4444
@scope = original_scope
4545
end
@@ -109,7 +109,7 @@ def resolve_args_without_dependencies(args)
109109
else
110110
arg_names = args
111111
end
112-
[task_name, arg_names, []]
112+
[task_name, arg_names, [], nil]
113113
end
114114
private :resolve_args_without_dependencies
115115

@@ -122,7 +122,10 @@ def resolve_args_without_dependencies(args)
122122
# task :t, [a] => [:d]
123123
#
124124
def resolve_args_with_dependencies(args, hash) # :nodoc:
125-
fail "Task Argument Error" if hash.size != 1
125+
fail "Task Argument Error" if
126+
hash.size != 1 &&
127+
(hash.size != 2 || !hash.key?(:order_only))
128+
order_only = hash.delete(:order_only)
126129
key, value = hash.map { |k, v| [k, v] }.first
127130
if args.empty?
128131
task_name = key
@@ -134,7 +137,7 @@ def resolve_args_with_dependencies(args, hash) # :nodoc:
134137
deps = value
135138
end
136139
deps = [deps] unless deps.respond_to?(:to_ary)
137-
[task_name, arg_names, deps]
140+
[task_name, arg_names, deps, order_only]
138141
end
139142
private :resolve_args_with_dependencies
140143

@@ -145,9 +148,10 @@ def resolve_args_with_dependencies(args, hash) # :nodoc:
145148
def enhance_with_matching_rule(task_name, level=0)
146149
fail Rake::RuleRecursionOverflowError,
147150
"Rule Recursion Too Deep" if level >= 16
148-
@rules.each do |pattern, args, extensions, block|
151+
@rules.each do |pattern, args, extensions, order_only, block|
149152
if pattern && pattern.match(task_name)
150153
task = attempt_rule(task_name, pattern, args, extensions, block, level)
154+
task | order_only unless order_only.nil?
151155
return task if task
152156
end
153157
end

test/test_rake_task_manager_argument_resolution.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
class TestRakeTaskManagerArgumentResolution < Rake::TestCase # :nodoc:
55

66
def test_good_arg_patterns
7-
assert_equal [:t, [], []], task(:t)
8-
assert_equal [:t, [], [:x]], task(t: :x)
9-
assert_equal [:t, [], [:x, :y]], task(t: [:x, :y])
7+
assert_equal [:t, [], [], nil], task(:t)
8+
assert_equal [:t, [], [:x], nil], task(t: :x)
9+
assert_equal [:t, [], [:x, :y], nil], task(t: [:x, :y])
1010

11-
assert_equal [:t, [:a, :b], []], task(:t, [:a, :b])
12-
assert_equal [:t, [:a, :b], [:x]], task(:t, [:a, :b] => :x)
13-
assert_equal [:t, [:a, :b], [:x, :y]], task(:t, [:a, :b] => [:x, :y])
11+
assert_equal [:t, [:a, :b], [], nil], task(:t, [:a, :b])
12+
assert_equal [:t, [:a, :b], [:x], nil], task(:t, [:a, :b] => :x)
13+
assert_equal [:t, [:a, :b], [:x, :y], nil], task(:t, [:a, :b] => [:x, :y])
1414
end
1515

1616
def task(*args)

test/test_rake_test_task.rb

+18
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,22 @@ def test_task_prerequisites_deps
169169
task = Rake::Task[:child]
170170
assert_includes task.prerequisites, "parent"
171171
end
172+
173+
def test_task_order_only_prerequisites
174+
t = task(a: 'b') {
175+
:aaa
176+
} | 'c'
177+
b, c = task('b'), task('c')
178+
assert_equal ['b'], t.prerequisites
179+
assert_equal ['c'], t.order_only_prerequisites
180+
assert_equal [b, c], t.prerequisite_tasks
181+
end
182+
183+
def test_task_order_only_prerequisites_key
184+
t = task 'a' => 'b', order_only: ['c']
185+
b, c = task('b'), task('c')
186+
assert_equal ['b'], t.prerequisites
187+
assert_equal ['c'], t.order_only_prerequisites
188+
assert_equal [b, c], t.prerequisite_tasks
189+
end
172190
end

0 commit comments

Comments
 (0)