Class: Homebrew::CLI::NamedArgs Private

Inherits:
Array show all
Defined in:
cli/named_args.rb

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Helper class for loading formulae/casks from named arguments.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Array

#blank?, #deep_dup, #fifth, #fourth, #present?, #second, #third, #to_sentence

Constructor Details

#initialize(*args, parent: Args.new, override_spec: T.unsafe(nil), force_bottle: T.unsafe(nil), flags: T.unsafe(nil), cask_options: false, without_api: false) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • args (String)
  • parent (Args) (defaults to: Args.new)
  • override_spec (Symbol) (defaults to: T.unsafe(nil))
  • force_bottle (Boolean) (defaults to: T.unsafe(nil))
  • flags (Array<String>) (defaults to: T.unsafe(nil))
  • cask_options (Boolean) (defaults to: false)
  • without_api (Boolean) (defaults to: false)


23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'cli/named_args.rb', line 23

def initialize(
  *args,
  parent: Args.new,
  override_spec: T.unsafe(nil),
  force_bottle: T.unsafe(nil),
  flags: T.unsafe(nil),
  cask_options: false,
  without_api: false
)
  require "cask/cask"
  require "cask/cask_loader"
  require "formulary"
  require "keg"
  require "missing_formula"

  @args = args
  @override_spec = override_spec
  @force_bottle = force_bottle
  @flags = flags
  @cask_options = cask_options
  @without_api = without_api
  @parent = parent

  super(@args)
end

Instance Attribute Details

#parentObject (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



49
50
51
# File 'cli/named_args.rb', line 49

def parent
  @parent
end

Instance Method Details

#homebrew_tap_cask_namesArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



359
360
361
# File 'cli/named_args.rb', line 359

def homebrew_tap_cask_names
  downcased_unique_named.grep(HOMEBREW_CASK_TAP_CASK_REGEX)
end

#to_casksObject

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



51
52
53
# File 'cli/named_args.rb', line 51

def to_casks
  @to_casks ||= to_formulae_and_casks(only: :cask).freeze
end

#to_default_kegsArray<Keg>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



298
299
300
301
302
303
304
305
306
307
# File 'cli/named_args.rb', line 298

def to_default_kegs
  @to_default_kegs ||= begin
    to_formulae_and_casks(only: :formula, method: :default_kegs).freeze
  rescue NoSuchKegError => e
    if (reason = MissingFormula.suggest_command(e.name, "uninstall"))
      $stderr.puts reason
    end
    raise e
  end
end

#to_formulaeObject

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



55
56
57
# File 'cli/named_args.rb', line 55

def to_formulae
  @to_formulae ||= to_formulae_and_casks(only: :formula).freeze
end

#to_formulae_and_casks(only: parent&.only_formula_or_cask, ignore_unavailable: nil, method: T.unsafe(nil), uniq: true, warn: T.unsafe(nil)) ⇒ Array<Formula, Keg, Cask::Cask>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Convert named arguments to Formula or Cask objects. If both a formula and cask with the same name exist, returns the formula and prints a warning unless only is specified.

Parameters:

  • only (Symbol, nil) (defaults to: parent&.only_formula_or_cask)
  • ignore_unavailable (Boolean, nil) (defaults to: nil)
  • method (Symbol, nil) (defaults to: T.unsafe(nil))
  • uniq (Boolean) (defaults to: true)
  • warn (Boolean) (defaults to: T.unsafe(nil))

Returns:



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
# File 'cli/named_args.rb', line 71

