Ignore invalid keys when reading existing Cask::Config.
This commit is contained in:
parent
7739152aa5
commit
9922ad382f
@ -46,7 +46,7 @@ module Cask
|
|||||||
@default_config = config || Config.new
|
@default_config = config || Config.new
|
||||||
|
|
||||||
self.config = if config_path.exist?
|
self.config = if config_path.exist?
|
||||||
Config.from_json(File.read(config_path))
|
Config.from_json(File.read(config_path), ignore_invalid_keys: true)
|
||||||
else
|
else
|
||||||
@default_config
|
@default_config
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# typed: false
|
# typed: true
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "json"
|
require "json"
|
||||||
@ -14,6 +14,8 @@ module Cask
|
|||||||
#
|
#
|
||||||
# @api private
|
# @api private
|
||||||
class Config
|
class Config
|
||||||
|
extend T::Sig
|
||||||
|
|
||||||
DEFAULT_DIRS = {
|
DEFAULT_DIRS = {
|
||||||
appdir: "/Applications",
|
appdir: "/Applications",
|
||||||
colorpickerdir: "~/Library/ColorPickers",
|
colorpickerdir: "~/Library/ColorPickers",
|
||||||
@ -37,6 +39,7 @@ module Cask
|
|||||||
}.merge(DEFAULT_DIRS).freeze
|
}.merge(DEFAULT_DIRS).freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(args: Homebrew::CLI::Args).returns(T.attached_class) }
|
||||||
def self.from_args(args)
|
def self.from_args(args)
|
||||||
new(explicit: {
|
new(explicit: {
|
||||||
appdir: args.appdir,
|
appdir: args.appdir,
|
||||||
@ -57,20 +60,22 @@ module Cask
|
|||||||
}.compact)
|
}.compact)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.from_json(json)
|
sig { params(json: String, ignore_invalid_keys: T::Boolean).returns(T.attached_class) }
|
||||||
config = begin
|
def self.from_json(json, ignore_invalid_keys: false)
|
||||||
JSON.parse(json)
|
config = JSON.parse(json)
|
||||||
rescue JSON::ParserError => e
|
|
||||||
raise e, "Cannot parse #{path}: #{e}", e.backtrace
|
|
||||||
end
|
|
||||||
|
|
||||||
new(
|
new(
|
||||||
default: config.fetch("default", {}),
|
default: config.fetch("default", {}),
|
||||||
env: config.fetch("env", {}),
|
env: config.fetch("env", {}),
|
||||||
explicit: config.fetch("explicit", {}),
|
explicit: config.fetch("explicit", {}),
|
||||||
|
ignore_invalid_keys: ignore_invalid_keys,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(config: T::Enumerable[[T.any(String, Symbol), T.any(String, Pathname, T::Array[String])]])
|
||||||
|
.returns(T::Hash[Symbol, T.any(String, Pathname, T::Array[String])])
|
||||||
|
end
|
||||||
def self.canonicalize(config)
|
def self.canonicalize(config)
|
||||||
config.map do |k, v|
|
config.map do |k, v|
|
||||||
key = k.to_sym
|
key = k.to_sym
|
||||||
@ -83,26 +88,43 @@ module Cask
|
|||||||
end.to_h
|
end.to_h
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Hash[Symbol, T.any(String, Pathname, T::Array[String])]) }
|
||||||
attr_accessor :explicit
|
attr_accessor :explicit
|
||||||
|
|
||||||
def initialize(default: nil, env: nil, explicit: {})
|
sig do
|
||||||
|
params(
|
||||||
|
default: T.nilable(T::Hash[Symbol, T.any(String, Pathname, T::Array[String])]),
|
||||||
|
env: T.nilable(T::Hash[Symbol, T.any(String, Pathname, T::Array[String])]),
|
||||||
|
explicit: T::Hash[Symbol, T.any(String, Pathname, T::Array[String])],
|
||||||
|
ignore_invalid_keys: T::Boolean,
|
||||||
|
).void
|
||||||
|
end
|
||||||
|
def initialize(default: nil, env: nil, explicit: {}, ignore_invalid_keys: false)
|
||||||
@default = self.class.canonicalize(self.class.defaults.merge(default)) if default
|
@default = self.class.canonicalize(self.class.defaults.merge(default)) if default
|
||||||
@env = self.class.canonicalize(env) if env
|
@env = self.class.canonicalize(env) if env
|
||||||
@explicit = self.class.canonicalize(explicit)
|
@explicit = self.class.canonicalize(explicit)
|
||||||
|
|
||||||
|
if ignore_invalid_keys
|
||||||
|
@env&.delete_if { |key, _| self.class.defaults.keys.exclude?(key) }
|
||||||
|
@explicit.delete_if { |key, _| self.class.defaults.keys.exclude?(key) }
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
@env&.assert_valid_keys!(*self.class.defaults.keys)
|
@env&.assert_valid_keys!(*self.class.defaults.keys)
|
||||||
@explicit.assert_valid_keys!(*self.class.defaults.keys)
|
@explicit.assert_valid_keys!(*self.class.defaults.keys)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Hash[Symbol, T.any(String, Pathname, T::Array[String])]) }
|
||||||
def default
|
def default
|
||||||
@default ||= self.class.canonicalize(self.class.defaults)
|
@default ||= self.class.canonicalize(self.class.defaults)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Hash[Symbol, T.any(String, Pathname, T::Array[String])]) }
|
||||||
def env
|
def env
|
||||||
@env ||= self.class.canonicalize(
|
@env ||= self.class.canonicalize(
|
||||||
Homebrew::EnvConfig.cask_opts
|
Homebrew::EnvConfig.cask_opts
|
||||||
.select { |arg| arg.include?("=") }
|
.select { |arg| arg.include?("=") }
|
||||||
.map { |arg| arg.split("=", 2) }
|
.map { |arg| T.cast(arg.split("=", 2), [String, String]) }
|
||||||
.map do |(flag, value)|
|
.map do |(flag, value)|
|
||||||
key = flag.sub(/^--/, "")
|
key = flag.sub(/^--/, "")
|
||||||
|
|
||||||
@ -116,19 +138,22 @@ module Cask
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(Pathname) }
|
||||||
def binarydir
|
def binarydir
|
||||||
@binarydir ||= HOMEBREW_PREFIX/"bin"
|
@binarydir ||= HOMEBREW_PREFIX/"bin"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(Pathname) }
|
||||||
def manpagedir
|
def manpagedir
|
||||||
@manpagedir ||= HOMEBREW_PREFIX/"share/man"
|
@manpagedir ||= HOMEBREW_PREFIX/"share/man"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Array[String]) }
|
||||||
def languages
|
def languages
|
||||||
[
|
[
|
||||||
*explicit[:languages],
|
*T.cast(explicit.fetch(:languages, []), T::Array[String]),
|
||||||
*env[:languages],
|
*T.cast(env.fetch(:languages, []), T::Array[String]),
|
||||||
*default[:languages],
|
*T.cast(default.fetch(:languages, []), T::Array[String]),
|
||||||
].uniq.select do |lang|
|
].uniq.select do |lang|
|
||||||
# Ensure all languages are valid.
|
# Ensure all languages are valid.
|
||||||
Locale.parse(lang)
|
Locale.parse(lang)
|
||||||
@ -152,16 +177,18 @@ module Cask
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(other: Config).returns(T.self_type) }
|
||||||
def merge(other)
|
def merge(other)
|
||||||
self.class.new(explicit: other.explicit.merge(explicit))
|
self.class.new(explicit: other.explicit.merge(explicit))
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_json(*args)
|
sig { params(options: T.untyped).returns(String) }
|
||||||
|
def to_json(**options)
|
||||||
{
|
{
|
||||||
default: default,
|
default: default,
|
||||||
env: env,
|
env: env,
|
||||||
explicit: explicit,
|
explicit: explicit,
|
||||||
}.to_json(*args)
|
}.to_json(**options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -226,6 +226,48 @@ module Homebrew
|
|||||||
|
|
||||||
sig { returns(T.nilable(T::Boolean)) }
|
sig { returns(T.nilable(T::Boolean)) }
|
||||||
def s?; end
|
def s?; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def appdir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def fontdir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def colorpickerdir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def prefpanedir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def qlplugindir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def dictionarydir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def servicedir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def input_methoddir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def mdimporterdir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def internet_plugindir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def audio_unit_plugindir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def vst_plugindir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def vst3_plugindir; end
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
def screen_saverdir; end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user