Class: Cask::DSL Private

Inherits:
Object show all
Includes:
OS::Mac::Cask::DSL, OnSystem::MacOSAndLinux, Utils::Output::Mixin
Defined in:
cask/dsl.rb,
cask/dsl/base.rb,
cask/dsl/rename.rb,
cask/dsl/caveats.rb,
cask/dsl/version.rb,
cask/dsl/container.rb,
cask/dsl/preflight.rb,
cask/dsl/depends_on.rb,
cask/dsl/postflight.rb,
cask/dsl/conflicts_with.rb,
cask/dsl/uninstall_preflight.rb,
cask/dsl/uninstall_postflight.rb

Overview

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

Class representing the domain-specific language used for casks.

Defined Under Namespace

Classes: Base, Caveats, ConflictsWith, Container, DependsOn, Postflight, Preflight, Rename, UninstallPostflight, UninstallPreflight, Version

Constant Summary collapse

ORDINARY_ARTIFACT_CLASSES =

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

[
  Artifact::Installer,
  Artifact::App,
  Artifact::Artifact,
  Artifact::AudioUnitPlugin,
  Artifact::Binary,
  Artifact::Colorpicker,
  Artifact::Dictionary,
  Artifact::Font,
  Artifact::InputMethod,
  Artifact::InternetPlugin,
  Artifact::KeyboardLayout,
  Artifact::Manpage,
  Artifact::Pkg,
  Artifact::Prefpane,
  Artifact::Qlplugin,
  Artifact::Mdimporter,
  Artifact::ScreenSaver,
  Artifact::Service,
  Artifact::StageOnly,
  Artifact::Suite,
  Artifact::VstPlugin,
  Artifact::Vst3Plugin,
  Artifact::ZshCompletion,
  Artifact::FishCompletion,
  Artifact::BashCompletion,
  Artifact::GeneratedCompletion,
  Artifact::Uninstall,
  Artifact::Zap,
].freeze
ACTIVATABLE_ARTIFACT_CLASSES =

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

T.let(
  (ORDINARY_ARTIFACT_CLASSES - [Artifact::StageOnly]).freeze,
  T::Array[T.class_of(Artifact::AbstractArtifact)],
)
ARTIFACT_BLOCK_CLASSES =

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

[
  Artifact::PreflightBlock,
  Artifact::PostflightBlock,
].freeze
DSL_METHODS =

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

T.let(Set.new([
  :arch,
  :artifacts,
  :auto_updates,
  :caveats,
  :conflicts_with,
  :container,
  :desc,
  :depends_on,
  :homepage,
  :language,
  :name,
  :os,
  :rename,
  :sha256,
  :staged_path,
  :url,
  :version,
  :appdir,
  :deprecate!,
  :deprecated?,
  :deprecation_date,
  :deprecation_reason,
  :deprecation_replacement_cask,
  :deprecation_replacement_formula,
  :deprecate_args,
  :disable!,
  :disabled?,
  :disable_date,
  :disable_reason,
  :disable_replacement_cask,
  :disable_replacement_formula,
  :disable_args,
  :livecheck,
  :livecheck_defined?,
  :no_autobump!,
  :autobump?,
  :no_autobump_message,
  :on_system_blocks_exist?,
  :on_os_blocks_exist?,
  :on_system_block_min_os,
  :depends_on_set_in_block?,
  *ORDINARY_ARTIFACT_CLASSES.map(&:dsl_key),
  *ACTIVATABLE_ARTIFACT_CLASSES.map(&:dsl_key),
  *ARTIFACT_BLOCK_CLASSES.flat_map { |klass| [klass.dsl_key, klass.uninstall_dsl_key] },
]).freeze, T::Set[Symbol])

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from OnSystem::MacOSAndLinux

included, #on_arch_conditional, #on_macos, #on_system_conditional

Methods included from Utils::Output::Mixin

#odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #opoo_outside_github_actions, #pretty_deprecated, #pretty_disabled, #pretty_duration, #pretty_installed, #pretty_outdated, #pretty_uninstalled

Constructor Details

#initialize(cask) ⇒ 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:



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'cask/dsl.rb', line 173

