Cask::DSL: define instance variables in initialize

We're now seeing warnings related to the cask DSL surfaced by Ruby
3.4:

```
/opt/homebrew/Library/Homebrew/cask/dsl.rb:456: warning: The class
Cask::DSL reached 8 shape variations, instance variables accesses
will be slower and memory usage increased.
It is recommended to define instance variables in a consistent order,
for instance by eagerly defining them all in the #initialize method.
```

I've been working on upgrading `Cask::DSL` to `typed: strict` and
part of that involves defining all of the instance variables in the
`initialize` method, so I've extracted this part of that work as a
way of helping to resolve the aforementioned warning. This doesn't
fully resolve the warning but it addresses what it was originally
referencing, at least.

For what it's worth, this includes some type fixes but I've only
included what's necessary to pass `brew typecheck`.
This commit is contained in:
Sam Ford 2025-04-22 17:53:19 -04:00
parent c495aa3e63
commit 5b5c460ab9
No known key found for this signature in database
GPG Key ID: 7AF5CBEE1DD6F76D

View File

@ -90,14 +90,14 @@ module Cask
:deprecated?, :deprecated?,
:deprecation_date, :deprecation_date,
:deprecation_reason, :deprecation_reason,
:deprecation_replacement_formula,
:deprecation_replacement_cask, :deprecation_replacement_cask,
:deprecation_replacement_formula,
:disable!, :disable!,
:disabled?, :disabled?,
:disable_date, :disable_date,
:disable_reason, :disable_reason,
:disable_replacement_formula,
:disable_replacement_cask, :disable_replacement_cask,
:disable_replacement_formula,
:discontinued?, # TODO: remove once discontinued? is removed (4.5.0) :discontinued?, # TODO: remove once discontinued? is removed (4.5.0)
:livecheck, :livecheck,
:livecheck_defined?, :livecheck_defined?,
@ -112,18 +112,39 @@ module Cask
include OnSystem::MacOSAndLinux include OnSystem::MacOSAndLinux
attr_reader :cask, :token, :deprecation_date, :deprecation_reason, :deprecation_replacement_formula, attr_reader :cask, :token, :artifacts, :deprecation_date, :deprecation_reason,
:deprecation_replacement_cask, :disable_date, :disable_reason, :disable_replacement_formula, :deprecation_replacement_cask, :deprecation_replacement_formula,
:disable_replacement_cask, :on_system_block_min_os :disable_date, :disable_reason, :disable_replacement_cask,
:disable_replacement_formula, :on_system_block_min_os
sig { params(cask: Cask).void }
def initialize(cask) def initialize(cask)
@cask = cask @artifacts = T.let(ArtifactSet.new, ArtifactSet)
@called_in_on_system_block = T.let(false, T::Boolean)
@cask = T.let(cask, Cask)
@caveats = T.let(DSL::Caveats.new(cask), DSL::Caveats)
@depends_on = T.let(DSL::DependsOn.new, DSL::DependsOn)
@depends_on_set_in_block = T.let(false, T::Boolean) @depends_on_set_in_block = T.let(false, T::Boolean)
@deprecated = 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))
@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))
@disabled = T.let(false, T::Boolean) @disabled = 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) @livecheck_defined = T.let(false, T::Boolean)
@name = T.let([], T::Array[String])
@on_system_blocks_exist = T.let(false, T::Boolean) @on_system_blocks_exist = T.let(false, T::Boolean)
@token = cask.token @token = cask.token
@on_system_block_min_os = T.let(nil, T.nilable(MacOSVersion))
@staged_path = T.let(nil, T.nilable(Pathname))
@token = T.let(cask.token, String)
end end
sig { returns(T::Boolean) } sig { returns(T::Boolean) }
@ -153,7 +174,6 @@ module Cask
# #
# @api public # @api public
def name(*args) def name(*args)
@name ||= []
return @name if args.empty? return @name if args.empty?
@name.concat(args.flatten) @name.concat(args.flatten)
@ -210,7 +230,6 @@ module Cask
if args.empty? if args.empty?
language_eval language_eval
elsif block elsif block
@language_blocks ||= {}
@language_blocks[args] = block @language_blocks[args] = block
return unless default return unless default
@ -226,11 +245,13 @@ module Cask
end end
def language_eval def language_eval
return @language_eval if defined?(@language_eval) return @language_eval unless @language_eval.nil?
return @language_eval = nil if @language_blocks.blank? return @language_eval = nil if @language_blocks.empty?
raise CaskInvalidError.new(cask, "No default language specified.") if @language_blocks.default.nil? if (language_blocks_default = @language_blocks.default).nil?
raise CaskInvalidError.new(cask, "No default language specified.")
end
locales = cask.config.languages locales = cask.config.languages
.filter_map do |language| .filter_map do |language|
@ -241,18 +262,15 @@ module Cask
locales.each do |locale| locales.each do |locale|
key = locale.detect(@language_blocks.keys) key = locale.detect(@language_blocks.keys)
next if key.nil? || (language_block = @language_blocks[key]).nil?
next if key.nil? return @language_eval = language_block.call
return @language_eval = @language_blocks[key].call
end end
@language_eval = @language_blocks.default.call @language_eval = language_blocks_default.call
end end
def languages def languages
return [] if @language_blocks.nil?
@language_blocks.keys.flatten @language_blocks.keys.flatten
end end
@ -425,7 +443,6 @@ module Cask
# #
# @api public # @api public
def depends_on(**kwargs) def depends_on(**kwargs)
@depends_on ||= DSL::DependsOn.new
@depends_on_set_in_block = true if @called_in_on_system_block @depends_on_set_in_block = true if @called_in_on_system_block
return @depends_on if kwargs.empty? return @depends_on if kwargs.empty?
@ -439,7 +456,7 @@ module Cask
# @api private # @api private
def add_implicit_macos_dependency def add_implicit_macos_dependency
return if @depends_on.present? && @depends_on.macos.present? return if (cask_depends_on = @depends_on).present? && cask_depends_on.macos.present?
depends_on macos: ">= :#{MacOSVersion::SYMBOLS.key MacOSVersion::SYMBOLS.values.min}" depends_on macos: ">= :#{MacOSVersion::SYMBOLS.key MacOSVersion::SYMBOLS.values.min}"
end end
@ -452,10 +469,6 @@ module Cask
set_unique_stanza(:conflicts_with, kwargs.empty?) { DSL::ConflictsWith.new(**kwargs) } set_unique_stanza(:conflicts_with, kwargs.empty?) { DSL::ConflictsWith.new(**kwargs) }
end end
def artifacts
@artifacts ||= ArtifactSet.new
end
sig { returns(Pathname) } sig { returns(Pathname) }
def caskroom_path def caskroom_path
cask.caskroom_path cask.caskroom_path
@ -476,7 +489,6 @@ module Cask
# #
# @api public # @api public
def caveats(*strings, &block) def caveats(*strings, &block)
@caveats ||= DSL::Caveats.new(cask)
if block if block
@caveats.eval_caveats(&block) @caveats.eval_caveats(&block)
elsif strings.any? elsif strings.any?
@ -500,7 +512,6 @@ module Cask
# #
# @api public # @api public
def livecheck(&block) def livecheck(&block)
@livecheck ||= Livecheck.new(cask)
return @livecheck unless block return @livecheck unless block
if !@cask.allow_reassignment && @livecheck_defined if !@cask.allow_reassignment && @livecheck_defined