Spec-Zone.ru › Homebrew

Класс: Dependency

Наследует:
Object
  • Object
  • Dependency
показать все
Подключает:
Dependable
Определён в:
dependency.rb

Обзор

Этот класс является частью внутреннего API. Этот класс можно использовать только внутри репозиториев, принадлежащих Homebrew, за исключением cask-файлов и формул. По возможности сторонним разработчикам следует избегать использования этого класса, поскольку он может быть удалён или изменён без предупреждения.

Зависимость от другой формулы Homebrew.

Прямые известные подклассы

UsesFromMacOSDependency

Сводка констант

Константы, подключённые из Dependable

Dependable::KEEP_BUT_PRUNE_RECURSIVE_DEPS, Dependable::PRUNE, Dependable::RESERVED_TAGS, Dependable::SKIP

Краткое описание атрибутов экземпляра свернуть

  • #name ⇒ String только для чтения закрытый
  • #tags ⇒ Array<Symbol, String, Array<T.untyped>> только для чтения закрытый
  • #tap ⇒ Tap? только для чтения закрытый

Краткое описание методов класса свернуть

  • .action(dependent, dep, &block) ⇒ Symbol? закрытый

    CaskDependent может быть ещё не инициализирован, поэтому мы не используем сигнатуру времени выполнения.

  • .cache(key, cache_timestamp: nil) ⇒ Hash{String, Symbol => T.untyped} закрытый
  • .clear_cache ⇒ void закрытый
  • .delete_timestamped_cache_entry(key, cache_timestamp) ⇒ void закрытый
  • .expand(dependent, deps = dependent.deps, cache_key: nil, cache_timestamp: nil, &block) ⇒ Array<Dependency> внутренний

    Рекурсивно раскрывает зависимости каждого зависимого объекта и при необходимости передаёт пары [dependent, dep] в блок, чтобы вызывающая сторона могла применить к списку произвольные фильтры.

  • .merge_repeats(all) ⇒ Array<Dependency> закрытый

Краткое описание методов экземпляра свернуть

  • #dup_with_formula_name(formula) ⇒ T.self_type закрытый
  • #initialize(name, tags = []) ⇒ void конструктор закрытый
  • #installed?(minimum_version: nil, minimum_revision: nil, minimum_compatibility_version: nil, bottle_os_version: nil) ⇒ Boolean закрытый
  • #missing_options ⇒ Options закрытый
  • #option_names ⇒ Array<String> закрытый
  • #satisfied?(minimum_version: nil, minimum_revision: nil, minimum_compatibility_version: nil, bottle_os_version: nil) ⇒ Boolean закрытый
  • #to_formula ⇒ Formula закрытый
  • #to_installed_formula ⇒ Formula закрытый
  • #uses_from_macos? ⇒ Boolean закрытый

Методы, подключённые из Dependable

#build?, #implicit?, #no_linkage?, #option_tags, #optional?, #options, #prune_from_option?, #prune_if_build_and_not_dependent?, #recommended?, #required?, #test?

Подробное описание конструкторов

#initialize(name, tags = []) ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • name (String)
  • tags (String, Symbol, Array<T.untyped>, Hash{Symbol => T.anything}) (по умолчанию: [])


23
24
25
26
27
28
29
30
31
# File 'dependency.rb', line 23

def initialize(name, tags = [])
  @name = name
  @tags = T.let(Array(tags), T::Array[T.any(Symbol, String)])
  @tap = T.let(nil, T.nilable(Tap))

  return unless (tap_with_name = Tap.with_formula_name(name))

  @tap, = tap_with_name
end

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

#name ⇒ String (только для чтения)

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (String)


14
15
16
# File 'dependency.rb', line 14

def name
  @name
end

#tags ⇒ Array<Symbol, String, Array<T.untyped>> (только для чтения)

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Array<Symbol, String, Array<T.untyped>>)


20
21
22
# File 'dependency.rb', line 20

def tags
  @tags
end

#tap ⇒ Tap? (только для чтения)

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Tap, nil)


17
18
19
# File 'dependency.rb', line 17

def tap
  @tap
end

Подробное описание методов класса

.action(dependent, dep, &block) ⇒ Symbol?

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

CaskDependent может быть ещё не инициализирован, поэтому мы не используем сигнатуру времени выполнения

Параметры:

  • dependent (Formula, CaskDependent)
  • dep (Dependency)
  • block (T.proc.params(arg0: T.any(Formula, CaskDependent), arg1: Dependency).returns(T.nilable(Symbol)), nil)

Возвращает:

  • (Symbol, nil)


241
242
243
244
245
246
247
# File 'dependency.rb', line 241

def action(dependent, dep, &block)
  if block
    yield dependent, dep
  elsif dep.optional? || dep.recommended?
    Dependable::PRUNE unless T.cast(dependent, Formula).build.with?(dep)
  end