def initialize(cask)
  # NOTE: `:"@#{stanza}"` variables set by `set_unique_stanza` must be
  # initialized to `nil`.
  @arch = T.let(nil, T.nilable(String))
  @arch_set_in_block = T.let(false, T::Boolean)
  @artifacts = T.let(ArtifactSet.new, ArtifactSet)
  @auto_updates = T.let(nil, T.nilable(T::Boolean))
  @auto_updates_set_in_block = T.let(false, T::Boolean)
  @autobump = T.let(true, T::Boolean)
  @called_in_on_system_block = T.let(false, T::Boolean)
  @cask = cask
  @caveats = T.let(DSL::Caveats.new(cask), DSL::Caveats)
  @conflicts_with = T.let(nil, T.nilable(DSL::ConflictsWith))
  @conflicts_with_set_in_block = T.let(false, T::Boolean)
  @container = T.let(nil, T.nilable(DSL::Container))
  @container_set_in_block = T.let(false, T::Boolean)
  @depends_on = T.let(DSL::DependsOn.new, DSL::DependsOn)
  @depends_on_set_in_block = T.let(false, T::Boolean)
  @deprecated = T.let(false, T::Boolean)
  @deprecation_date = T.let(nil, T.nilable(Date))
  @deprecation_reason = T.let(nil, T.nilable(T.any(String, Symbol)))
  @deprecation_replacement_cask = T.let(nil, T.nilable(String))
  @deprecation_replacement_formula = T.let(nil, T.nilable(String))
  @deprecate_args = T.let(nil, T.nilable(T::Hash[Symbol, T.nilable(T.any(String, Symbol))]))
  @desc = T.let(nil, T.nilable(String))
  @desc_set_in_block = T.let(false, T::Boolean)
  @disable_date = T.let(nil, T.nilable(Date))
  @disable_reason = T.let(nil, T.nilable(T.any(String, Symbol)))
  @disable_replacement_cask = T.let(nil, T.nilable(String))
  @disable_replacement_formula = T.let(nil, T.nilable(String))
  @disable_args = T.let(nil, T.nilable(T::Hash[Symbol, T.nilable(T.any(String, Symbol))]))
  @disabled = T.let(false, T::Boolean)
  @homepage = T.let(nil, T.nilable(String))
  @homepage_set_in_block = T.let(false, T::Boolean)
  @language_blocks = T.let({}, T::Hash[T::Array[String], Proc])
  @language_eval = T.let(nil, T.nilable(String))
  @livecheck = T.let(Livecheck.new(cask), Livecheck)
  @livecheck_defined = T.let(false, T::Boolean)
  @name = T.let([], T::Array[String])
  @no_autobump_defined = T.let(false, T::Boolean)
  @no_autobump_message = T.let(nil, T.nilable(T.any(String, Symbol)))
  @on_system_blocks_exist = T.let(false, T::Boolean)
  @on_os_blocks_exist = T.let(false, T::Boolean)
  @on_system_block_min_os = T.let(nil, T.nilable(MacOSVersion))
  @os = T.let(nil, T.nilable(String))
  @os_set_in_block = T.let(false, T::Boolean)
  @rename = T.let([], T::Array[DSL::Rename])
  @sha256 = T.let(nil, T.nilable(T.any(Checksum, Symbol)))
  @sha256_set_in_block = T.let(false, T::Boolean)
  @staged_path = T.let(nil, T.nilable(Pathname))
  @token = T.let(cask.token, String)
  @url = T.let(nil, T.nilable(URL))
  @url_set_in_block = T.let(false, T::Boolean)
  @version = T.let(nil, T.nilable(DSL::Version))
  @version_set_in_block = T.let(false, T::Boolean)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *_args) ⇒ T.noreturn

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:

  • method (Symbol)
  • _args (T.anything)

Returns:

  • (T.noreturn)

Raises:

  • (NoMethodError)


818
819
820
# File 'cask/dsl.rb', line 818

def method_missing(method, *_args)
  raise NoMethodError, "undefined method '#{method}' for Cask '#{token}'"
end

Instance Attribute Details

#artifactsArtifactSet (readonly)

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:



137
138
139
# File 'cask/dsl.rb', line 137

def artifacts
  @artifacts
end

#caskCask (readonly)

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:



128
129
130
# File 'cask/dsl.rb', line 128

def cask
  @cask
end

#deprecate_argsHash{Symbol => String, Symbol, nil}? (readonly)

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:



152
153
154
# File 'cask/dsl.rb', line 152

