Spec-Zone.ru › Ruby 2.2

класс OptionParser

Родитель:
Объект

OptionParser

Введение

OptionParser — это класс для анализа командной строки. Он значительно более продвинутый, но и проще в использовании, чем GetoptLong, и представляет собой более ориентированное на Ruby решение.

Возможности

  1. Спецификация аргументов и код для их обработки написаны в одном месте.

  2. Он может выводить сводку опций; вам не нужно отдельно поддерживать эту строку.

  3. Необязательные и обязательные аргументы задаются очень удобно.

  4. Аргументы могут быть автоматически преобразованы в указанный класс.

  5. Аргументы могут быть ограничены определённым набором.

Все эти возможности продемонстрированы в примерах ниже. Подробная документация см. в make_switch.

Минимальный пример

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
    options[:verbose] = v
  end
end.parse!

p options
p ARGV

Генерация справки

OptionParser может использоваться для автоматической генерации справки для написанных вами команд:

require 'optparse'

Options = Struct.new(:name)

class Parser
  def self.parse(options)
    args = Options.new("world")

    opt_parser = OptionParser.new do |opts|
      opts.banner = "Usage: example.rb [options]"

      opts.on("-nNAME", "--name=NAME", "Name to say hello to") do |n|
        args.name = n
      end

      opts.on("-h", "--help", "Prints this help") do
        puts opts
        exit
      end
    end

    opt_parser.parse!(options)
    return args
  end
end
options = Parser.parse %w[--help]

#=>
   # Usage: example.rb [options]
   #     -n, --name=NAME                  Name to say hello to
   #     -h, --help                       Prints this help#

Полный пример

Следующий пример — полная программа Ruby. Вы можете запустить её и увидеть эффект задания различных опций. Это, вероятно, лучший способ узнать о возможностях optparse.

require 'optparse'
require 'optparse/time'
require 'ostruct'
require 'pp'

class OptparseExample

  CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
  CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }

  #
  # Return a structure describing the options.
  #
  def self.parse(args)
    # The options specified on the command line will be collected in *options*.
    # We set default values here.
    options = OpenStruct.new
    options.library = []
    options.inplace = false
    options.encoding = "utf8"
    options.transfer_type = :auto
    options.verbose = false

    opt_parser = OptionParser.new do |opts|
      opts.banner = "Usage: example.rb [options]"

      opts.separator ""
      opts.separator "Specific options:"

      # Mandatory argument.
      opts.on("-r", "--require LIBRARY",
              "Require the LIBRARY before executing your script") do |lib|
        options.library << lib
      end

      # Optional argument; multi-line description.
      opts.on("-i", "--inplace [EXTENSION]",
              "Edit ARGV files in place",
              "  (make backup if EXTENSION supplied)") do |ext|
        options.inplace = true
        options.extension = ext || ''
        options.extension.sub!(/\A\.?(?=.)/, ".")  # Ensure extension begins with dot.
      end

      # Cast 'delay' argument to a Float.
      opts.on("--delay N", Float, "Delay N seconds before executing") do |n|
        options.delay = n
      end

      # Cast 'time' argument to a Time object.
      opts.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
        options.time = time
      end

      # Cast to octal integer.
      opts.on("-F", "--irs [OCTAL]", OptionParser::OctalInteger,
              "Specify record separator (default \\0)") do |rs|
        options.record_separator = rs
      end

      # List of arguments.
      opts.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
        options.list = list
      end

      # Keyword completion.  We are specifying a specific set of arguments (CODES
      # and CODE_ALIASES - notice the latter is a Hash), and the user may provide
      # the shortest unambiguous text.
      code_list = (CODE_ALIASES.keys + CODES).join(',')
      opts.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
              "  (#{code_list})") do |encoding|
        options.encoding = encoding
      end

      # Optional argument with keyword completion.
      opts.on("--type [TYPE]", [:text, :binary, :auto],
              "Select transfer type (text, binary, auto)") do |t|
        options.transfer_type = t
      end

      # Boolean switch.
      opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
        options.verbose = v
      end

      opts.separator ""
      opts.separator "Common options:"

      # No argument, shows at tail.  This will print an options summary.
      # Try it and see!
      opts.on_tail("-h", "--help", "Show this message") do
        puts opts
        exit
      end

      # Another typical switch to print the version.
      opts.on_tail("--version", "Show version") do
        puts ::Version.join('.')
        exit
      end
    end

    opt_parser.parse!(args)
    options
  end  # parse()

