apainintheneck 536ae08a44 cachable: make sure to clear caches between tests
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.
2024-02-25 17:47:30 -08:00

93 lines
2.7 KiB
Ruby

# typed: true
# frozen_string_literal: true
require "extend/cachable"
require "api/download"
module Homebrew
module API
# Helper functions for using the cask JSON API.
#
# @api private
module Cask
extend Cachable
class << self
private :cache
sig { params(token: String).returns(Hash) }
def fetch(token)
Homebrew::API.fetch "cask/#{token}.json"
end
sig { params(cask: ::Cask::Cask).returns(::Cask::Cask) }
def source_download(cask)
path = cask.ruby_source_path.to_s || "Casks/#{cask.token}.rb"
sha256 = cask.ruby_source_checksum[:sha256]
checksum = Checksum.new(sha256) if sha256
git_head = cask.tap_git_head || "HEAD"
tap = cask.tap&.full_name || "Homebrew/homebrew-cask"
download = Homebrew::API::Download.new(
"https://raw.githubusercontent.com/#{tap}/#{git_head}/#{path}",
checksum,
mirrors: [
"#{HOMEBREW_API_DEFAULT_DOMAIN}/cask-source/#{File.basename(path)}",
],
cache: HOMEBREW_CACHE_API_SOURCE/"#{tap}/#{git_head}/Cask",
)
download.fetch
::Cask::CaskLoader::FromPathLoader.new(download.symlink_location)
.load(config: cask.config)
end
sig { returns(T::Boolean) }
def download_and_cache_data!
json_casks, updated = Homebrew::API.fetch_json_api_file "cask.jws.json"
cache["renames"] = {}
cache["casks"] = json_casks.to_h do |json_cask|
token = json_cask["token"]
json_cask.fetch("old_tokens", []).each do |old_token|
cache["renames"][old_token] = token
end
[token, json_cask.except("token")]
end
updated
end
private :download_and_cache_data!
sig { returns(T::Hash[String, Hash]) }
def all_casks
unless cache.key?("casks")
json_updated = download_and_cache_data!
write_names(regenerate: json_updated)
end
cache.fetch("casks")
end
sig { returns(T::Hash[String, String]) }
def all_renames
unless cache.key?("renames")
json_updated = download_and_cache_data!
write_names(regenerate: json_updated)
end
cache.fetch("renames")
end
sig { params(regenerate: T::Boolean).void }
def write_names(regenerate: false)
download_and_cache_data! unless cache.key?("casks")
Homebrew::API.write_names_file(all_casks.keys, "cask", regenerate: regenerate)
end
end
end
end
end