Spec-Zone.ru › Ruby 2.7

module Bundler::Thor::Invocation

Публичные методы экземпляра

current_command_chain() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/invocation.rb, line 30
def current_command_chain
  @_invocations.values.flatten.map(&:to_sym)
end

Обеспечивает доступ к текущей цепочке команд внутри Bundler::Thor-(под)команды.

invoke(name = nil, *args) Показать исходный код
# 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
invoke_with_padding(*args) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API