end  # class OptparseExample

options = OptparseExample.parse(ARGV)
pp options
pp ARGV

Оболочка Завершение

Для современных оболочек (например, bash, zsh и т. д.) можно использовать завершение командной строки для опций.

Дополнительная документация

Приведённых выше примеров должно быть достаточно, чтобы понять, как использовать этот класс. Если у вас есть вопросы, отправьте запрос на bugs.ruby-lang.org.

Константы

DecimalInteger

Формат десятичного целого числа, подлежащий преобразованию в целое число.

DecimalNumeric

Формат десятичного целого/вещественного числа, подлежащий преобразованию в целое число для целочисленного формата, вещественное число для формата с плавающей точкой.

OctalInteger

Формат октального/шестнадцатеричного/двоичного целого числа в стиле Ruby/C, подлежащий преобразованию в целое число.

Атрибуты

banner[W]

Заголовок, предшествующий описанию.

default_argv[RW]

Строки, подлежащие парсингу по умолчанию.

program_name[W]

Имя программы, отображаемое в сообщении об ошибке и в заголовке по умолчанию, по умолчанию — $0.

release[W]

Код версии

set_banner[W]

Заголовок, предшествующий описанию.

set_program_name[W]

Имя программы, отображаемое в сообщении об ошибке и в заголовке по умолчанию, по умолчанию — $0.

set_summary_indent[RW]

Отступ для сводки. Должен быть строкой (или иметь метод + String).

set_summary_width[RW]

Ширина для части списка опций в сводке. Должен быть числовым.

summary_indent[RW]

Отступ для сводки. Должен быть строкой (или иметь метод + String).

summary_width[RW]

Ширина для части списка опций в сводке. Должен быть числовым.

version[W]

Версия

Публичные методы класса

accept(*args, &blk) Показать исходный код
# File lib/optparse.rb, line 954
def self.accept(*args, &blk) top.accept(*args, &blk) end

См. accept.

each_const(path, base = ::Object) Показать исходный код
# File lib/optparse/version.rb, line 49
def each_const(path, base = ::Object)
  path.split(/::|\//).inject(base) do |klass, name|
    raise NameError, path unless Module === klass
    klass.constants.grep(/#{name}/i) do |c|
      klass.const_defined?(c) or next
      klass.const_get(c)
    end
  end
end
getopts(*args) Показать исходный код
# File lib/optparse.rb, line 1546
def self.getopts(*args)
  new.getopts(*args)
end

См. getopts.

inc(arg, default = nil) Показать исходный код
# File lib/optparse.rb, line 890
def self.inc(arg, default = nil)
  case arg
  when Integer
    arg.nonzero?
  when nil
    default.to_i + 1
  end
end

Возвращает увеличенное значение default согласно arg.

new(banner = nil, width = 32, indent = ' ' * 4) { |self| ... } Показать исходный код
# File lib/optparse.rb, line 909
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

Инициализирует экземпляр и возвращает его, если вызван с блоком.

banner

Сообщение заголовка.

width

Ширина сводки.

indent

Отступ сводки.

reject(*args, &blk) Показать исходный код
# File lib/optparse.rb, line 967
def self.reject(*args, &blk) top.reject(*args, &blk) end

См. reject.

search_const(klass, name) { |klass, cname, const| ... } Показать исходный код
# File lib/optparse/version.rb, line 59
def search_const(klass, name)
  klasses = [klass]
  while klass = klasses.shift
    klass.constants.each do |cname|
      klass.const_defined?(cname) or next
      const = klass.const_get(cname)
      yield klass, cname, const if name === cname
      klasses << const if Module === const and const != ::Object
    end
  end
end
show_version(*pkgs) Показать исходный код
# File lib/optparse/version.rb, line 4
def show_version(*pkgs)
  progname = ARGV.options.program_name
  result = false
  show = proc do |klass, cname, version|
    str = "#{progname}"
    unless klass == ::Object and cname == :VERSION
      version = version.join(".") if Array === version
      str << ": #{klass}" unless klass == Object
      str << " version #{version}"
    end
    [:Release, :RELEASE].find do |rel|
      if klass.const_defined?(rel)
        str << " (#{klass.const_get(rel)})"
      end
    end
    puts str
    result = true
  end
  if pkgs.size == 1 and pkgs[0] == "all"
    self.search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version|
      unless cname[1] == ?e and klass.const_defined?(:Version)
        show.call(klass, cname.intern, version)
      end
    end
  else
    pkgs.each do |pkg|
      begin
        pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)}
        v = case
            when pkg.const_defined?(:Version)
              pkg.const_get(n = :Version)
            when pkg.const_defined?(:VERSION)
              pkg.const_get(n = :VERSION)
            else
              n = nil
              "unknown"
            end
        show.call(pkg, n, v)
      rescue NameError
      end
    end
  end
  result
