module Rubikon::ArgumentVector

This module will extend the argument array passed to the application, usually ARGV. It provides functionality to parse Rubikon specific tokens from the strings contained in the argument list passed to the application.

@author Sebastian Staudt @since 0.6.0

Public Instance Methods

command!(commands) click to toggle source

Gets the command to use from the list of arguments passed to the application. The first argument matching a command name or alias will cause the corresponding command to be selected.

The command and all arguments equal to ‘–’ will be removed from the array.

@param [Hash<Symbol, Command>] commands A list of available commands @return [Command] The command found in the argument list @return [Fixnum] The position of the command in the argument list

# File lib/rubikon/argument_vector.rb, line 26
def command!(commands)
  command = nil
  command_index = 0
  each_with_index do |arg, i|
    break if arg == '--'

    command = commands[arg.to_sym]
    unless command.nil?
      command_index = i
      delete_at i
      break
    end
  end
  delete '--'

  command ||= commands[:__default]

  return command, command_index
end
expand!() click to toggle source

Turns arguments using a special syntax into arguments that are parseable.

Single character parameters may be joined together like ‘-dv’. This method will split them into separate parameters like ‘-d -v’.

Additionally a parameter argument may be attached to the parameter itself using ‘=’ like ‘–path=/tmp’. This method will also split them into ‘–path /tmp’.

# File lib/rubikon/argument_vector.rb, line 54
def expand!
  each_with_index do |arg, i|
    next if !arg.start_with?('-')
    self[i] = arg.split('=', 2)
    next if arg.start_with?('--')
    self[i] = arg[1..-1].split('').uniq.map { |a| '-' + a }
  end
  flatten!
end
params!(params, pos = 0) click to toggle source

Selects active parameters from a list of available parameters

For every option found in the argument list {#scoped_args!} is called to find the arguments for that option.

All parameters found will be removed from the array.

@param [Hash<Symbol, Parameter>] params A list of available parameters @param [Fixnum] pos The position of the first argument that should be

checked. All arguments ahead of that position will be skipped.

@return [Array<Parameter>] Parameters called from the given argument list @see scoped_args

# File lib/rubikon/argument_vector.rb, line 76
def params!(params, pos = 0)
  active_params = []
  to_delete     = []
  each_with_index do |arg, i|
    next if i < pos || arg.nil? || !arg.start_with?('-')

    param = params[(arg.start_with?('--') ? arg[2..-1] : arg[1..1]).to_sym]
    unless param.nil?
      to_delete << i
      scoped_args! param, i + 1 if param.is_a? Option
      active_params << param
    end
  end

  to_delete.reverse.each { |i| delete_at i }

  active_params
end
scoped_args!(has_args, pos = 0) click to toggle source

Gets all arguments passed to a specific scope, i.e. a command or an option.

All arguments in the scope will be removed from the array.

@param [HasArguments] has_args @param [Fixnum] pos The position of the first argument that should be

checked. All arguments ahead of that position will be skipped.
# File lib/rubikon/argument_vector.rb, line 103
def scoped_args!(has_args, pos = 0)
  to_delete = []

  each_with_index do |arg, i|
    next if i < pos
    break if arg.start_with?('-') || !has_args.send(:more_args?)

    to_delete << i
    has_args.send(:<<, arg)
  end

  to_delete.reverse.each { |i| delete_at i }
end