end

.cache(key, cache_timestamp: nil) ⇒ Hash{String, Symbol => T.untyped}

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Параметры:

  • key (String, nil)
  • cache_timestamp (Time, nil) (по умолчанию: nil)

Возвращает:

  • (Hash{String, Symbol => T.untyped})


266
267
268
269
270
271
272
273
274
275
276
# File 'dependency.rb', line 266

def cache(key, cache_timestamp: nil)
  @cache = T.let(@cache, T.nilable(T::Hash[Symbol, T.untyped]))
  @cache ||= { timestamped: {}, not_timestamped: {} }

  if cache_timestamp
    @cache[:timestamped][cache_timestamp] ||= {}
    @cache[:timestamped][cache_timestamp][key] ||= {}
  else
    @cache[:not_timestamped][key] ||= {}
  end
end

.clear_cache ⇒ void

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



279
280
281
282
283
284
285
# File 'dependency.rb', line 279

def clear_cache
  return unless @cache

  # No need to clear the timestamped cache as it's timestamped, and doing so causes problems in `expand`.
  # See https://github.com/Homebrew/brew/pull/20896#issuecomment-3419257460
  @cache[:not_timestamped].clear
end

.delete_timestamped_cache_entry(key, cache_timestamp) ⇒ void

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Параметры:

  • key (String, nil)
  • cache_timestamp (Time, nil)


288
289
290
291
292
293
294
# File 'dependency.rb', line 288

def delete_timestamped_cache_entry(key, cache_timestamp)
  return unless @cache
  return unless (timestamp_entry = @cache[:timestamped][cache_timestamp])

  timestamp_entry.delete(key)
  @cache[:timestamped].delete(cache_timestamp) if timestamp_entry.empty?
end

.expand(dependent, deps = dependent.deps, cache_key: nil, cache_timestamp: nil, &block) ⇒ Array<Dependency>

Этот метод является частью внутреннего API. Этот метод можно использовать только внутри репозиториев, принадлежащих Homebrew, за исключением cask и formula. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Рекурсивно разворачивает зависимости каждого зависимого объекта; при необходимости передаёт пары [dependent, dep], чтобы вызывающий код мог применить к списку произвольные фильтры. Фильтр по умолчанию, применяемый, если блок не задан, исключает необязательные зависимости и рекомендации в соответствии с запросом зависимого объекта

Параметры:

  • dependent (Formula, CaskDependent)
  • deps (Array<Dependency>) (по умолчанию: dependent.deps)
  • cache_key (String, nil) (по умолчанию: nil)
  • cache_timestamp (Time, nil) (по умолчанию: nil)
  • block (T.proc.params(arg0: T.any(Formula, CaskDependent), arg1: Dependency).returns(T.nilable(Symbol)), nil)

Возвращает:

  • (Array<Dependency>)


184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'dependency.rb', line 184

def expand(dependent, deps = dependent.deps, cache_key: nil, cache_timestamp: nil, &block)
  # Keep track dependencies to avoid infinite cyclic dependency recursion.
  @expand_stack ||= T.let([], T.nilable(T::Array[T.any(String, Symbol)]))
  @expand_stack.push dependent.name

  begin
    if cache_key.present?
      cache_key = "#{cache_key}-#{cache_timestamp}" if cache_timestamp

      if (entry = cache(cache_key, cache_timestamp:)[cache_id dependent])
        return entry.dup
      end
    end

    expanded_deps = []

    deps.each do |dep|
      next if dependent.name == dep.name

      case action(dependent, dep, &block)
      when Dependable::PRUNE
        next
      when Dependable::SKIP
        next if @expand_stack.include? dep.name

        expanded_deps.concat(expand(dep.to_formula, cache_key:, &block))
      when Dependable::KEEP_BUT_PRUNE_RECURSIVE_DEPS
        expanded_deps << dep
      else
        next if @expand_stack.include? dep.name

        dep_formula = dep.to_formula
        expanded_deps.concat(expand(dep_formula, cache_key:, &block))

        # Fixes names for renamed/aliased formulae.
        dep = dep.dup_with_formula_name(dep_formula)
        expanded_deps << dep
      end
    end

    expanded_deps = merge_repeats(expanded_deps)
    cache(cache_key, cache_timestamp:)[cache_id dependent] = expanded_deps.dup if cache_key.present?
    expanded_deps
  ensure
    @expand_stack.pop
  end
end

.merge_repeats(all) ⇒ Array<Dependency>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • all (Array<Dependency>)

Возвращает:

  • (Array<Dependency>)


250
251
252
253
254
255
256
257
258
259
260
261
262
263
# File 'dependency.rb', line 250