def deprecate_args
  @deprecate_args
end

#deprecation_dateDate? (readonly)

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:

  • (Date, nil)


140
141
142
# File 'cask/dsl.rb', line 140

def deprecation_date
  @deprecation_date
end

#deprecation_reasonString, ... (readonly)

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:



143
144
145
# File 'cask/dsl.rb', line 143

def deprecation_reason
  @deprecation_reason
end

#deprecation_replacement_caskString? (readonly)

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/dsl.rb', line 146

def deprecation_replacement_cask
  @deprecation_replacement_cask
end

#deprecation_replacement_formulaString? (readonly)

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:



149
150
151
# File 'cask/dsl.rb', line 149

def deprecation_replacement_formula
  @deprecation_replacement_formula
end

#disable_argsHash{Symbol => String, Symbol, nil}? (readonly)

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:



167
168
169
# File 'cask/dsl.rb', line 167

def disable_args
  @disable_args
end

#disable_dateDate? (readonly)

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:

  • (Date, nil)


155
156
157
# File 'cask/dsl.rb', line 155

def disable_date
  @disable_date
end

#disable_reasonString, ... (readonly)

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:



158
159
160
# File 'cask/dsl.rb', line 158

def disable_reason
  @disable_reason
end

#disable_replacement_caskString? (readonly)

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:



161
162
163
# File 'cask/dsl.rb', line 161

def disable_replacement_cask
  @disable_replacement_cask
end

#disable_replacement_formulaString? (readonly)

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:



164
165
166
# File 'cask/dsl.rb', line 164

def disable_replacement_formula
  @disable_replacement_formula
end

#no_autobump_messageString, ... (readonly)

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:



134
135
136
# File 'cask/dsl.rb', line 134

def no_autobump_message
  @no_autobump_message
end

#on_system_block_min_osMacOSVersion? (readonly)

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:



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

def on_system_block_min_os
  @on_system_block_min_os
end

#tokenString (readonly)

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:



131
132
133
# File 'cask/dsl.rb', line 131

def token
  @token
end

Instance Method Details

#add_implicit_macos_dependencyvoid

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.

This method returns an undefined value.



598
599
600
601
602
# File 'cask/dsl.rb', line 598

def add_implicit_macos_dependency
  return if (cask_depends_on = @depends_on).present? && cask_depends_on.macos.present?

  depends_on macos: ">= #{MacOSVersion.new(HOMEBREW_MACOS_OLDEST_ALLOWED).to_sym.inspect}"
end

#appdirPathname, String

The directory apps are installed into.

Returns:



836
837
838
839
840
# File 'cask/dsl.rb', line 836

def appdir
  return HOMEBREW_CASK_APPDIR_PLACEHOLDER if Cask.generating_hash?

  cask.config.appdir
end

#arch(arm: nil, intel: nil) ⇒ String?

Sets the cask's architecture strings.

Example

arch arm: "darwin-arm64", intel: "darwin"

Parameters:

  • arm (String, nil) (defaults to: nil)
  • intel (String, nil) (defaults to: nil)

Returns:



537
538
539
540
541
542
543
544
545
# File 'cask/dsl.rb', line 537

def arch(arm: nil, intel: nil)
  should_return = arm.nil? && intel.nil?

  set_unique_stanza(:arch, should_return) do
    @on_system_blocks_exist = true

    on_arch_conditional(arm:, intel:)
  end
end

#auto_updates(auto_updates = nil) ⇒ Boolean?

Asserts that the cask artifacts auto-update.

Parameters:

  • auto_updates (Boolean, nil) (defaults to: nil)

Returns:

  • (Boolean, nil)


658
659
660
# File 'cask/dsl.rb', line 658

def auto_updates(auto_updates = nil)
  set_unique_stanza(:auto_updates, auto_updates.nil?) { auto_updates }
end

#autobump?Boolean

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.

Is the cask in autobump list?

Returns:

  • (Boolean)


704
705
706
# File 'cask/dsl.rb', line 704

def autobump?
  @autobump == true
end

#caskroom_pathPathname

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:



614
615
616
# File 'cask/dsl.rb', line 614

def caskroom_path
  cask.caskroom_path
end

#caveats(*strings, &block) ⇒ String, DSL::Caveats

Provide the user with cask-specific information at install time.

