class Convoy::OptionParser

Attributes

configuration[R]
setup[R]

Public Class Methods

new(configuration, setup) click to toggle source
# File lib/convoy/option_parser.rb, line 5
def initialize(configuration, setup)
    @configuration = configuration
    @setup         = setup
end

Public Instance Methods

parse(cli_options) click to toggle source
# File lib/convoy/option_parser.rb, line 10
def parse(cli_options)
    options = init_invoked_options_hash
    parse_global_options(cli_options, options[:global][:options])
    parse_command_options(cli_options, [], options[:global][:commands])

    [options, arguments_from(cli_options)]
end

Private Instance Methods

add_option_conflicts_to(parser, context = []) click to toggle source
# File lib/convoy/option_parser.rb, line 69
def add_option_conflicts_to(parser, context = [])
    conflicting_options_for_context = setup.conflicting_options_for(context)
    conflicting_options_for_context.keys.each do |option_name|
        conflict_list = [option_name] + conflicting_options_for_context[option_name]
        conflict_list.each do |option|
            raise Convoy::ClientError.new("Conflict defined with option '#{option}', but this option does not exist, perhaps it is a spelling error.") unless option_exists?(parser, option)
        end
        parser.conflicts *conflict_list
    end
    parser
end
add_setup_options_to(parser, context = []) click to toggle source
# File lib/convoy/option_parser.rb, line 61
def add_setup_options_to(parser, context = [])
    setup.options_for(context).each do |name, opts|
        parser.opt name, opts[:desc] || "", opts.dup #have to make sure to dup here, otherwise opts might get stuff added to it and it
        #may cause problems later, e.g. adds default value and when parsed again trollop barfs
    end
    parser
end
arguments_from(cli_options) click to toggle source
# File lib/convoy/option_parser.rb, line 151
def arguments_from(cli_options)
    cli_options
end
cli_option_is_a_command?(cli_options, context) click to toggle source
# File lib/convoy/option_parser.rb, line 131
def cli_option_is_a_command?(cli_options, context)
    cli_options.size > 0 && setup.command_names_for(context).include?(cli_options[0].to_sym)
end
command_name_from(cli_options) click to toggle source
# File lib/convoy/option_parser.rb, line 147
def command_name_from(cli_options)
    cli_options.shift.to_sym
end
config_has_value_for_context?(option, context) click to toggle source
# File lib/convoy/option_parser.rb, line 104
def config_has_value_for_context?(option, context)
    relevant_config_hash = config_hash_for_context(context)
    relevant_config_hash[:options].include?(option)
end
config_hash_for_context(context) click to toggle source
# File lib/convoy/option_parser.rb, line 114
def config_hash_for_context(context)
    relevant_config_hash = configuration.global
    context.each do |command_name|
        command_name         = command_name.to_sym
        relevant_config_hash = relevant_config_hash[:commands][command_name]
        relevant_config_hash = ensure_config_hash_has_options_and_commands(relevant_config_hash)
    end
    relevant_config_hash
end
config_value_for_context(option, context) click to toggle source
# File lib/convoy/option_parser.rb, line 109
def config_value_for_context(option, context)
    relevant_config_hash = config_hash_for_context(context)
    relevant_config_hash[:options][option]
end
default_option_values_from_config_for(parser, context) click to toggle source
# File lib/convoy/option_parser.rb, line 85
def default_option_values_from_config_for(parser, context)
    unless configuration.empty?
        parser.specs.each do |sym, opts|
            if config_has_value_for_context?(sym, context)
                default        = config_value_for_context(sym, context)
                opts[:default] = default
                if opts[:multi] && default.nil?
                    opts[:default] = [] # multi arguments default to [], not nil
                elsif opts[:multi] && !default.kind_of?(Array)
                    opts[:default] = [default]
                else
                    opts[:default] = default
                end
            end
        end
    end
    parser
end
ensure_config_hash_has_options_and_commands(relevant_config_hash) click to toggle source
# File lib/convoy/option_parser.rb, line 124
def ensure_config_hash_has_options_and_commands(relevant_config_hash)
    relevant_config_hash            ||= {}
    relevant_config_hash[:commands] ||= {}
    relevant_config_hash[:options]  ||= {}
    relevant_config_hash
end
init_invoked_options_hash() click to toggle source
# File lib/convoy/option_parser.rb, line 20
def init_invoked_options_hash
    {
        :global => {
            :options  => {},
            :commands => {}
        }
    }
end
init_parser(stop_words) click to toggle source
# File lib/convoy/option_parser.rb, line 135
def init_parser(stop_words)
    Trollop::Parser.new.tap do |parser|
        parser.stop_on(stop_words) # make sure we halt parsing if we see a command
    end
end
option_exists?(parser, option) click to toggle source
# File lib/convoy/option_parser.rb, line 81
def option_exists?(parser, option)
    parser.specs.keys.include?(option)
end
parse_command_options(cli_options, context, options) click to toggle source
# File lib/convoy/option_parser.rb, line 34
def parse_command_options(cli_options, context, options)
    unless cli_option_is_a_command?(cli_options, context)
        options
    else
        command = command_name_from(cli_options)
        context << command
        current_options             = parse_options(cli_options, context)
        options[command]            = {}
        options[command][:options]  = current_options
        options[command][:commands] = {}
        parse_command_options(cli_options, context, options[command][:commands])
    end
end
parse_global_options(cli_options, options) click to toggle source
# File lib/convoy/option_parser.rb, line 29
def parse_global_options(cli_options, options)
    context = []
    options.merge!(parse_options(cli_options, context))
end
parse_options(cli_options, context = []) click to toggle source
# File lib/convoy/option_parser.rb, line 48
def parse_options(cli_options, context = [])
    stop_words = setup.command_names_for(context).map(&:to_s)
    parser     = init_parser(stop_words)
    parser     = add_setup_options_to(parser, context)
    parser     = add_option_conflicts_to(parser, context)
    parser     = default_option_values_from_config_for(parser, context)
    parser.version(setup.version) #set the version if it was provided
    parser.help_formatter(Convoy::Formatter::DefaultHelpFormatter.new(setup, context))
    parsed_options = parse_options_string(parser, cli_options)
    Convoy::OptionDependencyValidator.for(parser).validate(parsed_options, setup.dependencies_for(context))
    Convoy::Validator.for(parser).validate(parsed_options, setup.validations_for(context))
end
parse_options_string(parser, cli_options) click to toggle source
# File lib/convoy/option_parser.rb, line 141
def parse_options_string(parser, cli_options)
    Trollop::with_standard_exception_handling(parser) do
        parser.parse(cli_options)
    end
end