class Dracula::Command

Constants

Desc

Attributes

desc[R]
flags[R]
long_desc[R]
method_name[R]
options[R]

Public Class Methods

new(klass, method_name, desc, long_desc, options) click to toggle source
# File lib/dracula/command.rb, line 13
def initialize(klass, method_name, desc, long_desc, options)
  @klass = klass
  @method_name = method_name
  @desc = desc
  @long_desc = long_desc
  @options = options || []
end

Public Instance Methods

arguments() click to toggle source
# File lib/dracula/command.rb, line 37
def arguments
  @klass.instance_method(@method_name).parameters.select { |p| p[0] == :req }.map { |p| p[1].to_s.upcase }
end
description() click to toggle source
# File lib/dracula/command.rb, line 33
def description
  desc.description
end
full_name() click to toggle source
# File lib/dracula/command.rb, line 25
def full_name
  "#{prefix}#{name}"
end
help() click to toggle source
# File lib/dracula/command.rb, line 41
def help
  CommandHelp.new(self).show
end
name() click to toggle source
# File lib/dracula/command.rb, line 29
def name
  desc.name
end
prefix() click to toggle source
# File lib/dracula/command.rb, line 21
def prefix
  @klass.namespace.prefix
end
run(params) click to toggle source
# File lib/dracula/command.rb, line 45
def run(params)
  args = params.take_while { |p| p[0] != "-" }

  if args.count < arguments.count
    puts Dracula::UI.error("Missing arguments")
    puts ""
    help
    exit(1)
  end

  if args.count > arguments.count
    puts Dracula::UI.error("Too many arguments")
    puts ""
    help
    exit(1)
  end

  parsed_flags = parse_flags(params.drop_while { |p| p[0] != "-" })

  missing_flags = missing_required_flags(parsed_flags)

  unless missing_flags.empty?
    puts Dracula::UI.error("Missing required Parameter: #{missing_flags.first.banner}")
    puts ""
    help
    exit(1)
  end

  @klass.new(parsed_flags).public_send(method_name, *args)
rescue OptionParser::MissingArgument => ex
  flag = flags.find { |f| "--#{f.name}" == ex.args.first }

  puts Dracula::UI.error("Missing flag parameter: #{flag.banner}")
  puts ""
  help
  exit(1)
rescue OptionParser::InvalidOption => ex
  puts Dracula::UI.error("Unrecognized Parameter: #{ex.args.first}")
  puts ""
  help
  exit(1)
end

Private Instance Methods

missing_required_flags(parsed_flags) click to toggle source
# File lib/dracula/command.rb, line 90
def missing_required_flags(parsed_flags)
  flags.select(&:required?).reject do |flag|
    parsed_flags.keys.include?(flag.name)
  end
end
parse_flags(args) click to toggle source
# File lib/dracula/command.rb, line 96
def parse_flags(args)
  parsed_flags = {}

  # set default values
  flags.each do |flag|
    if flag.has_default_value?
      parsed_flags[flag.name] = flag.default_value
    end
  end

  opt_parser = OptionParser.new do |opts|
    flags.each do |flag|
      if flag.boolean?
        short = "-#{flag.short_name}"
        long  = "--#{flag.name}"

        opts.on(short, long, flag.type) do
          parsed_flags[flag.name] = true
        end
      else
        short = "-#{flag.short_name}"
        long  = "--#{flag.name} VALUE"

        opts.on(short, long, flag.type) do |value|
          parsed_flags[flag.name] = value
        end
      end
    end
  end

  opt_parser.parse!(args)

  parsed_flags
end