Parameters:

Returns:



638
639
640
641
642
643
644
645
646
647
648
649
# File 'cask/dsl.rb', line 638

def caveats(*strings, &block)
  if block
    @caveats.eval_caveats(&block)
  elsif strings.any?
    strings.each do |string|
      @caveats.eval_caveats { string }
    end
  else
    return @caveats.to_s
  end
  @caveats
end

#caveats_objectDSL::Caveats

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:



652
# File 'cask/dsl.rb', line 652

def caveats_object = @caveats

#conflicts_with(**kwargs) ⇒ DSL::ConflictsWith?

Declare conflicts that keep a cask from installing or working correctly.

Parameters:

  • kwargs (T.anything)

Returns:



608
609
610
611
# File 'cask/dsl.rb', line 608

def conflicts_with(**kwargs)
  # TODO: Remove this constraint and instead merge multiple `conflicts_with` stanzas
  set_unique_stanza(:conflicts_with, kwargs.empty?) { DSL::ConflictsWith.new(**kwargs) }
end

#container(nested: nil, type: nil) ⇒ DSL::Container?

Sets the cask's container type or nested container path.

Examples

The container is a nested disk image:

container nested: "orca-#{version}.dmg"

The container should not be unarchived:

container type: :naked

Parameters:

  • nested (String, nil) (defaults to: nil)
  • type (Symbol, nil) (defaults to: nil)

Returns:



422
423
424
425
426
# File 'cask/dsl.rb', line 422

def container(nested: nil, type: nil)
  set_unique_stanza(:container, nested.nil? && type.nil?) do
    DSL::Container.new(nested:, type:)
  end
end

#depends_on(arg = nil, **kwargs) ⇒ DSL::DependsOn

Note:

Multiple dependencies can be specified.

Declare dependencies and requirements for a cask.

Parameters:

  • arg (Symbol, nil) (defaults to: nil)
  • kwargs (T.untyped)

Returns:



579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
# File 'cask/dsl.rb', line 579

def depends_on(arg = nil, **kwargs)
  @depends_on_set_in_block = true if @called_in_on_system_block
  if arg == :macos
    kwargs[:macos] = :any
  elsif arg
    raise CaskInvalidError.new(cask, "invalid 'depends_on' value: #{arg.inspect}")
  end
  return @depends_on if kwargs.empty?

  begin
    @depends_on.load(**kwargs)
  rescue RuntimeError => e
    raise CaskInvalidError.new(cask, e)
  end
  @depends_on
end

#depends_on_set_in_block?Boolean

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:

  • (Boolean)


231
# File 'cask/dsl.rb', line 231

def depends_on_set_in_block? = @depends_on_set_in_block

#deprecate!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) ⇒ void

Note:

A warning will be shown when trying to install this cask.

This method returns an undefined value.

Declare that a cask is no longer functional or supported.

Parameters:

  • date (String)
  • because (String, Symbol)
  • replacement (String, nil) (defaults to: nil)
  • replacement_formula (String, nil) (defaults to: nil)
  • replacement_cask (String, nil) (defaults to: nil)


722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
# File 'cask/dsl.rb', line 722

def deprecate!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil)
  if [replacement, replacement_formula, replacement_cask].filter_map(&:presence).length > 1
    raise ArgumentError, "more than one of replacement, replacement_formula and/or replacement_cask specified!"
  end

  if replacement
    odeprecated(
      "deprecate!(:replacement)",
      "deprecate!(:replacement_formula) or deprecate!(:replacement_cask)",
    )
  end

  @deprecate_args = { date:, because:, replacement_formula:, replacement_cask: }

  @deprecation_date = Date.parse(date)
  return if @deprecation_date > Date.today

  @deprecation_reason = because
  @deprecation_replacement_formula = replacement_formula.presence || replacement
  @deprecation_replacement_cask = replacement_cask.presence || replacement
  @deprecated = true
end

#deprecated?Boolean

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:

  • (Boolean)


234
# File 'cask/dsl.rb', line 234

def deprecated? = @deprecated

#desc(description = nil) ⇒ String?

Describes the cask.

Example

desc "Open-source code editor"

Parameters:

  • description (String, nil) (defaults to: nil)

Returns:



276
277
278
# File 'cask/dsl.rb', line 276

def desc(description = nil)
  set_unique_stanza(:desc, description.nil?) { description }
