From ffd761d2e90d67241794368c9910b2fa21ac66a3 Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Thu, 28 Dec 2023 11:45:18 -0800 Subject: [PATCH 1/2] Create dedicated Attrable mixin for attr_ methods --- Library/Homebrew/attrable.rb | 32 +++++++++++++++++++ .../{extend/predicable.rbi => attrable.rbi} | 3 +- .../cask/artifact/abstract_artifact.rb | 3 +- Library/Homebrew/cask/audit.rb | 3 +- Library/Homebrew/cask/cask.rb | 3 +- Library/Homebrew/cask/dsl.rb | 3 +- Library/Homebrew/cask/dsl/caveats.rb | 4 ++- Library/Homebrew/cask/installer.rb | 3 +- Library/Homebrew/cleanup.rb | 3 +- Library/Homebrew/debrew.rb | 3 +- Library/Homebrew/extend/module.rb | 20 +----------- Library/Homebrew/extend/predicable.rb | 13 -------- Library/Homebrew/formula.rb | 5 +-- Library/Homebrew/formula_installer.rb | 2 +- Library/Homebrew/global.rb | 1 - Library/Homebrew/requirement.rb | 2 ++ Library/Homebrew/software_spec.rb | 2 ++ .../sorbet/rbi/hidden-definitions/hidden.rbi | 2 +- Library/Homebrew/system_command.rb | 5 ++- 19 files changed, 62 insertions(+), 50 deletions(-) create mode 100644 Library/Homebrew/attrable.rb rename Library/Homebrew/{extend/predicable.rbi => attrable.rbi} (59%) delete mode 100644 Library/Homebrew/extend/predicable.rb diff --git a/Library/Homebrew/attrable.rb b/Library/Homebrew/attrable.rb new file mode 100644 index 0000000000..b15c59ca76 --- /dev/null +++ b/Library/Homebrew/attrable.rb @@ -0,0 +1,32 @@ +# typed: strict +# frozen_string_literal: true + +module Attrable + sig { params(attrs: Symbol).void } + def attr_predicate(*attrs) + attrs.each do |attr| + define_method attr do + instance_variable_get("@#{attr.to_s.sub(/\?$/, "")}") == true + end + end + end + + sig { params(attrs: Symbol).void } + def attr_rw(*attrs) + attrs.each do |attr| + module_eval <<-EOS, __FILE__, __LINE__+1 + def #{attr}(val=nil) # def prefix(val=nil) + if val.nil? # if val.nil? + if instance_variable_defined?(:@#{attr}) # if instance_variable_defined?(:@prefix) + return @#{attr} # return @prefix + else # else + return nil # return nil + end # end + end # end + # + @#{attr} = val # @prefix = val + end # end + EOS + end + end +end diff --git a/Library/Homebrew/extend/predicable.rbi b/Library/Homebrew/attrable.rbi similarity index 59% rename from Library/Homebrew/extend/predicable.rbi rename to Library/Homebrew/attrable.rbi index 027500f579..44a9560126 100644 --- a/Library/Homebrew/extend/predicable.rbi +++ b/Library/Homebrew/attrable.rbi @@ -1,6 +1,5 @@ # typed: strict -module Predicable - include Kernel +module Attrable requires_ancestor { Module } end diff --git a/Library/Homebrew/cask/artifact/abstract_artifact.rb b/Library/Homebrew/cask/artifact/abstract_artifact.rb index 112925e2d7..7e86cf4ac5 100644 --- a/Library/Homebrew/cask/artifact/abstract_artifact.rb +++ b/Library/Homebrew/cask/artifact/abstract_artifact.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "active_support/core_ext/object/deep_dup" module Cask @@ -13,7 +14,7 @@ module Cask abstract! include Comparable - extend Predicable + extend Attrable def self.english_name @english_name ||= T.must(name).sub(/^.*:/, "").gsub(/(.)([A-Z])/, '\1 \2') diff --git a/Library/Homebrew/cask/audit.rb b/Library/Homebrew/cask/audit.rb index 67ae10e22c..48d61a8aac 100644 --- a/Library/Homebrew/cask/audit.rb +++ b/Library/Homebrew/cask/audit.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "cask/denylist" require "cask/download" require "digest" @@ -17,7 +18,7 @@ module Cask # @api private class Audit include ::Utils::Curl - extend Predicable + extend Attrable attr_reader :cask, :download diff --git a/Library/Homebrew/cask/cask.rb b/Library/Homebrew/cask/cask.rb index 9a61984df7..9cbc8538ad 100644 --- a/Library/Homebrew/cask/cask.rb +++ b/Library/Homebrew/cask/cask.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "cask/cask_loader" require "cask/config" require "cask/dsl" @@ -14,7 +15,7 @@ module Cask # @api private class Cask extend Forwardable - extend Predicable + extend Attrable extend APIHashable include Metadata diff --git a/Library/Homebrew/cask/dsl.rb b/Library/Homebrew/cask/dsl.rb index 978251abb3..bf875e07aa 100644 --- a/Library/Homebrew/cask/dsl.rb +++ b/Library/Homebrew/cask/dsl.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "locale" require "lazy_object" require "livecheck" @@ -101,7 +102,7 @@ module Cask *ARTIFACT_BLOCK_CLASSES.flat_map { |klass| [klass.dsl_key, klass.uninstall_dsl_key] }, ]).freeze - extend Predicable + extend Attrable include OnSystem::MacOSOnly attr_reader :cask, :token, :deprecation_date, :deprecation_reason, :disable_date, :disable_reason diff --git a/Library/Homebrew/cask/dsl/caveats.rb b/Library/Homebrew/cask/dsl/caveats.rb index ba0ab886f8..356b9731ac 100644 --- a/Library/Homebrew/cask/dsl/caveats.rb +++ b/Library/Homebrew/cask/dsl/caveats.rb @@ -1,6 +1,8 @@ # typed: true # frozen_string_literal: true +require "attrable" + module Cask class DSL # Class corresponding to the `caveats` stanza. @@ -15,7 +17,7 @@ module Cask # # @api private class Caveats < Base - extend Predicable + extend Attrable attr_predicate :discontinued? diff --git a/Library/Homebrew/cask/installer.rb b/Library/Homebrew/cask/installer.rb index 494193a252..0cacc005fd 100644 --- a/Library/Homebrew/cask/installer.rb +++ b/Library/Homebrew/cask/installer.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "formula_installer" require "unpack_strategy" require "utils/topological_hash" @@ -17,7 +18,7 @@ module Cask # # @api private class Installer - extend Predicable + extend Attrable def initialize(cask, command: SystemCommand, force: false, adopt: false, skip_cask_deps: false, binaries: true, verbose: false, diff --git a/Library/Homebrew/cleanup.rb b/Library/Homebrew/cleanup.rb index 362673c559..b92b6f02f5 100644 --- a/Library/Homebrew/cleanup.rb +++ b/Library/Homebrew/cleanup.rb @@ -3,6 +3,7 @@ require "utils/bottles" +require "attrable" require "formula" require "cask/cask_loader" require "set" @@ -176,7 +177,7 @@ module Homebrew end end - extend Predicable + extend Attrable PERIODIC_CLEAN_FILE = (HOMEBREW_CACHE/".cleaned").freeze diff --git a/Library/Homebrew/debrew.rb b/Library/Homebrew/debrew.rb index 8db1eb63b1..c465f5d22c 100644 --- a/Library/Homebrew/debrew.rb +++ b/Library/Homebrew/debrew.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "mutex_m" require "ignorable" @@ -74,7 +75,7 @@ module Debrew @debugged_exceptions = Set.new class << self - extend Predicable + extend Attrable attr_predicate :active? attr_reader :debugged_exceptions end diff --git a/Library/Homebrew/extend/module.rb b/Library/Homebrew/extend/module.rb index 62b97c2b01..ea5d1f5d4c 100644 --- a/Library/Homebrew/extend/module.rb +++ b/Library/Homebrew/extend/module.rb @@ -1,24 +1,6 @@ -# typed: true +# typed: strict # frozen_string_literal: true class Module include T::Sig - - def attr_rw(*attrs) - attrs.each do |attr| - module_eval <<-EOS, __FILE__, __LINE__+1 - def #{attr}(val=nil) # def prefix(val=nil) - if val.nil? # if val.nil? - if instance_variable_defined?(:@#{attr}) # if instance_variable_defined?(:@prefix) - return @#{attr} # return @prefix - else # else - return nil # return nil - end # end - end # end - # - @#{attr} = val # @prefix = val - end # end - EOS - end - end end diff --git a/Library/Homebrew/extend/predicable.rb b/Library/Homebrew/extend/predicable.rb deleted file mode 100644 index 7eb7c9edbf..0000000000 --- a/Library/Homebrew/extend/predicable.rb +++ /dev/null @@ -1,13 +0,0 @@ -# typed: strict -# frozen_string_literal: true - -module Predicable - sig { params(attrs: Symbol).void } - def attr_predicate(*attrs) - attrs.each do |attr| - define_method attr do - instance_variable_get("@#{attr.to_s.sub(/\?$/, "")}") == true - end - end - end -end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 77be731c68..41d4201711 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "cache_store" require "did_you_mean" require "formula_support" @@ -66,7 +67,7 @@ class Formula include Homebrew::Livecheck::Constants extend Forwardable extend Cachable - extend Predicable + extend Attrable extend APIHashable # The name of this {Formula}. @@ -2916,7 +2917,7 @@ class Formula # The methods below define the formula DSL. class << self - extend Predicable + extend Attrable include BuildEnvironment::DSL include OnSystem::MacOSAndLinux diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index dd8a0e450e..d99a518595 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -28,7 +28,7 @@ require "service" # @api private class FormulaInstaller include FormulaCellarChecks - extend Predicable + extend Attrable attr_reader :formula, :bottle_tab_runtime_dependencies diff --git a/Library/Homebrew/global.rb b/Library/Homebrew/global.rb index eba4c8f078..3f6f878341 100644 --- a/Library/Homebrew/global.rb +++ b/Library/Homebrew/global.rb @@ -135,7 +135,6 @@ require "context" require "extend/array" require "git_repository" require "extend/pathname" -require "extend/predicable" require "cli/args" require "PATH" diff --git a/Library/Homebrew/requirement.rb b/Library/Homebrew/requirement.rb index 4d5fa7e0d2..0d5f1df7e3 100644 --- a/Library/Homebrew/requirement.rb +++ b/Library/Homebrew/requirement.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "dependable" require "dependency" require "dependencies" @@ -163,6 +164,7 @@ class Requirement class << self include BuildEnvironment::DSL + extend Attrable attr_reader :env_proc, :build diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index 1d47f14c85..26cbce80ce 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "attrable" require "resource" require "download_strategy" require "checksum" @@ -506,6 +507,7 @@ class Bottle end class BottleSpecification + extend Attrable RELOCATABLE_CELLARS = [:any, :any_skip_relocation].freeze attr_rw :rebuild diff --git a/Library/Homebrew/sorbet/rbi/hidden-definitions/hidden.rbi b/Library/Homebrew/sorbet/rbi/hidden-definitions/hidden.rbi index 7fe6a5dfc7..074dea5764 100644 --- a/Library/Homebrew/sorbet/rbi/hidden-definitions/hidden.rbi +++ b/Library/Homebrew/sorbet/rbi/hidden-definitions/hidden.rbi @@ -7219,7 +7219,7 @@ class Parlour::Types::Type extend ::T::InterfaceWrapper::Helpers end -module Predicable +module Attrable extend ::T::Private::Methods::MethodHooks extend ::T::Private::Methods::SingletonMethodHooks end diff --git a/Library/Homebrew/system_command.rb b/Library/Homebrew/system_command.rb index 80ef1e3a9c..aac75e29b4 100644 --- a/Library/Homebrew/system_command.rb +++ b/Library/Homebrew/system_command.rb @@ -1,13 +1,12 @@ # typed: true # frozen_string_literal: true +require "attrable" require "open3" require "plist" require "shellwords" require "extend/io" -require "extend/predicable" - require "extend/time" # Class for running sub-processes and capturing their output and exit status. @@ -28,7 +27,7 @@ class SystemCommand end include Context - extend Predicable + extend Attrable def self.run(executable, **options) new(executable, **options).run! From db97ff2dce26be9ecd3d141d7529c028655ffee2 Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Sun, 31 Dec 2023 11:29:57 -0800 Subject: [PATCH 2/2] Use define_method instead --- Library/Homebrew/attrable.rb | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/Library/Homebrew/attrable.rb b/Library/Homebrew/attrable.rb index b15c59ca76..b081e7d1fe 100644 --- a/Library/Homebrew/attrable.rb +++ b/Library/Homebrew/attrable.rb @@ -14,19 +14,9 @@ module Attrable sig { params(attrs: Symbol).void } def attr_rw(*attrs) attrs.each do |attr| - module_eval <<-EOS, __FILE__, __LINE__+1 - def #{attr}(val=nil) # def prefix(val=nil) - if val.nil? # if val.nil? - if instance_variable_defined?(:@#{attr}) # if instance_variable_defined?(:@prefix) - return @#{attr} # return @prefix - else # else - return nil # return nil - end # end - end # end - # - @#{attr} = val # @prefix = val - end # end - EOS + define_method attr do |val = nil| + val.nil? ? instance_variable_get(:"@#{attr}") : instance_variable_set(:"@#{attr}", val) + end end end end