
This adds a registry for all modules and classes that cachable is included in. The registry allows us to programmatically clear all caches in between tests so that we don't forget to do that when adding a new class or refactoring code. The goal here is to reduce the number of flaky tests in the future.
108 lines
3.3 KiB
Ruby
108 lines
3.3 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
|
|
|
|
class << self
|
|
private :cache
|
|
|
|
sig { params(name: String).returns(Hash) }
|
|
def fetch(name)
|
|
Homebrew::API.fetch "formula/#{name}.json"
|
|
end
|
|
|
|
sig { params(formula: ::Formula).returns(::Formula) }
|
|
def 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 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 :download_and_cache_data!
|
|
|
|
sig { returns(T::Hash[String, Hash]) }
|
|
def 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 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 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 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
|
|
end
|