def merge_repeats(all)
  grouped = all.group_by(&:name)

  all.map(&:name).uniq.filter_map do |name|
    deps = grouped.fetch(name)
    dep  = deps.first
    next unless dep

    tags = merge_tags(deps)
    kwargs = {}
    kwargs[:bounds] = T.cast(dep, UsesFromMacOSDependency).bounds if dep.uses_from_macos?
    dep.class.new(name, tags, **kwargs)
  end
end

Подробное описание методов экземпляра

#dup_with_formula_name(formula) ⇒ T.self_type

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • formula (Formula)

Возвращает:

  • (T.self_type)


161
162
163
# File 'dependency.rb', line 161

def dup_with_formula_name(formula)
  self.class.new(formula.full_name.to_s, tags)
end

#installed?(minimum_version: nil, minimum_revision: nil, minimum_compatibility_version: nil, bottle_os_version: nil) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • minimum_version (Version, nil) (по умолчанию: nil)
  • minimum_revision (Integer, nil) (по умолчанию: nil)
  • minimum_compatibility_version (Integer, nil) (по умолчанию: nil)
  • bottle_os_version (String, nil) (по умолчанию: nil)

Возвращает:

  • (Boolean)


70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'dependency.rb', line 70

def installed?(minimum_version: nil, minimum_revision: nil, minimum_compatibility_version: nil,
               bottle_os_version: nil)
  formula = begin
    to_installed_formula
  rescue FormulaUnavailableError
    nil
  end
  return false unless formula

  # If the opt prefix doesn't exist: we likely have an incomplete installation.
  return false unless formula.opt_prefix.exist?

  return true if formula.latest_version_installed?

  return false if minimum_version.blank?

  installed_keg = formula.any_installed_keg
  return false unless installed_keg

  # If the keg name doesn't match, we may have moved from an alias to a full formula and need to upgrade.
  return false unless formula.possible_names.include?(installed_keg.name)

  installed_version = installed_keg.version

  # If both the formula and minimum dependency have a compatibility_version set,
  # and they match, the dependency is satisfied regardless of version/revision.
  if minimum_compatibility_version.present? && formula.compatibility_version.present?
    installed_tab = Tab.for_keg(installed_keg)
    installed_compatibility_version = installed_tab.source.dig("versions", "compatibility_version")

    # If installed version has same compatibility_version as required, it's compatible
    return true if installed_compatibility_version == minimum_compatibility_version &&
                   formula.compatibility_version == minimum_compatibility_version
  end

  # Tabs prior to 4.1.18 did not have revision or pkg_version fields.
  # As a result, we have to be more conversative when we do not have
  # a minimum revision from the tab and assume that if the formula has a
  # the same version and a non-zero revision that it needs upgraded.
  if minimum_revision.present?
    minimum_pkg_version = PkgVersion.new(minimum_version, minimum_revision)
    installed_version >= minimum_pkg_version
  elsif installed_version.version == minimum_version
    formula.revision.zero?
  else
    installed_version.version > minimum_version
  end
end

#missing_options ⇒ Options

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Options)


134
135
136
137
138
139
140
# File 'dependency.rb', line 134

def missing_options
  formula = to_installed_formula
  required = options
  required &= formula.options.to_a
  required -= Tab.for_formula(formula).used_options
  required
end

#option_names ⇒ Array<String>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Array<String>)


143
144
145
# File 'dependency.rb', line 143

def option_names
  [Utils.name_from_full_name(name)].freeze
end

#satisfied?(minimum_version: nil, minimum_revision: nil, minimum_compatibility_version: nil, bottle_os_version: nil) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • minimum_version (Version, nil) (по умолчанию: nil)
  • minimum_revision (Integer, nil) (по умолчанию: nil)
  • minimum_compatibility_version (Integer, nil) (по умолчанию: nil)
  • bottle_os_version (String, nil) (по умолчанию: nil)

Возвращает:

  • (Boolean)


127
128
129
130
131
# File 'dependency.rb', line 127

def satisfied?(minimum_version: nil, minimum_revision: nil,
               minimum_compatibility_version: nil, bottle_os_version: nil)
  installed?(minimum_version:, minimum_revision:, minimum_compatibility_version:, bottle_os_version:) &&
    missing_options.empty?
end

#to_formula ⇒ Formula

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Третьим сторонам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Formula)


56
57
58
59
60
# File 'dependency.rb', line 56

def to_formula
  formula = Formulary.factory(name, warn: false)
  formula.build = BuildOptions.new(options, formula.options)
  formula
end

#to_installed_formula ⇒ Formula

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Третьим сторонам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Formula)


49
50
51
52
53
# File 'dependency.rb', line 49

def to_installed_formula
  formula = Formulary.resolve(name)
  formula.build = BuildOptions.new(options, formula.options)
  formula
end

#uses_from_macos? ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Третьим сторонам по возможности следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


148
149
150
# File 'dependency.rb', line 148

def uses_from_macos?
  false
end

© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/Dependency.html

Spec-Zone.ru

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