aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2009-03-21 04:00:51 -0700
committerJeremy Kemper <jeremy@bitsweat.net>2009-03-21 04:39:53 -0700
commitb4a1718832c70005e45a930d5106857cf882e147 (patch)
treeb1a5fd3f934fd7142e26190a1192fbe371e7250b /activesupport/lib/active_support/core_ext/hash/indifferent_access.rb
parentbc4e2aa931209e4d91779f15dbbf59b7db045dca (diff)
downloadrails-b4a1718832c70005e45a930d5106857cf882e147.tar.gz
rails-b4a1718832c70005e45a930d5106857cf882e147.tar.bz2
rails-b4a1718832c70005e45a930d5106857cf882e147.zip
Convert hash extension modules to class reopens
Diffstat (limited to 'activesupport/lib/active_support/core_ext/hash/indifferent_access.rb')
-rw-r--r--activesupport/lib/active_support/core_ext/hash/indifferent_access.rb146
1 files changed, 6 insertions, 140 deletions
diff --git a/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb b/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb
index 34ba8a005d..9c2af9e9e0 100644
--- a/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb
+++ b/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb
@@ -1,143 +1,9 @@
-# This class has dubious semantics and we only have it so that
-# people can write params[:key] instead of params['key']
-# and they get the same value for both keys.
+require 'active_support/hash_with_indifferent_access'
-class HashWithIndifferentAccess < Hash
- def initialize(constructor = {})
- if constructor.is_a?(Hash)
- super()
- update(constructor)
- else
- super(constructor)
- end
- end
-
- def default(key = nil)
- if key.is_a?(Symbol) && include?(key = key.to_s)
- self[key]
- else
- super
- end
- end
-
- alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)
- alias_method :regular_update, :update unless method_defined?(:regular_update)
-
- # Assigns a new value to the hash:
- #
- # hash = HashWithIndifferentAccess.new
- # hash[:key] = "value"
- #
- def []=(key, value)
- regular_writer(convert_key(key), convert_value(value))
- end
-
- # Updates the instantized hash with values from the second:
- #
- # hash_1 = HashWithIndifferentAccess.new
- # hash_1[:key] = "value"
- #
- # hash_2 = HashWithIndifferentAccess.new
- # hash_2[:key] = "New Value!"
- #
- # hash_1.update(hash_2) # => {"key"=>"New Value!"}
- #
- def update(other_hash)
- other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) }
- self
- end
-
- alias_method :merge!, :update
-
- # Checks the hash for a key matching the argument passed in:
- #
- # hash = HashWithIndifferentAccess.new
- # hash["key"] = "value"
- # hash.key? :key # => true
- # hash.key? "key" # => true
- #
- def key?(key)
- super(convert_key(key))
- end
-
- alias_method :include?, :key?
- alias_method :has_key?, :key?
- alias_method :member?, :key?
-
- # Fetches the value for the specified key, same as doing hash[key]
- def fetch(key, *extras)
- super(convert_key(key), *extras)
- end
-
- # Returns an array of the values at the specified indices:
- #
- # hash = HashWithIndifferentAccess.new
- # hash[:a] = "x"
- # hash[:b] = "y"
- # hash.values_at("a", "b") # => ["x", "y"]
- #
- def values_at(*indices)
- indices.collect {|key| self[convert_key(key)]}
- end
-
- # Returns an exact copy of the hash.
- def dup
- HashWithIndifferentAccess.new(self)
- end
-
- # Merges the instantized and the specified hashes together, giving precedence to the values from the second hash
- # Does not overwrite the existing hash.
- def merge(hash)
- self.dup.update(hash)
- end
-
- # Performs the opposite of merge, with the keys and values from the first hash taking precedence over the second.
- # This overloaded definition prevents returning a regular hash, if reverse_merge is called on a HashWithDifferentAccess.
- def reverse_merge(other_hash)
- super other_hash.with_indifferent_access
- end
-
- # Removes a specified key from the hash.
- def delete(key)
- super(convert_key(key))
- end
-
- def stringify_keys!; self end
- def symbolize_keys!; self end
- def to_options!; self end
-
- # Convert to a Hash with String keys.
- def to_hash
- Hash.new(default).merge(self)
- end
-
- protected
- def convert_key(key)
- key.kind_of?(Symbol) ? key.to_s : key
- end
-
- def convert_value(value)
- case value
- when Hash
- value.with_indifferent_access
- when Array
- value.collect { |e| e.is_a?(Hash) ? e.with_indifferent_access : e }
- else
- value
- end
- end
-end
-
-module ActiveSupport #:nodoc:
- module CoreExtensions #:nodoc:
- module Hash #:nodoc:
- module IndifferentAccess #:nodoc:
- def with_indifferent_access
- hash = HashWithIndifferentAccess.new(self)
- hash.default = self.default
- hash
- end
- end
- end
+class Hash
+ def with_indifferent_access
+ hash = HashWithIndifferentAccess.new(self)
+ hash.default = self.default
+ hash
end
end