blob: 37d61a8bea4c90bd0f0fbbea1f00555ea511a15c (
plain) (
blame)
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
module Rails
module Commands
class Command
attr_reader :argv
def initialize(argv = '')
@argv = argv
@option_parser = build_option_parser
@options = {}
end
def run(task_name)
command_name = self.class.command_name_for(task_name)
parse_options_for(command_name)
@option_parser.parse! @argv
if command_instance = command_for(command_name)
command_instance.public_send(command_name)
else
puts @option_parser
end
end
def self.options_for(command_name, &options_to_parse)
@@command_options[command_name] = options_to_parse
end
def self.set_banner(command_name, banner)
options_for(command_name) { |opts, _| opts.banner = banner }
end
def exists?(task_name) # :nodoc:
command_name = self.class.command_name_for(task_name)
!command_for(command_name).nil?
end
private
@@commands = []
@@command_options = {}
def parse_options_for(command_name)
@@command_options.fetch(command_name, -> {}).call(@option_parser, @options)
end
def build_option_parser
OptionParser.new do |opts|
opts.on('-h', '--help', 'Show this help.') do
puts opts
exit
end
end
end
def self.inherited(command)
@@commands << command
end
def self.command_name_for(task_name)
task_name.gsub(':', '_').to_sym
end
def command_for(command_name)
klass = @@commands.find do |command|
command.public_instance_methods.include?(command_name)
end
if klass
klass.new(@argv)
end
end
end
end
end
|