end
terminate(arg = nil) Показать исходный код
# File lib/optparse.rb, line 934
def self.terminate(arg = nil)
  throw :terminate, arg
end
top() Показать исходный код
# File lib/optparse.rb, line 939
def self.top() DefaultList end
with(*args, &block) Показать исходный код
# File lib/optparse.rb, line 881
def self.with(*args, &block)
  opts = new(*args)
  opts.instance_eval(&block)
  opts
end

Инициализирует новый экземпляр и вычисляет необязательный блок в контексте экземпляра. Аргументы args передаются в new, см. там описание параметров.

Этот метод устарел, его поведение соответствует более старому методу new.

Общедоступные методы экземпляров

abort(mesg = $!) Показать исходный код
# File lib/optparse.rb, line 1048
def abort(mesg = $!)
  super("#{program_name}: #{mesg}")
end
Вызывает метод суперкласса Kernel#abort
accept(*args, &blk) Показать исходный код
# File lib/optparse.rb, line 950
def accept(*args, &blk) top.accept(*args, &blk) end

Направляет на прием указанного класса t. Строка аргумента передаётся в блок, в котором она должна быть преобразована в желаемый класс.

t

Указатель класса аргумента, любой объект, включая Class.

pat

Шаблон аргумента, по умолчанию t , если он отвечает на match.

accept(t, pat, &block)
banner() Показать исходный код
# File lib/optparse.rb, line 992
def banner
  unless @banner
    @banner = "Usage: #{program_name} [options]"
    visit(:add_banner, @banner)
  end
  @banner
end

Заголовок баннера, предшествующий сводке.

base() Показать исходный код
# File lib/optparse.rb, line 1062
def base
  @stack[1]
end

Предмет on_tail.

candidate(word) Показать исходный код
# File lib/optparse.rb, line 1593
def candidate(word)
  list = []
  case word
  when /\A--/
    word, arg = word.split(/=/, 2)
    argpat = Completion.regexp(arg, false) if arg and !arg.empty?
    long = true
  when /\A-(!-)/
    short = true
  when /\A-/
    long = short = true
  end
  pat = Completion.regexp(word, true)
  visit(:each_option) do |opt|
    next unless Switch === opt
    opts = (long ? opt.long : []) + (short ? opt.short : [])
    opts = Completion.candidate(word, true, pat, &opts.method(:each)).map(&:first) if pat
    if /\A=/ =~ opt.arg
      opts.map! {|sw| sw + "="}
      if arg and CompletingHash === opt.pattern
        if opts = opt.pattern.candidate(arg, false, argpat)
          opts.map!(&:last)
        end
      end
    end
    list.concat(opts)
  end
  list
end
def_head_option(*opts, &block)
Псевдоним для: define_head
def_option(*opts, &block)
Псевдоним для: define
def_tail_option(*opts, &block)
Псевдоним для: define_tail
define(*opts, &block) Показать исходный код
# File lib/optparse.rb, line 1317
def define(*opts, &block)
  top.append(*(sw = make_switch(opts, block)))
  sw[0]
end
Также псевдоним для: def_option
define_head(*opts, &block) Показать исходный код
# File lib/optparse.rb, line 1332
def define_head(*opts, &block)
  top.prepend(*(sw = make_switch(opts, block)))
  sw[0]
