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