class Kozo::CLI

Attributes

args[R]
command_args[R]
parser[R]

Public Class Methods

new(args) click to toggle source
# File lib/kozo/cli.rb, line 9
def initialize(args)
  @parser = OptionParser.new("#{File.basename($PROGRAM_NAME)} [global options] command [command options]") do |o|
    o.on("Global options:")
    o.on("-v", "--verbose", "Turn on verbose logging")
    o.on("-h", "--help", "Display this message") { usage }
    o.separator("\n")
    o.on("Commands:")
    commands.each { |(name, description)| o.on("    #{name}#{description.rjust(48)}") }
    o.separator("\n")
  end

  @args = args
  @command_args = []

  parse!
end

Public Instance Methods

parse!() click to toggle source
# File lib/kozo/cli.rb, line 26
def parse!
  # Parse command line arguments (in order) and extract non-option arguments
  # (unrecognized option values). Raise for invalid option arguments (unrecognized
  # option keys). "--foo FOO --bar BAR" will result in "--foo" and "FOO" being parsed
  # correctly, "--bar" and "BAR" will be extracted.
  parser.order!(args, into: Kozo.options) { |value| command_args << value }
rescue OptionParser::InvalidOption => e
  @command_args += e.args
  retry
end
start() click to toggle source
# File lib/kozo/cli.rb, line 37
def start
  command = command_args.shift

  return usage unless command

  klass = "Kozo::Commands::#{command.camelize}".safe_constantize

  return usage(tail: "#{File.basename($PROGRAM_NAME)}: unknown command: #{command}") unless klass

  klass
    .new(command_args)
    .start
end

Private Instance Methods

commands() click to toggle source
# File lib/kozo/cli.rb, line 60
def commands
  Commands::Base.descendants.map { |k| [k.name.demodulize.underscore, k.description] }
end
usage(code: 1, tail: nil) click to toggle source
# File lib/kozo/cli.rb, line 53
def usage(code: 1, tail: nil)
  puts parser.to_s
  puts tail if tail

  exit code
end