end
Также псевдоним для: def_head_option
define_tail(*opts, &block) Показать исходный код
# File lib/optparse.rb, line 1346
def define_tail(*opts, &block)
  base.append(*(sw = make_switch(opts, block)))
  sw[0]
end
Также псевдоним для: def_tail_option
environment(env = File.basename($0, '.*')) Показать исходный код
# File lib/optparse.rb, line 1650
def environment(env = File.basename($0, '.*'))
  env = ENV[env] || ENV[env.upcase] or return
  require 'shellwords'
  parse(*Shellwords.shellwords(env))
end

Обрабатывает переменную окружения env или её верхний регистр с разбиением, как в оболочке.

env по умолчанию является именем файла программы.

getopts(*args) Показать исходный код
# File lib/optparse.rb, line 1511
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|
    arg, desc = arg.split(';', 2)
    opt, val = arg.split(':', 2)
    if val
      result[opt] = val.empty? ? nil : val
      define("--#{opt}=#{result[opt] || "VAL"}", *[desc].compact)
    else
      result[opt] = false
      define("--#{opt}", *[desc].compact)
    end
  end

  parse_in_order(argv, result.method(:[]=))
  result
end

Метод-обёртка для getopts.rb.

params = ARGV.getopts("ab:", "foo", "bar:", "zot:Z;zot option)
# params[:a] = true   # -a
# params[:b] = "1"    # -b1
# params[:foo] = "1"  # --foo
# params[:bar] = "x"  # --bar x
# params[:zot] = "z"  # --zot Z
help() Показать исходный код
# File lib/optparse.rb, line 1103
def help; summarize("#{banner}".sub(/\n?\z/, "\n")) end

Возвращает строку сводки опций.

Также псевдоним для: to_s
inc(*args) Показать исходный код
# File lib/optparse.rb, line 898
def inc(*args)
  self.class.inc(*args)
end
load(filename = nil) Показать исходный код
# File lib/optparse.rb, line 1630
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

Загружает опции из имен файлов как filename. Не делает ничего, когда файла нет. Возвращает, загружен ли успешно.

filename по умолчанию является именем файла программы без суффикса в каталоге ~/.options.

make_switch(opts, block = nil) Показать исходный код
# File lib/optparse.rb, line 1187
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
  q, a = nil
  has_arg = false

  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 || Symbol === o)) and o.respond_to?(:match)
      pattern = notwice(o, pattern, 'pattern')
      if pattern.respond_to?(:convert)
        conv = pattern.method(:convert).to_proc
      else
        conv = SPLAT_PROC
      end
      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 {|pat, *v| pattern[pat] = v.fetch(0) {pat}}
    when Module
      raise ArgumentError, "unsupported argument type: #{o}", ParseError.filter_backtrace(caller(4))
    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
      else
        has_arg = true
      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?)
    if has_arg and default_style == Switch::NoArgument
      default_style = Switch::RequiredArgument
    end
    s = (style || default_style).new(pattern || default_pattern,
                                     conv, sdesc, ldesc, arg, desc, block)
  elsif !block
    if style or pattern
      raise ArgumentError, "no switch given", ParseError.filter_backtrace(caller)
    end
    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

Создаёт OptionParser::Switch из параметров. Значение обработанного аргумента передаётся в заданный блок, где он может быть обработан.

См. в начале OptionParser для примеров.

opts может включать следующие элементы:

Стиль аргумента:

Один из следующих:

:NONE, :REQUIRED, :OPTIONAL
Шаблон аргумента:

Приемлемый формат аргумента опции, должен быть предварительно определён с #accept или #accept, или Regexp. Это может появиться один раз или быть назначено как String, если отсутствует, в противном случае вызывает ArgumentError. Примеры:

Float, Time, Array
Возможные значения аргументов:

Hash или Массив.