def to_formulae_and_casks(
  only: parent&.only_formula_or_cask,
  ignore_unavailable: nil,
  method: T.unsafe(nil),
  uniq: true,
  warn: T.unsafe(nil)
)
  @to_formulae_and_casks ||= {}
  @to_formulae_and_casks[only] ||= downcased_unique_named.flat_map do |name|
    options = { warn: }.compact
    load_formula_or_cask(name, only:, method:, **options)
  rescue FormulaUnreadableError, FormulaClassUnavailableError,
         TapFormulaUnreadableError, TapFormulaClassUnavailableError,
         Cask::CaskUnreadableError
    # Need to rescue before `*UnavailableError` (superclass of this)
    # The formula/cask was found, but there's a problem with its implementation
    raise
  rescue NoSuchKegError, FormulaUnavailableError, Cask::CaskUnavailableError, FormulaOrCaskUnavailableError
    ignore_unavailable ? [] : raise
  end.freeze

  if uniq
    @to_formulae_and_casks[only].uniq.freeze
  else
    @to_formulae_and_casks[only]
  end
end

#to_formulae_and_casks_and_unavailable(only: parent&.only_formula_or_cask, method: nil) ⇒ Object

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



128
129
130
131
132
133
134
135
# File 'cli/named_args.rb', line 128

def to_formulae_and_casks_and_unavailable(only: parent&.only_formula_or_cask, method: nil)
  @to_formulae_casks_unknowns ||= {}
  @to_formulae_casks_unknowns[method] = downcased_unique_named.map do |name|
    load_formula_or_cask(name, only:, method:)
  rescue FormulaOrCaskUnavailableError => e
    e
  end.uniq.freeze
end

#to_formulae_and_casks_with_tapsObject

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns formulae and casks after validating that a tap is present for each of them.



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'cli/named_args.rb', line 107

def to_formulae_and_casks_with_taps
  formulae_and_casks_with_taps, formulae_and_casks_without_taps =
    to_formulae_and_casks.partition do |formula_or_cask|
      T.cast(formula_or_cask, T.any(Formula, Cask::Cask)).tap&.installed?
    end

  return formulae_and_casks_with_taps if formulae_and_casks_without_taps.blank?

  types = []
  types << "formulae" if formulae_and_casks_without_taps.any?(Formula)
  types << "casks" if formulae_and_casks_without_taps.any?(Cask::Cask)

  odie <<~ERROR
    These #{types.join(" and ")} are not in any locally installed taps!

      #{formulae_and_casks_without_taps.sort_by(&:to_s).join("\n  ")}

    You may need to run `brew tap` to install additional taps.
  ERROR
end

#to_formulae_to_casks(only: parent&.only_formula_or_cask, method: nil) ⇒ Object

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



99
100
101
102
103
104
# File 'cli/named_args.rb', line 99

def to_formulae_to_casks(only: parent&.only_formula_or_cask, method: nil)
  @to_formulae_to_casks ||= {}
  @to_formulae_to_casks[[method, only]] = to_formulae_and_casks(only:, method:)
                                          .partition { |o| o.is_a?(Formula) || o.is_a?(Keg) }
                                          .map(&:freeze).freeze
end

#to_installed_tapsArray<Tap>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



352
353
354
355
356
# File 'cli/named_args.rb', line 352

def to_installed_taps
  @to_installed_taps ||= to_taps.each do |tap|
    raise TapUnavailableError, tap.name unless tap.installed?
  end.uniq.freeze
end

#to_kegsArray<Keg>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



322
323
324
325
326
327
328
329
330
331
# File 'cli/named_args.rb', line 322

def to_kegs
  @to_kegs ||= begin
    to_formulae_and_casks(only: :formula, method: :kegs).freeze
  rescue NoSuchKegError => e
    if (reason = MissingFormula.suggest_command(e.name, "uninstall"))
      $stderr.puts reason
    end
    raise e
  end
end

#to_kegs_to_casks(only: parent&.only_formula_or_cask, ignore_unavailable: nil, all_kegs: nil) ⇒ Array(Array<Keg>, Array<Cask::Cask>)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • only (Symbol, nil) (defaults to: parent&.only_formula_or_cask)
  • ignore_unavailable (Boolean, nil) (defaults to: nil)
  • all_kegs (Boolean, nil) (defaults to: nil)

