Method: Optimist::Parser#opt
- Defined in:
- lib/optimist.rb
#opt(name, desc = "", opts = {}, &b) ⇒ Object
Define an option. name is the option name, a unique identifier for the option that you will use internally, which should be a symbol or a string. desc is a string description which will be displayed in help messages.
Takes the following optional arguments:
:long-
Specify the long form of the argument, i.e. the form with two dashes. If unspecified, will be automatically derived based on the argument name by turning the
nameoption into a string, and replacing any _’s by -‘s. :short-
Specify the short form of the argument, i.e. the form with one dash. If unspecified, will be automatically derived from
name. Use :none: to not have a short value. :type-
Require that the argument take a parameter or parameters of type
type. For a single parameter, the value can be a member ofSINGLE_ARG_TYPES, or a corresponding Ruby class (e.g.Integerfor:int). For multiple-argument parameters, the value can be any member ofMULTI_ARG_TYPESconstant. If unset, the default argument type is:flag, meaning that the argument does not take a parameter. The specification of:typeis not necessary if a:defaultis given. :default-
Set the default value for an argument. Without a default value, the hash returned by #parse (and thus Optimist::options) will have a
nilvalue for this key unless the argument is given on the commandline. The argument type is derived automatically from the class of the default value given, so specifying a:typeis not necessary if a:defaultis given. (But see below for an important caveat when:multi: is specified too.) If the argument is a flag, and the default is set totrue, then if it is specified on the the commandline the value will befalse. :required-
If set to
true, the argument must be provided on the commandline. :multi-
If set to
true, allows multiple occurrences of the option on the commandline. Otherwise, only a single instance of the option is allowed. (Note that this is different from taking multiple parameters. See below.) :permitted-
Specify an Array of permitted values for an option. If the user provides a value outside this list, an error is thrown.
Note that there are two types of argument multiplicity: an argument can take multiple values, e.g. “–arg 1 2 3”. An argument can also be allowed to occur multiple times, e.g. “–arg 1 –arg 2”.
Arguments that take multiple values should have a :type parameter drawn from MULTI_ARG_TYPES (e.g. :strings), or a :default: value of an array of the correct type (e.g. [String]). The value of this argument will be an array of the parameters on the commandline.
Arguments that can occur multiple times should be marked with :multi => true. The value of this argument will also be an array. In contrast with regular non-multi options, if not specified on the commandline, the default value will be [], not nil.
These two attributes can be combined (e.g. :type => :strings, :multi => true), in which case the value of the argument will be an array of arrays.
There’s one ambiguous case to be aware of: when :multi: is true and a :default is set to an array (of something), it’s ambiguous whether this is a multi-value argument as well as a multi-occurrence argument. In thise case, Optimist assumes that it’s not a multi-value argument. If you want a multi-value, multi-occurrence argument with a default value, you must specify :type as well.
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/optimist.rb', line 204 def opt(name, desc = "", opts = {}, &b) opts[:callback] ||= b if block_given? opts[:desc] ||= desc o = Option.create(name, desc, opts) raise ArgumentError, "you already have an argument named '#{name}'" if @specs.member? o.name o.long.names.each do |lng| raise ArgumentError, "long option name #{lng.inspect} is already taken; please specify a (different) :long/:alt" if @long[lng] @long[lng] = o.name end o.short.chars.each do |short| raise ArgumentError, "short option name #{short.inspect} is already taken; please specify a (different) :short" if @short[short] @short[short] = o.name end raise ArgumentError, "permitted values for option #{o.long.long.inspect} must be either nil, Range, Regexp or an Array;" unless o.permitted_type_valid? @specs[o.name] = o @order << [:opt, o.name] end |