Class: Homebrew::Bundle::Uv Private

Inherits:
Extension show all
Defined in:
bundle/extensions/uv.rb

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.

Constant Summary collapse

WithOptions =

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

T.type_alias { T::Hash[Symbol, T.any(String, T::Array[String])] }
Tool =

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

T.type_alias { { name: String, with: T::Array[String], source: T.nilable(String) } }
Checkable =

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

T.type_alias { { name: String, options: WithOptions } }
ToolEntry =

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

T.type_alias { T.any(Tool, Checkable) }
SOURCE_REQUIREMENT_REGEX =

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

%r{\A(?:git\+|https?://|file://|\.{0,2}/)|\.git\z}

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Extension

add_supported?, check, cleanup!, cleanup_disable_description, cleanup_disable_env, cleanup_item_name, cleanup_items, cleanup_supported?, disable_predicate_method, dump, dump_disable_description, dump_disable_env, dump_disable_predicate_method, dump_disable_supported?, dump_output, dump_supported?, ensure_package_manager_installed!, #failure_reason, fetchable_name, flag, inherited, install_supported?, install_verb, legacy_check_step, package_description, package_manager_env, package_manager_executable, package_manager_executable!, package_manager_installed?, package_manager_name, predicate_method, quote, remove_supported?, switch_description, with_package_manager_env

Methods inherited from PackageType

check, #checkable_entries, dump, dump_output, dump_supported?, #exit_early_check, #failure_reason, fetchable_name, #find_actionable, #full_check, inherited, install_supported?, install_verb

Class Method Details

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:



24
# File 'bundle/extensions/uv.rb', line 24

def banner_name = "uv tools"

.check_labelString

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:



21
# File 'bundle/extensions/uv.rb', line 21

def check_label = "uv Tool"

.cleanup_headingString?

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:



57
58
59
# File 'bundle/extensions/uv.rb', line 57

def cleanup_heading
  banner_name
end

.continuation_constraint?(requirement) ⇒ Boolean

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:

Returns:

  • (Boolean)


188
189
190
# File 'bundle/extensions/uv.rb', line 188

def continuation_constraint?(requirement)
  requirement.match?(/\A(?:<=|>=|!=|==|~=|<|>)\s*\S/)
end

.dump_entry(package) ⇒ 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.

Parameters:

Returns:



275
276
277
278
279
280
281
# File 'bundle/extensions/uv.rb', line 275

def dump_entry(package)
  line = super
  source = dump_source(package)
  line = "#{line}, source: #{quote(source)}" if source.present?

  line
end

.dump_name(package) ⇒ 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.

Parameters:

Returns:



76
77
78
# File 'bundle/extensions/uv.rb', line 76

def dump_name(package)
  package_name(T.cast(package, ToolEntry))
end

.dump_source(package) ⇒ 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.

Parameters:

Returns:



86
87
88
# File 'bundle/extensions/uv.rb', line 86

def dump_source(package)
  package_source(T.cast(package, ToolEntry))
end

.dump_with(package) ⇒ Array<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.

Parameters:

Returns:



81
82
83
# File 'bundle/extensions/uv.rb', line 81

def dump_with(package)
  package_with(T.cast(package, ToolEntry))
end

.entry(name, options = {}) ⇒ Dsl::Entry

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:

Returns:



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'bundle/extensions/uv.rb', line 27

def entry(name, options = {})
  unknown_options = options.keys - [:with, :source]
  raise "unknown options(#{unknown_options.inspect}) for uv" if unknown_options.present?

  with = options[:with]
  if !with.nil? && (!with.is_a?(Array) || with.any? { |requirement| !requirement.is_a?(String) })
    raise "options[:with](#{with.inspect}) should be an Array of String objects"
  end

  source = options.fetch(:source, nil)
  if !source.nil? && !source.is_a?(String)
    raise "options[:source](#{source.inspect}) should be a String object"
  end

  normalized_options = {}
  normalized_with = normalize_with(with || [])
  normalized_options[:with] = normalized_with if normalized_with.present?
  normalized_source = normalize_source(source)
  normalized_options[:source] = normalized_source if normalized_source.present?

  Dsl::Entry.new(:uv, name, normalized_options)
end

.install!(name, with: nil, source: nil, preinstall: true, no_upgrade: false, verbose: false, force: false, **_options) ⇒ Boolean

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:

  • name (String)
  • with (Array<String>, nil) (defaults to: nil)
  • source (String, nil) (defaults to: nil)
  • preinstall (Boolean) (defaults to: true)
  • no_upgrade (Boolean) (defaults to: false)
  • verbose (Boolean) (defaults to: false)
  • force (Boolean) (defaults to: false)
  • _options (Homebrew::Bundle::EntryOption)

Returns:

  • (Boolean)


318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
# File 'bundle/extensions/uv.rb', line 318

def install!(name, with: nil, source: nil, preinstall: true, no_upgrade: false, verbose: false, force: false,
             **_options)
  _ = no_upgrade
  _ = force

  return true unless preinstall

  puts "Installing #{name} #{package_description}. It is not currently installed." if verbose
  return false unless install_package!(name, with:, source:, verbose:)

  package = normalized_options(name, with: with || [], source:)
  installed_packages << package unless installed_packages.include?(package)
  packages << package unless packages.include?(package)
  true
end

.install_package!(name, with: nil, source: nil, verbose: false) ⇒ Boolean

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:

  • name (String)
  • with (Array<String>, nil) (defaults to: nil)
  • source (String, nil) (defaults to: nil)
  • verbose (Boolean) (defaults to: false)

Returns:

  • (Boolean)


98
99
100
101
102
103
104
105
106
107
108
# File 'bundle/extensions/uv.rb', line 98

def install_package!(name, with: nil, source: nil, verbose: false)
  uv = package_manager_executable!

  args = ["tool", "install", source.presence || name]
  normalize_with(with || []).each do |requirement|
    args << "--with"
    args << requirement
  end

  Bundle.system(uv.to_s, *args, verbose:)
end

.installed_packagesArray<Tool>

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:



111
112
113
114
115
116
# File 'bundle/extensions/uv.rb', line 111

def installed_packages
  installed_packages = @installed_packages
  return installed_packages if installed_packages

  @installed_packages = packages.dup
end

.name_with_extras(name, extras_raw) ⇒ 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.

Parameters:

Returns:



156
157
158
159
160
161
162
163
# File 'bundle/extensions/uv.rb', line 156

def name_with_extras(name, extras_raw)
  return name if extras_raw.blank?

  extras = extras_raw.split(",").map(&:strip).reject(&:empty?).uniq.sort
  return name if extras.empty?

  "#{name}[#{extras.join(",")}]"
end

.normalize_constraint(requirement) ⇒ 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.

Parameters:

Returns:



194
195
196
# File 'bundle/extensions/uv.rb', line 194

def normalize_constraint(requirement)
  requirement.strip.sub(/\A(<=|>=|!=|==|~=|<|>)\s+/, "\\1")
end

.normalize_name(name) ⇒ 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.

Parameters:

Returns:



212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'bundle/extensions/uv.rb', line 212

def normalize_name(name)
  match = name.strip.match(/\A(?<base>[^\[\]]+)(?:\[(?<extras>[^\]]+)\])?\z/)
  return name.strip unless match

  base = match[:base]
  return name.strip if base.nil?

  extras_raw = match[:extras]
  return base.strip if extras_raw.blank?

  extras = extras_raw.split(",").map(&:strip).reject(&:empty?).uniq.sort
  return base.strip if extras.empty?

  "#{base.strip}[#{extras.join(",")}]"
end

.normalize_source(source) ⇒ 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.

Parameters:

Returns:



206
207
208
# File 'bundle/extensions/uv.rb', line 206

def normalize_source(source)
  source.presence&.strip
end

.normalize_with(with) ⇒ Array<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.

Parameters:

Returns:



200
201
202
# File 'bundle/extensions/uv.rb', line 200

def normalize_with(with)
  with.map(&:strip).reject(&:empty?).uniq.sort
end

.normalized_options(name, with:, source: nil) ⇒ Tool

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:

Returns:



241
242
243
244
245
246
247
# File 'bundle/extensions/uv.rb', line 241

def normalized_options(name, with:, source: nil)
  {
    name:   normalize_name(name),
    with:   normalize_with(with),
    source: normalize_source(source),
  }
end

.package_installed?(name, with: nil, source: nil) ⇒ Boolean

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:

Returns:

  • (Boolean)


341
342
343
# File 'bundle/extensions/uv.rb', line 341

def package_installed?(name, with: nil, source: nil)
  installed_packages.include?(package_record(name, with:, source:))
end

.package_name(package) ⇒ 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.

Parameters:

Returns:



251
252
253
# File 'bundle/extensions/uv.rb', line 251

def package_name(package)
  package[:name]
end

.package_record(name, with: nil, source: 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.

Parameters:

Returns:



236
237
238
# File 'bundle/extensions/uv.rb', line 236

def package_record(name, with: nil, source: nil)
  normalized_options(name, with: with || [], source:)
end

.package_source(package) ⇒ 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.

Parameters:

Returns:



267
268
269
270
271
# File 'bundle/extensions/uv.rb', line 267

def package_source(package)
  return package[:source] if package.key?(:source)

  T.cast(package[:options].fetch(:source, nil), T.nilable(String))
end

.package_with(package) ⇒ Array<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.

Parameters:

Returns:



257
258
259
260
261
262
263
# File 'bundle/extensions/uv.rb', line 257

def package_with(package)
  if package.key?(:with)
    package[:with]
  else
    package[:options].fetch(:with, [])
  end
end

.packagesArray<Tool>

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:



62
63
64
65
66
67
68
69
70
71
72
73
# File 'bundle/extensions/uv.rb', line 62

def packages
  packages = @packages
  return packages if packages

  @packages = if (uv = package_manager_executable)
    output = `#{uv} tool list --show-with --show-extras --show-version-specifiers 2>/dev/null`
    parse_tool_list(output)
  end
  return [] if @packages.nil?

  @packages
end

.parse_source(required_raw) ⇒ 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.

Parameters:

Returns:



146
147
148
149
150
151
152
# File 'bundle/extensions/uv.rb', line 146

def parse_source(required_raw)
  source = normalize_source(required_raw)
  return if source.nil?
  return source if source.match?(SOURCE_REQUIREMENT_REGEX)

  nil
end

.parse_tool_list(output) ⇒ Array<Tool>

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:

Returns:



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'bundle/extensions/uv.rb', line 119

def parse_tool_list(output)
  entries = T.let([], T::Array[Tool])

  output.each_line do |line|
    match = line.match(/\A(\S+)\s+v\S+/)
    next unless match

    name = match[1]
    next if name.nil?

    extras_raw = line[/\[extras:\s*([^\]]+)\]/, 1]
    name = name_with_extras(name, extras_raw)
    with_raw = line[/\[with:\s*([^\]]+)\]/, 1]
    required_raw = line[/\[required:\s*([^\]]+)\]/, 1]

    entries << {
      name:   name,
      with:   parse_with_requirements(with_raw),
      source: parse_source(required_raw),
    }
  end

  entries.sort_by { |entry| entry[:name].to_s }
