mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

These were changed to extend to make it easier to determine where the classes come to in the extended callback but that means that the file is somewhat inconsistent. On the one hand we're using class methods and on the other we're extend self. This cleans that up but now the diff is atrocious and the blame is even worse. Oh well...
106 lines
3.2 KiB
Ruby
106 lines
3.2 KiB
Ruby
# typed: true
|
|
# frozen_string_literal: true
|
|
|
|
require "extend/cachable"
|
|
require "api/download"
|
|
|
|
module Homebrew
|
|
module API
|
|
# Helper functions for using the formula JSON API.
|
|
#
|
|
# @api private
|
|
module Formula
|
|
extend Cachable
|
|
|
|
private_class_method :cache
|
|
|
|
sig { params(name: String).returns(Hash) }
|
|
def self.fetch(name)
|
|
Homebrew::API.fetch "formula/#{name}.json"
|
|
end
|
|
|
|
sig { params(formula: ::Formula).returns(::Formula) }
|
|
def self.source_download(formula)
|
|
path = formula.ruby_source_path || "Formula/#{formula.name}.rb"
|
|
git_head = formula.tap_git_head || "HEAD"
|
|
tap = formula.tap&.full_name || "Homebrew/homebrew-core"
|
|
|
|
download = Homebrew::API::Download.new(
|
|
"https://raw.githubusercontent.com/#{tap}/#{git_head}/#{path}",
|
|
formula.ruby_source_checksum,
|
|
cache: HOMEBREW_CACHE_API_SOURCE/"#{tap}/#{git_head}/Formula",
|
|
)
|
|
download.fetch
|
|
Formulary.factory(download.symlink_location,
|
|
formula.active_spec_sym,
|
|
alias_path: formula.alias_path,
|
|
flags: formula.class.build_flags)
|
|
end
|
|
|
|
sig { returns(T::Boolean) }
|
|
def self.download_and_cache_data!
|
|
json_formulae, updated = Homebrew::API.fetch_json_api_file "formula.jws.json"
|
|
|
|
cache["aliases"] = {}
|
|
cache["renames"] = {}
|
|
cache["formulae"] = json_formulae.to_h do |json_formula|
|
|
json_formula["aliases"].each do |alias_name|
|
|
cache["aliases"][alias_name] = json_formula["name"]
|
|
end
|
|
(json_formula["oldnames"] || [json_formula["oldname"]].compact).each do |oldname|
|
|
cache["renames"][oldname] = json_formula["name"]
|
|
end
|
|
|
|
[json_formula["name"], json_formula.except("name")]
|
|
end
|
|
|
|
updated
|
|
end
|
|
private_class_method :download_and_cache_data!
|
|
|
|
sig { returns(T::Hash[String, Hash]) }
|
|
def self.all_formulae
|
|
unless cache.key?("formulae")
|
|
json_updated = download_and_cache_data!
|
|
write_names_and_aliases(regenerate: json_updated)
|
|
end
|
|
|
|
cache["formulae"]
|
|
end
|
|
|
|
sig { returns(T::Hash[String, String]) }
|
|
def self.all_aliases
|
|
unless cache.key?("aliases")
|
|
json_updated = download_and_cache_data!
|
|
write_names_and_aliases(regenerate: json_updated)
|
|
end
|
|
|
|
cache["aliases"]
|
|
end
|
|
|
|
sig { returns(T::Hash[String, String]) }
|
|
def self.all_renames
|
|
unless cache.key?("renames")
|
|
json_updated = download_and_cache_data!
|
|
write_names_and_aliases(regenerate: json_updated)
|
|
end
|
|
|
|
cache["renames"]
|
|
end
|
|
|
|
sig { params(regenerate: T::Boolean).void }
|
|
def self.write_names_and_aliases(regenerate: false)
|
|
download_and_cache_data! unless cache.key?("formulae")
|
|
|
|
return unless Homebrew::API.write_names_file(all_formulae.keys, "formula", regenerate: regenerate)
|
|
|
|
(HOMEBREW_CACHE_API/"formula_aliases.txt").open("w") do |file|
|
|
all_aliases.each do |alias_name, real_name|
|
|
file.puts "#{alias_name}|#{real_name}"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|