Spec-Zone.ru › Ruby 2.7

модуль Bundler::Plugin::API::Source

Этот класс предоставляет базу для создания плагинов источников. Все методы здесь необходимы для создания плагина источника (за исключением `uri_hash`, `gem_install_dir`; они являются вспомогательными).

По умолчанию для методов, где это возможно, предоставляются значения, которые, как ожидается, будут работать. Однако все плагины источников должны переопределять `fetch_gemspec_files` и `install`. Значения по умолчанию также не предоставляются для `remote!`, `cache!` и `unlock!`.

Значения по умолчанию должны работать в большинстве случаев, но тем не менее их можно (желательно следует) безопасно переопределять в соответствии с потребностями плагинов (при условии, что они ведут себя так, как ожидается). При переопределении `initialize` вы должны сначала вызвать `super`.

При необходимости плагин должен переопределять методы `hash`, `==` и `eql?`, чтобы иметь возможность сопоставлять объекты, представляющие одни и те же источники, но созданные в разных ситуациях (например, из файла gemfile и lockfile). Значения по умолчанию проверяют только класс и uri, но более сложные плагины источников могут потребовать более подробных сравнений (например, сравнение git по ветке или тегу).

@!attribute [r] uri

@return [String] the remote specified with `source` block in Gemfile

@!attribute [r] options

@return [String] options passed during initialization (either from
  lockfile or Gemfile)

@!attribute [r] name

@return [String] name that can be used to uniquely identify a source

@!attribute [rw] dependency_names

@return [Array<String>] Names of dependencies that the source should
  try to resolve. It is not necessary to use this list internally. This
  is present to be compatible with `Definition` and is used by
  rubygems source.

Атрибуты

dependency_names[RW]
name[R]
options[R]
uri[R]

Публичные методы класса

new(opts) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 45
def initialize(opts)
  @options = opts
  @dependency_names = []
  @uri = opts["uri"]
  @type = opts["type"]
  @name = opts["name"] || "#{@type} at #{@uri}"
end

Общедоступные методы экземпляров

==(other) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 205
def ==(other)
  other.is_a?(self.class) && uri == other.uri
end

Проверяет, представляют ли два объекта источника один и тот же источник.

Сравнение выполняется только по атрибутам, которые можно определить из опций, переданных из Gemfile, а не по атрибутам, используемым для привязки драгоценного камня к определённой версии (например, источники Git должны сравнивать ветку и тег, но не хеш коммита).

Объекты источников создаются из Gemfile и из lockfile. Для согласования источников необходимо, чтобы они совпадали.

То же самое относится к `eql?` и `hash`

Также алиас: eql?
app_cache_dirname() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 170
def app_cache_dirname
  base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
  "#{base_name}-#{uri_hash}"
end

Имя каталога, в котором плагин ожидает кэшировать драгоценные камни при вызове cache.

Также это имя используется для сопоставления каталогов в кэше для обрезки

Используется методом `app_cache_path`

app_cache_path(custom_path = nil) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 229
def app_cache_path(custom_path = nil)
  @app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname)
end

Полный путь, где плагин должен кэшировать драгоценный камень, чтобы его можно было установить позже.

Примечание: Не переопределяйте, если не знаете, что делаете.

bundler_plugin_api_source?() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 291
def bundler_plugin_api_source?
  true
end

@private Возвращает true

cache(spec, custom_path = nil) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 186
def cache(spec, custom_path = nil)
  new_cache_path = app_cache_path(custom_path)

  FileUtils.rm_rf(new_cache_path)
  FileUtils.cp_r(install_path, new_cache_path)
  FileUtils.touch(app_cache_path.join(".bundlecache"))
end

Этот метод вызывается во время кэширования, чтобы сохранить копию драгоценных камней, к которым источник может получить доступ по пути, предоставленному `app_cache_app`, чтобы их можно было переустановить из кэша без запроса удалённого сервера (т.е. альтернатива удалённому).

Это хранится вместе с приложением, и плагины источников должны пытаться предоставлять спецификации и устанавливать только из этого кэша, когда вызывается `cached!`.

Этот кэш отличается от внутреннего кэширования, которое может выполняться по подпутям `cache_path` (из API). Это можно рассматривать как кэширование Bundler.

cached!() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 154
def cached!
end

Set внутреннее представление для извлечения драгоценных камней/спецификаций из кэша приложения.

Когда это вызывается, источник должен попытаться извлечь спецификации и установить их из пути, предоставленного `app_cache_path`.

can_lock?(spec) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 241
def can_lock?(spec)
  spec.source == self
end

Примечание: Не переопределяйте, если не знаете, что делаете.

double_check_for(*) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 300
def double_check_for(*); end

@private Этот API для источника может быть нестабильным, и сейчас мы ожидаем, что плагины загрузят все спецификации в `#specs`, поэтому мы реализуем метод для совместимости и оставим его без документации (и не поддерживаем) переопределение.

eql?(other)

При переопределении `eql?` сохраните поведение, как описано в документации для метода `==`.

Псевдоним для: ==
fetch_gemspec_files() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 61
def fetch_gemspec_files
  []
end

Используется методом `spec` по умолчанию для создания объектов спецификаций для драгоценных камней и версий, которые может установить этот плагин источника.

