formulary: support requirements, aliases etc from API

This commit is contained in:
Bo Anderson 2023-02-14 02:03:58 +00:00
parent 2a417f1416
commit 9b26bf9b92
No known key found for this signature in database
GPG Key ID: 3DB94E204E137D65
4 changed files with 68 additions and 9 deletions

View File

@ -154,6 +154,8 @@ class DependencyCollector
end
def parse_symbol_spec(spec, tags)
# When modifying this list of supported requirements, consider
# whether Formulary::API_SUPPORTED_REQUIREMENTS should also be changed.
case spec
when :arch then ArchRequirement.new(tags)
when :codesign then CodesignRequirement.new(tags)

View File

@ -2180,14 +2180,6 @@ class Formula
}
end
# TODO: can we implement these in Formulary?
if self.class.loaded_from_api && Homebrew::EnvConfig.install_from_api?
json_formula = Homebrew::API::Formula.all_formulae[name]
json_formula = Homebrew::API.merge_variations(json_formula)
hsh["oldname"] = json_formula["oldname"]
hsh["requirements"] = json_formula["requirements"]
end
hsh
end

View File

@ -19,6 +19,9 @@ module Formulary
URL_START_REGEX = %r{(https?|ftp|file)://}.freeze
# :codesign and custom requirement classes are not supported
API_SUPPORTED_REQUIREMENTS = [:arch, :linux, :macos, :maximum_macos, :xcode].freeze
sig { void }
def self.enable_factory_cache!
@factory_cache = true
@ -212,6 +215,35 @@ module Formulary
uses_from_macos dep
end
json_formula["requirements"].each do |req|
req_name = req["name"].to_sym
next if API_SUPPORTED_REQUIREMENTS.exclude?(req_name)
req_version = case req_name
when :arch
req["version"]&.to_sym
when :macos, :maximum_macos
MacOSVersions::SYMBOLS.key(req["version"])
else
req["version"]
end
req_tags = []
req_tags << req_version if req_version.present?
req_tags += req["contexts"].map do |tag|
case tag
when String
tag.to_sym
when Hash
tag.deep_transform_keys(&:to_sym)
else
tag
end
end
depends_on req_name => req_tags
end
def install
raise "Cannot build from source from abstract formula."
end
@ -225,6 +257,21 @@ module Formulary
def tap_git_head
self.class.instance_variable_get(:@tap_git_head_string)
end
@oldname_string = json_formula["oldname"]
def oldname
self.class.instance_variable_get(:@oldname_string)
end
@aliases_array = json_formula["aliases"]
def aliases
self.class.instance_variable_get(:@aliases_array)
end
@versioned_formulae_array = json_formula["versioned_formulae"]
def versioned_formulae_names
self.class.instance_variable_get(:@versioned_formulae_array)
end
end
klass.loaded_from_api = true

View File

@ -244,6 +244,15 @@ describe Formulary do
"recommended_dependencies" => ["recommended_dep"],
"optional_dependencies" => ["optional_dep"],
"uses_from_macos" => ["uses_from_macos_dep"],
"requirements" => [
{
"name" => "xcode",
"cask" => nil,
"download" => nil,
"version" => "1.0",
"contexts" => ["build"],
},
],
"caveats" => "example caveat string",
}.merge(extra_items),
}
@ -296,14 +305,23 @@ describe Formulary do
formula = described_class.factory(formula_name)
expect(formula).to be_a(Formula)
expect(formula.keg_only_reason.reason).to eq :provided_by_macos
if OS.mac?
expect(formula.deps.count).to eq 5
elsif OS.linux?
else
expect(formula.deps.count).to eq 6
end
expect(formula.uses_from_macos_elements).to eq ["uses_from_macos_dep"]
expect(formula.requirements.count).to eq 1
req = formula.requirements.first
expect(req).to be_an_instance_of XcodeRequirement
expect(req.version).to eq "1.0"
expect(req.tags).to eq [:build]
expect(formula.caveats).to eq "example caveat string"
expect {
formula.install
}.to raise_error("Cannot build from source from abstract formula.")