Merge pull request #16621 from reitermarkus/cask-loader-improvements
More `CaskLoader` improvements.
This commit is contained in:
commit
e90b53b50c
@ -60,7 +60,7 @@ module Homebrew
|
|||||||
end
|
end
|
||||||
private :download_and_cache_data!
|
private :download_and_cache_data!
|
||||||
|
|
||||||
sig { returns(Hash) }
|
sig { returns(T::Hash[String, Hash]) }
|
||||||
def all_casks
|
def all_casks
|
||||||
unless cache.key?("casks")
|
unless cache.key?("casks")
|
||||||
json_updated = download_and_cache_data!
|
json_updated = download_and_cache_data!
|
||||||
|
@ -90,10 +90,14 @@ module Cask
|
|||||||
.returns(T.nilable(T.attached_class))
|
.returns(T.nilable(T.attached_class))
|
||||||
}
|
}
|
||||||
def self.try_new(ref, warn: false)
|
def self.try_new(ref, warn: false)
|
||||||
ref = Pathname(ref) if ref.is_a?(String)
|
path = case ref
|
||||||
return unless ref.is_a?(Pathname)
|
when String
|
||||||
|
Pathname(ref)
|
||||||
path = ref
|
when Pathname
|
||||||
|
ref
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
return if %w[.rb .json].exclude?(path.extname)
|
return if %w[.rb .json].exclude?(path.extname)
|
||||||
return unless path.expand_path.exist?
|
return unless path.expand_path.exist?
|
||||||
@ -110,9 +114,8 @@ module Cask
|
|||||||
path = Pathname(path).expand_path
|
path = Pathname(path).expand_path
|
||||||
|
|
||||||
@token = path.basename(path.extname).to_s
|
@token = path.basename(path.extname).to_s
|
||||||
|
|
||||||
@path = path
|
@path = path
|
||||||
@tap = Homebrew::API.tap_from_source_download(path)
|
@tap = Tap.from_path(path) || Homebrew::API.tap_from_source_download(path)
|
||||||
end
|
end
|
||||||
|
|
||||||
def load(config:)
|
def load(config:)
|
||||||
@ -191,27 +194,8 @@ module Cask
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Loads a cask from a tap path.
|
|
||||||
class FromTapPathLoader < 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)
|
|
||||||
return unless (loader = super)
|
|
||||||
|
|
||||||
loader unless Tap.from_path(ref).nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { params(path: T.any(Pathname, String)).void }
|
|
||||||
def initialize(path)
|
|
||||||
super(path)
|
|
||||||
@tap = Tap.from_path(path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Loads a cask from a specific tap.
|
# Loads a cask from a specific tap.
|
||||||
class FromTapLoader < FromTapPathLoader
|
class FromTapLoader < FromPathLoader
|
||||||
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))
|
||||||
@ -225,9 +209,9 @@ module Cask
|
|||||||
new("#{tap}/#{token}")
|
new("#{tap}/#{token}")
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { params(tapped_name: String).void }
|
sig { params(tapped_token: String).void }
|
||||||
def initialize(tapped_name)
|
def initialize(tapped_token)
|
||||||
user, repo, token = tapped_name.split("/", 3)
|
user, repo, token = tapped_token.split("/", 3)
|
||||||
tap = Tap.fetch(user, repo)
|
tap = Tap.fetch(user, repo)
|
||||||
cask = CaskLoader.find_cask_in_tap(token, tap)
|
cask = CaskLoader.find_cask_in_tap(token, tap)
|
||||||
super cask
|
super cask
|
||||||
@ -249,7 +233,7 @@ module Cask
|
|||||||
def self.try_new(ref, warn: false)
|
def self.try_new(ref, warn: false)
|
||||||
ref = ref.to_s
|
ref = ref.to_s
|
||||||
|
|
||||||
return unless (match = ref.match(HOMEBREW_MAIN_TAP_CASK_REGEX))
|
return unless (match = ref.match(HOMEBREW_DEFAULT_TAP_CASK_REGEX))
|
||||||
|
|
||||||
token = match[:token]
|
token = match[:token]
|
||||||
|
|
||||||
@ -261,7 +245,7 @@ module Cask
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Loads a cask from the default tap path.
|
# Loads a cask from the default tap path.
|
||||||
class FromDefaultTapPathLoader < FromTapPathLoader
|
class FromDefaultTapPathLoader < FromPathLoader
|
||||||
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))
|
||||||
@ -297,7 +281,11 @@ module Cask
|
|||||||
class FromAPILoader
|
class FromAPILoader
|
||||||
include ILoader
|
include ILoader
|
||||||
|
|
||||||
attr_reader :token, :path
|
sig { returns(String) }
|
||||||
|
attr_reader :token
|
||||||
|
|
||||||
|
sig { returns(Pathname) }
|
||||||
|
attr_reader :path
|
||||||
|
|
||||||
sig { returns(T.nilable(Hash)) }
|
sig { returns(T.nilable(Hash)) }
|
||||||
attr_reader :from_json
|
attr_reader :from_json
|
||||||
@ -309,12 +297,8 @@ module Cask
|
|||||||
def self.try_new(ref, warn: false)
|
def self.try_new(ref, warn: false)
|
||||||
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 (match = ref.match(HOMEBREW_MAIN_TAP_CASK_REGEX))
|
return if !Homebrew::API::Cask.all_casks.key?(token) && !Homebrew::API::Cask.all_renames.key?(token)
|
||||||
|
|
||||||
token = match[:token]
|
|
||||||
|
|
||||||
return unless Homebrew::API::Cask.all_casks.key?(token)
|
|
||||||
|
|
||||||
ref = "#{CoreCaskTap.instance}/#{token}"
|
ref = "#{CoreCaskTap.instance}/#{token}"
|
||||||
|
|
||||||
@ -330,7 +314,7 @@ module Cask
|
|||||||
end
|
end
|
||||||
|
|
||||||
def load(config:)
|
def load(config:)
|
||||||
json_cask = from_json || Homebrew::API::Cask.all_casks[token]
|
json_cask = from_json || Homebrew::API::Cask.all_casks.fetch(token)
|
||||||
|
|
||||||
cask_options = {
|
cask_options = {
|
||||||
loaded_from_api: true,
|
loaded_from_api: true,
|
||||||
@ -480,13 +464,13 @@ 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 < FromTapPathLoader
|
class FromAmbiguousTapPathLoader < FromPathLoader
|
||||||
def self.try_new(ref, warn: false)
|
def self.try_new(ref, warn: false)
|
||||||
case (possible_tap_casks = CaskLoader.tap_paths(ref, warn: warn)).count
|
case (possible_tap_casks = CaskLoader.tap_paths(ref)).count
|
||||||
when 1
|
when 1
|
||||||
new(possible_tap_casks.first)
|
new(possible_tap_casks.first)
|
||||||
when 2..Float::INFINITY
|
when 2..Float::INFINITY
|
||||||
loaders = possible_tap_casks.map(&FromTapPathLoader.method(:new))
|
loaders = possible_tap_casks.map(&FromPathLoader.method(:new))
|
||||||
raise TapCaskAmbiguityError.new(ref, loaders)
|
raise TapCaskAmbiguityError.new(ref, loaders)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -568,7 +552,6 @@ module Cask
|
|||||||
FromURILoader,
|
FromURILoader,
|
||||||
FromAPILoader,
|
FromAPILoader,
|
||||||
FromTapLoader,
|
FromTapLoader,
|
||||||
FromTapPathLoader,
|
|
||||||
FromPathLoader,
|
FromPathLoader,
|
||||||
FromDefaultTapPathLoader,
|
FromDefaultTapPathLoader,
|
||||||
FromAmbiguousTapPathLoader,
|
FromAmbiguousTapPathLoader,
|
||||||
@ -587,7 +570,7 @@ module Cask
|
|||||||
find_cask_in_tap(token.to_s.downcase, CoreCaskTap.instance)
|
find_cask_in_tap(token.to_s.downcase, CoreCaskTap.instance)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.tap_paths(token, warn: true)
|
def self.tap_paths(token)
|
||||||
token = token.to_s.downcase
|
token = token.to_s.downcase
|
||||||
|
|
||||||
Tap.map { |tap| find_cask_in_tap(token, tap) }.select(&:exist?)
|
Tap.map { |tap| find_cask_in_tap(token, tap) }.select(&:exist?)
|
||||||
|
@ -56,7 +56,7 @@ module Cask
|
|||||||
CaskLoader.load(token, config: config)
|
CaskLoader.load(token, config: config)
|
||||||
rescue TapCaskAmbiguityError
|
rescue TapCaskAmbiguityError
|
||||||
tap_path = CaskLoader.tap_paths(token).first
|
tap_path = CaskLoader.tap_paths(token).first
|
||||||
CaskLoader::FromTapPathLoader.new(tap_path).load(config: config)
|
CaskLoader::FromPathLoader.new(tap_path).load(config: config)
|
||||||
rescue
|
rescue
|
||||||
# Don't blow up because of a single unavailable cask.
|
# Don't blow up because of a single unavailable cask.
|
||||||
nil
|
nil
|
||||||
|
@ -256,11 +256,11 @@ module Homebrew
|
|||||||
paths = []
|
paths = []
|
||||||
|
|
||||||
if formula_path.exist? ||
|
if formula_path.exist? ||
|
||||||
(!CoreTap.instance.installed? && Homebrew::API::Formula.all_formulae.key?(path.basename))
|
(!CoreTap.instance.installed? && Homebrew::API::Formula.all_formulae.key?(path.basename.to_s))
|
||||||
paths << formula_path
|
paths << formula_path
|
||||||
end
|
end
|
||||||
if cask_path.exist? ||
|
if cask_path.exist? ||
|
||||||
(!CoreCaskTap.instance.installed? && Homebrew::API::Cask.all_casks.key?(path.basename))
|
(!CoreCaskTap.instance.installed? && Homebrew::API::Cask.all_casks.key?(path.basename.to_s))
|
||||||
paths << cask_path
|
paths << cask_path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -2,3 +2,111 @@
|
|||||||
|
|
||||||
# This file contains temporary definitions for fixes that have
|
# This file contains temporary definitions for fixes that have
|
||||||
# been submitted upstream to https://github.com/sorbet/sorbet.
|
# been submitted upstream to https://github.com/sorbet/sorbet.
|
||||||
|
|
||||||
|
# https://github.com/sorbet/sorbet/pull/7678
|
||||||
|
class String
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Integer,
|
||||||
|
arg1: Integer,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: T.any(T::Range[Integer], Regexp),
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Regexp,
|
||||||
|
arg1: Integer,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Regexp,
|
||||||
|
arg1: T.any(String, Symbol),
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: String,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
def [](arg0, arg1=T.unsafe(nil)); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Integer,
|
||||||
|
arg1: Integer,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: T.any(T::Range[Integer], Regexp),
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Regexp,
|
||||||
|
arg1: Integer,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Regexp,
|
||||||
|
arg1: T.any(String, Symbol),
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: String,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
def slice!(arg0, arg1=T.unsafe(nil)); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Integer,
|
||||||
|
arg1: Integer,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: T.any(T::Range[Integer], Regexp),
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Regexp,
|
||||||
|
arg1: Integer,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: Regexp,
|
||||||
|
arg1: T.any(String, Symbol),
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
arg0: String,
|
||||||
|
)
|
||||||
|
.returns(T.nilable(String))
|
||||||
|
end
|
||||||
|
def slice(arg0, arg1=T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
@ -5,8 +5,10 @@
|
|||||||
HOMEBREW_TAP_FORMULA_REGEX = T.let(%r{^([\w-]+)/([\w-]+)/([\w+-.@]+)$}, Regexp)
|
HOMEBREW_TAP_FORMULA_REGEX = T.let(%r{^([\w-]+)/([\w-]+)/([\w+-.@]+)$}, Regexp)
|
||||||
# Match taps' casks, e.g. `someuser/sometap/somecask`
|
# Match taps' casks, e.g. `someuser/sometap/somecask`
|
||||||
HOMEBREW_TAP_CASK_REGEX = T.let(%r{^([\w-]+)/([\w-]+)/([a-z0-9\-_]+)$}, Regexp)
|
HOMEBREW_TAP_CASK_REGEX = T.let(%r{^([\w-]+)/([\w-]+)/([a-z0-9\-_]+)$}, Regexp)
|
||||||
# Match main cask taps' casks, e.g. `homebrew/cask/somecask` or `somecask`
|
# Match default cask taps' casks, e.g. `homebrew/cask/somecask` or `somecask`
|
||||||
HOMEBREW_MAIN_TAP_CASK_REGEX = T.let(%r{^(?:[Hh]omebrew/(?:homebrew-)?cask/)?(?<token>[a-z0-9\-_]+)$}, Regexp)
|
HOMEBREW_DEFAULT_TAP_CASK_REGEX = T.let(
|
||||||
|
%r{^(?:[Hh]omebrew/(?:homebrew-)?cask/)?(?<token>[a-z0-9\-_]+)$}, Regexp
|
||||||
|
)
|
||||||
# Match taps' directory paths, e.g. `HOMEBREW_LIBRARY/Taps/someuser/sometap`
|
# Match taps' directory paths, e.g. `HOMEBREW_LIBRARY/Taps/someuser/sometap`
|
||||||
HOMEBREW_TAP_DIR_REGEX = T.let(
|
HOMEBREW_TAP_DIR_REGEX = T.let(
|
||||||
%r{#{Regexp.escape(HOMEBREW_LIBRARY.to_s)}/Taps/(?<user>[\w-]+)/(?<repo>[\w-]+)}, Regexp
|
%r{#{Regexp.escape(HOMEBREW_LIBRARY.to_s)}/Taps/(?<user>[\w-]+)/(?<repo>[\w-]+)}, Regexp
|
||||||
|
@ -37,13 +37,13 @@ describe Cask::CaskLoader, :cask do
|
|||||||
|
|
||||||
it "warns when using the short token" do
|
it "warns when using the short token" do
|
||||||
expect do
|
expect do
|
||||||
expect(described_class.for("version-newest")).to be_a Cask::CaskLoader::FromTapPathLoader
|
expect(described_class.for("version-newest")).to be_a Cask::CaskLoader::FromPathLoader
|
||||||
end.to output(/version-newest was renamed to version-latest/).to_stderr
|
end.to output(/version-newest was renamed to version-latest/).to_stderr
|
||||||
end
|
end
|
||||||
|
|
||||||
it "warns when using the full token" do
|
it "warns when using the full token" do
|
||||||
expect do
|
expect do
|
||||||
expect(described_class.for("homebrew/cask/version-newest")).to be_a Cask::CaskLoader::FromTapPathLoader
|
expect(described_class.for("homebrew/cask/version-newest")).to be_a Cask::CaskLoader::FromPathLoader
|
||||||
end.to output(/version-newest was renamed to version-latest/).to_stderr
|
end.to output(/version-newest was renamed to version-latest/).to_stderr
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user