Class: CommandLine::Option
- Inherits:
-
Object
- Object
- CommandLine::Option
- Defined in:
- lib/commandline/optionparser/option.rb
Defined Under Namespace
Classes: InvalidArgumentArityError, InvalidArgumentError, InvalidConstructionError, InvalidOptionNameError, InvalidPropertyError, MissingOptionNameError, MissingPropertyError, OptionError
Constant Summary collapse
- GENERAL_OPT_EQ_ARG_RE =
:nodoc:
/^(-{1,2}[a-zA-Z]+[-_a-zA-Z0-9]*)=(.*)$/
- GNU_OPT_EQ_ARG_RE =
/^(--[a-zA-Z]+[-_a-zA-Z0-9]*)=(.*)$/
- POSIX_OPTION_RE =
OPTION_RE = /^-1,2([a-zA-Z]+w*)(.*)/ UNIX_OPT_EQ_ARG_RE = /^(-[a-zA-Z])=(.*)$/ UNIX_OPT_EQorSP_ARG_RE = /^(-[a-zA-Z])(=|s+)(.*)$/
/^-[a-zA-Z]?$/
- NON_POSIX_OPTION_RE =
need to change this to support - and –
/^(-|-{1,2}[a-zA-Z_]+[-_a-zA-Z0-9]*)/
- PROPERTIES =
[ :names, :arity, :opt_description, :arg_description, :opt_found, :opt_not_found, :posix ]
- FLAG_BASE_OPTS =
{ :arity => [0,0], # :opt_description => nil, :arg_description => "", :opt_found => true, :opt_not_found => false }
- DEFAULT_OPTS =
You get these without asking for them
{ :arity => [1,1], :opt_description => "", :arg_description => "", :opt_found => true, #TODO: Should be get_args? :opt_not_found => false }
Instance Attribute Summary collapse
-
#posix ⇒ Object
Returns the value of attribute posix.
Instance Method Summary collapse
- #check_option_name(name) ⇒ Object
- #create_opt_description ⇒ Object
-
#initialize(*all) ⇒ Option
constructor
Option.new(:flag, :posix => true, :names => %w(–opt)).
- #method_missing(sym, *args) ⇒ Object
- #to_hash ⇒ Object
- #validate_arity(arity) ⇒ Object
Constructor Details
#initialize(*all) ⇒ Option
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?
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# 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 |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(sym, *args) ⇒ Object
172 173 174 175 176 177 |
# 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 |
Instance Attribute Details
#posix ⇒ Object
Returns the value of attribute posix.
26 27 28 |
# File 'lib/commandline/optionparser/option.rb', line 26 def posix @posix end |
Instance Method Details
#check_option_name(name) ⇒ Object
143 144 145 146 147 148 149 150 151 152 153 154 |
# 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 ⇒ Object
133 134 135 136 137 138 139 140 141 |
# 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 |
#to_hash ⇒ Object
179 180 181 |
# File 'lib/commandline/optionparser/option.rb', line 179 def to_hash Marshal.load(Marshal.dump(@properties)) end |
#validate_arity(arity) ⇒ Object
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
# 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 |