класс 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– Принимает ‘+, да, true, -, нет, 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
Атрибуты
Заголовок баннера перед общим описанием.
Строки для парсинга по умолчанию.
Имя программы, которое будет отображаться в сообщениях об ошибках и баннере по умолчанию, по умолчанию равно $0.
Вызывать исключение для неизвестных опций.
Код релиза
Требовать точное совпадение опций (не допускает предоставление сокращённой длинной опции в виде короткой опции).
Заголовок баннера перед общим описанием.
Имя программы, которое будет отображаться в сообщениях об ошибках и баннере по умолчанию, по умолчанию равно $0.
Ширина для части списка опций в сводке. Должна быть Numeric.
Ширина для части списка опций в сводке. Должна быть Numeric.
Публичные методы класса
# File lib/optparse.rb, line 1190 def self.accept(*args, &blk) top.accept(*args, &blk) end
См. accept.
# File lib/optparse/version.rb, line 50
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 # File lib/optparse.rb, line 1822 def self.getopts(*args, symbolize_names: false) new.getopts(*args, symbolize_names: symbolize_names) end
См. getopts.
# File lib/optparse.rb, line 1124
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 1143 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 1203 def self.reject(*args, &blk) top.reject(*args, &blk) end
См. reject.
# File lib/optparse/version.rb, line 60
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 # File lib/optparse/version.rb, line 5
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 # File lib/optparse.rb, line 1170 def self.terminate(arg = nil) throw :terminate, arg end
# File lib/optparse.rb, line 1175 def self.top() DefaultList end
# File lib/optparse.rb, line 1115 def self.with(*args, &block) opts = new(*args) opts.instance_eval(&block) opts end
Инициализирует новый экземпляр и вычисляет необязательный блок в контексте экземпляра. Аргументы args передаются в new, см. описание параметров там.
Этот метод устарел, его поведение соответствует более старому методу new.
Общедоступные методы экземпляров
# File lib/optparse.rb, line 1291
def abort(mesg = $!)
super("#{program_name}: #{mesg}")
end Kernel#abort # File lib/optparse.rb, line 1186 def accept(*args, &blk) top.accept(*args, &blk) end
Направляет на принятие указанного класса t. Строка аргумента передаётся в блок, в котором она должна быть преобразована в желаемый класс.
-
t -
Указатель класса аргумента, любой объект, включая
Class. -
pat -
Шаблон для аргумента, по умолчанию
t, если он отвечает на match.
accept(t, pat, &block)
# File lib/optparse.rb, line 1873
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 1235
def banner
unless @banner
@banner = +"Usage: #{program_name} [options]"
visit(:add_banner, @banner)
end
@banner
end Заголовок баннера, предшествующий описанию.
# File lib/optparse.rb, line 1305 def base @stack[1] end
Предмет on_tail.
# File lib/optparse.rb, line 1884
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 # File lib/optparse.rb, line 1540 def define(*opts, &block) top.append(*(sw = make_switch(opts, block))) sw[0] end
Создаёт опцию из заданных параметров params. См. Параметры новых опций.
Блок, если задан, — обработчик созданной опции. При обнаружении опции во время разбора командной строки вызывается блок с аргументом, указанным для опции, если таковой имеется. См. Обработчики опций.
# File lib/optparse/kwargs.rb, line 10
def define_by_keywords(options, meth, **opts)
meth.parameters.each do |type, name|
case type
when :key, :keyreq
op, cl = *(type == :key ? %w"[ ]" : ["", ""])
define("--#{name}=#{op}#{name.upcase}#{cl}", *opts[name]) do |o|
options[name] = o
end
end
end
options
end Создаёт опцию из заданных параметров params. См. Параметры новых опций.
Блок, если задан, — обработчик созданной опции. При обнаружении опции во время разбора командной строки вызывается блок с аргументом, указанным для опции, если таковой имеется. См. Обработчики опций.
# File lib/optparse.rb, line 1561 def define_head(*opts, &block) top.prepend(*(sw = make_switch(opts, block))) sw[0] end
Создаёт опцию из заданных параметров params. См. Параметры новых опций.
Блок, если задан, — обработчик созданной опции. При обнаружении опции во время разбора командной строки вызывается блок с аргументом, указанным для опции, если таковой имеется. См. Обработчики опций.
# File lib/optparse.rb, line 1584 def define_tail(*opts, &block) base.append(*(sw = make_switch(opts, block))) sw[0] end
Создаёт опцию из заданных параметров params. См. Параметры новых опций.
Блок, если задан, — обработчик созданной опции. При обнаружении опции во время разбора командной строки вызывается блок с аргументом, указанным для опции, если таковой имеется. См. Обработчики опций.
# File lib/optparse.rb, line 1957 def environment(env = File.basename($0, '.*')) env = ENV[env] || ENV[env.upcase] or return require 'shellwords' parse(*Shellwords.shellwords(env)) end
Разбирает переменную среды env или её заглавную версию с разделением, как в оболочке.
env по умолчанию является именем файла программы.
# File lib/optparse.rb, line 1787
def getopts(*args, symbolize_names: false)
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(:[]=))
symbolize_names ? result.transform_keys(&:to_sym) : 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 1347
def help; summarize("#{banner}".sub(/\n?\z/, "\n")) end Возвращает строку с описанием опций.
# File lib/optparse.rb, line 1132 def inc(*args) self.class.inc(*args) end
# File lib/optparse.rb, line 1925
def load(filename = nil, into: nil)
unless filename
basename = File.basename($0, '.*')
return true if load(File.expand_path(basename, '~/.options'), into: into) rescue nil
basename << ".options"
return [
# XDG
ENV['XDG_CONFIG_HOME'],
'~/.config',
*ENV['XDG_CONFIG_DIRS']&.split(File::PATH_SEPARATOR),
# Haiku
'~/config/settings',
].any? {|dir|
next if !dir or dir.empty?
load(File.expand_path(basename, dir), into: into) rescue nil
}
end
begin
parse(*File.readlines(filename, chomp: true), into: into)
true
rescue Errno::ENOENT, Errno::ENOTDIR
false
end
end Загружает опции из файлов в виде filename. Ничего не делает, когда файла нет. Возвращает, загрузился ли файл успешно.
filename по умолчанию — имя программы без суффикса в каталоге ~/.options, а затем имя программы с суффиксом «.options» в стандартных местах XDG и Haiku.
Опциональный into аргумент работает точно так же, как и принятый в методе parse.
# File lib/optparse.rb, line 1402
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}"
(q = q.downcase).tr!('_', '-')
long << "no-#{q}"
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}"
(o = q.downcase).tr!('_', '-')
long << o
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}"
(o = q.downcase).tr!('_', '-')
long << o
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) if o && !o.empty?
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 Создаёт опцию из заданных параметров params. См. Параметры новых опций.
Блок, если задан, — обработчик созданной опции. При обнаружении опции во время разбора командной строки вызывается блок с аргументом, указанным для опции, если таковой имеется. См. Обработчики опций.
# File lib/optparse.rb, line 1312
def new
@stack.push(List.new)
if block_given?
yield self
else
self
end
end Добавляет новый List.
# File lib/optparse.rb, line 1550 def on(*opts, &block) define(*opts, &block) self end
Создает опцию из заданных параметров params. Смотрите Параметры для новых опций.
Блок, если задан, является обработчиком для созданной опции. Когда опция встречается во время разбора командной строки, блок вызывается с аргументом, заданным для опции, если таковой имеется. Смотрите Обработчики опций.
# File lib/optparse.rb, line 1573 def on_head(*opts, &block) define_head(*opts, &block) self end
Создает опцию из заданных параметров params. Смотрите Параметры для новых опций.
Блок, если задан, является обработчиком для созданной опции. Когда опция встречается во время разбора командной строки, блок вызывается с аргументом, заданным для опции, если таковой имеется. Смотрите Обработчики опций.
Новая опция добавляется в начало сводки.
# File lib/optparse.rb, line 1597 def on_tail(*opts, &block) define_tail(*opts, &block) self end
Создает опцию из заданных параметров params. Смотрите Параметры для новых опций.
Блок, если задан, является обработчиком для созданной опции. Когда опция встречается во время разбора командной строки, блок вызывается с аргументом, заданным для опции, если таковой имеется. Смотрите Обработчики опций.
Новая опция добавляется в конец сводки.
# File lib/optparse.rb, line 1619 def order(*argv, into: nil, &nonopt) argv = argv[0].dup if argv.size == 1 and Array === argv[0] order!(argv, into: into, &nonopt) end
Разбирает аргументы командной строки argv по порядку. Когда задан блок, каждый не являющийся опцией аргумент передается ему. Когда предоставлен необязательный into именованный аргумент, разобранные значения опций сохраняются там через метод []= (поэтому это может быть Hash, или OpenStruct, или другой подобный объект).
Возвращает оставшуюся часть argv, которая не была разобрана.
# File lib/optparse.rb, line 1628
def order!(argv = default_argv, into: nil, &nonopt)
setter = ->(name, val) {into[name.to_sym] = val} if into
parse_in_order(argv, setter, &nonopt)
end То же, что и order, но удаляет переключатели деструктивно. Аргументы, не являющиеся опциями, остаются в argv.
# File lib/optparse.rb, line 1751 def parse(*argv, into: nil) argv = argv[0].dup if argv.size == 1 and Array === argv[0] parse!(argv, into: into) end
Разбирает аргументы командной строки argv по порядку, когда установлена переменная окружения POSIXLY_CORRECT, и в режиме перестановки в противном случае. Когда предоставлен необязательный into именованный аргумент, разобранные значения опций сохраняются там через метод []= (поэтому это может быть Hash, или OpenStruct, или другой подобный объект).
# File lib/optparse.rb, line 1760
def parse!(argv = default_argv, into: nil)
if ENV.include?('POSIXLY_CORRECT')
order!(argv, into: into)
else
permute!(argv, into: into)
end
end То же, что и parse, но удаляет переключатели деструктивно. Аргументы, не являющиеся опциями, остаются в argv.
# File lib/optparse.rb, line 1728 def permute(*argv, into: nil) argv = argv[0].dup if argv.size == 1 and Array === argv[0] permute!(argv, into: into) end
Разбирает аргументы командной строки argv в режиме перестановки и возвращает список аргументов, не являющихся опциями. Когда предоставлен необязательный into именованный аргумент, разобранные значения опций сохраняются там через метод []= (поэтому это может быть Hash, или OpenStruct, или другой подобный объект).
# File lib/optparse.rb, line 1737 def permute!(argv = default_argv, into: nil) nonopts = [] order!(argv, into: into, &nonopts.method(:<<)) argv[0, 0] = nonopts argv end
То же, что и permute, но удаляет переключатели деструктивно. Аргументы, не являющиеся опциями, остаются в argv.
# File lib/optparse.rb, line 1247 def program_name @program_name || File.basename($0, '.*') end
Имя программы, которое будет выводиться в сообщении об ошибке и стандартном баннере, по умолчанию $0.
# File lib/optparse.rb, line 1199 def reject(*args, &blk) top.reject(*args, &blk) end
Указывает отклонять указанный аргумент класса.
-
t -
Указатель класса аргумента, любой объект, включая
Class.
reject(t)
# File lib/optparse.rb, line 1272 def release (defined?(@release) && @release) || (defined?(::Release) && ::Release) || (defined?(::RELEASE) && ::RELEASE) end
Код релиза
# File lib/optparse.rb, line 1324 def remove @stack.pop end
Удаляет последний List.
# File lib/optparse.rb, line 1606 def separator(string) top.append(string, nil, nil) end
Добавить разделитель в сводку.
# File lib/optparse.rb, line 1337
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 1167 def terminate(arg = nil) self.class.terminate(arg) end
Завершает разбор опций. Необязательный параметр arg - это строка, которая возвращается, чтобы быть первым аргументом, не являющимся опцией.
# File lib/optparse.rb, line 1376
def to_a; summarize("#{banner}".split(/^/)) end Возвращает список сводки опций.
# File lib/optparse.rb, line 1279
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 1265 def version (defined?(@version) && @version) || (defined?(::Version) && ::Version) end
# File lib/optparse.rb, line 1287
def warn(mesg = $!)
super("#{program_name}: #{mesg}")
end Kernel#warn
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.