модуль Bundler::Thor::Invocation
Методы публичного экземпляра
# File lib/bundler/vendor/thor/lib/thor/invocation.rb, line 29 def current_command_chain @_invocations.values.flatten.map(&:to_sym) end
Обеспечивает доступ к текущей цепочке команд внутри Bundler::Thor-(под)команды.
# File lib/bundler/vendor/thor/lib/thor/invocation.rb, line 101
def invoke(name = nil, *args)
if name.nil?
warn "[Bundler::Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}"
return invoke_all
end
args.unshift(nil) if args.first.is_a?(Array) || args.first.nil?
command, args, opts, config = args
klass, command = _retrieve_class_and_command(name, command)
raise "Missing Bundler::Thor class for invoke #{name}" unless klass
raise "Expected Bundler::Thor class, got #{klass}" unless klass <= Bundler::Thor::Base
args, opts, config = _parse_initialization_options(args, opts, config)
klass.send(:dispatch, command, args, opts, config) do |instance|
instance.parent_options = options
end
end Принимает имя и вызывает его. Имя может быть строкой (либо «команда», либо «пространство имён:команда»), Bundler::Thor::Command, Class или экземпляром Bundler::Thor. Если команду нельзя определить по имени, её также можно указать как второй аргумент.
Вы также можете предоставить аргументы, опции и значения конфигурации для вызываемой команды. Если не указано, используются те же значения, что и при инициализации вызывающего элемента.
Если имя не указано, вызывается команда по умолчанию для текущего класса.
Примеры
class A < Bundler::Thor
def foo
invoke :bar
invoke "b:hello", ["Erik"]
end
def bar
invoke "b:hello", ["Erik"]
end
end
class B < Bundler::Thor
def hello(name)
puts "hello #{name}"
end
end
Вы можете заметить, что метод «foo» выше вызывает две команды: «bar», которая принадлежит тому же классу, и «hello», которая принадлежит классу B.
Используя систему вызовов, вы гарантируете, что команда вызывается только один раз. В примере выше, вызов «foo» вызовет «b:hello» только один раз, даже если он вызывается позже методом «bar».
Когда класс A вызывает класс B, все аргументы, используемые при инициализации A, передаются в B. Это позволяет ленивую обработку опций. Предположим, у вас есть некоторые команды rspec:
class Rspec < Bundler::Thor::Group
class_option :mock_framework, :type => :string, :default => :rr
def invoke_mock_framework
invoke "rspec:#{options[:mock_framework]}"
end
end
Как вы заметили, это вызывает заданный фреймворк mock, который может иметь свои собственные опции:
class Rspec::RR < Bundler::Thor::Group class_option :style, :type => :string, :default => :mock end
Поскольку rspec не должен обрабатывать опции фреймворка mock, при вызове RR все опции обрабатываются снова, поэтому RR может извлечь только те опции, которые он собирается использовать.
Если вы хотите, чтобы Rspec::RR был инициализирован своим набором опций, вы должны сделать это явно:
invoke "rspec:rr", [], :style => :foo
Помимо предоставления экземпляра, вы также можете указать класс для вызова:
invoke Rspec::RR, [], :style => :foo
# File lib/bundler/vendor/thor/lib/thor/invocation.rb, line 137
def invoke_with_padding(*args)
with_padding { invoke(*args) }
end Вызывает с использованием заполнения оболочки.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.