From f6c7eb7124166f8e142deac40e317353563f22ef Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Fri, 12 Jan 2024 09:38:49 -0800 Subject: [PATCH] Add hash/keys to extend/ --- .gitignore | 1 - .../cask/artifact/abstract_uninstall.rb | 1 + Library/Homebrew/cask/artifact/installer.rb | 1 + Library/Homebrew/cask/artifact/pkg.rb | 1 + Library/Homebrew/cask/artifact/relocated.rb | 1 + Library/Homebrew/cask/cask_loader.rb | 1 + Library/Homebrew/cask/config.rb | 1 + Library/Homebrew/cask/dsl/conflicts_with.rb | 1 + .../extend/hash/deep_transform_values.rb | 2 + .../extend/hash/deep_transform_values.rbi | 7 +- Library/Homebrew/extend/hash/keys.rb | 116 ++++++++++++++ Library/Homebrew/extend/hash/keys.rbi | 30 ++++ Library/Homebrew/formulary.rb | 2 +- Library/Homebrew/github_packages.rb | 1 + Library/Homebrew/global.rb | 2 - .../lib/active_support/core_ext/hash/keys.rb | 143 ------------------ 16 files changed, 158 insertions(+), 153 deletions(-) create mode 100644 Library/Homebrew/extend/hash/keys.rb create mode 100644 Library/Homebrew/extend/hash/keys.rbi delete mode 100644 Library/Homebrew/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.7.6/lib/active_support/core_ext/hash/keys.rb diff --git a/.gitignore b/.gitignore index 12fd4fb18f..a88cbb4ca7 100644 --- a/.gitignore +++ b/.gitignore @@ -63,7 +63,6 @@ !**/vendor/bundle/ruby/*/gems/activesupport-*/lib/active_support/ !**/vendor/bundle/ruby/*/gems/activesupport-*/lib/active_support/core_ext/ !**/vendor/bundle/ruby/*/gems/activesupport-*/lib/active_support/core_ext/*/ -!**/vendor/bundle/ruby/*/gems/activesupport-*/lib/active_support/core_ext/hash/keys.rb !**/vendor/bundle/ruby/*/gems/activesupport-*/lib/active_support/core_ext/object/deep_dup.rb !**/vendor/bundle/ruby/*/gems/activesupport-*/lib/active_support/core_ext/object/duplicable.rb diff --git a/Library/Homebrew/cask/artifact/abstract_uninstall.rb b/Library/Homebrew/cask/artifact/abstract_uninstall.rb index db0dbe3551..a08431eb93 100644 --- a/Library/Homebrew/cask/artifact/abstract_uninstall.rb +++ b/Library/Homebrew/cask/artifact/abstract_uninstall.rb @@ -6,6 +6,7 @@ require "timeout" require "utils/user" require "cask/artifact/abstract_artifact" require "cask/pkg" +require "extend/hash/keys" module Cask module Artifact diff --git a/Library/Homebrew/cask/artifact/installer.rb b/Library/Homebrew/cask/artifact/installer.rb index 69de947bea..810a48b9f7 100644 --- a/Library/Homebrew/cask/artifact/installer.rb +++ b/Library/Homebrew/cask/artifact/installer.rb @@ -2,6 +2,7 @@ # frozen_string_literal: true require "cask/artifact/abstract_artifact" +require "extend/hash/keys" module Cask module Artifact diff --git a/Library/Homebrew/cask/artifact/pkg.rb b/Library/Homebrew/cask/artifact/pkg.rb index 0d2610f29f..5bf94b6ee6 100644 --- a/Library/Homebrew/cask/artifact/pkg.rb +++ b/Library/Homebrew/cask/artifact/pkg.rb @@ -5,6 +5,7 @@ require "plist" require "utils/user" require "cask/artifact/abstract_artifact" +require "extend/hash/keys" module Cask module Artifact diff --git a/Library/Homebrew/cask/artifact/relocated.rb b/Library/Homebrew/cask/artifact/relocated.rb index ecb6ba3242..345699031d 100644 --- a/Library/Homebrew/cask/artifact/relocated.rb +++ b/Library/Homebrew/cask/artifact/relocated.rb @@ -2,6 +2,7 @@ # frozen_string_literal: true require "cask/artifact/abstract_artifact" +require "extend/hash/keys" module Cask module Artifact diff --git a/Library/Homebrew/cask/cask_loader.rb b/Library/Homebrew/cask/cask_loader.rb index 9adcb5ad8c..9516792de8 100644 --- a/Library/Homebrew/cask/cask_loader.rb +++ b/Library/Homebrew/cask/cask_loader.rb @@ -5,6 +5,7 @@ require "cask/cache" require "cask/cask" require "uri" require "utils/curl" +require "extend/hash/keys" module Cask # Loads a cask from various sources. diff --git a/Library/Homebrew/cask/config.rb b/Library/Homebrew/cask/config.rb index b546a44f48..ac11934b7a 100644 --- a/Library/Homebrew/cask/config.rb +++ b/Library/Homebrew/cask/config.rb @@ -5,6 +5,7 @@ require "json" require "lazy_object" require "locale" +require "extend/hash/keys" module Cask # Configuration for installing casks. diff --git a/Library/Homebrew/cask/dsl/conflicts_with.rb b/Library/Homebrew/cask/dsl/conflicts_with.rb index 40b19f6056..1b177198fd 100644 --- a/Library/Homebrew/cask/dsl/conflicts_with.rb +++ b/Library/Homebrew/cask/dsl/conflicts_with.rb @@ -2,6 +2,7 @@ # frozen_string_literal: true require "delegate" +require "extend/hash/keys" module Cask class DSL diff --git a/Library/Homebrew/extend/hash/deep_transform_values.rb b/Library/Homebrew/extend/hash/deep_transform_values.rb index 24c91f15aa..608e3c73a8 100644 --- a/Library/Homebrew/extend/hash/deep_transform_values.rb +++ b/Library/Homebrew/extend/hash/deep_transform_values.rb @@ -20,6 +20,7 @@ class Hash private # Support methods for deep transforming nested hashes and arrays. + sig { params(object: T.anything, block: T.proc.params(v: T.untyped).returns(T.untyped)).returns(T.untyped) } def _deep_transform_values_in_object(object, &block) case object when Hash @@ -31,6 +32,7 @@ class Hash end end + sig { params(object: T.anything, block: T.proc.params(v: T.untyped).returns(T.untyped)).returns(T.untyped) } def _deep_transform_values_in_object!(object, &block) case object when Hash diff --git a/Library/Homebrew/extend/hash/deep_transform_values.rbi b/Library/Homebrew/extend/hash/deep_transform_values.rbi index 072474393b..29c8d273e2 100644 --- a/Library/Homebrew/extend/hash/deep_transform_values.rbi +++ b/Library/Homebrew/extend/hash/deep_transform_values.rbi @@ -7,16 +7,11 @@ class Hash ).returns(T::Hash[Hash::K, T.type_parameter(:out)]) } def deep_transform_values(&block); end + sig { type_parameters(:out).params( block: T.proc.params(o: Hash::V).returns(T.type_parameter(:out)) ).returns(T::Hash[Hash::K, T.type_parameter(:out)]) } def deep_transform_values!(&block); end - - sig { params(object: T.anything, block: T.untyped).returns(T.untyped) } - def _deep_transform_values_in_object(object, &block); end - - sig { params(object: T.anything, block: T.untyped).returns(T.untyped) } - def _deep_transform_values_in_object!(object, &block); end end diff --git a/Library/Homebrew/extend/hash/keys.rb b/Library/Homebrew/extend/hash/keys.rb new file mode 100644 index 0000000000..6ee0e945fd --- /dev/null +++ b/Library/Homebrew/extend/hash/keys.rb @@ -0,0 +1,116 @@ +# typed: strict +# frozen_string_literal: true + +class Hash + # Validates all keys in a hash match *valid_keys, raising + # +ArgumentError+ on a mismatch. + # + # Note that keys are treated differently than HashWithIndifferentAccess, + # meaning that string and symbol keys will not match. + # + # { name: 'Rob', years: '28' }.assert_valid_keys(:name, :age) + # # => raises "ArgumentError: Unknown key: :years. Valid keys are: :name, :age" + # { name: 'Rob', age: '28' }.assert_valid_keys('name', 'age') + # # => raises "ArgumentError: Unknown key: :name. Valid keys are: 'name', 'age'" + # { name: 'Rob', age: '28' }.assert_valid_keys(:name, :age) # => passes, raises nothing + sig { params(valid_keys: T.untyped).void } + def assert_valid_keys(*valid_keys) + valid_keys.flatten! + each_key do |k| + next if valid_keys.include?(k) + + raise ArgumentError, + "Unknown key: #{T.unsafe(k).inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(", ")}" + end + end + + # Returns a new hash with all keys converted by the block operation. + # This includes the keys from the root hash and from all + # nested hashes and arrays. + # + # hash = { person: { name: 'Rob', age: '28' } } + # + # hash.deep_transform_keys{ |key| key.to_s.upcase } + # # => {"PERSON"=>{"NAME"=>"Rob", "AGE"=>"28"}} + def deep_transform_keys(&block) = _deep_transform_keys_in_object(self, &block) + + # Destructively converts all keys by using the block operation. + # This includes the keys from the root hash and from all + # nested hashes and arrays. + def deep_transform_keys!(&block) = _deep_transform_keys_in_object!(self, &block) + + # Returns a new hash with all keys converted to strings. + # This includes the keys from the root hash and from all + # nested hashes and arrays. + # + # hash = { person: { name: 'Rob', age: '28' } } + # + # hash.deep_stringify_keys + # # => {"person"=>{"name"=>"Rob", "age"=>"28"}} + def deep_stringify_keys = T.unsafe(self).deep_transform_keys(&:to_s) + + # Destructively converts all keys to strings. + # This includes the keys from the root hash and from all + # nested hashes and arrays. + def deep_stringify_keys! = T.unsafe(self).deep_transform_keys!(&:to_s) + + # Returns a new hash with all keys converted to symbols, as long as + # they respond to +to_sym+. This includes the keys from the root hash + # and from all nested hashes and arrays. + # + # hash = { 'person' => { 'name' => 'Rob', 'age' => '28' } } + # + # hash.deep_symbolize_keys + # # => {:person=>{:name=>"Rob", :age=>"28"}} + def deep_symbolize_keys + deep_transform_keys do |key| + T.unsafe(key).to_sym + rescue + key + end + end + + # Destructively converts all keys to symbols, as long as they respond + # to +to_sym+. This includes the keys from the root hash and from all + # nested hashes and arrays. + def deep_symbolize_keys! + deep_transform_keys! do |key| + T.unsafe(key).to_sym + rescue + key + end + end + + private + + # Support methods for deep transforming nested hashes and arrays. + sig { params(object: T.anything, block: T.proc.params(k: T.untyped).returns(T.untyped)).returns(T.untyped) } + def _deep_transform_keys_in_object(object, &block) + case object + when Hash + object.each_with_object({}) do |(key, value), result| + result[yield(key)] = _deep_transform_keys_in_object(value, &block) + end + when Array + object.map { |e| _deep_transform_keys_in_object(e, &block) } + else + object + end + end + + sig { params(object: T.anything, block: T.proc.params(k: T.untyped).returns(T.untyped)).returns(T.untyped) } + def _deep_transform_keys_in_object!(object, &block) + case object + when Hash + object.each_key do |key| + value = object.delete(key) + object[yield(key)] = _deep_transform_keys_in_object!(value, &block) + end + object + when Array + object.map! { |e| _deep_transform_keys_in_object!(e, &block) } + else + object + end + end +end diff --git a/Library/Homebrew/extend/hash/keys.rbi b/Library/Homebrew/extend/hash/keys.rbi new file mode 100644 index 0000000000..581c876f7f --- /dev/null +++ b/Library/Homebrew/extend/hash/keys.rbi @@ -0,0 +1,30 @@ +# typed: strict +# frozen_string_literal: true + +class Hash + sig { + type_parameters(:out).params( + block: T.proc.params(o: K).returns(T.type_parameter(:out)) + ).returns(T::Hash[T.type_parameter(:out), V]) + } + def deep_transform_keys(&block); end + + sig { + type_parameters(:out).params( + block: T.proc.params(o: K).returns(T.type_parameter(:out)) + ).returns(T::Hash[T.type_parameter(:out), V]) + } + def deep_transform_keys!(&block); end + + sig { returns(T::Hash[String, V]) } + def deep_stringify_keys; end + + sig { returns(T::Hash[String, V]) } + def deep_stringify_keys!; end + + sig { returns(T::Hash[Symbol, V]) } + def deep_symbolize_keys; end + + sig { returns(T::Hash[Symbol, V]) } + def deep_symbolize_keys!; end +end diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 6690311389..5063333823 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -8,8 +8,8 @@ require "utils/bottles" require "service" require "utils/curl" require "deprecate_disable" - require "extend/hash/deep_transform_values" +require "extend/hash/keys" # The {Formulary} is responsible for creating instances of {Formula}. # It is not meant to be used directly from formulae. diff --git a/Library/Homebrew/github_packages.rb b/Library/Homebrew/github_packages.rb index 9d3fc79bcb..1bcd1ccb59 100644 --- a/Library/Homebrew/github_packages.rb +++ b/Library/Homebrew/github_packages.rb @@ -4,6 +4,7 @@ require "utils/curl" require "json" require "zlib" +require "extend/hash/keys" # GitHub Packages client. # diff --git a/Library/Homebrew/global.rb b/Library/Homebrew/global.rb index 20e0482bb2..863f322be0 100644 --- a/Library/Homebrew/global.rb +++ b/Library/Homebrew/global.rb @@ -10,8 +10,6 @@ require "json/add/exception" require "forwardable" require "set" -require "active_support/core_ext/hash/keys" - HOMEBREW_API_DEFAULT_DOMAIN = ENV.fetch("HOMEBREW_API_DEFAULT_DOMAIN").freeze HOMEBREW_BOTTLE_DEFAULT_DOMAIN = ENV.fetch("HOMEBREW_BOTTLE_DEFAULT_DOMAIN").freeze HOMEBREW_BREW_DEFAULT_GIT_REMOTE = ENV.fetch("HOMEBREW_BREW_DEFAULT_GIT_REMOTE").freeze diff --git a/Library/Homebrew/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.7.6/lib/active_support/core_ext/hash/keys.rb b/Library/Homebrew/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.7.6/lib/active_support/core_ext/hash/keys.rb deleted file mode 100644 index f2db61f386..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.7.6/lib/active_support/core_ext/hash/keys.rb +++ /dev/null @@ -1,143 +0,0 @@ -# frozen_string_literal: true - -class Hash - # Returns a new hash with all keys converted to strings. - # - # hash = { name: 'Rob', age: '28' } - # - # hash.stringify_keys - # # => {"name"=>"Rob", "age"=>"28"} - def stringify_keys - transform_keys(&:to_s) - end - - # Destructively converts all keys to strings. Same as - # +stringify_keys+, but modifies +self+. - def stringify_keys! - transform_keys!(&:to_s) - end - - # Returns a new hash with all keys converted to symbols, as long as - # they respond to +to_sym+. - # - # hash = { 'name' => 'Rob', 'age' => '28' } - # - # hash.symbolize_keys - # # => {:name=>"Rob", :age=>"28"} - def symbolize_keys - transform_keys { |key| key.to_sym rescue key } - end - alias_method :to_options, :symbolize_keys - - # Destructively converts all keys to symbols, as long as they respond - # to +to_sym+. Same as +symbolize_keys+, but modifies +self+. - def symbolize_keys! - transform_keys! { |key| key.to_sym rescue key } - end - alias_method :to_options!, :symbolize_keys! - - # Validates all keys in a hash match *valid_keys, raising - # +ArgumentError+ on a mismatch. - # - # Note that keys are treated differently than HashWithIndifferentAccess, - # meaning that string and symbol keys will not match. - # - # { name: 'Rob', years: '28' }.assert_valid_keys(:name, :age) # => raises "ArgumentError: Unknown key: :years. Valid keys are: :name, :age" - # { name: 'Rob', age: '28' }.assert_valid_keys('name', 'age') # => raises "ArgumentError: Unknown key: :name. Valid keys are: 'name', 'age'" - # { name: 'Rob', age: '28' }.assert_valid_keys(:name, :age) # => passes, raises nothing - def assert_valid_keys(*valid_keys) - valid_keys.flatten! - each_key do |k| - unless valid_keys.include?(k) - raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}") - end - end - end - - # Returns a new hash with all keys converted by the block operation. - # This includes the keys from the root hash and from all - # nested hashes and arrays. - # - # hash = { person: { name: 'Rob', age: '28' } } - # - # hash.deep_transform_keys{ |key| key.to_s.upcase } - # # => {"PERSON"=>{"NAME"=>"Rob", "AGE"=>"28"}} - def deep_transform_keys(&block) - _deep_transform_keys_in_object(self, &block) - end - - # Destructively converts all keys by using the block operation. - # This includes the keys from the root hash and from all - # nested hashes and arrays. - def deep_transform_keys!(&block) - _deep_transform_keys_in_object!(self, &block) - end - - # Returns a new hash with all keys converted to strings. - # This includes the keys from the root hash and from all - # nested hashes and arrays. - # - # hash = { person: { name: 'Rob', age: '28' } } - # - # hash.deep_stringify_keys - # # => {"person"=>{"name"=>"Rob", "age"=>"28"}} - def deep_stringify_keys - deep_transform_keys(&:to_s) - end - - # Destructively converts all keys to strings. - # This includes the keys from the root hash and from all - # nested hashes and arrays. - def deep_stringify_keys! - deep_transform_keys!(&:to_s) - end - - # Returns a new hash with all keys converted to symbols, as long as - # they respond to +to_sym+. This includes the keys from the root hash - # and from all nested hashes and arrays. - # - # hash = { 'person' => { 'name' => 'Rob', 'age' => '28' } } - # - # hash.deep_symbolize_keys - # # => {:person=>{:name=>"Rob", :age=>"28"}} - def deep_symbolize_keys - deep_transform_keys { |key| key.to_sym rescue key } - end - - # Destructively converts all keys to symbols, as long as they respond - # to +to_sym+. This includes the keys from the root hash and from all - # nested hashes and arrays. - def deep_symbolize_keys! - deep_transform_keys! { |key| key.to_sym rescue key } - end - - private - # Support methods for deep transforming nested hashes and arrays. - def _deep_transform_keys_in_object(object, &block) - case object - when Hash - object.each_with_object({}) do |(key, value), result| - result[yield(key)] = _deep_transform_keys_in_object(value, &block) - end - when Array - object.map { |e| _deep_transform_keys_in_object(e, &block) } - else - object - end - end - - def _deep_transform_keys_in_object!(object, &block) - case object - when Hash - object.keys.each do |key| - value = object.delete(key) - object[yield(key)] = _deep_transform_keys_in_object!(value, &block) - end - object - when Array - object.map! { |e| _deep_transform_keys_in_object!(e, &block) } - else - object - end - end -end