Примечание: Если метод `spec` переопределён, эта функция не нужна

@return [Массив<Строка>] пути файлов gemspec для драгоценных камней, которые могут

be installed
gem_install_dir() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 276
def gem_install_dir
  Bundler.install_path
end

Примечание: Не переопределяйте, если не знаете, что делаете.

hash() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 216
def hash
  [self.class, uri].hash
end

При переопределении `hash` сохраните поведение, как описано в документации для метода `==`, т.е. два метода, равные по вышеуказанному сравнению, должны иметь одинаковый хеш.

include?(other) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 267
def include?(other)
  other == self
end

Примечание: Не переопределяйте, если не знаете, что делаете.

install(spec, opts) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 81
def install(spec, opts)
  raise MalformattedPlugin, "Source plugins need to override the install method."
end

Устанавливает драгоценный камень, указанный в спецификации, по соответствующему пути. `install_path` обеспечивает достаточный по умолчанию, если источник может удовлетворить только один драгоценный камень, но не является обязательным.

@return [Строка] сообщение после установки (если есть)

install_path() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 106
def install_path
  @install_path ||=
    begin
      base_name = File.basename(Bundler::URI.parse(uri).normalize.path)

      gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
    end
end

Путь установки по умолчанию для установки одного драгоценного камня. Если источник обслуживает несколько драгоценных камней, он не так полезен, и источник должен определить свой собственный.

installed?() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 221
def installed?
  File.directory?(install_path)
end

Вспомогательный метод, не обязателен, если не используется во внутреннем представлении.

options_to_lock() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 72
def options_to_lock
  {}
end

Опции, которые необходимо сохранить в lockfile, чтобы плагин источника мог позже получить ту же версию драгоценного камня.

Эти опции передаются при создании плагина источника из lockfile.

@return [Хеш]

post_install(spec, disable_exts = false) Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 97
def post_install(spec, disable_exts = false)
  opts = { :env_shebang => false, :disable_extensions => disable_exts }
  installer = Bundler::Source::Path::Installer.new(spec, opts)
  installer.post_install
end

Создаёт расширения, генерирует файлы исполняемых библиотек и устанавливает их для предоставленной спецификации.

Зависит от `spec.loaded_from` для получения `full_gem_path`. Плагины источника должны устанавливать это значение.

Должен вызываться в `install` после того, как плагин поместит драгоценный камень в правильное место установки.

Также выполняет крючки Gem `pre_install`, `post_build` и `post_install`

Примечание: Не переопределяйте, если не знаете, что делаете.

remote!() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 147
def remote!
end

Set внутреннее представление для извлечения драгоценных камней/спецификаций с удалённого сервера.

Когда это вызывается, источник должен попытаться извлечь спецификации и установить их с удалённого сервера.

root() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 285
def root
  Bundler.root
end

Используется для получения полного пути `full_gem_path`.

Путь `loaded_from` спецификации расширяется относительно этого значения для получения `full_gem_path`

Примечание: Не переопределяйте, если не знаете, что делаете.

specs() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 127
def specs
  files = fetch_gemspec_files

  Bundler::Index.build do |index|
    files.each do |file|
      next unless spec = Bundler.load_gemspec(file)
      Bundler.rubygems.set_installed_by_version(spec)

      spec.source = self
      Bundler.rubygems.validate(spec)

      index << spec
    end
  end
end

Парсит файлы gemspec, чтобы найти спецификации для драгоценных камней, которые могут быть удовлетворены исходным кодом.

Несколько важных моментов, которые следует учитывать:

- If the gems are not installed then it shall return specs for all
the gems it can satisfy
- If gem is installed (that is to be detected by the plugin itself)
then it shall return at least the specs that are installed.
- The `loaded_from` for each of the specs shall be correct (it is
used to find the load path)

@return [Bundler::Index] индекс, содержащий спецификации

to_lock() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 252
def to_lock
  out = String.new("#{LockfileParser::PLUGIN}\n")
  out << "  remote: #{@uri}\n"
  out << "  type: #{@type}\n"
  options_to_lock.each do |opt, value|
    out << "  #{opt}: #{value}\n"
  end
  out << "  specs:\n"
end

Генерирует содержимое, которое необходимо ввести в файл блокировки. Сохраняет тип и удалённый ресурс, а также вызывает `options_to_lock`.

Plugin следует использовать `options_to_lock` для сохранения информации в файле блокировки, а не перезаписывать это.

Примечание: Не перезаписывайте, если вы не знаете, что делаете.

to_s() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 262
def to_s
  "plugin source for #{options[:type]} with uri #{uri}"
end
unlock!() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 161
def unlock!
end

Этот метод вызывается для обновления спецификации и установки.

Если плагин источников загружается из файла блокировки или иным образом, он обновит кэш/спецификации (например, git-источники могут создать свежую копию).

unmet_deps() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 236
def unmet_deps
  specs.unmet_dependency_names
end

Используется по определению.

Примечание: Не перезаписывайте, если вы не знаете, что делаете.

uri_hash() Показать исходный код
# File lib/bundler/plugin/api/source.rb, line 271
def uri_hash
  SharedHelpers.digest(:SHA1).hexdigest(uri)
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