class Bosh::Cli::CommandHandler

Attributes

desc[R]

@return [String]

keywords[R]

@return [Array]

options[R]
runner[RW]

@return [Bosh::Cli::Runner]

usage[R]

@return [String]

Public Class Methods

new(klass, method, usage, desc, options = []) click to toggle source

@param [Class] klass @param [UnboundMethod] method @param [String] usage @param [String] desc

# File lib/cli/command_handler.rb, line 22
def initialize(klass, method, usage, desc, options = [])
  @klass = klass
  @method = method
  @usage = usage
  @desc = desc

  @options = options

  @hints = []
  @keywords = []

  @parser = OptionParser.new
  @runner = nil
  extract_keywords
end

Public Instance Methods

has_options?() click to toggle source
# File lib/cli/command_handler.rb, line 83
def has_options?
  @options.size > 0
end
options_summary() click to toggle source
# File lib/cli/command_handler.rb, line 87
def options_summary
  result = []
  padding = 5

  margin = @options.inject(0) do |max, (name, _)|
    [max, name.size].max
  end

  @options.each do |(name, desc)|
    desc = desc.select { |word| word.is_a?(String) }
    column_width = terminal_width - padding - margin

    result << name.ljust(margin).make_yellow + " " +
      desc.join(" ").columnize(
        column_width, [margin + 1, name.size + 1].max)
  end

  result.join("\n")
end
parse_options(args) click to toggle source

@param [Array] args Arguments to parse

# File lib/cli/command_handler.rb, line 108
def parse_options(args)
  @parser.parse!(args)
end
run(args, extra_options = {}) click to toggle source

Run handler with provided args @param [Array] args @return [Integer] Command exit code

# File lib/cli/command_handler.rb, line 41
def run(args, extra_options = {})
  command = @klass.new(@runner)

  @options.each do |(name, arguments)|
    @parser.on(name, *arguments) do |value|
      command.add_option(format_option_name(name), value)
    end
  end

  extra_options.each_pair do |name, value|
    command.add_option(format_option_name(name), value)
  end

  args = parse_options(args)

  begin
    command.send(@method.name, *args)
    [command.exit_code, command.info]
  rescue ArgumentError => ex
    err("#{ex.message}.\n\nUsage: #{usage_with_params}")
  end
end
usage_with_params() click to toggle source
# File lib/cli/command_handler.rb, line 64
def usage_with_params
  result = [@usage]
  @method.parameters.each do |parameter|
    next if parameter.size < 2
    kind, name = parameter
    if kind == :opt
      result << "[<#{name}>]"
    elsif kind == :req
      result << "<#{name}>"
    end
  end

  @options.each do |(name, _)|
    result << "[#{name}]"
  end

  result.join(" ")
end

Private Instance Methods

extract_keywords() click to toggle source
# File lib/cli/command_handler.rb, line 125
def extract_keywords
  words = @usage.split(/\s+/)
  words.each do |word|
    break unless word.match(/^[a-z]/i)
    @keywords << word
  end
end
format_option_name(name) click to toggle source
# File lib/cli/command_handler.rb, line 114
def format_option_name(name)
  case name
  when Symbol
    name
  when String
    name.split(/\s+/)[0].gsub(/^-*/, "").gsub("-", "_").to_sym
  else
    name
  end
end