| Path: | optparse.rb |
| Last Update: | Sun Jun 01 17:54:45 -0500 2008 |
optparse.rb - command-line option analysis with the OptionParser class.
| Author: | Nobu Nakada |
| Documentation: | Nobu Nakada and Gavin Sinclair. |
See OptionParser for documentation.
| DecimalInteger | = | /\A[-+]?#{decimal}/io | Decimal integer format, to be converted to Integer. | |
| OctalInteger | = | /\A[-+]?(?:[0-7]+(?:_[0-7]+)*|0(?:#{binary}|#{hex}))/io | Ruby/C like octal/hexadecimal/binary integer format, to be converted to Integer. | |
| DecimalNumeric | = | floatpat # decimal integer is allowed as float also. | Decimal integer/float number format, to be converted to Integer for integer format, Float for float format. |
| banner= | -> | set_banner |
| for experimental cascading :-) | ||
| program_name= | -> | set_program_name |
| summary_width= | -> | set_summary_width |
| summary_indent= | -> | set_summary_indent |
Returns an incremented value of default according to arg.
# File optparse.rb, line 760 def self.inc(arg, default = nil) case arg when Integer arg.nonzero? when nil default.to_i + 1 end end
Initializes the instance and yields itself if called with a block.
| banner: | Banner message. |
| width: | Summary width. |
| indent: | Summary indent. |
# File optparse.rb, line 779 def initialize(banner = nil, width = 32, indent = ' ' * 4) @stack = [DefaultList, List.new, List.new] @program_name = nil @banner = banner @summary_width = width @summary_indent = indent @default_argv = ARGV add_officious yield self if block_given? end
Initializes a new instance and evaluates the optional block in context of the instance. Arguments args are passed to new, see there for description of parameters.
This method is deprecated, its behavior corresponds to the older new method.
# File optparse.rb, line 751 def self.with(*args, &block) opts = new(*args) opts.instance_eval(&block) opts end
Directs to accept specified class t. The argument string is passed to the block in which it should be converted to the desired class.
| t: | Argument class specifier, any object including Class. |
| pat: | Pattern for argument, defaults to t if it responds to match. |
accept(t, pat, &block)
# File optparse.rb, line 820 def accept(*args, &blk) top.accept(*args, &blk) end
# File optparse.rb, line 1178 def define(*opts, &block) top.append(*(sw = make_switch(opts, block))) sw[0] end
# File optparse.rb, line 1193 def define_head(*opts, &block) top.prepend(*(sw = make_switch(opts, block))) sw[0] end
# File optparse.rb, line 1207 def define_tail(*opts, &block) base.append(*(sw = make_switch(opts, block))) sw[0] end
Parses environment variable env or its uppercase with splitting like a shell.
env defaults to the basename of the program.
# File optparse.rb, line 1477 def environment(env = File.basename($0, '.*')) env = ENV[env] || ENV[env.upcase] or return parse(*Shellwords.shellwords(env)) end
Wrapper method for getopts.rb.
params = ARGV.getopts("ab:", "foo", "bar:")
# params[:a] = true # -a
# params[:b] = "1" # -b1
# params[:foo] = "1" # --foo
# params[:bar] = "x" # --bar x
# File optparse.rb, line 1368 def getopts(*args) argv = Array === args.first ? args.shift : default_argv single_options, *long_options = *args result = {} single_options.scan(/(.)(:)?/) do |opt, val| if val result[opt] = nil define("-#{opt} VAL") else result[opt] = false define("-#{opt}") end end if single_options long_options.each do |arg| opt, val = arg.split(':', 2) if val result[opt] = val.empty? ? nil : val define("--#{opt} VAL") else result[opt] = false define("--#{opt}") end end parse_in_order(argv, result.method(:[]=)) result end
Returns option summary string.
# File optparse.rb, line 972 def help; summarize(banner.to_s.sub(/\n?\z/, "\n")) end
Loads options from file names as filename. Does nothing when the file is not present. Returns whether successfully loaded.
filename defaults to basename of the program without suffix in a directory ~/.options.
# File optparse.rb, line 1457 def load(filename = nil) begin filename ||= File.expand_path(File.basename($0, '.*'), '~/.options') rescue return false end begin parse(*IO.readlines(filename).each {|s| s.chomp!}) true rescue Errno::ENOENT, Errno::ENOTDIR false end end
Creates an OptionParser::Switch from the parameters. The parsed argument value is passed to the given block, where it can be processed.
See at the beginning of OptionParser for some full examples.
opts can include the following elements:
:NONE, :REQUIRED, :OPTIONAL
Float, Time, Array
[:text, :binary, :auto]
%w[iso-2022-jp shift_jis euc-jp utf8 binary]
{ "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
"--switch=MANDATORY" or "--switch MANDATORY" "--switch[=OPTIONAL]" "--switch"
"-xMANDATORY" "-x[OPTIONAL]" "-x"
There is also a special form which matches character range (not full set of regural expression):
"-[a-z]MANDATORY" "-[a-z][OPTIONAL]" "-[a-z]"
"=MANDATORY" "=[OPTIONAL]"
"Run verbosely"
# File optparse.rb, line 1059 def make_switch(opts, block = nil) short, long, nolong, style, pattern, conv, not_pattern, not_conv, not_style = [], [], [] ldesc, sdesc, desc, arg = [], [], [] default_style = Switch::NoArgument default_pattern = nil klass = nil o = nil n, q, a = nil opts.each do |o| # argument class next if search(:atype, o) do |pat, c| klass = notwice(o, klass, 'type') if not_style and not_style != Switch::NoArgument not_pattern, not_conv = pat, c else default_pattern, conv = pat, c end end # directly specified pattern(any object possible to match) if !(String === o) and o.respond_to?(:match) pattern = notwice(o, pattern, 'pattern') conv = pattern.method(:convert).to_proc if pattern.respond_to?(:convert) next end # anything others case o when Proc, Method block = notwice(o, block, 'block') when Array, Hash case pattern when CompletingHash when nil pattern = CompletingHash.new conv = pattern.method(:convert).to_proc if pattern.respond_to?(:convert) else raise ArgumentError, "argument pattern given twice" end o.each {|(o, *v)| pattern[o] = v.fetch(0) {o}} when Module raise ArgumentError, "unsupported argument type: #{o}" when *ArgumentStyle.keys style = notwice(ArgumentStyle[o], style, 'style') when /^--no-([^\[\]=\s]*)(.+)?/ q, a = $1, $2 o = notwice(a ? Object : TrueClass, klass, 'type') not_pattern, not_conv = search(:atype, o) unless not_style not_style = (not_style || default_style).guess(arg = a) if a default_style = Switch::NoArgument default_pattern, conv = search(:atype, FalseClass) unless default_pattern ldesc << "--no-#{q}" long << 'no-' + (q = q.downcase) nolong << q when /^--\[no-\]([^\[\]=\s]*)(.+)?/ q, a = $1, $2 o = notwice(a ? Object : TrueClass, klass, 'type') if a default_style = default_style.guess(arg = a) default_pattern, conv = search(:atype, o) unless default_pattern end ldesc << "--[no-]#{q}" long << (o = q.downcase) not_pattern, not_conv = search(:atype, FalseClass) unless not_style not_style = Switch::NoArgument nolong << 'no-' + o when /^--([^\[\]=\s]*)(.+)?/ q, a = $1, $2 if a o = notwice(NilClass, klass, 'type') default_style = default_style.guess(arg = a) default_pattern, conv = search(:atype, o) unless default_pattern end ldesc << "--#{q}" long << (o = q.downcase) when /^-(\[\^?\]?(?:[^\\\]]|\\.)*\])(.+)?/ q, a = $1, $2 o = notwice(Object, klass, 'type') if a default_style = default_style.guess(arg = a) default_pattern, conv = search(:atype, o) unless default_pattern end sdesc << "-#{q}" short << Regexp.new(q) when /^-(.)(.+)?/ q, a = $1, $2 if a o = notwice(NilClass, klass, 'type') default_style = default_style.guess(arg = a) default_pattern, conv = search(:atype, o) unless default_pattern end sdesc << "-#{q}" short << q when /^=/ style = notwice(default_style.guess(arg = o), style, 'style') default_pattern, conv = search(:atype, Object) unless default_pattern else desc.push(o) end end default_pattern, conv = search(:atype, default_style.pattern) unless default_pattern if !(short.empty? and long.empty?) s = (style || default_style).new(pattern || default_pattern, conv, sdesc, ldesc, arg, desc, block) elsif !block raise ArgumentError, "no switch given" if style or pattern s = desc else short << pattern s = (style || default_style).new(pattern, conv, nil, nil, arg, desc, block) end return s, short, long, (not_style.new(not_pattern, not_conv, sdesc, ldesc, nil, desc, block) if not_style), nolong end
Add option switch and handler. See make_switch for an explanation of parameters.
# File optparse.rb, line 1187 def on(*opts, &block) define(*opts, &block) self end
Parses command line arguments argv in order when environment variable POSIXLY_CORRECT is set, and in permutation mode otherwise.
# File optparse.rb, line 1343 def parse(*argv) argv = argv[0].dup if argv.size == 1 and Array === argv[0] parse!(argv) end
Parses command line arguments argv in permutation mode and returns list of non-option arguments.
# File optparse.rb, line 1323 def permute(*argv) argv = argv[0].dup if argv.size == 1 and Array === argv[0] permute!(argv) end
Release code
# File optparse.rb, line 899 def release @release || (defined?(::Release) && ::Release) || (defined?(::RELEASE) && ::RELEASE) end
Puts option summary into to and returns to. Yields each line if a block is given.
| to: | Output destination, which must have method <<. Defaults to []. |
| width: | Width of left side, defaults to @summary_width. |
| max: | Maximum length allowed for left side, defaults to width - 1. |
| indent: | Indentation, defaults to @summary_indent. |
# File optparse.rb, line 964 def summarize(to = [], width = @summary_width, max = width - 1, indent = @summary_indent, &blk) visit(:summarize, {}, {}, width, max, indent, &(blk || proc {|l| to << l + $/})) to end
Terminates option parsing. Optional parameter arg is a string pushed back to be the first non-option argument.
# File optparse.rb, line 801 def terminate(arg = nil) self.class.terminate(arg) end
Returns version string from program_name, version and release.
# File optparse.rb, line 906 def ver if v = version str = "#{program_name} #{[v].join('.')}" str << " (#{v})" if v = release str end end
ruby-doc.org is a community service provided by James Britt and Happy Camper Studios, a Phoenix, Arizona, Ruby application development company.
Documentation content on ruby-doc.org is provided by remarkable members of the Ruby community.
For more information on the Ruby programming language, visit ruby-lang.org.
Want to help improve Ruby's API docs? See Ruby Documentation Guidelines.