класс OptionParser
OptionParser
Впервые знакомитесь с OptionParser?
См. руководство.
Введение
OptionParser — это класс для анализа параметров командной строки. Он гораздо функциональнее, но при этом проще в использовании, чем GetoptLong, и представляет собой более ориентированное на Ruby решение.
Возможности
-
Спецификация аргументов и код для их обработки записываются в одном месте.
-
Класс может выводить сводку параметров — вам не нужно поддерживать эту строку отдельно.
-
Необязательные и обязательные аргументы указываются очень удобно.
-
Аргументы можно автоматически преобразовывать в указанный класс.
-
Аргументы можно ограничить определённым набором значений.
Все эти возможности показаны в приведённых ниже примерах. Полную документацию см. в разделе make_switch.
Минимальный пример
require 'optparse'
options = {}
OptionParser.new do |parser|
parser.banner = "Usage: example.rb [options]"
parser.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 |parser|
parser.banner = "Usage: example.rb [options]"
parser.on("-nNAME", "--name=NAME", "Name to say hello to") do |n|
args.name = n
end
parser.on("-h", "--help", "Prints this help") do
puts parser
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
Обязательные аргументы
Для параметров, которым требуется аргумент, строки спецификации параметров могут содержать имя параметра, записанное заглавными буквами. Если параметр используется без обязательного аргумента, будет вызвано исключение.
require 'optparse'
options = {}
OptionParser.new do |parser|
parser.on("-r", "--require LIBRARY",
"Require the LIBRARY before executing your script") do |lib|
puts "You required #{lib}!"
end
end.parse!
Использование:
$ ruby optparse-test.rb -r optparse-test.rb:9:in '<main>': missing argument: -r (OptionParser::MissingArgument) $ ruby optparse-test.rb -r my-library You required my-library!
Преобразование типов
OptionParser позволяет преобразовывать аргументы командной строки в объекты.
OptionParser включает несколько готовых вариантов преобразования типов:
-
Date— любое значение, принимаемое методомDate.parse(необходимо подключитьoptparse/date) -
DateTime— любое значение, принимаемое методомDateTime.parse(необходимо подключитьoptparse/date) -
Time— любое значение, принимаемое методомTime.httpdateилиTime.parse(необходимо подключитьoptparse/time) -
URI— любое значение, принимаемое методомURI.parse(необходимо подключитьoptparse/uri) -
Shellwords— любое значение, принимаемое методомShellwords.shellwords(необходимо подключитьoptparse/shellwords) -
String— любая непустая строка -
Integer— любое целое число. Поддерживается преобразование восьмеричных чисел (например, 124, -3, 040). -
Float— любое число с плавающей точкой (например, 10, 3.14, -100E+13). -
Numeric— любое целое число, число с плавающей точкой или рациональное число (1, 3.4, 1/3). -
DecimalInteger— какInteger, но без восьмеричного формата. -
OctalInteger— какInteger, но без десятичного формата. -
DecimalNumeric— десятичное целое число или число с плавающей точкой. -
TrueClass— принимает значения ‘+, yes, true, -, no, false’; значение по умолчанию —true -
FalseClass— то же, что иTrueClass, но значение по умолчанию —false -
Array— строки, разделённые символом ‘,’ (например, 1,2,3) -
Regexp— регулярные выражения, включая параметры.
Можно также добавлять собственные преобразования, о чём рассказывается ниже.
Использование встроенных преобразований
В качестве примера используется встроенное преобразование Time. Другие встроенные преобразования работают аналогично. OptionParser попытается разобрать аргумент как значение Time. Если это удастся, полученное время будет передано блоку-обработчику. В противном случае будет вызвано исключение.
require 'optparse'
require 'optparse/time'
OptionParser.new do |parser|
parser.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
p time
end
end.parse!
Использование:
$ ruby optparse-test.rb -t nonsense ... invalid argument: -t nonsense (OptionParser::InvalidArgument) $ ruby optparse-test.rb -t 10-11-12 2010-11-12 00:00:00 -0500 $ ruby optparse-test.rb -t 9:30 2014-08-13 09:30:00 -0400
Создание пользовательских преобразований
Метод accept класса OptionParser можно использовать для создания преобразователей. Он указывает, какой блок преобразования вызывать при указании класса. В приведённом ниже примере с его помощью извлекается объект User до того, как он будет передан обработчику on.
require 'optparse'
User = Struct.new(:id, :name)
def find_user id
not_found = ->{ raise "No User Found for id #{id}" }
[ User.new(1, "Sam"),
User.new(2, "Gandalf") ].find(not_found) do |u|
u.id == id
end
end
op = OptionParser.new
op.accept(User) do |user_id|
find_user user_id.to_i
end
op.on("--user ID", User) do |user|
puts user
end
op.parse!
Использование:
$ ruby optparse-test.rb --user 1 #<struct User id=1, name="Sam"> $ ruby optparse-test.rb --user 2 #<struct User id=2, name="Gandalf"> $ ruby optparse-test.rb --user 3 optparse-test.rb:15:in 'block in find_user': No User Found for id 3 (RuntimeError)
Сохранение параметров в Hash
Параметр into методов order, parse и других сохраняет параметры командной строки в Hash.
require 'optparse'
options = {}
OptionParser.new do |parser|
parser.on('-a')
parser.on('-b NUM', Integer)
parser.on('-v', '--verbose')
end.parse!(into: options)
p options
Использование:
$ ruby optparse-test.rb -a
{:a=>true}
$ ruby optparse-test.rb -a -v
{:a=>true, :verbose=>true}
$ ruby optparse-test.rb -a -b 100
{:a=>true, :b=>100} Полный пример
Следующий пример представляет собой полноценную программу на Ruby. Её можно запустить и посмотреть, как влияют различные параметры. Это, вероятно, лучший способ познакомиться с возможностями optparse.
require 'optparse'
require 'optparse/time'
require 'ostruct'
require 'pp'
class OptparseExample
Version = '1.0.0'
CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
class ScriptOptions
attr_accessor :library, :inplace, :encoding, :transfer_type,
:verbose, :extension, :delay, :time, :record_separator,
:list
def initialize
self.library = []
self.inplace = false
self.encoding = "utf8"
self.transfer_type = :auto
self.verbose = false
end
def define_options(parser)
parser.banner = "Usage: example.rb [options]"
parser.separator ""
parser.separator "Specific options:"
# add additional options
perform_inplace_option(parser)
delay_execution_option(parser)
execute_at_time_option(parser)
specify_record_separator_option(parser)
list_example_option(parser)
specify_encoding_option(parser)
optional_option_argument_with_keyword_completion_option(parser)
boolean_verbose_option(parser)
parser.separator ""
parser.separator "Common options:"
# No argument, shows at tail. This will print an options summary.
# Try it and see!
parser.on_tail("-h", "--help", "Show this message") do
puts parser
exit
end
# Another typical switch to print the version.
parser.on_tail("--version", "Show version") do
puts Version
exit
end
end
def perform_inplace_option(parser)
# Specifies an optional option argument
parser.on("-i", "--inplace [EXTENSION]",
"Edit ARGV files in place",
"(make backup if EXTENSION supplied)") do |ext|
self.inplace = true
self.extension = ext || ''
self.extension.sub!(/\A\.?(?=.)/, ".") # Ensure extension begins with dot.
end
end
def delay_execution_option(parser)
# Cast 'delay' argument to a Float.
parser.on("--delay N", Float, "Delay N seconds before executing") do |n|
self.delay = n
end
end
def execute_at_time_option(parser)
# Cast 'time' argument to a Time object.
parser.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
self.time = time
end
end
def specify_record_separator_option(parser)
# Cast to octal integer.
parser.on("-F", "--irs [OCTAL]", OptionParser::OctalInteger,
"Specify record separator (default \\0)") do |rs|
self.record_separator = rs
end
end
def list_example_option(parser)
# List of arguments.
parser.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
self.list = list
end
end
def specify_encoding_option(parser)
# 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(', ')
parser.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
"(#{code_list})") do |encoding|
self.encoding = encoding
end
end
def optional_option_argument_with_keyword_completion_option(parser)
# Optional '--type' option argument with keyword completion.
parser.on("--type [TYPE]", [:text, :binary, :auto],
"Select transfer type (text, binary, auto)") do |t|
self.transfer_type = t
end
end
def boolean_verbose_option(parser)
# Boolean switch.
parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
self.verbose = v
end
end
end
#
# Return a structure describing the options.
#
def parse(args)
# The options specified on the command line will be collected in
# *options*.
@options = ScriptOptions.new
@args = OptionParser.new do |parser|
@options.define_options(parser)
parser.parse!(args)
end
@options
end
attr_reader :parser, :options
end # class OptparseExample
example = OptparseExample.new
options = example.parse(ARGV)
pp options # example.options
pp ARGV
Автодополнение в Completion
В современных оболочках (например, bash, zsh и других) можно использовать автодополнение параметров командной строки.
Дополнительная документация
Приведённых выше примеров и прилагаемого руководства должно быть достаточно, чтобы научиться пользоваться этим классом. Если у вас возникнут вопросы, создайте обращение на сайте bugs.ruby-lang.org.
Константы
- DecimalInteger
-
Формат десятичного целого числа, преобразуемого в
Integer. - DecimalNumeric
-
Формат десятичного целого числа или числа с плавающей точкой: целочисленный формат преобразуется в
Integer, а формат с плавающей точкой — вFloat. - OctalInteger
-
Формат целого числа в стиле Ruby/C: восьмеричное, шестнадцатеричное или двоичное число, преобразуемое в
Integer. - VERSION
-
Строка версии
- Version
-
Псевдоним для обеспечения совместимости
Атрибуты
Заголовок, выводимый перед сводкой.
Строки, разбираемые по умолчанию.
Имя программы, выводимое в сообщении об ошибке и заголовке по умолчанию; по умолчанию используется $0.
Вызывать ли исключение при неизвестном параметре.
Код выпуска
Требовать ли точного соответствия параметров (запрещает указывать сокращённый длинный параметр как короткий).
Заголовок, выводимый перед сводкой.
Имя программы, выводимое в сообщении об ошибке и заголовке по умолчанию; по умолчанию используется $0.
Ширина области списка параметров в сводке. Должна быть Numeric.
Ширина области списка параметров в сводке. Должна быть Numeric.
Открытые методы класса
# File lib/optparse.rb, line 1237 def self.accept(*args, &blk) top.accept(*args, &blk) end
См. accept.
# File lib/optparse.rb, line 1939 def self.getopts(*args, symbolize_names: false) new.getopts(*args, symbolize_names: symbolize_names) end
См. getopts.
# File lib/optparse.rb, line 1159
def self.inc(arg, default = nil)
case arg
when Integer
arg.nonzero?
when nil
default.to_i + 1
end
end Возвращает увеличенное значение default в соответствии с arg.
# File lib/optparse.rb, line 1182 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 @require_exact = false @raise_unknown = true add_officious yield self if block_given? end
Инициализирует экземпляр и передаёт его в блок, если блок был указан.
banner-
Текст заголовка.
width-
Ширина сводки.
indent-
Отступ сводки.
# File lib/optparse.rb, line 1250 def self.reject(*args, &blk) top.reject(*args, &blk) end
См. reject.
# File lib/optparse/version.rb, line 10
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 Выводит строку версии пакетов, если определена Version.
pkgs-
список пакетов
# File lib/optparse.rb, line 1212 def self.terminate(arg = nil) throw :terminate, arg end
См. terminate.
# File lib/optparse.rb, line 1222 def self.top() DefaultList end
Возвращает глобальный верхний список параметров.
Не используйте напрямую.
# File lib/optparse.rb, line 1150 def self.with(*args, &block) opts = new(*args) opts.instance_eval(&block) opts end
Открытые методы экземпляра
# File lib/optparse.rb, line 1360
def abort(mesg = $!)
super("#{program_name}: #{mesg}")
end Выводит сообщение с именем программы, а затем прерывает выполнение.
mesg-
Сообщение; по умолчанию — +$!+.
См. Kernel#abort.
Kernel#abort # File lib/optparse.rb, line 1233 def accept(*args, &blk) top.accept(*args, &blk) end
Указывает принимать аргументы указанного класса t. Строка аргумента передаётся блоку, в котором её следует преобразовать в нужный класс.
t-
Спецификатор класса аргумента — любой объект, включая Class.
pat-
Шаблон аргумента; по умолчанию —
t, если он поддерживает match.
accept(t, pat, &block)
# File lib/optparse.rb, line 1987
def additional_message(typ, opt)
return unless typ and opt and defined?(DidYouMean::SpellChecker)
all_candidates = []
visit(:get_candidates, typ) do |candidates|
all_candidates.concat(candidates)
end
all_candidates.select! {|cand| cand.is_a?(String) }
checker = DidYouMean::SpellChecker.new(dictionary: all_candidates)
DidYouMean.formatter.message_for(all_candidates & checker.correct(opt))
end Возвращает дополнительную информацию.
# File lib/optparse.rb, line 1282
def banner
unless @banner
@banner = +"Usage: #{program_name} [options]"
visit(:add_banner, @banner)
end
@banner
end Заголовок, предваряющий сводку.
# File lib/optparse.rb, line 1374 def base @stack[1] end
Объект метода on_tail.
# File lib/optparse.rb, line 2001
def candidate(word)
list = []
case word
when '-'
long = short = true
when /\A--/
word, arg = word.split(/=/, 2)
argpat = Completion.regexp(arg, false) if arg and !arg.empty?
long = true
when /\A-/
short = true
end
pat = Completion.regexp(word, long)
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 Возвращает кандидаты для word.
# File lib/optparse.rb, line 1631 def define(*opts, &block) top.append(*(sw = make_switch(opts, block))) sw[0] end
Создаёт параметр из указанных параметров params. См. Параметры новых параметров.
Если блок задан, он служит обработчиком созданного параметра. Когда параметр встречается при разборе командной строки, блок вызывается с аргументом, заданным для этого параметра, если он есть. См. Обработчики параметров.
# File lib/optparse/kwargs.rb, line 15
def define_by_keywords(options, method, **params)
method.parameters.each do |type, name|
case type
when :key, :keyreq
op, cl = *(type == :key ? %w"[ ]" : ["", ""])
define("--#{name}=#{op}#{name.upcase}#{cl}", *params[name]) do |o|
options[name] = o
end
end
end
options
end Создаёт параметр из указанных параметров params. См. Параметры новых параметров.
Если блок задан, он служит обработчиком созданного параметра. Когда параметр встречается при разборе командной строки, блок вызывается с аргументом, заданным для этого параметра, если он есть. См. Обработчики параметров.
Определяет параметры, которые записываются в options для именованных параметров метода method.
Параметры для каждого именованного параметра задаются элементами params.
# File lib/optparse.rb, line 1652 def define_head(*opts, &block) top.prepend(*(sw = make_switch(opts, block))) sw[0] end
Создаёт параметр из указанных параметров params. См. Параметры новых параметров.
Если блок задан, он служит обработчиком созданного параметра. Когда параметр встречается при разборе командной строки, блок вызывается с аргументом, заданным для этого параметра, если он есть. См. Обработчики параметров.
# File lib/optparse.rb, line 1675 def define_tail(*opts, &block) base.append(*(sw = make_switch(opts, block))) sw[0] end
Создаёт параметр из указанных параметров params. См. Параметры новых параметров.
Если блок задан, он служит обработчиком созданного параметра. Когда параметр встречается при разборе командной строки, блок вызывается с аргументом, заданным для этого параметра, если он есть. См. Обработчики параметров.
# File lib/optparse.rb, line 2082 def environment(env = File.basename($0, '.*'), **keywords) env = ENV[env] || ENV[env.upcase] or return require 'shellwords' parse(*Shellwords.shellwords(env), **keywords) end
Разбирает переменную окружения env или её имя в верхнем регистре, разделяя значение так же, как это делает оболочка.
env по умолчанию равен базовому имени программы.
# File lib/optparse.rb, line 1901
def getopts(*args, symbolize_names: false, **keywords)
argv = Array === args.first ? args.shift : default_argv
single_options, *long_options = *args
result = {}
setter = (symbolize_names ?
->(name, val) {result[name.to_sym] = val}
: ->(name, val) {result[name] = val})
single_options.scan(/(.)(:)?/) do |opt, val|
if val
setter[opt, nil]
define("-#{opt} VAL")
else
setter[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
setter[opt, (val unless val.empty?)]
define("--#{opt}=#{result[opt] || "VAL"}", *[desc].compact)
else
setter[opt, false]
define("--#{opt}", *[desc].compact)
end
end
parse_in_order(argv, setter, **keywords)
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
Параметр symbolize_names (логический) определяет, должны ли ключи возвращаемого Hash быть символами; по умолчанию задано false (использовать строки).
params = ARGV.getopts("ab:", "foo", "bar:", "zot:Z;zot option", symbolize_names: true)
# params[:a] = true # -a
# params[:b] = "1" # -b1
# params[:foo] = "1" # --foo
# params[:bar] = "x" # --bar x
# params[:zot] = "z" # --zot Z
# File lib/optparse.rb, line 1419
def help; summarize("#{banner}".sub(/\n?\z/, "\n")) end Возвращает строку со сводкой параметров.
# File lib/optparse.rb, line 1171 def inc(*args) self.class.inc(*args) end
См. self.inc
# File lib/optparse.rb, line 2042
def load(filename = nil, **keywords)
unless filename
basename = File.basename($0, '.*')
return true if load(File.expand_path("~/.options/#{basename}"), **keywords) rescue nil
basename << ".options"
if !(xdg = ENV['XDG_CONFIG_HOME']) or xdg.empty?
# https://specifications.freedesktop.org/basedir-spec/latest/#variables
#
# If $XDG_CONFIG_HOME is either not set or empty, a default
# equal to $HOME/.config should be used.
xdg = ['~/.config', true]
end
return [
xdg,
*ENV['XDG_CONFIG_DIRS']&.split(File::PATH_SEPARATOR),
# Haiku
['~/config/settings', true],
].any? {|dir, expand|
next if !dir or dir.empty?
filename = File.join(dir, basename)
filename = File.expand_path(filename) if expand
load(filename, **keywords) rescue nil
}
end
begin
parse(*File.readlines(filename, chomp: true), **keywords)
true
rescue Errno::ENOENT, Errno::ENOTDIR
false
end
end Загружает параметры из файлов с именами вида filename. Ничего не делает, если файл отсутствует. Возвращает признак успешной загрузки.
filename по умолчанию равно базовому имени программы без суффикса в каталоге ~/.options, а затем — базовому имени с суффиксом «.options» в стандартных каталогах XDG и Haiku.
Необязательный именованный аргумент into работает точно так же, как аргумент метода parse.
# File lib/optparse.rb, line 1473
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
values = 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 !Completion.completable?(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, Set
if Array === o
o, v = o.partition {|v,| Completion.completable?(v)}
values = notwice(v, values, 'values') unless v.empty?
next if o.empty?
end
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 Range
values = notwice(o, values, 'values')
when Module
raise ArgumentError, "unsupported argument type: #{o}", ParseError.filter_backtrace(caller(4))
when *ArgumentStyle.keys
style = notwice(ArgumentStyle[o], style, 'style')
when /\A--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}"
(q = q.downcase).tr!('_', '-')
long << "no-#{q}"
nolong << q
when /\A--\[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}"
(o = q.downcase).tr!('_', '-')
long << o
not_pattern, not_conv = search(:atype, FalseClass) unless not_style
not_style = Switch::NoArgument
nolong << "no-#{o}"
when /\A--([^\[\]=\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}"
(o = q.downcase).tr!('_', '-')
long << o
when /\A-(\[\^?\]?(?:[^\\\]]|\\.)*\])(.+)?/
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 /\A-(.)(.+)?/
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 /\A=/
style = notwice(default_style.guess(arg = o), style, 'style')
default_pattern, conv = search(:atype, Object) unless default_pattern
else
desc.push(o) if o && !o.empty?
end
end
default_pattern, conv = search(:atype, default_style.pattern) unless default_pattern
if Range === values and klass
unless (!values.begin or klass === values.begin) and
(!values.end or klass === values.end)
raise ArgumentError, "range does not match class"
end
end
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, values)
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, values)
end
return s, short, long,
(not_style.new(not_pattern, not_conv, sdesc, ldesc, nil, desc, block) if not_style),
nolong
end Создаёт параметр из указанных параметров params. См. Параметры новых параметров.
Если блок задан, он служит обработчиком созданного параметра. Когда параметр встречается при разборе командной строки, блок вызывается с аргументом, заданным для этого параметра, если он есть. См. Обработчики параметров.
# File lib/optparse.rb, line 1384
def new
@stack.push(List.new)
if block_given?
yield self
else
self
end
end Добавляет новый List.
Если задан блок, передаёт ему self и возвращает результат его выполнения; в противном случае возвращает self.
# File lib/optparse.rb, line 1641 def on(*opts, &block) define(*opts, &block) self end
Создаёт параметр из указанных параметров params. См. Параметры новых параметров.
Если блок задан, он служит обработчиком созданного параметра. Когда параметр встречается при разборе командной строки, блок вызывается с аргументом, заданным для этого параметра, если он есть. См. Обработчики параметров.
# File lib/optparse.rb, line 1664 def on_head(*opts, &block) define_head(*opts, &block) self end
Создаёт параметр из указанных параметров params. См. Параметры новых параметров.
Если блок задан, он служит обработчиком созданного параметра. Когда параметр встречается при разборе командной строки, блок вызывается с аргументом, заданным для этого параметра, если он есть. См. Обработчики параметров.
Новый параметр добавляется в начало сводки.
# File lib/optparse.rb, line 1688 def on_tail(*opts, &block) define_tail(*opts, &block) self end
Создаёт параметр из указанных параметров params. См. Параметры новых параметров.
Если блок задан, он служит обработчиком созданного параметра. Когда параметр встречается при разборе командной строки, блок вызывается с аргументом, заданным для этого параметра, если он есть. См. Обработчики параметров.
Новый параметр добавляется в конец сводки.
# File lib/optparse.rb, line 1717 def order(*argv, **keywords, &nonopt) argv = argv[0].dup if argv.size == 1 and Array === argv[0] order!(argv, **keywords, &nonopt) end
Разбирает аргументы командной строки argv по порядку. Если задан блок, ему передаётся каждый аргумент, не являющийся параметром. Если указан необязательный именованный аргумент into, разобранные значения параметров сохраняются в нём с помощью метода []= (поэтому это может быть Hash, OpenStruct или другой подобный объект).
Возвращает оставшуюся неразобранную часть argv.
# File lib/optparse.rb, line 1726
def order!(argv = default_argv, into: nil, **keywords, &nonopt)
setter = ->(name, val) {into[name.to_sym] = val} if into
parse_in_order(argv, setter, **keywords, &nonopt)
end То же, что и order, но переключатели удаляются безвозвратно. Аргументы, не являющиеся параметрами, остаются в argv.
# File lib/optparse.rb, line 1865 def parse(*argv, **keywords) argv = argv[0].dup if argv.size == 1 and Array === argv[0] parse!(argv, **keywords) end
Разбирает аргументы командной строки argv по порядку, если задана переменная окружения POSIXLY_CORRECT, и в режиме перестановки в противном случае. Если указан необязательный именованный аргумент into, разобранные значения параметров сохраняются в нём с помощью метода []= (поэтому это может быть Hash, OpenStruct или другой подобный объект).
# File lib/optparse.rb, line 1874
def parse!(argv = default_argv, **keywords)
if ENV.include?('POSIXLY_CORRECT')
order!(argv, **keywords)
else
permute!(argv, **keywords)
end
end То же, что и parse, но переключатели удаляются безвозвратно. Аргументы, не являющиеся параметрами, остаются в argv.
# File lib/optparse.rb, line 1842 def permute(*argv, **keywords) argv = argv[0].dup if argv.size == 1 and Array === argv[0] permute!(argv, **keywords) end
Разбирает аргументы командной строки argv в режиме перестановки и возвращает список аргументов, не являющихся параметрами. Если указан необязательный именованный аргумент into, разобранные значения параметров сохраняются в нём с помощью метода []= (поэтому это может быть Hash, OpenStruct или другой подобный объект).
# File lib/optparse.rb, line 1851
def permute!(argv = default_argv, **keywords)
nonopts = []
order!(argv, **keywords) {|nonopt| nonopts << nonopt}
argv[0, 0] = nonopts
argv
end То же, что и permute, но переключатели удаляются безвозвратно. Аргументы, не являющиеся параметрами, остаются в argv.
# File lib/optparse.rb, line 1294 def program_name @program_name || strip_ext(File.basename($0)) end
Имя программы, выводимое в сообщениях об ошибках и в заголовке по умолчанию; по умолчанию — $0.
# File lib/optparse.rb, line 1246 def reject(*args, &blk) top.reject(*args, &blk) end
Указывает отклонять аргументы указанного класса.
type-
Спецификатор класса аргумента — любой объект, включая Class.
reject(type)
# File lib/optparse.rb, line 1327 def release (defined?(@release) && @release) || (defined?(::Release) && ::Release) || (defined?(::RELEASE) && ::RELEASE) end
Код выпуска
# File lib/optparse.rb, line 1396 def remove @stack.pop end
Удаляет последний List.
# File lib/optparse.rb, line 1697 def separator(string) top.append(string, nil, nil) end
Добавляет разделитель в сводку.
# File lib/optparse.rb, line 1409
def summarize(to = [], width = @summary_width, max = width - 1, indent = @summary_indent, &blk)
nl = "\n"
blk ||= proc {|l| to << (l.index(nl, -1) ? l : l + nl)}
visit(:summarize, {}, {}, width, max, indent, &blk)
to
end Записывает сводку параметров в to и возвращает to. Если задан блок, передаёт ему каждую строку.
to-
Место назначения вывода, у которого должен быть метод <<. По умолчанию — [].
width-
Ширина левой части; по умолчанию — @summary_width.
max-
Максимально допустимая длина левой части; по умолчанию —
width- 1. indent-
Отступ; по умолчанию — @summary_indent.
# File lib/optparse.rb, line 1206 def terminate(arg = nil) self.class.terminate(arg) end
Завершает разбор параметров. Необязательный параметр arg — это строка, которая помещается обратно в начало списка аргументов, не являющихся параметрами.
# File lib/optparse.rb, line 1448
def to_a; summarize("#{banner}".split(/^/)) end Возвращает список параметров для сводки.
# File lib/optparse.rb, line 1367 def top @stack[-1] end
# File lib/optparse.rb, line 1334
def ver
if v = version
str = +"#{program_name} #{[v].join('.')}"
str << " (#{v})" if v = release
str
end
end Возвращает строку версии из program_name, версии и выпуска.
# File lib/optparse.rb, line 1320 def version (defined?(@version) && @version) || (defined?(::Version) && ::Version) end
# File lib/optparse.rb, line 1349
def warn(mesg = $!)
super("#{program_name}: #{mesg}")
end Выводит предупреждение с именем программы
mesg-
Сообщение; по умолчанию — +$!+.
См. Kernel#warn.
Kernel#warn
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.