Merge pull request #19323 from Homebrew/typed-formula

Enable strict typing in Formula
This commit is contained in:
Mike McQuaid 2025-02-25 08:36:24 +00:00 committed by GitHub
commit e49b36d118
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 393 additions and 391 deletions

View File

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

View File

@ -209,16 +209,18 @@ module Homebrew
formulae.map(&:to_hash)
end
when :v2
formulae, casks = if all
[
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)]
else
args.named.to_formulae_to_casks
end
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),
]
elsif args.installed?
[Formula.installed.sort, Cask::Caskroom.casks.sort_by(&:full_name)]
else
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?
{

View File

@ -123,7 +123,8 @@ module Homebrew
raise UsageError, "Cannot use #{flags.join(", ")} with formula arguments." unless args.no_named?
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?
Formula.installed.sort { |a, b| tap_and_name_comparison.call(a.full_name, b.full_name) }
else

View File

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

View File

@ -161,7 +161,7 @@ module Homebrew
end
next unless formula.any_version_installed?
keg = formula.installed_kegs.last
keg = formula.installed_kegs.fetch(-1)
tab = keg.tab
# force a `brew upgrade` from the linuxbrew-core version to the homebrew-core version (even if lower)
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.
used_formulae = T.cast(used_formulae, T::Array[Formula])
if show_formulae_and_casks || args.formula?
deps += used_formulae.map(&:runtime_installed_formula_dependents)
.reduce(&:&)
.select(&:any_version_installed?)
deps += T.must(used_formulae.map(&:runtime_installed_formula_dependents)
.reduce(&:&))
.select(&:any_version_installed?)
end
if show_formulae_and_casks || args.cask?
deps += select_used_dependents(

View File

@ -115,7 +115,7 @@ module Homebrew
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
end

View File

@ -63,7 +63,7 @@ module Homebrew
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)
list.reduce(string.dup) { |acc, elem| acc << " #{elem}\n" }
.freeze

View File

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

View File

@ -48,9 +48,9 @@ module OS
built_global_dep_tree!
end
sig { params(name: String).returns(T.nilable(Formula)) }
sig { params(name: String).returns(T.nilable(::Formula)) }
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]
rescue FormulaUnavailableError
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.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
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.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?
begin

View File

@ -16,7 +16,7 @@ module Language
next false unless f.any_version_installed?
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 && !can_be_newer
end

View File

@ -340,7 +340,10 @@ module Language
version = rp.match %r{^#{HOMEBREW_CELLAR}/python@(.*?)/}o
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.make_symlink new_target
end
@ -351,7 +354,10 @@ module Language
version = prefix_path.match %r{^#{HOMEBREW_CELLAR}/python@(.*?)/}o
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
end
@ -362,7 +368,7 @@ module Language
cfg = cfg_file.read
framework = "Frameworks/Python.framework/Versions"
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
end
end

View File

@ -46,7 +46,6 @@ RSpec.describe Language::Node::Shebang do
describe "#detected_node_shebang" do
it "can be used to replace Node shebangs" do
allow(Formulary).to receive(:factory)
allow(Formulary).to receive(:factory).with(f[:node18].name).and_return(f[:node18])
Utils::Shebang.rewrite_shebang described_class.detected_node_shebang(f[:versioned_node_dep]), file.path

View File

@ -45,7 +45,6 @@ RSpec.describe Language::Perl::Shebang do
describe "#detected_perl_shebang" do
it "can be used to replace Perl shebangs when depends_on \"perl\" is used" do
allow(Formulary).to receive(:factory)
allow(Formulary).to receive(:factory).with(f[:perl].name).and_return(f[:perl])
Utils::Shebang.rewrite_shebang described_class.detected_perl_shebang(f[:depends_on]), file.path
@ -58,7 +57,6 @@ RSpec.describe Language::Perl::Shebang do
end
it "can be used to replace Perl shebangs when uses_from_macos \"perl\" is used" do
allow(Formulary).to receive(:factory)
allow(Formulary).to receive(:factory).with(f[:perl].name).and_return(f[:perl])
Utils::Shebang.rewrite_shebang described_class.detected_perl_shebang(f[:uses_from_macos]), file.path

View File

@ -46,7 +46,6 @@ RSpec.describe Language::Python::Shebang do
describe "#detected_python_shebang" do
it "can be used to replace Python shebangs" do
allow(Formulary).to receive(:factory)
allow(Formulary).to receive(:factory).with(f[:python311].name).and_return(f[:python311])
Utils::Shebang.rewrite_shebang(
described_class.detected_python_shebang(f[:versioned_python_dep], use_python_from_path: false), file.path