Spec-Zone.ru › Ruby 2.6

модуль Bundler::Thor::Invocation

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

current_command_chain() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/invocation.rb, line 29
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 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
invoke_with_padding(*args) Показать исходный код
# 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.

Spec-Zone.ru

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