Returns:



337
338
339
340
341
342
343
344
# File 'cli/named_args.rb', line 337

def to_kegs_to_casks(only: parent&.only_formula_or_cask, ignore_unavailable: nil, all_kegs: nil)
  method = all_kegs ? :kegs : :default_kegs
  @to_kegs_to_casks ||= {}
  @to_kegs_to_casks[method] ||=
    to_formulae_and_casks(only:, ignore_unavailable:, method:)
    .partition { |o| o.is_a?(Keg) }
    .map(&:freeze).freeze
end

#to_latest_kegsArray<Keg>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



310
311
312
313
314
315
316
317
318
319
# File 'cli/named_args.rb', line 310

def to_latest_kegs
  @to_latest_kegs ||= begin
    to_formulae_and_casks(only: :formula, method: :latest_kegs).freeze
  rescue NoSuchKegError => e
    if (reason = MissingFormula.suggest_command(e.name, "uninstall"))
      $stderr.puts reason
    end
    raise e
  end
end

#to_paths(only: parent&.only_formula_or_cask, recurse_tap: false) ⇒ Array<Pathname>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Keep existing paths and try to convert others to tap, formula or cask paths. If a cask and formula with the same name exist, includes both their paths unless only is specified.

Parameters:

  • only (Symbol, nil) (defaults to: parent&.only_formula_or_cask)
  • recurse_tap (Boolean) (defaults to: false)

Returns:



253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# File 'cli/named_args.rb', line 253

def to_paths(only: parent&.only_formula_or_cask, recurse_tap: false)
  @to_paths ||= {}
  @to_paths[only] ||= Homebrew.with_no_api_env_if_needed(@without_api) do
    downcased_unique_named.flat_map do |name|
      path = Pathname(name).expand_path
      if only.nil? && name.match?(LOCAL_PATH_REGEX) && path.exist?
        path
      elsif name.match?(TAP_NAME_REGEX)
        tap = Tap.fetch(name)

        if recurse_tap
          next tap.formula_files if only == :formula
          next tap.cask_files if only == :cask
        end

        tap.path
      else
        next Formulary.path(name) if only == :formula
        next Cask::CaskLoader.path(name) if only == :cask

        formula_path = Formulary.path(name)
        cask_path = Cask::CaskLoader.path(name)

        paths = []

        if formula_path.exist? ||
           (!Homebrew::EnvConfig.no_install_from_api? &&
           !CoreTap.instance.installed? &&
           Homebrew::API::Formula.all_formulae.key?(path.basename.to_s))
          paths << formula_path
        end
        if cask_path.exist? ||
           (!Homebrew::EnvConfig.no_install_from_api? &&
           !CoreCaskTap.instance.installed? &&
           Homebrew::API::Cask.all_casks.key?(path.basename.to_s))
          paths << cask_path
        end

        paths.empty? ? path : paths
      end
    end.uniq.freeze
  end
end

#to_resolved_formulae(uniq: true) ⇒ Array<Formula>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • uniq (Boolean) (defaults to: true)

Returns:



236
237
238
239
# File 'cli/named_args.rb', line 236

def to_resolved_formulae(uniq: true)
  @to_resolved_formulae ||= to_formulae_and_casks(only: :formula, method: :resolve, uniq:)
                            .freeze
end

#to_resolved_formulae_to_casks(only: parent&.only_formula_or_cask) ⇒ Object

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



241
242
243
# File 'cli/named_args.rb', line 241

def to_resolved_formulae_to_casks(only: parent&.only_formula_or_cask)
  to_formulae_to_casks(only:, method: :resolve)
end

#to_tapsArray<Tap>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



347
348
349
# File 'cli/named_args.rb', line 347

def to_taps
  @to_taps ||= downcased_unique_named.map { |name| Tap.fetch name }.uniq.freeze
end