Class: Cask::Config

Inherits:
Object show all
Defined in:
cask/config.rb

Overview

This class is part of an internal API. This class may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Configuration for installing casks.

Constant Summary collapse

DEFAULT_DIRS =

This constant is part of an internal API. This constant may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

{
  appdir:               "/Applications",
  keyboard_layoutdir:   "/Library/Keyboard Layouts",
  colorpickerdir:       "~/Library/ColorPickers",
  prefpanedir:          "~/Library/PreferencePanes",
  qlplugindir:          "~/Library/QuickLook",
  mdimporterdir:        "~/Library/Spotlight",
  dictionarydir:        "~/Library/Dictionaries",
  fontdir:              "~/Library/Fonts",
  servicedir:           "~/Library/Services",
  input_methoddir:      "~/Library/Input Methods",
  internet_plugindir:   "~/Library/Internet Plug-Ins",
  audio_unit_plugindir: "~/Library/Audio/Plug-Ins/Components",
  vst_plugindir:        "~/Library/Audio/Plug-Ins/VST",
  vst3_plugindir:       "~/Library/Audio/Plug-Ins/VST3",
  screen_saverdir:      "~/Library/Screen Savers",
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(default: nil, env: nil, explicit: {}, ignore_invalid_keys: false) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:



106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'cask/config.rb', line 106

def initialize(default: nil, env: nil, explicit: {}, ignore_invalid_keys: false)
  @default = self.class.canonicalize(self.class.defaults.merge(default)) if default
  @env = self.class.canonicalize(env) if env
  @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)
  @explicit.assert_valid_keys(*self.class.defaults.keys)
end

Instance Attribute Details

#explicitHash{Symbol => String, Pathname, Array<String>}

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Get the explicit configuration.

Returns:



96
97
98
# File 'cask/config.rb', line 96

def explicit
  @explicit
end

Class Method Details

.canonicalize(config) ⇒ Hash{Symbol => String, Pathname, Array<String>}

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'cask/config.rb', line 78

def self.canonicalize(config)
  config.to_h do |k, v|
    key = k.to_sym

    if DEFAULT_DIRS.key?(key)
      raise TypeError, "Invalid path for default dir #{k}: #{v.inspect}" if v.is_a?(Array)

      [key, Pathname(v).expand_path]
    else
      [key, v]
    end
  end
end

.defaultsObject

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



33
34
35
36
37
# File 'cask/config.rb', line 33

def self.defaults
  {
    languages: LazyObject.new { MacOS.languages },
  }.merge(DEFAULT_DIRS).freeze
end

.from_args(args) ⇒ T.attached_class

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (T.attached_class)


40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'cask/config.rb', line 40

def self.from_args(args)
  args = T.unsafe(args)
  new(explicit: {
    appdir:               args.appdir,
    keyboard_layoutdir:   args.keyboard_layoutdir,
    colorpickerdir:       args.colorpickerdir,
    prefpanedir:          args.prefpanedir,
    qlplugindir:          args.qlplugindir,
    mdimporterdir:        args.mdimporterdir,
    dictionarydir:        args.dictionarydir,
    fontdir:              args.fontdir,
    servicedir:           args.servicedir,
    input_methoddir:      args.input_methoddir,
    internet_plugindir:   args.internet_plugindir,
    audio_unit_plugindir: args.audio_unit_plugindir,
    vst_plugindir:        args.vst_plugindir,
    vst3_plugindir:       args.vst3_plugindir,
    screen_saverdir:      args.screen_saverdir,
    languages:            args.language,
  }.compact)
end

.from_json(json, ignore_invalid_keys: false) ⇒ T.attached_class

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • json (String)
  • ignore_invalid_keys (Boolean) (defaults to: false)

Returns:

  • (T.attached_class)


63
64
65
66
67
68
69
70
71
72
# File 'cask/config.rb', line 63

def self.from_json(json, ignore_invalid_keys: false)
  config = JSON.parse(json)

  new(
    default:             config.fetch("default",  {}),
    env:                 config.fetch("env",      {}),
    explicit:            config.fetch("explicit", {}),
    ignore_invalid_keys:,
  )
end

Instance Method Details

#binarydirPathname

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



146
147
148
# File 'cask/config.rb', line 146

def binarydir
  @binarydir ||= HOMEBREW_PREFIX/"bin"
end

#defaultHash{Symbol => String, Pathname, Array<String>}

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



122
123
124
# File 'cask/config.rb', line 122

def default
  @default ||= self.class.canonicalize(self.class.defaults)
end

#envHash{Symbol => String, Pathname, Array<String>}

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'cask/config.rb', line 127

def env
  @env ||= self.class.canonicalize(
    Homebrew::EnvConfig.cask_opts
      .select { |arg| arg.include?("=") }
      .map { |arg| T.cast(arg.split("=", 2), [String, String]) }
      .map do |(flag, value)|
        key = flag.sub(/^--/, "")
        # converts --language flag to :languages config key
        if key == "language"
          key = "languages"
          value = value.split(",")
        end

        [key, value]
      end,
  )
end

#explicit_sString

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

TODO:

This is only used by homebrew/bundle, so move it there.

Get explicit configuration as a string.

Returns:



197
198
199
200
201
202
203
204
205
206
# File 'cask/config.rb', line 197

def explicit_s
  explicit.map do |key, value|
    # inverse of #env - converts :languages config key back to --language flag
    if key == :languages
      key = "language"
      value = T.cast(explicit.fetch(:languages, []), T::Array[String]).join(",")
    end
    "#{key}: \"#{value.to_s.sub(/^#{Dir.home}/, "~")}\""
  end.join(", ")
end

#languagesArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'cask/config.rb', line 156

def languages
  [
    *T.cast(explicit.fetch(:languages, []), T::Array[String]),
    *T.cast(env.fetch(:languages, []), T::Array[String]),
    *T.cast(default.fetch(:languages, []), T::Array[String]),
  ].uniq.select do |lang|
    # Ensure all languages are valid.
    Locale.parse(lang)
    true
  rescue Locale::ParserError
    false
  end
end

#languages=(languages) ⇒ Object

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



170
171
172
# File 'cask/config.rb', line 170

def languages=(languages)
  explicit[:languages] = languages
end

#manpagedirPathname

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



151
152
153
# File 'cask/config.rb', line 151

def manpagedir
  @manpagedir ||= HOMEBREW_PREFIX/"share/man"
end

#merge(other) ⇒ T.self_type

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (T.self_type)


187
188
189
# File 'cask/config.rb', line 187

def merge(other)
  self.class.new(explicit: other.explicit.merge(explicit))
end

#to_json(*options) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • options (T.untyped)

Returns:



209
210
211
212
213
214
215
# File 'cask/config.rb', line 209

def to_json(*options)
  {
    default:,
    env:,
    explicit:,
  }.to_json(*options)
end