end

.parse_with_requirements(with_raw) ⇒ Array<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.

Parameters:

Returns:



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'bundle/extensions/uv.rb', line 167

def parse_with_requirements(with_raw)
  return [] if with_raw.blank?

  entries = T.let([], T::Array[String])
  with_raw.split(", ").each do |token|
    requirement = token.strip
    next if requirement.empty?

    if continuation_constraint?(requirement) && entries.any?
      last_requirement = entries.pop
      entries << "#{last_requirement}, #{normalize_constraint(requirement)}" if last_requirement
    else
      entries << requirement
    end
  end

  entries.uniq.sort
end

.preinstall!(name, with: nil, source: nil, no_upgrade: false, verbose: false, **_options) ⇒ Boolean

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:

Returns:

  • (Boolean)


293
294
295
296
297
298
299
300
301
302
303
304
# File 'bundle/extensions/uv.rb', line 293

def preinstall!(name, with: nil, source: nil, no_upgrade: false, verbose: false, **_options)
  _ = no_upgrade

  ensure_package_manager_installed!(name, verbose:)

  if package_installed?(name, with:, source:)
    puts "Skipping install of #{name} #{package_description}. It is already installed." if verbose
    return false
  end

  true
end

.reset!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.

This method returns an undefined value.



51
52
53
54
# File 'bundle/extensions/uv.rb', line 51

