Enable strict typing in Formula

This commit is contained in:
Douglas Eichelberger 2025-02-16 22:20:37 -08:00 committed by Douglas Eichelberger
parent 62dc3876ab
commit a81239ec2d
No known key found for this signature in database
GPG Key ID: F90193CBD547EB81
15 changed files with 323 additions and 160 deletions

View File

@ -19,8 +19,8 @@ class Caveats
sig { returns(String) } sig { returns(String) }
def caveats def caveats
caveats = [] caveats = []
build = formula.build
begin begin
build = formula.build
formula.build = Tab.for_formula(formula) formula.build = Tab.for_formula(formula)
string = formula.caveats.to_s string = formula.caveats.to_s
caveats << "#{string.chomp}\n" unless string.empty? caveats << "#{string.chomp}\n" unless string.empty?

View File

@ -209,16 +209,18 @@ module Homebrew
formulae.map(&:to_hash) formulae.map(&:to_hash)
end end
when :v2 when :v2
formulae, casks = if all formulae, casks = T.let(
[ if all
Formula.all(eval_all: args.eval_all?).sort, [
Cask::Cask.all(eval_all: args.eval_all?).sort_by(&:full_name), Formula.all(eval_all: args.eval_all?).sort,
] Cask::Cask.all(eval_all: args.eval_all?).sort_by(&:full_name),
elsif args.installed? ]
[Formula.installed.sort, Cask::Caskroom.casks.sort_by(&:full_name)] elsif args.installed?
else [Formula.installed.sort, Cask::Caskroom.casks.sort_by(&:full_name)]
args.named.to_formulae_to_casks else
end T.cast(args.named.to_formulae_to_casks, [T::Array[Formula], T::Array[Cask::Cask]])
end, [T::Array[Formula], T::Array[Cask::Cask]]
)
if args.variations? if args.variations?
{ {

View File

@ -123,7 +123,8 @@ module Homebrew
raise UsageError, "Cannot use #{flags.join(", ")} with formula arguments." unless args.no_named? raise UsageError, "Cannot use #{flags.join(", ")} with formula arguments." unless args.no_named?
formulae = if args.t? formulae = if args.t?
Formula.installed.sort_by { |formula| test("M", formula.rack) }.reverse! # See https://ruby-doc.org/3.2/Kernel.html#method-i-test
Formula.installed.sort_by { |formula| T.cast(test("M", formula.rack.to_s), Time) }.reverse!
elsif args.full_name? elsif args.full_name?
Formula.installed.sort { |a, b| tap_and_name_comparison.call(a.full_name, b.full_name) } Formula.installed.sort { |a, b| tap_and_name_comparison.call(a.full_name, b.full_name) }
else else

View File

@ -33,7 +33,7 @@ module Homebrew
end end
ff.each do |f| ff.each do |f|
missing = f.missing_dependencies(hide: args.hide) missing = f.missing_dependencies(hide: args.hide || [])
next if missing.empty? next if missing.empty?
Homebrew.failed = true Homebrew.failed = true

View File

@ -161,7 +161,7 @@ module Homebrew
end end
next unless formula.any_version_installed? next unless formula.any_version_installed?
keg = formula.installed_kegs.last keg = formula.installed_kegs.fetch(-1)
tab = keg.tab tab = keg.tab
# force a `brew upgrade` from the linuxbrew-core version to the homebrew-core version (even if lower) # force a `brew upgrade` from the linuxbrew-core version to the homebrew-core version (even if lower)
tab.source["versions"]["version_scheme"] = -1 tab.source["versions"]["version_scheme"] = -1

View File

@ -106,9 +106,9 @@ module Homebrew
# We can only get here if `used_formulae_missing` is false, thus there are no UnavailableFormula. # We can only get here if `used_formulae_missing` is false, thus there are no UnavailableFormula.
used_formulae = T.cast(used_formulae, T::Array[Formula]) used_formulae = T.cast(used_formulae, T::Array[Formula])
if show_formulae_and_casks || args.formula? if show_formulae_and_casks || args.formula?
deps += used_formulae.map(&:runtime_installed_formula_dependents) deps += T.must(used_formulae.map(&:runtime_installed_formula_dependents)
.reduce(&:&) .reduce(&:&))
.select(&:any_version_installed?) .select(&:any_version_installed?)
end end
if show_formulae_and_casks || args.cask? if show_formulae_and_casks || args.cask?
deps += select_used_dependents( deps += select_used_dependents(

View File

@ -115,7 +115,7 @@ module Homebrew
end end
end end
formulae_and_casks = formulae_and_casks&.sort_by do |formula_or_cask| formulae_and_casks = formulae_and_casks.sort_by do |formula_or_cask|
formula_or_cask.respond_to?(:token) ? formula_or_cask.token : formula_or_cask.name formula_or_cask.respond_to?(:token) ? formula_or_cask.token : formula_or_cask.name
end end

View File

@ -63,7 +63,7 @@ module Homebrew
end end
end end
sig { params(list: T::Array[String], string: String).returns(String) } sig { params(list: T::Array[T.any(Formula, Pathname, String)], string: String).returns(String) }
def inject_file_list(list, string) def inject_file_list(list, string)
list.reduce(string.dup) { |acc, elem| acc << " #{elem}\n" } list.reduce(string.dup) { |acc, elem| acc << " #{elem}\n" }
.freeze .freeze

View File

@ -24,7 +24,7 @@ module Homebrew
end end
next unless recursive_runtime_dependencies.map(&:name).include? "gcc" next unless recursive_runtime_dependencies.map(&:name).include? "gcc"
keg = formula.installed_kegs.last keg = formula.installed_kegs.fetch(-1)
tab = keg.tab tab = keg.tab
# Force reinstallation upon `brew upgrade` to fix the bottle RPATH. # Force reinstallation upon `brew upgrade` to fix the bottle RPATH.
tab.source["versions"]["version_scheme"] = -1 tab.source["versions"]["version_scheme"] = -1

View File

@ -48,9 +48,9 @@ module OS
built_global_dep_tree! built_global_dep_tree!
end end
sig { params(name: String).returns(T.nilable(Formula)) } sig { params(name: String).returns(T.nilable(::Formula)) }
def formula_for(name) def formula_for(name)
@formula_for ||= T.let({}, T.nilable(T::Hash[String, Formula])) @formula_for ||= T.let({}, T.nilable(T::Hash[String, ::Formula]))
@formula_for[name] ||= ::Formula[name] @formula_for[name] ||= ::Formula[name]
rescue FormulaUnavailableError rescue FormulaUnavailableError
nil nil

File diff suppressed because it is too large Load Diff

View File

@ -307,7 +307,7 @@ module FormulaCellarChecks
return unless formula.service? return unless formula.service?
return unless formula.service.command? return unless formula.service.command?
"Service command does not exist" unless File.exist?(formula.service.command.first) "Service command does not exist" unless File.exist?(T.must(formula.service.command).first)
end end
sig { params(formula: Formula).returns(T.nilable(String)) } sig { params(formula: Formula).returns(T.nilable(String)) }

View File

@ -1230,7 +1230,7 @@ on_request: installed_on_request?, options:)
return keg_formula_path if formula.loaded_from_api? return keg_formula_path if formula.loaded_from_api?
return keg_formula_path if formula.local_bottle_path.present? return keg_formula_path if formula.local_bottle_path.present?
tap_formula_path = formula.specified_path tap_formula_path = T.must(formula.specified_path)
return keg_formula_path unless tap_formula_path.exist? return keg_formula_path unless tap_formula_path.exist?
begin begin

View File

@ -16,7 +16,7 @@ module Language
next false unless f.any_version_installed? next false unless f.any_version_installed?
unless version.zero? unless version.zero?
major = f.any_installed_version.major major = T.must(f.any_installed_version).major
next false if major < version next false if major < version
next false if major > version && !can_be_newer next false if major > version && !can_be_newer
end end

View File

@ -340,7 +340,10 @@ module Language
version = rp.match %r{^#{HOMEBREW_CELLAR}/python@(.*?)/}o version = rp.match %r{^#{HOMEBREW_CELLAR}/python@(.*?)/}o
version = "@#{version.captures.first}" unless version.nil? version = "@#{version.captures.first}" unless version.nil?
new_target = rp.sub %r{#{HOMEBREW_CELLAR}/python#{version}/[^/]+}, Formula["python#{version}"].opt_prefix new_target = rp.sub(
%r{#{HOMEBREW_CELLAR}/python#{version}/[^/]+},
Formula["python#{version}"].opt_prefix.to_s,
)
f.unlink f.unlink
f.make_symlink new_target f.make_symlink new_target
end end
@ -351,7 +354,10 @@ module Language
version = prefix_path.match %r{^#{HOMEBREW_CELLAR}/python@(.*?)/}o version = prefix_path.match %r{^#{HOMEBREW_CELLAR}/python@(.*?)/}o
version = "@#{version.captures.first}" unless version.nil? version = "@#{version.captures.first}" unless version.nil?
prefix_path.sub! %r{^#{HOMEBREW_CELLAR}/python#{version}/[^/]+}, Formula["python#{version}"].opt_prefix prefix_path.sub!(
%r{^#{HOMEBREW_CELLAR}/python#{version}/[^/]+},
Formula["python#{version}"].opt_prefix.to_s,
)
prefix_file.atomic_write prefix_path prefix_file.atomic_write prefix_path
end end
@ -362,7 +368,7 @@ module Language
cfg = cfg_file.read cfg = cfg_file.read
framework = "Frameworks/Python.framework/Versions" framework = "Frameworks/Python.framework/Versions"
cfg.match(%r{= *(#{HOMEBREW_CELLAR}/(python@[\d.]+)/[^/]+(?:/#{framework}/[\d.]+)?/bin)}) do |match| cfg.match(%r{= *(#{HOMEBREW_CELLAR}/(python@[\d.]+)/[^/]+(?:/#{framework}/[\d.]+)?/bin)}) do |match|
cfg.sub! match[1].to_s, Formula[match[2]].opt_bin cfg.sub! match[1].to_s, Formula[T.must(match[2])].opt_bin.to_s
cfg_file.atomic_write cfg cfg_file.atomic_write cfg
end end
end end