Module: EacCli::RunnerWith::Subcommands
- Defined in:
- lib/eac_cli/runner_with/subcommands.rb,
lib/eac_cli/runner_with/subcommands/definition_concern.rb
Defined Under Namespace
Modules: DefinitionConcern
Constant Summary
collapse
- EXTRA_AVAILABLE_SUBCOMMANDS_METHOD_NAME =
:extra_available_subcommands
Class Method Summary
collapse
Instance Method Summary
collapse
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *arguments, &block) ⇒ Object
52
53
54
55
56
57
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 52
def method_missing(method_name, *arguments, &block)
return run_with_subcommand(*arguments, &block) if
run_with_subcommand_alias_run?(method_name)
super
end
|
Class Method Details
.subcommands_from_module(a_module) ⇒ Hash<String, EacCli::Runner>
10
11
12
13
14
15
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 10
def subcommands_from_module(a_module)
a_module.constants
.map { |name| [name.to_s.underscore.gsub('_', '-'), a_module.const_get(name)] }
.select { |c| runner?(c[1]) }
.to_h.with_indifferent_access
end
|
Instance Method Details
#available_subcommands ⇒ Object
26
27
28
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 26
def available_subcommands
@available_subcommands ||= available_subcommands_auto.merge(available_subcommands_extra)
end
|
#available_subcommands_auto ⇒ Hash<String, EacCli::Runner>
31
32
33
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 31
def available_subcommands_auto
::EacCli::RunnerWith::Subcommands.subcommands_from_module(self.class)
end
|
#available_subcommands_extra ⇒ Object
35
36
37
38
39
40
41
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 35
def available_subcommands_extra
if respond_to?(EXTRA_AVAILABLE_SUBCOMMANDS_METHOD_NAME, true)
send(EXTRA_AVAILABLE_SUBCOMMANDS_METHOD_NAME)
else
{}
end
end
|
#available_subcommands_to_s ⇒ Object
43
44
45
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 43
def available_subcommands_to_s
available_subcommands.keys.sort.join(', ')
end
|
48
49
50
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 48
def
help_list_section('Subcommands', available_subcommands.keys.sort)
end
|
#respond_to_missing?(method_name, include_private = false) ⇒ Boolean
59
60
61
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 59
def respond_to_missing?(method_name, include_private = false)
run_with_subcommand_alias_run?(method_name) || super
end
|
#run_subcommand? ⇒ Boolean
83
84
85
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 83
def run_subcommand?
subcommand_name.present?
end
|
#run_with_subcommand ⇒ Object
63
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 63
def run_with_subcommand
if run_subcommand?
if subcommand_runner.respond_to?(:run_run)
subcommand_runner.run_run
else
subcommand_runner.run
end
else
run_without_subcommand
end
end
|
#run_with_subcommand_alias_run?(method_name) ⇒ Boolean
75
76
77
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 75
def run_with_subcommand_alias_run?(method_name)
subcommands? && method_name.to_sym == :run
end
|
#run_without_subcommand ⇒ Object
79
80
81
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 79
def run_without_subcommand
"Method #{__method__} should be overrided in #{self.class.name}"
end
|
#subcommand_args ⇒ Object
91
92
93
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 91
def subcommand_args
parsed.fetch(::EacCli::Definition::SUBCOMMAND_ARGS_ARG)
end
|
#subcommand_class ⇒ Object
95
96
97
98
99
100
101
102
103
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 95
def subcommand_class
available_subcommands[subcommand_name].if_present { |v| return v }
raise(::EacCli::Parser::Error.new(
self.class.runner_definition, runner_context.argv,
"Subcommand \"#{subcommand_name}\" not found " \
"(Available: #{available_subcommands_to_s})"
))
end
|
#subcommand_name ⇒ Object
105
106
107
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 105
def subcommand_name
parsed.fetch(::EacCli::Definition::SUBCOMMAND_NAME_ARG)
end
|
#subcommand_program ⇒ Object
109
110
111
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 109
def subcommand_program
[program_name, subcommand_name]
end
|
#subcommand_runner ⇒ Object
113
114
115
116
117
118
119
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 113
def subcommand_runner
@subcommand_runner ||= subcommand_class.create(
argv: subcommand_args,
program_name: subcommand_program,
parent: self
)
end
|
#subcommands? ⇒ Boolean
87
88
89
|
# File 'lib/eac_cli/runner_with/subcommands.rb', line 87
def subcommands?
self.class.runner_definition.subcommands?
end
|