Parent

CommandLine::Option

Constants

DEFAULT_OPTS

You get these without asking for them

FLAG_BASE_OPTS
GNU_OPT_EQ_ARG_RE
NON_POSIX_OPTION_RE

need to change this to support - and --

POSIX_OPTION_RE

OPTION_RE = /^-{1,2}(+w*)(.*)/ UNIX_OPT_EQ_ARG_RE = /^(-[a-zA-Z])=(.*)$/ UNIX_OPT_EQorSP_ARG_RE = /^(-[a-zA-Z])(=|s+)(.*)$/

PROPERTIES

Attributes

posix[RW]

Public Class Methods

new(*all) click to toggle source

Option.new(:flag, :posix => true, :names => %w(--opt))

TODO: Should we test and raise key is not one of :names, opt_description, ... This will prevent typos. Can users add properties to an Option that are their own?

# File lib/commandline/optionparser/option.rb, line 65
def initialize(*all)
  @posix = false

  raise(MissingPropertyError,
    "No properties specified for new #{self.class}.") if all.empty?

  until Hash === all[0]
    case (prop = all.shift)
    when :flag then @flag = true
    when :posix then @posix = true
    else 
      raise(InvalidPropertyError, "Unknown option setting '#{prop}'.")
    end
  end

  unknown_keys = all[0].keys.find_all { |k| !PROPERTIES.include?(k) && /^use?r_/ !~ "#{k}" }
  raise(InvalidPropertyError, 
    "The key #{unknown_keys.inspect} is not known and is not a user key.") unless 
      unknown_keys.empty?

  @flag = nil unless defined?(@flag)
  type = @flag.nil? ? :default : :flag
  merge_hash = 
    case type
    when :flag then FLAG_BASE_OPTS
    when :default then DEFAULT_OPTS
    else raise(InvalidConstructionError, 
      "Invalid arguments to Option.new. Must be a property hash with "+
      "keys [:names, :arity, :opt_description, :arg_description, "+
      ":opt_found, :opt_not_found] or "+
      "an option type [:flag, :default].")
    end

  @properties = {}.merge(merge_hash)
  all.each { |properties|
    raise(InvalidPropertyError, 
      "Don't understand argument of type '#{properties.class}' => "+
          "#{properties.inspect} passed to #{self.class}.new. Looking "+
          "for type Hash.") unless properties.kind_of?(Hash)

    @properties.merge!(properties)
  }
  
  @properties[:names] = [@properties[:names]].flatten.compact

  arg_arity = @properties[:arity]
  @properties[:arity] = [arg_arity, arg_arity] unless 
    arg_arity.kind_of?(Array)

  raise "Invalid value for arity '#{arg_arity}'." unless 
    arg_arity.kind_of?(Array) || arg_arity.kind_of?(Fixnum)

  raise(InvalidArgumentArityError,
    "Conflicting value given to new option: :flag "+
    "and :arity = #{@properties[:arity].inspect}.") if 
      :flag == type && [0,0] != @properties[:arity]

  names = @properties[:names]
  raise(MissingOptionNameError, 
    "Attempt to create an Option without :names defined.") if 
    names.nil? || names.empty?

  names.each { |name| check_option_name(name) }
  validate_arity @properties[:arity]

  create_opt_description if :flag == type
end

Public Instance Methods

check_option_name(name) click to toggle source
# File lib/commandline/optionparser/option.rb, line 143
def check_option_name(name)
  raise(InvalidOptionNameError, 
    "Option name '#{name}' contains invalid space.") if /\s+/.match(name)

  if @posix
    raise(InvalidOptionNameError, 
      "Option name '#{name}' is invalid.") unless POSIX_OPTION_RE.match(name)
  else
    raise(InvalidOptionNameError, 
      "Option name '#{name}' is invalid.") unless NON_POSIX_OPTION_RE.match(name)
  end
end
create_opt_description() click to toggle source
# File lib/commandline/optionparser/option.rb, line 133
def create_opt_description
  return if @properties.has_key?(:opt_description)
  word = @properties[:names].grep(/^--\w.+/)
  if word.empty?
    @properties[:opt_description] = ""
  else
    @properties[:opt_description] = "Sets #{word.first} to true."
  end
end
method_missing(sym, *args) click to toggle source
# File lib/commandline/optionparser/option.rb, line 172
def method_missing(sym, *args)
  raise "Unknown property '#{sym}' for option 
    #{@properties[:names].inspect unless @properties[:names].nil?}." unless 
      @properties.has_key?(sym) || PROPERTIES.include?(sym)
  @properties[sym, *args]
end
to_hash() click to toggle source
# File lib/commandline/optionparser/option.rb, line 179
def to_hash
  Marshal.load(Marshal.dump(@properties))
end
validate_arity(arity) click to toggle source
# File lib/commandline/optionparser/option.rb, line 156
def validate_arity(arity)
raise ":arity is nil" if arity.nil?
  min, max = *arity

  raise(InvalidArgumentArityError, "Minimum argument arity '#{min}' must be "+
    "greater than or equal to 0.") unless min >= 0
  raise(InvalidArgumentArityError, "Maximum argument arity '#{max}' must be "+
    "greater than or equal to -1.") if max < -1
  raise(InvalidArgumentArityError, "Maximum argument arity '#{max}' must be "+
    "greater than minimum arity '#{min}'.") if max < min && max != -1
  if @posix
    raise(InvalidArgumentArityError, "Posix options only support :arity "+
      "of [0,0] or [1,1].") unless ([0,0] == arity) || ([1,1] == arity)
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.