def reset!
  @packages = T.let(nil, T.nilable(T::Array[Tool]))
  @installed_packages = T.let(nil, T.nilable(T::Array[Tool]))
end

.typeSymbol

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:



18
# File 'bundle/extensions/uv.rb', line 18

def type = :uv

.uninstall_package!(name, executable: Pathname.new("")) ⇒ 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.

This method returns an undefined value.

Parameters:



346
347
348
# File 'bundle/extensions/uv.rb', line 346

def uninstall_package!(name, executable: Pathname.new(""))
  Bundle.system(executable.to_s, "tool", "uninstall", name, verbose: false)
end

Instance Method Details

#format_checkable(entries) ⇒ Array<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.

Parameters:

Returns:



352
353
354
355
356
# File 'bundle/extensions/uv.rb', line 352

def format_checkable(entries)
  checkable_entries(entries).map do |entry|
    { name: entry.name, options: entry.options }
  end
end

#installed_and_up_to_date?(package, no_upgrade: false) ⇒ Boolean

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:

  • package (Object)
  • no_upgrade (Boolean) (defaults to: false)

Returns:

  • (Boolean)


359
360
361
362
363
364
365
# File 'bundle/extensions/uv.rb', line 359

def installed_and_up_to_date?(package, no_upgrade: false)
  self.class.package_installed?(
    self.class.dump_name(package),
    with:   self.class.dump_with(package),
    source: self.class.dump_source(package),
  )
end