module Bundler::Thor::Invocation
Публичные методы экземпляра
# File lib/bundler/vendor/thor/lib/thor/invocation.rb, line 30 def current_command_chain @_invocations.values.flatten.map(&:to_sym) end
Обеспечивает доступ к текущей цепочке команд внутри Bundler::Thor-(под)команды.
# File lib/bundler/vendor/thor/lib/thor/invocation.rb, line 102
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
Поскольку среда тестирования mock не должна заниматься парсингом опций 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 138
def invoke_with_padding(*args)
with_padding { invoke(*args) }
end Вызывает с использованием заполнения shell.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.