Merge pull request #2325 from reitermarkus/better-cask-loading
Use a `Formulary`-like approach to load Casks.
This commit is contained in:
commit
bfb5bf1d70
@ -7,7 +7,6 @@ require "hbc/auditor"
|
||||
require "hbc/cache"
|
||||
require "hbc/cask"
|
||||
require "hbc/cask_loader"
|
||||
require "hbc/without_source"
|
||||
require "hbc/caskroom"
|
||||
require "hbc/checkable"
|
||||
require "hbc/cli"
|
||||
@ -24,7 +23,6 @@ require "hbc/macos"
|
||||
require "hbc/pkg"
|
||||
require "hbc/qualified_token"
|
||||
require "hbc/scopes"
|
||||
require "hbc/source"
|
||||
require "hbc/staged"
|
||||
require "hbc/system_command"
|
||||
require "hbc/topological_hash"
|
||||
@ -44,11 +42,4 @@ module Hbc
|
||||
Cache.ensure_cache_exists
|
||||
Caskroom.ensure_caskroom_exists
|
||||
end
|
||||
|
||||
def self.load(query)
|
||||
odebug "Loading Cask definitions"
|
||||
cask = Source.for_query(query).load
|
||||
cask.dumpcask
|
||||
cask
|
||||
end
|
||||
end
|
||||
|
||||
@ -15,7 +15,7 @@ module Hbc
|
||||
walk = lambda do |acc, deps|
|
||||
deps.each do |dep|
|
||||
next if acc.key?(dep)
|
||||
succs = deps_in.call Hbc.load(dep)
|
||||
succs = deps_in.call CaskLoader.load(dep)
|
||||
acc[dep] = succs
|
||||
walk.call(acc, succs)
|
||||
end
|
||||
|
||||
@ -1,44 +1,167 @@
|
||||
module Hbc
|
||||
class CaskLoader
|
||||
def self.load_from_file(path)
|
||||
raise CaskError, "File '#{path}' does not exist" unless path.exist?
|
||||
raise CaskError, "File '#{path}' is not readable" unless path.readable?
|
||||
raise CaskError, "File '#{path}' is not a plain file" unless path.file?
|
||||
|
||||
token = path.basename(".rb").to_s
|
||||
content = IO.read(path).force_encoding("UTF-8")
|
||||
|
||||
new(token, content, path).load
|
||||
end
|
||||
|
||||
def self.load_from_string(token, content)
|
||||
new(token, content).load
|
||||
end
|
||||
|
||||
def load
|
||||
instance_eval(@content, __FILE__, __LINE__)
|
||||
rescue CaskError, StandardError, ScriptError => e
|
||||
e.message.concat(" while loading '#{@token}'")
|
||||
e.message.concat(" from '#{@path}'") unless @path.nil?
|
||||
raise e, e.message
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def initialize(token, content, path = nil)
|
||||
@token = token
|
||||
@content = content
|
||||
@path = path unless path.nil?
|
||||
end
|
||||
|
||||
def cask(header_token, &block)
|
||||
raise CaskTokenDoesNotMatchError.new(@token, header_token) unless @token == header_token
|
||||
|
||||
if @path.nil?
|
||||
Cask.new(@token, &block)
|
||||
else
|
||||
Cask.new(@token, sourcefile_path: @path, &block)
|
||||
module CaskLoader
|
||||
class FromContentLoader
|
||||
def initialize(content)
|
||||
@content = content
|
||||
end
|
||||
|
||||
def load
|
||||
instance_eval(@content.force_encoding("UTF-8"), __FILE__, __LINE__)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def cask(header_token, &block)
|
||||
Cask.new(header_token, &block)
|
||||
end
|
||||
end
|
||||
|
||||
class FromPathLoader < FromContentLoader
|
||||
def self.can_load?(ref)
|
||||
path = Pathname.new(ref)
|
||||
path.extname == ".rb" && path.expand_path.exist?
|
||||
end
|
||||
|
||||
attr_reader :token, :path
|
||||
|
||||
def initialize(path)
|
||||
path = Pathname.new(path).expand_path
|
||||
|
||||
@token = path.basename(".rb").to_s
|
||||
@path = path
|
||||
end
|
||||
|
||||
def load
|
||||
raise CaskError, "'#{@path}' does not exist." unless @path.exist?
|
||||
raise CaskError, "'#{@path}' is not readable." unless @path.readable?
|
||||
raise CaskError, "'#{@path}' is not a file." unless @path.file?
|
||||
|
||||
@content = IO.read(@path)
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def cask(header_token, &block)
|
||||
if @token != header_token
|
||||
raise CaskTokenDoesNotMatchError.new(@token, header_token)
|
||||
end
|
||||
|
||||
Cask.new(header_token, sourcefile_path: @path, &block)
|
||||
end
|
||||
end
|
||||
|
||||
class FromURILoader < FromPathLoader
|
||||
def self.can_load?(ref)
|
||||
!(ref.to_s !~ ::URI.regexp)
|
||||
end
|
||||
|
||||
def initialize(url)
|
||||
@url = url
|
||||
uri = URI(url)
|
||||
super Hbc.cache/File.basename(uri.path)
|
||||
end
|
||||
|
||||
def load
|
||||
Hbc.cache.mkpath
|
||||
FileUtils.rm_f @path
|
||||
|
||||
begin
|
||||
ohai "Downloading #{@url}."
|
||||
curl @url, "-o", @path
|
||||
rescue ErrorDuringExecution
|
||||
raise CaskUnavailableError, @url
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
class FromTapLoader < FromPathLoader
|
||||
def self.can_load?(ref)
|
||||
!(ref.to_s !~ HOMEBREW_TAP_CASK_REGEX)
|
||||
end
|
||||
|
||||
def initialize(tapped_name)
|
||||
user, repo, token = tapped_name.split("/", 3).map(&:downcase)
|
||||
@tap = Tap.fetch(user, repo)
|
||||
|
||||
super @tap.cask_dir/"#{token}.rb"
|
||||
end
|
||||
|
||||
def load
|
||||
@tap.install unless @tap.installed?
|
||||
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
class NullLoader < FromPathLoader
|
||||
def self.can_load?(*)
|
||||
true
|
||||
end
|
||||
|
||||
def initialize(ref)
|
||||
@token = File.basename(ref, ".rb")
|
||||
super CaskLoader.default_path(@token)
|
||||
end
|
||||
|
||||
def load
|
||||
raise CaskUnavailableError, @token
|
||||
end
|
||||
end
|
||||
|
||||
def self.load_from_file(path)
|
||||
FromPathLoader.new(path).load
|
||||
end
|
||||
|
||||
def self.load_from_string(content)
|
||||
FromContentLoader.new(content).load
|
||||
end
|
||||
|
||||
def self.path(ref)
|
||||
self.for(ref).path
|
||||
end
|
||||
|
||||
def self.load(ref)
|
||||
self.for(ref).load
|
||||
end
|
||||
|
||||
def self.for(ref)
|
||||
[
|
||||
FromURILoader,
|
||||
FromTapLoader,
|
||||
FromPathLoader,
|
||||
].each do |loader_class|
|
||||
return loader_class.new(ref) if loader_class.can_load?(ref)
|
||||
end
|
||||
|
||||
if FromPathLoader.can_load?(default_path(ref))
|
||||
return FromPathLoader.new(default_path(ref))
|
||||
end
|
||||
|
||||
possible_tap_casks = tap_paths(ref)
|
||||
if possible_tap_casks.count == 1
|
||||
possible_tap_cask = possible_tap_casks.first
|
||||
return FromPathLoader.new(possible_tap_cask)
|
||||
end
|
||||
|
||||
possible_installed_cask = Cask.new(ref)
|
||||
if possible_installed_cask.installed?
|
||||
return FromPathLoader.new(possible_installed_cask.installed_caskfile)
|
||||
end
|
||||
|
||||
NullLoader.new(ref)
|
||||
end
|
||||
|
||||
def self.default_path(token)
|
||||
Hbc.default_tap.cask_dir/"#{token.to_s.downcase}.rb"
|
||||
end
|
||||
|
||||
def self.tap_paths(token)
|
||||
Tap.map { |t| t.cask_dir/"#{token.to_s.downcase}.rb" }
|
||||
.select(&:exist?)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -40,7 +40,7 @@ module Hbc
|
||||
if cask_tokens.empty?
|
||||
Hbc.all
|
||||
else
|
||||
cask_tokens.map { |token| Hbc.load(token) }
|
||||
cask_tokens.map { |token| CaskLoader.load(token) }
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@ module Hbc
|
||||
raise CaskUnspecifiedError if cask_tokens.empty?
|
||||
# only respects the first argument
|
||||
cask_token = cask_tokens.first.sub(/\.rb$/i, "")
|
||||
cask_path = Hbc.path(cask_token)
|
||||
cask_path = CaskLoader.path(cask_token)
|
||||
raise CaskUnavailableError, cask_token.to_s unless cask_path.exist?
|
||||
puts File.open(cask_path, &:read)
|
||||
end
|
||||
|
||||
@ -5,7 +5,7 @@ module Hbc
|
||||
cask_tokens = cask_tokens_from(args)
|
||||
raise CaskUnspecifiedError if cask_tokens.empty?
|
||||
cask_token = cask_tokens.first.sub(/\.rb$/i, "")
|
||||
cask_path = Hbc.path(cask_token)
|
||||
cask_path = CaskLoader.path(cask_token)
|
||||
odebug "Creating Cask #{cask_token}"
|
||||
|
||||
raise CaskAlreadyCreatedError, cask_token if cask_path.exist?
|
||||
|
||||
@ -6,7 +6,7 @@ module Hbc
|
||||
raise CaskUnspecifiedError if cask_tokens.empty?
|
||||
# only respects the first argument
|
||||
cask_token = cask_tokens.first.sub(/\.rb$/i, "")
|
||||
cask_path = Hbc.path(cask_token)
|
||||
cask_path = CaskLoader.path(cask_token)
|
||||
odebug "Opening editor for Cask #{cask_token}"
|
||||
unless cask_path.exist?
|
||||
raise CaskUnavailableError, %Q(#{cask_token}, run "brew cask create #{cask_token}" to create a new Cask)
|
||||
|
||||
@ -8,7 +8,7 @@ module Hbc
|
||||
|
||||
cask_tokens.each do |cask_token|
|
||||
ohai "Downloading external files for Cask #{cask_token}"
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
downloaded_path = Download.new(cask, force: force).perform
|
||||
Verify.all(cask, downloaded_path)
|
||||
ohai "Success! Downloaded to -> #{downloaded_path}"
|
||||
|
||||
@ -8,7 +8,7 @@ module Hbc
|
||||
else
|
||||
cask_tokens.each do |cask_token|
|
||||
odebug "Opening homepage for Cask #{cask_token}"
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
system "/usr/bin/open", "--", cask.homepage
|
||||
end
|
||||
end
|
||||
|
||||
@ -6,7 +6,7 @@ module Hbc
|
||||
raise CaskUnspecifiedError if cask_tokens.empty?
|
||||
cask_tokens.each do |cask_token|
|
||||
odebug "Getting info for Cask #{cask_token}"
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
|
||||
info(cask)
|
||||
end
|
||||
|
||||
@ -18,7 +18,7 @@ module Hbc
|
||||
count = 0
|
||||
cask_tokens.each do |cask_token|
|
||||
begin
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
Installer.new(cask,
|
||||
force: force,
|
||||
skip_cask_deps: skip_cask_deps,
|
||||
|
||||
@ -24,7 +24,7 @@ module Hbc
|
||||
count = 0
|
||||
|
||||
cask_tokens.each do |cask_token|
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
|
||||
if cask.appcast.nil?
|
||||
opoo "Cask '#{cask}' is missing an `appcast` stanza."
|
||||
|
||||
@ -84,7 +84,7 @@ module Hbc
|
||||
|
||||
def modified_casks
|
||||
return @modified_casks if defined? @modified_casks
|
||||
@modified_casks = modified_cask_files.map { |f| Hbc.load(f) }
|
||||
@modified_casks = modified_cask_files.map { |f| CaskLoader.load(f) }
|
||||
if @modified_casks.any?
|
||||
num_modified = @modified_casks.size
|
||||
ohai "#{Formatter.pluralize(num_modified, "modified cask")}: " \
|
||||
|
||||
@ -2,7 +2,7 @@ module Hbc
|
||||
class CLI
|
||||
class InternalCheckurl < InternalUseBase
|
||||
def self.run(*args)
|
||||
casks_to_check = args.empty? ? Hbc.all : args.map { |arg| Hbc.load(arg) }
|
||||
casks_to_check = args.empty? ? Hbc.all : args.map { |arg| CaskLoader.load(arg) }
|
||||
casks_to_check.each do |cask|
|
||||
odebug "Checking URL for Cask #{cask}"
|
||||
checker = UrlChecker.new(cask)
|
||||
|
||||
@ -16,7 +16,7 @@ module Hbc
|
||||
count = 0
|
||||
cask_tokens.each do |cask_token|
|
||||
begin
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
count += 1
|
||||
cask.dumpcask
|
||||
rescue StandardError => e
|
||||
|
||||
@ -84,7 +84,7 @@ module Hbc
|
||||
print "#{cask_token}\t" if table
|
||||
|
||||
begin
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
rescue StandardError
|
||||
opoo "Cask '#{cask_token}' was not found" unless quiet
|
||||
puts ""
|
||||
|
||||
@ -28,7 +28,7 @@ module Hbc
|
||||
cask_tokens.each do |cask_token|
|
||||
odebug "Listing files for Cask #{cask_token}"
|
||||
begin
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
|
||||
if cask.installed?
|
||||
if @options[:one]
|
||||
|
||||
@ -9,7 +9,7 @@ module Hbc
|
||||
casks_to_check = if cask_tokens.empty?
|
||||
Hbc.installed
|
||||
else
|
||||
cask_tokens.map { |token| Hbc.load(token) }
|
||||
cask_tokens.map { |token| CaskLoader.load(token) }
|
||||
end
|
||||
|
||||
casks_to_check.each do |cask|
|
||||
|
||||
@ -5,7 +5,7 @@ module Hbc
|
||||
count = 0
|
||||
cask_tokens.each do |cask_token|
|
||||
begin
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
|
||||
installer = Installer.new(cask,
|
||||
force: force,
|
||||
|
||||
@ -39,7 +39,7 @@ module Hbc
|
||||
elsif cask_tokens.any? { |file| File.exist?(file) }
|
||||
cask_tokens
|
||||
else
|
||||
cask_tokens.map { |token| Hbc.path(token) }
|
||||
cask_tokens.map { |token| CaskLoader.path(token) }
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ module Hbc
|
||||
|
||||
cask_tokens.each do |cask_token|
|
||||
odebug "Uninstalling Cask #{cask_token}"
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
|
||||
raise CaskNotInstalledError, cask unless cask.installed? || force
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@ module Hbc
|
||||
raise CaskUnspecifiedError if cask_tokens.empty?
|
||||
cask_tokens.each do |cask_token|
|
||||
odebug "Zapping Cask #{cask_token}"
|
||||
cask = Hbc.load(cask_token)
|
||||
cask = CaskLoader.load(cask_token)
|
||||
Installer.new(cask).zap
|
||||
end
|
||||
end
|
||||
|
||||
@ -229,7 +229,7 @@ module Hbc
|
||||
deps = CaskDependencies.new(@cask)
|
||||
deps.sorted.each do |dep_token|
|
||||
puts "#{dep_token} ..."
|
||||
dep = Hbc.load(dep_token)
|
||||
dep = CaskLoader.load(dep_token)
|
||||
if dep.installed?
|
||||
puts "already installed"
|
||||
else
|
||||
|
||||
@ -109,34 +109,6 @@ module Hbc
|
||||
@default_tap ||= Tap.fetch("caskroom", "homebrew-cask")
|
||||
end
|
||||
|
||||
def path(query)
|
||||
query_path = Pathname.new(query)
|
||||
|
||||
return query_path if query_path.absolute?
|
||||
return query_path if query_path.exist? && query_path.extname == ".rb"
|
||||
|
||||
query_without_extension = query.sub(/\.rb$/i, "")
|
||||
|
||||
token_with_tap = if query =~ %r{\A[^/]+/[^/]+/[^/]+\Z}
|
||||
query_without_extension
|
||||
else
|
||||
all_tokens.detect do |tap_and_token|
|
||||
tap_and_token.split("/")[2] == query_without_extension
|
||||
end
|
||||
end
|
||||
|
||||
if token_with_tap
|
||||
user, repo, token = token_with_tap.split("/")
|
||||
tap = Tap.fetch(user, repo)
|
||||
else
|
||||
token = query_without_extension
|
||||
tap = Hbc.default_tap
|
||||
end
|
||||
|
||||
return query_path if tap.cask_dir.nil?
|
||||
tap.cask_dir.join("#{token}.rb")
|
||||
end
|
||||
|
||||
def tcc_db
|
||||
@tcc_db ||= Pathname.new("/Library/Application Support/com.apple.TCC/TCC.db")
|
||||
end
|
||||
|
||||
@ -11,22 +11,22 @@ module Hbc
|
||||
end
|
||||
|
||||
def all_tapped_cask_dirs
|
||||
Tap.map(&:cask_dir).compact
|
||||
Tap.map(&:cask_dir).select(&:directory?)
|
||||
end
|
||||
|
||||
def all_tokens
|
||||
Tap.map do |t|
|
||||
Tap.flat_map do |t|
|
||||
t.cask_files.map do |p|
|
||||
"#{t.name}/#{File.basename(p, ".rb")}"
|
||||
end
|
||||
end.flatten
|
||||
end
|
||||
end
|
||||
|
||||
def installed
|
||||
# Hbc.load has some DWIM which is slow. Optimize here
|
||||
# by spoon-feeding Hbc.load fully-qualified paths.
|
||||
# CaskLoader.load has some DWIM which is slow. Optimize here
|
||||
# by spoon-feeding CaskLoader.load fully-qualified paths.
|
||||
# TODO: speed up Hbc::Source::Tapped (main perf drag is calling Hbc.all_tokens repeatedly)
|
||||
# TODO: ability to specify expected source when calling Hbc.load (minor perf benefit)
|
||||
# TODO: ability to specify expected source when calling CaskLoader.load (minor perf benefit)
|
||||
Pathname.glob(caskroom.join("*"))
|
||||
.map do |caskroom_path|
|
||||
token = caskroom_path.basename.to_s
|
||||
@ -36,9 +36,9 @@ module Hbc
|
||||
end
|
||||
|
||||
if path_to_cask
|
||||
Hbc.load(path_to_cask.join("#{token}.rb"))
|
||||
CaskLoader.load(path_to_cask.join("#{token}.rb"))
|
||||
else
|
||||
Hbc.load(token)
|
||||
CaskLoader.load(token)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,37 +0,0 @@
|
||||
require "hbc/source/gone"
|
||||
require "hbc/source/path_slash_required"
|
||||
require "hbc/source/path_slash_optional"
|
||||
require "hbc/source/tapped_qualified"
|
||||
require "hbc/source/untapped_qualified"
|
||||
require "hbc/source/tapped"
|
||||
require "hbc/source/uri"
|
||||
|
||||
module Hbc
|
||||
module Source
|
||||
def self.sources
|
||||
[
|
||||
URI,
|
||||
PathSlashRequired,
|
||||
TappedQualified,
|
||||
UntappedQualified,
|
||||
Tapped,
|
||||
PathSlashOptional,
|
||||
Gone,
|
||||
]
|
||||
end
|
||||
|
||||
def self.for_query(query)
|
||||
odebug "Translating '#{query}' into a valid Cask source"
|
||||
raise CaskUnavailableError, query if query.to_s =~ /^\s*$/
|
||||
source = sources.find do |s|
|
||||
odebug "Testing source class #{s}"
|
||||
s.me?(query)
|
||||
end
|
||||
raise CaskUnavailableError, query unless source
|
||||
odebug "Success! Using source class #{source}"
|
||||
resolved_cask_source = source.new(query)
|
||||
odebug "Resolved Cask URI or file source to '#{resolved_cask_source}'"
|
||||
resolved_cask_source
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,23 +0,0 @@
|
||||
module Hbc
|
||||
module Source
|
||||
class Gone
|
||||
def self.me?(query)
|
||||
WithoutSource.new(query).installed?
|
||||
end
|
||||
|
||||
attr_reader :query
|
||||
|
||||
def initialize(query)
|
||||
@query = query
|
||||
end
|
||||
|
||||
def load
|
||||
WithoutSource.new(query)
|
||||
end
|
||||
|
||||
def to_s
|
||||
""
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,29 +0,0 @@
|
||||
require "rubygems"
|
||||
require "hbc/cask_loader"
|
||||
|
||||
module Hbc
|
||||
module Source
|
||||
class PathBase
|
||||
# derived classes must define method self.me?
|
||||
|
||||
def self.path_for_query(query)
|
||||
Pathname.new(query).sub(/(\.rb)?$/, ".rb")
|
||||
end
|
||||
|
||||
attr_reader :path
|
||||
|
||||
def initialize(path)
|
||||
@path = Pathname.new(path).expand_path
|
||||
end
|
||||
|
||||
def load
|
||||
CaskLoader.load_from_file(@path)
|
||||
end
|
||||
|
||||
def to_s
|
||||
# stringify to fully-resolved location
|
||||
@path.to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,12 +0,0 @@
|
||||
require "hbc/source/path_base"
|
||||
|
||||
module Hbc
|
||||
module Source
|
||||
class PathSlashOptional < PathBase
|
||||
def self.me?(query)
|
||||
path = path_for_query(query)
|
||||
path.exist?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,12 +0,0 @@
|
||||
require "hbc/source/path_base"
|
||||
|
||||
module Hbc
|
||||
module Source
|
||||
class PathSlashRequired < PathBase
|
||||
def self.me?(query)
|
||||
path = path_for_query(query)
|
||||
path.to_s.include?("/") && path.exist?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,24 +0,0 @@
|
||||
module Hbc
|
||||
module Source
|
||||
class Tapped
|
||||
def self.me?(query)
|
||||
Hbc.path(query).exist?
|
||||
end
|
||||
|
||||
attr_reader :token
|
||||
|
||||
def initialize(token)
|
||||
@token = token
|
||||
end
|
||||
|
||||
def load
|
||||
PathSlashOptional.new(Hbc.path(token)).load
|
||||
end
|
||||
|
||||
def to_s
|
||||
# stringify to fully-resolved location
|
||||
Hbc.path(token).expand_path.to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,21 +0,0 @@
|
||||
require "hbc/source/tapped"
|
||||
|
||||
module Hbc
|
||||
module Source
|
||||
class TappedQualified < Tapped
|
||||
def self.me?(query)
|
||||
return if (tap = tap_for_query(query)).nil?
|
||||
|
||||
tap.installed? && Hbc.path(query).exist?
|
||||
end
|
||||
|
||||
def self.tap_for_query(query)
|
||||
qualified_token = QualifiedToken.parse(query)
|
||||
return if qualified_token.nil?
|
||||
|
||||
user, repo = qualified_token[0..1]
|
||||
Tap.fetch(user, repo)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,14 +0,0 @@
|
||||
require "hbc/source/tapped_qualified"
|
||||
|
||||
module Hbc
|
||||
module Source
|
||||
class UntappedQualified < TappedQualified
|
||||
def self.me?(query)
|
||||
return if (tap = tap_for_query(query)).nil?
|
||||
|
||||
tap.install
|
||||
tap.installed? && Hbc.path(query).exist?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,32 +0,0 @@
|
||||
module Hbc
|
||||
module Source
|
||||
class URI
|
||||
def self.me?(query)
|
||||
!(query.to_s =~ ::URI.regexp).nil?
|
||||
end
|
||||
|
||||
attr_reader :uri
|
||||
|
||||
def initialize(uri)
|
||||
@uri = uri
|
||||
end
|
||||
|
||||
def load
|
||||
Hbc.cache.mkpath
|
||||
path = Hbc.cache.join(File.basename(uri))
|
||||
ohai "Downloading #{uri}"
|
||||
odebug "Download target -> #{path}"
|
||||
begin
|
||||
curl(uri, "-o", path.to_s)
|
||||
rescue ErrorDuringExecution
|
||||
raise CaskUnavailableError, uri
|
||||
end
|
||||
PathSlashOptional.new(path).load
|
||||
end
|
||||
|
||||
def to_s
|
||||
uri.to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,17 +0,0 @@
|
||||
module Hbc
|
||||
class WithoutSource < Cask
|
||||
# Override from `Hbc::DSL` because we don't have a cask source file to work
|
||||
# with, so we don't know the cask's `version`.
|
||||
def staged_path
|
||||
(caskroom_path.children - [metadata_master_container_path]).first
|
||||
end
|
||||
|
||||
def to_s
|
||||
"#{token} (!)"
|
||||
end
|
||||
|
||||
def installed?
|
||||
caskroom_path.exist?
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -19,6 +19,11 @@ class String
|
||||
end
|
||||
end
|
||||
|
||||
def cask
|
||||
$LOAD_PATH.unshift("#{HOMEBREW_LIBRARY_PATH}/cask/lib")
|
||||
require "hbc"
|
||||
end
|
||||
|
||||
module Homebrew
|
||||
module_function
|
||||
|
||||
|
||||
@ -12,7 +12,11 @@ module CaskLoaderCompatibilityLayer
|
||||
end
|
||||
|
||||
module Hbc
|
||||
class CaskLoader
|
||||
prepend CaskLoaderCompatibilityLayer
|
||||
module CaskLoader
|
||||
class FromContentLoader; end
|
||||
|
||||
class FromPathLoader < FromContentLoader
|
||||
prepend CaskLoaderCompatibilityLayer
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -285,7 +285,7 @@ class Tap
|
||||
|
||||
# path to the directory of all {Formula} files for this {Tap}.
|
||||
def formula_dir
|
||||
@formula_dir ||= potential_formula_dirs.detect(&:directory?)
|
||||
@formula_dir ||= potential_formula_dirs.detect(&:directory?) || path/"Formula"
|
||||
end
|
||||
|
||||
def potential_formula_dirs
|
||||
@ -294,12 +294,12 @@ class Tap
|
||||
|
||||
# path to the directory of all {Cask} files for this {Tap}.
|
||||
def cask_dir
|
||||
@cask_dir ||= [path/"Casks"].detect(&:directory?)
|
||||
@cask_dir ||= path/"Casks"
|
||||
end
|
||||
|
||||
# an array of all {Formula} files of this {Tap}.
|
||||
def formula_files
|
||||
@formula_files ||= if formula_dir
|
||||
@formula_files ||= if formula_dir.directory?
|
||||
formula_dir.children.select(&method(:formula_file?))
|
||||
else
|
||||
[]
|
||||
@ -308,7 +308,7 @@ class Tap
|
||||
|
||||
# an array of all {Cask} files of this {Tap}.
|
||||
def cask_files
|
||||
@cask_files ||= if cask_dir
|
||||
@cask_files ||= if cask_dir.directory?
|
||||
cask_dir.children.select(&method(:cask_file?))
|
||||
else
|
||||
[]
|
||||
|
||||
@ -79,7 +79,7 @@ describe Hbc::Audit, :cask do
|
||||
end
|
||||
|
||||
describe "#run!" do
|
||||
let(:cask) { Hbc.load(cask_token) }
|
||||
let(:cask) { Hbc::CaskLoader.load(cask_token) }
|
||||
subject { audit.run! }
|
||||
|
||||
describe "required stanzas" do
|
||||
@ -320,7 +320,7 @@ describe Hbc::Audit, :cask do
|
||||
|
||||
describe "audit of downloads" do
|
||||
let(:cask_token) { "with-binary" }
|
||||
let(:cask) { Hbc.load(cask_token) }
|
||||
let(:cask) { Hbc::CaskLoader.load(cask_token) }
|
||||
let(:download) { instance_double(Hbc::Download) }
|
||||
let(:verify) { class_double(Hbc::Verify).as_stubbed_const }
|
||||
let(:error_msg) { "Download Failed" }
|
||||
|
||||
@ -27,20 +27,20 @@ describe Hbc::Cask, :cask do
|
||||
let(:relative_tap_path) { tap_path.relative_path_from(file_dirname) }
|
||||
|
||||
it "returns an instance of the Cask for the given token" do
|
||||
c = Hbc.load("local-caffeine")
|
||||
c = Hbc::CaskLoader.load("local-caffeine")
|
||||
expect(c).to be_kind_of(Hbc::Cask)
|
||||
expect(c.token).to eq("local-caffeine")
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a specific file location" do
|
||||
c = Hbc.load("#{tap_path}/Casks/local-caffeine.rb")
|
||||
c = Hbc::CaskLoader.load("#{tap_path}/Casks/local-caffeine.rb")
|
||||
expect(c).to be_kind_of(Hbc::Cask)
|
||||
expect(c.token).to eq("local-caffeine")
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a url" do
|
||||
c = shutup do
|
||||
Hbc.load("file://#{tap_path}/Casks/local-caffeine.rb")
|
||||
Hbc::CaskLoader.load("file://#{tap_path}/Casks/local-caffeine.rb")
|
||||
end
|
||||
expect(c).to be_kind_of(Hbc::Cask)
|
||||
expect(c.token).to eq("local-caffeine")
|
||||
@ -50,25 +50,25 @@ describe Hbc::Cask, :cask do
|
||||
expect {
|
||||
url = "file://#{tap_path}/Casks/notacask.rb"
|
||||
shutup do
|
||||
Hbc.load(url)
|
||||
Hbc::CaskLoader.load(url)
|
||||
end
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a relative file location" do
|
||||
c = Hbc.load(relative_tap_path/"Casks/local-caffeine.rb")
|
||||
c = Hbc::CaskLoader.load(relative_tap_path/"Casks/local-caffeine.rb")
|
||||
expect(c).to be_kind_of(Hbc::Cask)
|
||||
expect(c.token).to eq("local-caffeine")
|
||||
end
|
||||
|
||||
it "uses exact match when loading by token" do
|
||||
expect(Hbc.load("test-opera").token).to eq("test-opera")
|
||||
expect(Hbc.load("test-opera-mail").token).to eq("test-opera-mail")
|
||||
expect(Hbc::CaskLoader.load("test-opera").token).to eq("test-opera")
|
||||
expect(Hbc::CaskLoader.load("test-opera-mail").token).to eq("test-opera-mail")
|
||||
end
|
||||
|
||||
it "raises an error when attempting to load a Cask that doesn't exist" do
|
||||
expect {
|
||||
Hbc.load("notacask")
|
||||
Hbc::CaskLoader.load("notacask")
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
end
|
||||
@ -84,7 +84,7 @@ describe Hbc::Cask, :cask do
|
||||
describe "metadata" do
|
||||
it "proposes a versioned metadata directory name for each instance" do
|
||||
cask_token = "local-caffeine"
|
||||
c = Hbc.load(cask_token)
|
||||
c = Hbc::CaskLoader.load(cask_token)
|
||||
metadata_path = Hbc.caskroom.join(cask_token, ".metadata", c.version)
|
||||
expect(c.metadata_versioned_container_path.to_s).to eq(metadata_path.to_s)
|
||||
end
|
||||
@ -92,13 +92,13 @@ describe Hbc::Cask, :cask do
|
||||
|
||||
describe "outdated" do
|
||||
it "ignores the Casks that have auto_updates true (without --greedy)" do
|
||||
c = Hbc.load("auto-updates")
|
||||
c = Hbc::CaskLoader.load("auto-updates")
|
||||
expect(c).not_to be_outdated
|
||||
expect(c.outdated_versions).to be_empty
|
||||
end
|
||||
|
||||
it "ignores the Casks that have version :latest (without --greedy)" do
|
||||
c = Hbc.load("version-latest-string")
|
||||
c = Hbc::CaskLoader.load("version-latest-string")
|
||||
expect(c).not_to be_outdated
|
||||
expect(c.outdated_versions).to be_empty
|
||||
end
|
||||
|
||||
@ -13,7 +13,7 @@ describe Hbc::CLI::Audit, :cask do
|
||||
|
||||
it "audits specified Casks if tokens are given" do
|
||||
cask_token = "nice-app"
|
||||
expect(Hbc).to receive(:load).with(cask_token).and_return(cask)
|
||||
expect(Hbc::CaskLoader).to receive(:load).with(cask_token).and_return(cask)
|
||||
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
@ -23,14 +23,14 @@ describe Hbc::CLI::Audit, :cask do
|
||||
|
||||
describe "rules for downloading a Cask" do
|
||||
it "does not download the Cask per default" do
|
||||
allow(Hbc).to receive(:load).and_return(cask)
|
||||
allow(Hbc::CaskLoader).to receive(:load).and_return(cask)
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken"], auditor)
|
||||
end
|
||||
|
||||
it "download a Cask if --download flag is set" do
|
||||
allow(Hbc).to receive(:load).and_return(cask)
|
||||
allow(Hbc::CaskLoader).to receive(:load).and_return(cask)
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: true, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken", "--download"], auditor)
|
||||
@ -39,14 +39,14 @@ describe Hbc::CLI::Audit, :cask do
|
||||
|
||||
describe "rules for checking token conflicts" do
|
||||
it "does not check for token conflicts per default" do
|
||||
allow(Hbc).to receive(:load).and_return(cask)
|
||||
allow(Hbc::CaskLoader).to receive(:load).and_return(cask)
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken"], auditor)
|
||||
end
|
||||
|
||||
it "checks for token conflicts if --token-conflicts flag is set" do
|
||||
allow(Hbc).to receive(:load).and_return(cask)
|
||||
allow(Hbc::CaskLoader).to receive(:load).and_return(cask)
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: false, check_token_conflicts: true)
|
||||
|
||||
run_audit(["casktoken", "--token-conflicts"], auditor)
|
||||
|
||||
@ -24,7 +24,7 @@ describe Hbc::CLI::Create, :cask do
|
||||
|
||||
after(:each) do
|
||||
%w[new-cask additional-cask another-cask yet-another-cask local-caff].each do |cask|
|
||||
path = Hbc.path(cask)
|
||||
path = Hbc::CaskLoader.path(cask)
|
||||
path.delete if path.exist?
|
||||
end
|
||||
end
|
||||
@ -32,13 +32,13 @@ describe Hbc::CLI::Create, :cask do
|
||||
it "opens the editor for the specified Cask" do
|
||||
Hbc::CLI::Create.run("new-cask")
|
||||
expect(Hbc::CLI::Create.editor_commands).to eq [
|
||||
[Hbc.path("new-cask")],
|
||||
[Hbc::CaskLoader.path("new-cask")],
|
||||
]
|
||||
end
|
||||
|
||||
it "drops a template down for the specified Cask" do
|
||||
Hbc::CLI::Create.run("new-cask")
|
||||
template = File.read(Hbc.path("new-cask"))
|
||||
template = File.read(Hbc::CaskLoader.path("new-cask"))
|
||||
expect(template).to eq <<-EOS.undent
|
||||
cask 'new-cask' do
|
||||
version ''
|
||||
@ -56,14 +56,14 @@ describe Hbc::CLI::Create, :cask do
|
||||
it "throws away additional Cask arguments and uses the first" do
|
||||
Hbc::CLI::Create.run("additional-cask", "another-cask")
|
||||
expect(Hbc::CLI::Create.editor_commands).to eq [
|
||||
[Hbc.path("additional-cask")],
|
||||
[Hbc::CaskLoader.path("additional-cask")],
|
||||
]
|
||||
end
|
||||
|
||||
it "throws away stray options" do
|
||||
Hbc::CLI::Create.run("--notavalidoption", "yet-another-cask")
|
||||
expect(Hbc::CLI::Create.editor_commands).to eq [
|
||||
[Hbc.path("yet-another-cask")],
|
||||
[Hbc::CaskLoader.path("yet-another-cask")],
|
||||
]
|
||||
end
|
||||
|
||||
@ -76,7 +76,7 @@ describe Hbc::CLI::Create, :cask do
|
||||
it "allows creating Casks that are substrings of existing Casks" do
|
||||
Hbc::CLI::Create.run("local-caff")
|
||||
expect(Hbc::CLI::Create.editor_commands).to eq [
|
||||
[Hbc.path("local-caff")],
|
||||
[Hbc::CaskLoader.path("local-caff")],
|
||||
]
|
||||
end
|
||||
|
||||
|
||||
@ -25,14 +25,14 @@ describe Hbc::CLI::Edit, :cask do
|
||||
it "opens the editor for the specified Cask" do
|
||||
Hbc::CLI::Edit.run("local-caffeine")
|
||||
expect(Hbc::CLI::Edit.editor_commands).to eq [
|
||||
[Hbc.path("local-caffeine")],
|
||||
[Hbc::CaskLoader.path("local-caffeine")],
|
||||
]
|
||||
end
|
||||
|
||||
it "throws away additional arguments and uses the first" do
|
||||
Hbc::CLI::Edit.run("local-caffeine", "local-transmission")
|
||||
expect(Hbc::CLI::Edit.editor_commands).to eq [
|
||||
[Hbc.path("local-caffeine")],
|
||||
[Hbc::CaskLoader.path("local-caffeine")],
|
||||
]
|
||||
end
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
describe Hbc::CLI::List, :cask do
|
||||
it "lists the installed Casks in a pretty fashion" do
|
||||
casks = %w[local-caffeine local-transmission].map { |c| Hbc.load(c) }
|
||||
casks = %w[local-caffeine local-transmission].map { |c| Hbc::CaskLoader.load(c) }
|
||||
|
||||
casks.each do |c|
|
||||
InstallHelper.install_with_caskfile(c)
|
||||
@ -24,7 +24,7 @@ describe Hbc::CLI::List, :cask do
|
||||
}
|
||||
|
||||
before(:each) do
|
||||
casks.map(&Hbc.method(:load)).each(&InstallHelper.method(:install_with_caskfile))
|
||||
casks.map(&Hbc::CaskLoader.method(:load)).each(&InstallHelper.method(:install_with_caskfile))
|
||||
end
|
||||
|
||||
it "of all installed Casks" do
|
||||
@ -40,23 +40,6 @@ describe Hbc::CLI::List, :cask do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when Casks have been renamed" do
|
||||
let(:caskroom_path) { Hbc.caskroom.join("ive-been-renamed") }
|
||||
let(:staged_path) { caskroom_path.join("latest") }
|
||||
|
||||
before do
|
||||
staged_path.mkpath
|
||||
end
|
||||
|
||||
it "lists installed Casks without backing ruby files (due to renames or otherwise)" do
|
||||
expect {
|
||||
Hbc::CLI::List.run
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
ive-been-renamed (!)
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
describe "given a set of installed Casks" do
|
||||
let(:caffeine) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb") }
|
||||
let(:transmission) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb") }
|
||||
|
||||
@ -130,7 +130,7 @@ describe Hbc::CLI::Style, :cask do
|
||||
end
|
||||
|
||||
it "tries to find paths for all tokens" do
|
||||
expect(Hbc).to receive(:path).twice
|
||||
expect(Hbc::CaskLoader).to receive(:path).twice
|
||||
subject
|
||||
end
|
||||
end
|
||||
|
||||
@ -32,7 +32,7 @@ describe Hbc::CLI::Zap, :cask do
|
||||
# The above tests that implicitly.
|
||||
#
|
||||
# it "dispatches both uninstall and zap stanzas" do
|
||||
# with_zap = Hbc.load('with-zap')
|
||||
# with_zap = Hbc::CaskLoader.load('with-zap')
|
||||
#
|
||||
# shutup do
|
||||
# Hbc::Installer.new(with_zap).install
|
||||
|
||||
@ -17,7 +17,7 @@ describe "Satisfy Dependencies and Requirements", :cask do
|
||||
|
||||
context do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask.rb") }
|
||||
let(:dependency) { Hbc.load(cask.depends_on.cask.first) }
|
||||
let(:dependency) { Hbc::CaskLoader.load(cask.depends_on.cask.first) }
|
||||
|
||||
it "installs the dependency of a Cask and the Cask itself" do
|
||||
expect(subject).not_to raise_error
|
||||
|
||||
@ -291,7 +291,7 @@ describe "download strategies", :cask do
|
||||
# does not work yet, because (for unknown reasons), the tar command
|
||||
# returns an error code when running under the test suite
|
||||
# it 'creates a tarball matching the expected checksum' do
|
||||
# cask = Hbc.load('svn-download-check-cask')
|
||||
# cask = Hbc::CaskLoader.load('svn-download-check-cask')
|
||||
# downloader = Hbc::SubversionDownloadStrategy.new(cask)
|
||||
# # special mocking required for tar to have something to work with
|
||||
# def downloader.fetch_repo(target, url, revision = nil, ignore_externals=false)
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
describe Hbc::Scopes, :cask do
|
||||
describe "installed" do
|
||||
it "returns a list installed Casks by loading Casks for all the dirs that exist in the caskroom" do
|
||||
allow(Hbc).to receive(:load) { |token| "loaded-#{token}" }
|
||||
allow(Hbc::CaskLoader).to receive(:load) { |token| "loaded-#{token}" }
|
||||
|
||||
Hbc.caskroom.join("cask-bar").mkpath
|
||||
Hbc.caskroom.join("cask-foo").mkpath
|
||||
|
||||
installed_casks = Hbc.installed
|
||||
|
||||
expect(Hbc).to have_received(:load).with("cask-bar")
|
||||
expect(Hbc).to have_received(:load).with("cask-foo")
|
||||
expect(Hbc::CaskLoader).to have_received(:load).with("cask-bar")
|
||||
expect(Hbc::CaskLoader).to have_received(:load).with("cask-foo")
|
||||
expect(installed_casks).to eq(
|
||||
%w[
|
||||
loaded-cask-bar
|
||||
@ -18,11 +18,11 @@ describe Hbc::Scopes, :cask do
|
||||
)
|
||||
end
|
||||
|
||||
it "optimizes performance by resolving to a fully qualified path before calling Hbc.load" do
|
||||
it "optimizes performance by resolving to a fully qualified path before calling Hbc::CaskLoader.load" do
|
||||
fake_tapped_cask_dir = Pathname.new(Dir.mktmpdir).join("Casks")
|
||||
absolute_path_to_cask = fake_tapped_cask_dir.join("some-cask.rb")
|
||||
|
||||
allow(Hbc).to receive(:load)
|
||||
allow(Hbc::CaskLoader).to receive(:load)
|
||||
allow(Hbc).to receive(:all_tapped_cask_dirs) { [fake_tapped_cask_dir] }
|
||||
|
||||
Hbc.caskroom.join("some-cask").mkdir
|
||||
@ -31,7 +31,7 @@ describe Hbc::Scopes, :cask do
|
||||
|
||||
Hbc.installed
|
||||
|
||||
expect(Hbc).to have_received(:load).with(absolute_path_to_cask)
|
||||
expect(Hbc::CaskLoader).to have_received(:load).with(absolute_path_to_cask)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user