end

#disable!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) ⇒ void

Note:

An error will be thrown when trying to install this cask.

This method returns an undefined value.

Declare that a cask is no longer functional or supported.

Parameters:

  • date (String)
  • because (String, Symbol)
  • replacement (String, nil) (defaults to: nil)
  • replacement_formula (String, nil) (defaults to: nil)
  • replacement_cask (String, nil) (defaults to: nil)


759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
# File 'cask/dsl.rb', line 759

def disable!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil)
  if [replacement, replacement_formula, replacement_cask].filter_map(&:presence).length > 1
    raise ArgumentError, "more than one of replacement, replacement_formula and/or replacement_cask specified!"
  end

  # odeprecate: remove this remapping when the :unsigned reason is removed
  because = :fails_gatekeeper_check if because == :unsigned

  if replacement
    odeprecated(
      "disable!(:replacement)",
      "disable!(:replacement_formula) or disable!(:replacement_cask)",
    )
  end

  @disable_args = { date:, because:, replacement_formula:, replacement_cask: }

  @disable_date = Date.parse(date)

  if @disable_date > Date.today
    @deprecation_reason = because
    @deprecation_replacement_formula = replacement_formula.presence || replacement
    @deprecation_replacement_cask = replacement_cask.presence || replacement
    @deprecated = true
    return
  end

  @disable_reason = because
  @disable_replacement_formula = replacement_formula.presence || replacement
  @disable_replacement_cask = replacement_cask.presence || replacement
  @disabled = true
end

#disabled?Boolean

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:

  • (Boolean)


237
# File 'cask/dsl.rb', line 237

def disabled? = @disabled

#homepage(homepage = nil) ⇒ String?

Sets the cask's homepage.

Example

homepage "https://code.visualstudio.com/"

Parameters:

  • homepage (String, nil) (defaults to: nil)

Returns:



320
321
322
# File 'cask/dsl.rb', line 320

def homepage(homepage = nil)
  set_unique_stanza(:homepage, homepage.nil?) { homepage }
end

#language(*args, default: false, &block) ⇒ String?

Specifies language-specific values for the cask.

Parameters:

  • args (String)
  • default (Boolean) (defaults to: false)
  • block (T.proc.returns(String), nil)

Returns:



334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
# File 'cask/dsl.rb', line 334

def language(*args, default: false, &block)
  if args.empty?
    language_eval
  elsif block
    @language_blocks[args] = block

    return unless default

    if !@cask.allow_reassignment && @language_blocks.default.present?
      raise CaskInvalidError.new(cask, "Only one default language may be defined.")
    end

    @language_blocks.default = block
    nil
  else
    raise CaskInvalidError.new(cask, "No block given to language stanza.")
  end
end

#language_evalString?

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:



354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
# File 'cask/dsl.rb', line 354

def language_eval
  return @language_eval unless @language_eval.nil?

  return @language_eval = nil if @language_blocks.empty?

  if (language_blocks_default = @language_blocks.default).nil?
    raise CaskInvalidError.new(cask, "No default language specified.")
  end

  locales = cask.config.languages
                .filter_map do |language|
                  Locale.parse(language)
                rescue Locale::ParserError
                  nil
                end

  locales.each do |locale|
    key = T.cast(locale.detect(@language_blocks.keys), T.nilable(T::Array[String]))
    next if key.nil? || (language_block = @language_blocks[key]).nil?

    return @language_eval = language_block.call
  end

  @language_eval = language_blocks_default.call
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:



381
382
383
# File 'cask/dsl.rb', line 381

def languages
  @language_blocks.keys.flatten
end

#livecheck(&block) ⇒ Livecheck

Automatically fetch the latest version of a cask from changelogs.

Parameters:

  • block (T.proc.void, nil)

Returns:



666
667
668
669
670
671
672
673
674
675
676
677
# File 'cask/dsl.rb', line 666

def livecheck(&block)
  return @livecheck unless block

  if !@cask.allow_reassignment && @livecheck_defined
    raise CaskInvalidError.new(cask, "'livecheck' stanza may only appear once.")
  end

  @livecheck_defined = true
  @livecheck.instance_eval(&block)
  no_autobump! because: :extract_plist if @livecheck.strategy == :extract_plist
  @livecheck
end

