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



62
63
64
65
66
67
# File 'lib/eac_cli/runner_with/subcommands.rb', line 62

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

.runner?(object) ⇒ Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/eac_cli/runner_with/subcommands.rb', line 12

def runner?(object)
  ::EacCli::Runner.runner?(object)
end

.subcommands_from_module(a_module) ⇒ Hash<String, EacCli::Runner>

Returns:



17
18
19
20
21
22
# File 'lib/eac_cli/runner_with/subcommands.rb', line 17

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_subcommandsObject



33
34
35
# File 'lib/eac_cli/runner_with/subcommands.rb', line 33

def available_subcommands
  @available_subcommands ||= available_subcommands_auto.merge(available_subcommands_extra)
end

#available_subcommands_autoHash<String, EacCli::Runner>

Returns:



38
39
40
# File 'lib/eac_cli/runner_with/subcommands.rb', line 38

def available_subcommands_auto
  ::EacCli::RunnerWith::Subcommands.subcommands_from_module(self.class)
end

#available_subcommands_extraObject



42
43
44
45
46
47
48
# File 'lib/eac_cli/runner_with/subcommands.rb', line 42

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_sObject



50
51
52
# File 'lib/eac_cli/runner_with/subcommands.rb', line 50

def available_subcommands_to_s
  available_subcommands.keys.sort.join(', ')
end

#help_extra_textHash<String, Enumerable<String>]

Returns Hash<String, Enumerable<String>].

Returns:

  • (Hash<String, Enumerable<String>])

    Hash<String, Enumerable<String>]



55
56
57
58
59
60
# File 'lib/eac_cli/runner_with/subcommands.rb', line 55

def help_extra_text
  {
    'Subcommands' =>
    available_subcommands.keys.sort
  }
end

#respond_to_missing?(method_name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/eac_cli/runner_with/subcommands.rb', line 69

def respond_to_missing?(method_name, include_private = false)
  run_with_subcommand_alias_run?(method_name) || super
end

#run_subcommand?Boolean

Returns:

  • (Boolean)


93
94
95
# File 'lib/eac_cli/runner_with/subcommands.rb', line 93

def run_subcommand?
  subcommand_name.present?
end

#run_with_subcommandObject



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/eac_cli/runner_with/subcommands.rb', line 73

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

Returns:

  • (Boolean)


85
86
87
# File 'lib/eac_cli/runner_with/subcommands.rb', line 85

def run_with_subcommand_alias_run?(method_name)
  subcommands? && method_name.to_sym == :run
end

#run_without_subcommandObject



89
90
91
# File 'lib/eac_cli/runner_with/subcommands.rb', line 89

def run_without_subcommand
  "Method #{__method__} should be overrided in #{self.class.name}"
end

#subcommand_argsObject



101
102
103
# File 'lib/eac_cli/runner_with/subcommands.rb', line 101

def subcommand_args
  parsed.fetch(::EacCli::Definition::SUBCOMMAND_ARGS_ARG)
end

#subcommand_classObject



105
106
107
108
109
110
111
112
113
# File 'lib/eac_cli/runner_with/subcommands.rb', line 105

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_nameObject



115
116
117
# File 'lib/eac_cli/runner_with/subcommands.rb', line 115

def subcommand_name
  parsed.fetch(::EacCli::Definition::SUBCOMMAND_NAME_ARG)
end

#subcommand_programObject



119
120
121
# File 'lib/eac_cli/runner_with/subcommands.rb', line 119

def subcommand_program
  [program_name, subcommand_name]
end

#subcommand_runnerObject



123
124
125
126
127
128
129
# File 'lib/eac_cli/runner_with/subcommands.rb', line 123

def subcommand_runner
  @subcommand_runner ||= subcommand_class.create(
    argv: subcommand_args,
    program_name: subcommand_program,
    parent: self
  )
end

#subcommands?Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/eac_cli/runner_with/subcommands.rb', line 97

def subcommands?
  self.class.runner_definition.subcommands?
end