[: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"

Также существует специальный формат, который соответствует диапазону символов (не полному набору регулярных выражений):

"-[a-z]MANDATORY"
"-[a-z][OPTIONAL]"
"-[a-z]"
Стиль аргумента и описание:

Вместо прямого указания обязательных или необязательных аргументов в параметре переключателя, можно использовать этот отдельный параметр.

"=MANDATORY"
"=[OPTIONAL]"
Описание:

Строка описания для опции.

"Run verbosely"
Обработчик:

Обработчик обработанного значения аргумента. Либо передайте блок, либо передайте Proc или Method в качестве аргумента.

new() { |self| ... } Показать исходный код
# File lib/optparse.rb, line 1069
def new
  @stack.push(List.new)
  if block_given?
    yield self
  else
    self
  end
end

Добавляет новый List.

on(*opts, &block) Показать исходный код
# File lib/optparse.rb, line 1326
def on(*opts, &block)
  define(*opts, &block)
  self
end

Добавляет переключатель опции и обработчик. См. make_switch для объяснения параметров.

on_head(*opts, &block) Показать исходный код
# File lib/optparse.rb, line 1340
def on_head(*opts, &block)
  define_head(*opts, &block)
  self
end

Добавляет переключатель опции, как с on, но в начале сводки.

on_tail(*opts, &block) Показать исходный код
# File lib/optparse.rb, line 1354
def on_tail(*opts, &block)
  define_tail(*opts, &block)
  self
end

Добавляет переключатель опции, как с on, но в конце сводки.

order(*argv, &block) Показать исходный код
# File lib/optparse.rb, line 1373
def order(*argv, &block)
  argv = argv[0].dup if argv.size == 1 and Array === argv[0]
  order!(argv, &block)
end

Парсит аргументы командной строки argv в порядке их следования. Если указан блок, каждый аргумент, не являющийся опцией, передаётся в него.

Возвращает оставшуюся часть argv необработанных аргументов.

order!(argv = default_argv, &nonopt) Показать исходный код
# File lib/optparse.rb, line 1382
def order!(argv = default_argv, &nonopt)
  parse_in_order(argv, &nonopt)
end

То же, что и order, но удаляет переключатели деструктивно. Аргументы, не являющиеся опциями, остаются в argv.

parse(*argv) Показать исходный код
# File lib/optparse.rb, line 1484
def parse(*argv)
  argv = argv[0].dup if argv.size == 1 and Array === argv[0]
  parse!(argv)
end

Парсит аргументы командной строки argv в порядке их следования, если переменная среды POSIXLY_CORRECT установлена, и в режиме перестановки в противном случае.

parse!(argv = default_argv) Показать исходный код
# File lib/optparse.rb, line 1493
def parse!(argv = default_argv)
  if ENV.include?('POSIXLY_CORRECT')
    order!(argv)
  else
    permute!(argv)
  end
end

То же, что и parse, но удаляет переключатели деструктивно. Аргументы, не являющиеся опциями, остаются в argv.

permute(*argv) Показать исходный код
# File lib/optparse.rb, line 1464
def permute(*argv)
  argv = argv[0].dup if argv.size == 1 and Array === argv[0]
  permute!(argv)
end

Парсит аргументы командной строки argv в режиме перестановки и возвращает список аргументов, не являющихся опциями.

permute!(argv = default_argv) Показать исходный код
# File lib/optparse.rb, line 1473
def permute!(argv = default_argv)
  nonopts = []
  order!(argv, &nonopts.method(:<<))
  argv[0, 0] = nonopts
  argv
end

То же, что и permute, но удаляет переключатели деструктивно. Аргументы, не являющиеся опциями, остаются в argv.

program_name() Показать исходный код
# File lib/optparse.rb, line 1004
def program_name
  @program_name || File.basename($0, '.*')
end

Имя программы, используемое в сообщениях об ошибках и баннере по умолчанию, по умолчанию равно $0.

reject(*args, &blk) Показать исходный код
# File lib/optparse.rb, line 963
def reject(*args, &blk) top.reject(*args, &blk) end

Направляет аргумент указанного класса на отклонение.

t

Указатель класса аргумента, любой объект, включая Класс.

reject(t)
release() Показать исходный код
# File lib/optparse.rb, line 1029
def release
  @release || (defined?(::Release) && ::Release) || (defined?(::RELEASE) && ::RELEASE)
end

Код выпуска

remove() Показать исходный код
# File lib/optparse.rb, line 1081
def remove
  @stack.pop
end

Удаляет последний элемент Список.

separator(string) Показать исходный код
# File lib/optparse.rb, line 1363
def separator(string)
  top.append(string, nil, nil)
end

Добавляет разделитель в сводку.

summarize(to = [], width = @summary_width, max = width - 1, indent = @summary_indent, &blk) Показать исходный код
# File lib/optparse.rb, line 1094
def summarize(to = [], width = @summary_width, max = width - 1, indent = @summary_indent, &blk)
  blk ||= proc {|l| to << (l.index($/, -1) ? l : l + $/)}
  visit(:summarize, {}, {}, width, max, indent, &blk)
  to
end

Выводит сводку опций в to и возвращает to. Если указан блок, возвращает каждую строку.

to

Место назначения вывода, которое должно иметь метод <<. По умолчанию [].

width

Ширина левой стороны, по умолчанию @summary_width.

max

Максимальная длина левой стороны, по умолчанию width - 1.

indent

Отступ, по умолчанию @summary_indent.

terminate(arg = nil) Показать исходный код
# File lib/optparse.rb, line 931
def terminate(arg = nil)
  self.class.terminate(arg)
end

Прерывает парсинг опций. Необязательный параметр arg — строка, которая возвращается первой как аргумент, не являющийся опцией.

to_a() Показать исходный код
# File lib/optparse.rb, line 1109
def to_a; summarize("#{banner}".split(/^/)) end

Возвращает список сводки опций.

to_s()
Псевдоним для: help
top() Показать исходный код
# File lib/optparse.rb, line 1055
def top
  @stack[-1]
end

Объект, к которому применяются on / on_head, accept / reject

ver() Показать исходный код
# File lib/optparse.rb, line 1036
def ver
  if v = version
    str = "#{program_name} #{[v].join('.')}"
    str << " (#{v})" if v = release
    str
  end
end

Возвращает строку версии из #program_name, номер версии и выпуска.

version() Показать исходный код
# File lib/optparse.rb, line 1022
def version
  @version || (defined?(::Version) && ::Version)
end

Версия

warn(mesg = $!) Показать исходный код
# File lib/optparse.rb, line 1044
def warn(mesg = $!)
  super("#{program_name}: #{mesg}")
end
Вызывает метод суперкласса Kernel#warn
END_OF_DOCUMENT_MARKER

Методы экземпляра (приватные)

complete(typ, opt, icase = false, *pat) Показать исходный код
# File lib/optparse.rb, line 1582
def complete(typ, opt, icase = false, *pat)
  if pat.empty?
    search(typ, opt) {|sw| return [sw, opt]} # exact match or...
  end
  raise AmbiguousOption, catch(:ambiguous) {
    visit(:complete, typ, opt, icase, *pat) {|o, *sw| return sw}
    raise InvalidOption, opt
  }
end

Завершает сокращенную длинную запись опции переключателя стиля и возвращает пару канонического переключателя и описателя переключателя OptionParser::Switch.

id

Таблица поиска.

opt

Ключ поиска.

icase

Выполнять поиск без учёта регистра, если значение true.

pat

Дополнительный шаблон для завершения.

notwice(obj, prv, msg) Показать исходный код
# File lib/optparse.rb, line 1119
def notwice(obj, prv, msg)
  unless !prv or prv == obj
    raise(ArgumentError, "argument #{msg} given twice: #{obj}",
          ParseError.filter_backtrace(caller(2)))
  end
  obj
end

Проверяет, задан ли аргумент дважды. В этом случае генерируется ArgumentError. Вызывается только из OptionParser#switch.

obj

Новый аргумент.

prv

Ранее заданный аргумент.

msg

Сообщение об исключении.

search(id, key) { |k| ... } Показать исходный код
# File lib/optparse.rb, line 1565
def search(id, key)
  block_given = block_given?
  visit(:search, id, key) do |k|
    return block_given ? yield(k) : k
  end
end

Ищет key в @stack для id хэша и возвращает или выдает результат.

visit(id, *args, &block) Показать исходный код
# File lib/optparse.rb, line 1554
def visit(id, *args, &block)
  @stack.reverse_each do |el|
    el.send(id, *args, &block)
  end
  nil
end

Обходит @stack, отправляя каждому элементу метод id с args и block.

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API