Merge pull request #16629 from reitermarkus/simplify-cask-loader

Simplify `CaskLoader` further.
This commit is contained in:
Markus Reiter 2024-02-12 22:03:27 +01:00 committed by GitHub
commit a783aaf03f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 43 additions and 43 deletions

View File

@ -196,6 +196,9 @@ module Cask
# Loads a cask from a specific tap. # Loads a cask from a specific tap.
class FromTapLoader < FromPathLoader class FromTapLoader < FromPathLoader
sig { returns(Tap) }
attr_reader :tap
sig { sig {
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean) params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
.returns(T.nilable(T.attached_class)) .returns(T.nilable(T.attached_class))
@ -224,37 +227,6 @@ module Cask
end end
end end
# Load a cask from the default tap, using either a full or short token.
class FromDefaultTapLoader < FromTapLoader
sig {
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
.returns(T.nilable(T.attached_class))
}
def self.try_new(ref, warn: false)
ref = ref.to_s
return unless (match = ref.match(HOMEBREW_DEFAULT_TAP_CASK_REGEX))
token = match[:token]
ref = "#{CoreCaskTap.instance}/#{token}"
token, tap, = CaskLoader.tap_cask_token_type(ref, warn: warn)
new("#{tap}/#{token}")
end
end
# Loads a cask from the default tap path.
class FromDefaultTapPathLoader < FromPathLoader
sig {
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
.returns(T.nilable(T.attached_class))
}
def self.try_new(ref, warn: false)
super CaskLoader.default_path(ref)
end
end
# Loads a cask from an existing {Cask} instance. # Loads a cask from an existing {Cask} instance.
class FromInstanceLoader class FromInstanceLoader
include ILoader include ILoader
@ -298,7 +270,10 @@ module Cask
return if Homebrew::EnvConfig.no_install_from_api? return if Homebrew::EnvConfig.no_install_from_api?
return unless ref.is_a?(String) return unless ref.is_a?(String)
return unless (token = ref[HOMEBREW_DEFAULT_TAP_CASK_REGEX, :token]) return unless (token = ref[HOMEBREW_DEFAULT_TAP_CASK_REGEX, :token])
return if !Homebrew::API::Cask.all_casks.key?(token) && !Homebrew::API::Cask.all_renames.key?(token) if !Homebrew::API::Cask.all_casks.key?(token) &&
!Homebrew::API::Cask.all_renames.key?(token)
return
end
ref = "#{CoreCaskTap.instance}/#{token}" ref = "#{CoreCaskTap.instance}/#{token}"
@ -464,21 +439,44 @@ module Cask
# Loader which tries loading casks from tap paths, failing # Loader which tries loading casks from tap paths, failing
# if the same token exists in multiple taps. # if the same token exists in multiple taps.
class FromAmbiguousTapPathLoader < FromPathLoader class FromNameLoader < FromTapLoader
sig {
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
.returns(T.nilable(T.attached_class))
}
def self.try_new(ref, warn: false) def self.try_new(ref, warn: false)
case (possible_tap_casks = CaskLoader.tap_paths(ref)).count return unless ref.is_a?(String)
return if ref.include?("/")
token = ref
loaders = Tap.map { |tap| super("#{tap}/#{token}", warn: warn) }
.compact
.select { _1.path.exist? }
case loaders.count
when 1 when 1
new(possible_tap_casks.first) loaders.first
when 2..Float::INFINITY when 2..Float::INFINITY
loaders = possible_tap_casks.map(&FromPathLoader.method(:new)) # Always prefer the default tap, i.e. behave the same as if loading from the API.
raise TapCaskAmbiguityError.new(ref, loaders) if (default_tap_loader = loaders.find { _1.tap.core_cask_tap? })
return default_tap_loader
end
raise TapCaskAmbiguityError.new(token, loaders.map(&:tap))
end end
end end
end end
# Loader which loads a cask from the installed cask file. # Loader which loads a cask from the installed cask file.
class FromInstalledPathLoader < FromPathLoader class FromInstalledPathLoader < FromPathLoader
sig {
params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean)
.returns(T.nilable(T.attached_class))
}
def self.try_new(ref, warn: false) def self.try_new(ref, warn: false)
return unless ref.is_a?(String)
possible_installed_cask = Cask.new(ref) possible_installed_cask = Cask.new(ref)
return unless (installed_caskfile = possible_installed_cask.installed_caskfile) return unless (installed_caskfile = possible_installed_cask.installed_caskfile)
@ -557,10 +555,8 @@ module Cask
FromURILoader, FromURILoader,
FromAPILoader, FromAPILoader,
FromTapLoader, FromTapLoader,
FromNameLoader,
FromPathLoader, FromPathLoader,
FromDefaultTapPathLoader,
FromAmbiguousTapPathLoader,
FromDefaultTapLoader,
FromInstalledPathLoader, FromInstalledPathLoader,
NullLoader, NullLoader,
].each do |loader_class| ].each do |loader_class|

View File

@ -131,10 +131,14 @@ module Cask
# #
# @api private # @api private
class TapCaskAmbiguityError < CaskError class TapCaskAmbiguityError < CaskError
def initialize(ref, loaders) def initialize(token, taps)
casks = taps.map { |tap| "#{tap}/#{token}" }
cask_list = casks.sort.map { |f| "\n * #{f}" }.join
super <<~EOS super <<~EOS
Cask #{ref} exists in multiple taps: Cask #{token} exists in multiple taps:#{cask_list}
#{loaders.map { |loader| " #{loader.tap}/#{loader.token}" }.join("\n")}
Please use the fully-qualified name (e.g. #{casks.first}) to refer to a specific Cask.
EOS EOS
end end
end end