модуль Bundler::Thor::Base::ClassMethods
Открытые методы экземпляров
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 374 def all_commands @all_commands ||= from_superclass(:all_commands, Hash.new) @all_commands.merge!(commands) end
Возвращает команды для данного класса Bundler::Thor и всех его подклассов.
Возвращает
-
Hash -
Упорядоченный хэш с именами команд в качестве ключей и объектами
Bundler::Thor::Commandв качестве значений.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 164 def allow_incompatible_default_type! @check_default_type = false end
Если вы хотите использовать значения по умолчанию, которые не соответствуют типу опции, либо укажите `check_default_type: false`, либо вызовите `allow_incompatible_default_type!`
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 236
def argument(name, options = {})
is_thor_reserved_word?(name, :argument)
no_commands { attr_accessor name }
required = if options.key?(:optional)
!options[:optional]
elsif options.key?(:required)
options[:required]
else
options[:default].nil?
end
remove_argument name
if required
arguments.each do |argument|
next if argument.required?
raise ArgumentError, "You cannot have #{name.to_s.inspect} as required argument after " \
"the non-required argument #{argument.human_name.inspect}."
end
end
options[:required] = required
arguments << Bundler::Thor::Argument.new(name, options)
end Добавляет аргумент в класс и создаёт для него attr_accessor.
Аргументы отличаются от опций по нескольким аспектам. Во-первых, способ их парсинга из командной строки: аргументы извлекаются по позиции:
thor command NAME
Вместо:
thor command --name=NAME
Кроме того, аргументы используются внутри вашего кода как аксессоры (self.argument), в то время как опции хранятся в хэше (self.options).
Наконец, аргументы не могут иметь тип :default или :boolean, но могут быть необязательными (указав :optional => :true или :required => false), хотя обязательный аргумент не может следовать за необязательным. Если вы попробуете, будет выброшено исключение.
Параметры
- name<Symbol>
-
Имя аргумента.
- options<Hash>
-
Описание ниже.
Опции
:desc - Описание аргумента. :required - Требуется ли аргумент. :optional - Необязательный аргумент. :type - Тип аргумента, может быть :string, :hash, :array, :numeric. :default - Значение по умолчанию для данного аргумента. Не может быть обязательным и иметь значение по умолчанию. :banner - String для отображения в справке.
Ошибки
-
ArgumentError -
Выбрасывается, если вы указываете обязательный аргумент после необязательного.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 268 def arguments @arguments ||= from_superclass(:arguments, []) end
Возвращает аргументы этого класса, проверяя цепочку предков.
Возвращает
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 158 def check_default_type! @check_default_type = true end
Если вы хотите вызывать ошибку, когда значение по умолчанию опции не соответствует типу, вызовите check_default_type!. Это будет по умолчанию; для совместимости будет выведено предупреждение о устаревании, если необходимо.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 143 def check_unknown_options! @check_unknown_options = true end
Если вы хотите вызывать ошибку для неизвестных опций, вызовите check_unknown_options!. Это отключено по умолчанию для поддержки динамических вызовов.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 303
def class_option(name, options = {})
build_option(name, options, class_options)
end Добавляет опцию в набор опций класса
Параметры
- name<Symbol>
-
Имя аргумента.
- options<Hash>
-
Описание ниже.
Опции
- :desc
-
– Описание аргумента.
- :required
-
– Требуется ли аргумент.
- :default
-
– Значение по умолчанию для данного аргумента.
- :group
-
– Группа для этой опции. Используется для группировки опций в выводе.
- :aliases
-
– Псевдонимы для этой опции. Примечание: Bundler::Thor использует соглашение о названии опций с одним тире и одной буквой. Таким образом, псевдонимы, как “-something”, не будут распознаны; используйте либо “--something”, либо “-s”.
- :type
-
– Тип аргумента, может быть :string, :hash, :array, :numeric или :boolean.
- :banner
-
–
Stringдля отображения в справке. - :hide
-
– Если вы хотите скрыть эту опцию из справки.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 281
def class_options(options = nil)
@class_options ||= from_superclass(:class_options, {})
build_options(options, @class_options) if options
@class_options
end Добавляет набор опций в набор опций класса.
class_options :foo => false, :bar => :required, :baz => :string
Если вы предпочитаете более подробное объявление, используйте class_option.
Параметры
Hash[Symbol => Object]
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 363 def commands @commands ||= Hash.new end
Возвращает команды для данного класса Bundler::Thor.
Возвращает
-
Hash -
Упорядоченный хэш с именами команд в качестве ключей и объектами
Bundler::Thor::Commandв качестве значений.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 520
def exit_on_failure?
Bundler::Thor.deprecation_warning "Bundler::Thor exit with status 0 on errors. To keep this behavior, you must define `exit_on_failure?` in `#{self.name}`"
false
end Флаг, который заставляет процесс завершиться со статусом 1, если произошла какая-либо ошибка.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 349
def group(name = nil)
if name
@group = name.to_s
else
@group ||= from_superclass(:group, "standard")
end
end Определяет группу. Используется при вызове thor list, чтобы указать, что будут показаны только команды из предварительно определённой группы. По умолчанию - стандартная группа.
Параметры
name<String|Symbol>
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 458
def namespace(name = nil)
if name
@namespace = name.to_s
else
@namespace ||= Bundler::Thor::Util.namespace_from_thor_class(self)
end
end Устанавливает пространство имён для класса Bundler::Thor или Bundler::Thor::Group. По умолчанию пространство имён извлекается из имени класса. Если ваш класс Bundler::Thor называется Scripts::MyScript, метод help, например, будет вызываться как:
thor scripts:my_script -h
Если вы измените пространство имён:
namespace :my_scripts
Вы меняете способ вызова ваших команд:
thor my_scripts -h
Наконец, если вы измените пространство имён на default:
namespace :default
Ваши команды могут быть вызваны с сокращением. Вместо:
thor :my_command
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 422 def no_commands(&block) no_commands_context.enter(&block) end
Все методы, определённые внутри данного блока, не добавляются как команды.
Так вы можете сделать:
class MyScript < Bundler::Thor
no_commands do
def this_is_not_a_command
end
end
end
Вы также можете добавить метод и удалить его из списка команд:
class MyScript < Bundler::Thor def this_is_not_a_command end remove_command :this_is_not_a_command end
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 432 def no_commands? no_commands_context.entered? end
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 428 def no_commands_context @no_commands_context ||= NestedContext.new end
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 498
def public_command(*names)
names.each do |name|
class_eval "def #{name}(*); super end"
end
end Позволяет использовать приватные методы родительского класса в дочерних классах в качестве команд.
Параметры
names<Array>:: Method names to be used as commands
Примеры
public_command :foo public_command :foo, :bar, :baz
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 318
def remove_argument(*names)
options = names.last.is_a?(Hash) ? names.pop : {}
names.each do |name|
arguments.delete_if { |a| a.name == name.to_s }
undef_method name, "#{name}=" if options[:undefine]
end
end Удаляет предварительно определённый аргумент. Если задано :undefine, удаляются и аксессоры.
Параметры
- names<Array>
-
Аргументы для удаления
Примеры
remove_argument :foo remove_argument :foo, :bar, :baz, :undefine => true
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 337
def remove_class_option(*names)
names.each do |name|
class_options.delete(name)
end
end Удаляет предварительно определённый параметр класса.
Параметры
- names<Array>
-
Classпараметры для удаления
Примеры
remove_class_option :foo remove_class_option :foo, :bar, :baz
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 392
def remove_command(*names)
options = names.last.is_a?(Hash) ? names.pop : {}
names.each do |name|
commands.delete(name.to_s)
all_commands.delete(name.to_s)
undef_method name if options[:undefine]
end
end Удаляет заданную команду из класса Bundler::Thor. Это обычно делается, если вы наследуете от другого класса и не хотите, чтобы она была доступна.
По умолчанию удаляется только отображение команды. Но вы можете указать :undefine => true, чтобы удалить метод из класса также.
Параметры
- name<Symbol|String>
-
Имя команды для удаления
- options<Hash>
-
Можно задать :undefine => true, если вы хотите, чтобы метод команды также был удалён из класса.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 474
def start(given_args = ARGV, config = {})
config[:shell] ||= Bundler::Thor::Base.shell.new
dispatch(nil, given_args.dup, nil, config)
rescue Bundler::Thor::Error => e
config[:debug] || ENV["THOR_DEBUG"] == "1" ? (raise e) : config[:shell].error(e.message)
exit(false) if exit_on_failure?
rescue Errno::EPIPE
# This happens if a thor command is piped to something like `head`,
# which closes the pipe when it's done reading. This will also
# mean that if the pipe is closed, further unnecessary
# computation will not occur.
exit(true)
end Парсит команду и параметры из заданных аргументов, инициализирует класс и вызывает команду. Этот метод используется, когда аргументы должны быть обработаны из массива. Если вы находитесь внутри Ruby и хотите использовать класс Bundler::Thor, вы можете просто его инициализировать:
script = MyScript.new(args, options, config) script.invoke(:command, first_arg, second_arg, third_arg)
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 189 def strict_args_position! @strict_args_position = true end
Если вам нужны только строковые аргументы (полезно при наследовании классов thor), вызовите strict_args_position! Этот параметр отключён по умолчанию, чтобы разрешить динамические вызовы.
Защищённые методы экземпляра
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 664
def basename
File.basename($PROGRAM_NAME).split(" ").first
end Имя файла программы, вызвавшей класс thor.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 642
def from_superclass(method, default = nil)
if self == baseclass || !superclass.respond_to?(method, true)
default
else
value = superclass.send(method)
# Ruby implements `dup` on Object, but raises a `TypeError`
# if the method is called on immediates. As a result, we
# don't have a good way to check whether dup will succeed
# without calling it and rescuing the TypeError.
begin
value.dup
rescue TypeError
value
end
end
end Извлекает значение из родительского класса. Если достигает базового класса, возвращает значение по умолчанию.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 614 def inherited(klass) super(klass) Bundler::Thor::Base.register_klass_file(klass) klass.instance_variable_set(:@no_commands, 0) end
Каждый раз, когда кто-то наследует от класса Bundler::Thor, регистрирует klass и файл в базовом классе.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 622
def method_added(meth)
super(meth)
meth = meth.to_s
if meth == "initialize"
initialize_added
return
end
# Return if it's not a public instance method
return unless public_method_defined?(meth.to_sym)
return if no_commands? || !create_command(meth)
is_thor_reserved_word?(meth, :command)
Bundler::Thor::Base.register_klass_file(self)
end Вызывает этот обработчик каждый раз, когда добавляется метод. Добавленные методы отслеживаются как команды вызовом метода create_command.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 548
def print_options(shell, options, group_name = nil)
return if options.empty?
list = []
padding = options.map { |o| o.aliases.size }.max.to_i * 4
options.each do |option|
next if option.hide
item = [option.usage(padding)]
item.push(option.description ? "# #{option.description}" : "")
list << item
list << ["", "# Default: #{option.default}"] if option.show_default?
list << ["", "# Possible values: #{option.enum.join(', ')}"] if option.enum
end
shell.say(group_name ? "#{group_name} options:" : "Options:")
shell.print_table(list, :indent => 2)
shell.say ""
end Принимает набор параметров и выводит их.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.