/
rake_command.rb
55 lines (46 loc) · 1.49 KB
/
rake_command.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# frozen_string_literal: true
module Rails
module Command
class RakeCommand < Base # :nodoc:
extend Rails::Command::Actions
namespace "rake"
class << self
def printing_commands
rake_tasks.filter_map do |task|
if task.comment && task.locations.any?(non_app_file_pattern)
[task.name_with_args, task.comment]
end
end
end
def perform(task, args, config)
with_rake(task, *args) do |rake|
if unrecognized_task = (rake.top_level_tasks - ["default"]).find { |task| !rake.lookup(task[/[^\[]+/]) }
@rake_tasks = rake.tasks
raise UnrecognizedCommandError.new(unrecognized_task)
end
rake.options.suppress_backtrace_pattern = non_app_file_pattern
rake.standard_exception_handling { rake.top_level }
end
end
private
def non_app_file_pattern
/\A(?!#{Regexp.quote Rails::Command.root.to_s})/
end
def with_rake(*args, &block)
require "rake"
Rake::TaskManager.record_task_metadata = true
result = nil
Rake.with_application do |rake|
rake.init(bin, args) unless args.empty?
rake.load_rakefile
result = block.call(rake)
end
result
end
def rake_tasks
@rake_tasks ||= with_rake(&:tasks)
end
end
end
end
end