модуль Bundler::Thor::Base::ClassMethods
Публичные методы экземпляров
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 370 def all_commands @all_commands ||= from_superclass(:all_commands, Bundler::Thor::CoreExt::OrderedHash.new) @all_commands.merge!(commands) end
Возвращает команды для этого класса Bundler::Thor и всех подклассов.
Возвращает
- OrderedHash
-
Упорядоченный массив с именами команд в качестве ключей и объектами
Bundler::Thor::Commandв качестве значений.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 232
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 264 def arguments @arguments ||= from_superclass(:arguments, []) end
Возвращает аргументы этого класса, обращаясь к предкам.
Возвращает
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 157 def check_default_type! @check_default_type = true end
Если вы хотите выводить ошибку, когда значение по умолчанию опции не соответствует типу, вызовите check_default_type!. По умолчанию эта функция отключена для совместимости.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 142 def check_unknown_options! @check_unknown_options = true end
Если вы хотите выводить ошибку для неизвестных опций, вызовите check_unknown_options!. По умолчанию она отключена, чтобы разрешить динамические вызовы.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 299
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 277
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[Символ => Объект]
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 359 def commands @commands ||= Bundler::Thor::CoreExt::OrderedHash.new end
Возвращает команды для этого класса Bundler::Thor.
Возвращает
- OrderedHash
-
Упорядоченный массив с именами команд в качестве ключей и объектами
Bundler::Thor::Commandв качестве значений.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 345
def group(name = nil)
if name
@group = name.to_s
else
@group ||= from_superclass(:group, "standard")
end
end Определяет группу. Используется при вызове thor list, чтобы указать, что будут отображаться только команды из предварительно определённой группы. По умолчанию — стандартная группа.
Параметры
name<Строка|Символ>
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 448
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 418 def no_commands @no_commands = true yield ensure @no_commands = false 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 488
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 314
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 333
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 388
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 464
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(1) 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(0)
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 185 def strict_args_position! @strict_args_position = true end
Если вы хотите только строгие аргументы (полезно при наследовании классов thor), вызовите strict_args_position!. По умолчанию это отключено, чтобы разрешить динамические вызовы.
Защищённые методы экземпляра
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 653
def basename
File.basename($PROGRAM_NAME).split(" ").first
end Имя файла без пути программы, вызвавшей класс thor.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 646 def exit_on_failure? false end
Флаг, который заставляет процесс завершаться со статусом 1, если произошла какая-либо ошибка.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 626
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 599 def inherited(klass) Bundler::Thor::Base.register_klass_file(klass) klass.instance_variable_set(:@no_commands, false) end
Каждый раз, когда кто-то наследует от класса Bundler::Thor, регистрирует класс и файл в базовом классе.
# File lib/bundler/vendor/thor/lib/thor/base.rb, line 606
def method_added(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)
@no_commands ||= false
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 533
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.