#livecheck_defined?Boolean

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:

  • (Boolean)


240
# File 'cask/dsl.rb', line 240

def livecheck_defined? = @livecheck_defined

#name(*args) ⇒ Array<String>

Note:

Multiple names can be specified.

Specifies the cask's name.

Example

name "Visual Studio Code"

Parameters:

Returns:



260
261
262
263
264
# File 'cask/dsl.rb', line 260

def name(*args)
  return @name if args.empty?

  @name.concat(args.flatten)
end

#no_autobump!(because:) ⇒ void

TODO:

limit this method to the official taps only (e.g. raise an error if !tap.official?)

This method returns an undefined value.

Excludes the cask from autobump list.

Parameters:



686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
# File 'cask/dsl.rb', line 686

def no_autobump!(because:)
  if because.is_a?(Symbol) && !NO_AUTOBUMP_REASONS_LIST.key?(because)
    raise ArgumentError, "'because' argument should use valid symbol or a string!"
  end

  if !@cask.allow_reassignment && @no_autobump_defined
    raise CaskInvalidError.new(cask, "'no_autobump_defined' stanza may only appear once.")
  end

  odeprecated "no_autobump! because: :requires_manual_review" if because == :requires_manual_review

  @no_autobump_defined = true
  @no_autobump_message = because
  @autobump = false
end

#on_os_blocks_exist?Boolean

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:

  • (Boolean)


246
# File 'cask/dsl.rb', line 246

def on_os_blocks_exist? = @on_os_blocks_exist

#on_system_blocks_exist?Boolean

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:

  • (Boolean)


243
# File 'cask/dsl.rb', line 243

def on_system_blocks_exist? = @on_system_blocks_exist

#os(macos: nil, linux: nil) ⇒ String?

Sets the cask's os strings.

Example

os macos: "darwin", linux: "tux"

Parameters:

  • macos (String, nil) (defaults to: nil)
  • linux (String, nil) (defaults to: nil)

Returns:



562
563
564
565
566
567
568
569
570
571
# File 'cask/dsl.rb', line 562

def os(macos: nil, linux: nil)
  should_return = macos.nil? && linux.nil?

  set_unique_stanza(:os, should_return) do
    @on_system_blocks_exist = true
    @on_os_blocks_exist = true

    on_system_conditional(macos:, linux:)
  end
end

#os_versionMacOSVersion?

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:



828
829
830
# File 'cask/dsl.rb', line 828

def os_version
  nil
end

#rename(from = T.unsafe(nil), to = T.unsafe(nil)) ⇒ Array<DSL::Rename>

Renames files after extraction.

This is useful when the downloaded file has unpredictable names that need to be normalized for proper artifact installation.

Example

rename "RØDECaster App*.pkg", "RØDECaster App.pkg"

Parameters:

  • from (String) (defaults to: T.unsafe(nil))
  • to (String) (defaults to: T.unsafe(nil))

Returns:



444
445
446
447
448
# File 'cask/dsl.rb', line 444

def rename(from = T.unsafe(nil), to = T.unsafe(nil))
  return @rename if from.nil?

  @rename << DSL::Rename.new(from, to)
end

#respond_to_missing?(_method_name, _include_private = false) ⇒ Boolean

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:

  • _method_name (String, Symbol)
  • _include_private (Boolean) (defaults to: false)

Returns:

  • (Boolean)


823
824
825
# File 'cask/dsl.rb', line 823

def respond_to_missing?(_method_name, _include_private = false)
  false
end

#set_unique_stanza(stanza, should_return, &_block) ⇒ T.type_parameter(:U)

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.

Note:

Using WithoutRuntime to avoid Sorbet wrapping this method,

which would interfere with caller_locations in methods like url.

Parameters:

  • stanza (Symbol)
  • should_return (Boolean)
  • _block (T.proc.returns(T.all(BasicObject, T.type_parameter(:U))))

Returns:

  • (T.type_parameter(:U))


289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
# File 'cask/dsl.rb', line 289

def set_unique_stanza(stanza, should_return, &_block)
  return instance_variable_get(:"@#{stanza}") if should_return

  unless @cask.allow_reassignment
    if !instance_variable_get(:"@#{stanza}").nil? && !@called_in_on_system_block
      raise CaskInvalidError.new(cask, "'#{stanza}' stanza may only appear once.")
    end

    if instance_variable_get(:"@#{stanza}_set_in_block") && @called_in_on_system_block
      raise CaskInvalidError.new(cask, "'#{stanza}' stanza may only be overridden once.")
    end
  end

  instance_variable_set(:"@#{stanza}_set_in_block", true) if @called_in_on_system_block
  instance_variable_set(:"@#{stanza}", yield)
rescue CaskInvalidError
  raise
rescue => e
  raise CaskInvalidError.new(cask, "'#{stanza}' stanza failed with: #{e}")
end

#sha256(arg = nil, arm: nil, intel: nil, x86_64: nil, x86_64_linux: nil, arm64_linux: nil) ⇒ Symbol, ...

Sets the cask's download checksum.

Example

For universal or single-architecture downloads:

sha256 "7bdb497080ffafdfd8cc94d8c62b004af1be9599e865e5555e456e2681e150ca"

For architecture-dependent downloads:

sha256 arm:          "7bdb497080ffafdfd8cc94d8c62b004af1be9599e865e5555e456e2681e150ca",
       x86_64:       "b3c1c2442480a0219b9e05cf91d03385858c20f04b764ec08a3fa83d1b27e7b2"
       x86_64_linux: "1a2aee7f1ddc999993d4d7d42a150c5e602bc17281678050b8ed79a0500cc90f"
       arm64_linux:  "bd766af7e692afceb727a6f88e24e6e68d9882aeb3e8348412f6c03d96537c75"

Parameters:

  • arg (String, Symbol, nil) (defaults to: nil)
  • arm (String, nil) (defaults to: nil)
  • intel (String, nil) (defaults to: nil)
  • x86_64 (String, nil) (defaults to: nil)
  • x86_64_linux (String, nil) (defaults to: nil)
  • arm64_linux (String, nil) (defaults to: nil)

Returns:



503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
# File 'cask/dsl.rb', line 503

def sha256(arg = nil, arm: nil, intel: nil, x86_64: nil, x86_64_linux: nil, arm64_linux: nil)
  should_return = arg.nil? && arm.nil? && (intel.nil? || x86_64.nil?) && x86_64_linux.nil? && arm64_linux.nil?

  x86_64 ||= intel if intel.present? && x86_64.nil?
  set_unique_stanza(:sha256, should_return) do
    if arm.present? || x86_64.present? || x86_64_linux.present? || arm64_linux.present?
      @on_system_blocks_exist = true
    end

    val = arg || on_system_conditional(
      macos: on_arch_conditional(arm:, intel: x86_64),
      linux: on_arch_conditional(arm: arm64_linux, intel: x86_64_linux),
    )
    case val
    when :no_check
      :no_check
    when String
      Checksum.new(val)
    else
      raise CaskInvalidError.new(cask, "invalid 'sha256' value: #{val.inspect}")
    end
  end
end

#staged_pathPathname

The staged location for this cask, including version number.

Returns:



622
623
624
625
626
627
# File 'cask/dsl.rb', line 622

def staged_path
  return @staged_path if @staged_path

  cask_version = version || :unknown
  @staged_path = caskroom_path.join(cask_version.to_s)
end

#url(uri = nil, **options) ⇒ URL?

Sets the cask's download URL.

Example

url "https://update.code.visualstudio.com/#{version}/#{arch}/stable"

Parameters:

  • uri (URI::Generic, String, nil) (defaults to: nil)
  • options (T.untyped)

Returns:



395
396
397
398
399
400
401
402
# File 'cask/dsl.rb', line 395

def url(uri = nil, **options)
  caller_location = caller_locations.fetch(0)
  return @url unless uri

  set_unique_stanza(:url, false) do
    URL.new(uri, **options, caller_location:)
  end
end

#version(arg = nil) ⇒ DSL::Version?

Sets the cask's version.

Example

version "1.88.1"

Parameters:

Returns:

See Also:



461
462
463
464
465
466
467
468
469
470
471
# File 'cask/dsl.rb', line 461

def version(arg = nil)
  set_unique_stanza(:version, arg.nil?) do
    if !arg.is_a?(String) && arg != :latest
      raise CaskInvalidError.new(cask, "invalid 'version' value: #{arg.inspect}")
    end

    no_autobump! because: :latest_version if arg == :latest

    DSL::Version.new(arg)
  end
end