lib/lotus/utils/hash.rb in lotus-utils-0.2.0 vs lib/lotus/utils/hash.rb in lotus-utils-0.3.0
- old
+ new
@@ -1,19 +1,37 @@
module Lotus
module Utils
# Hash on steroids
# @since 0.1.0
- class Hash < ::Hash
+ class Hash
# Initialize the hash
#
- # @param hash [::Hash, Hash] the value we want to use to initialize this instance
+ # @param hash [#to_h] the value we want to use to initialize this instance
+ # @param blk [Proc] define the default value
#
- # @return [Hash] self
+ # @return [Lotus::Utils::Hash] self
#
# @since 0.1.0
- def initialize(hash = {})
- merge! hash
+ #
+ # @see http://www.ruby-doc.org/core/Hash.html#method-c-5B-5D
+ #
+ # @example Passing a Hash
+ # require 'lotus/utils/hash'
+ #
+ # hash = Lotus::Utils::Hash.new('l' => 23)
+ # hash['l'] # => 23
+ #
+ # @example Passing a block for default
+ # require 'lotus/utils/hash'
+ #
+ # hash = Lotus::Utils::Hash.new {|h,k| h[k] = [] }
+ # hash['foo'].push 'bar'
+ #
+ # hash.to_h # => { 'foo' => ['bar'] }
+ def initialize(hash = {}, &blk)
+ @hash = hash.to_h
+ @hash.default_proc = blk
end
# Convert in-place all the keys to Symbol instances, nested hashes are converted too.
#
# @return [Hash] self
@@ -35,9 +53,135 @@
self[k.to_sym] = v
end
self
+ end
+
+ # Returns a new array populated with the keys from this hash
+ #
+ # @return [Array] the keys
+ #
+ # @since 0.3.0
+ #
+ # @see http://www.ruby-doc.org/core/Hash.html#method-i-keys
+ def keys
+ @hash.keys
+ end
+
+ # Deletes the key-value pair and returns the value from hsh whose key is
+ # equal to key.
+ #
+ # @param key [Object] the key to remove
+ #
+ # @return [Object,nil] the value hold by the given key, if present
+ #
+ # @since 0.3.0
+ #
+ # @see http://www.ruby-doc.org/core/Hash.html#method-i-keys
+ def delete(key)
+ @hash.delete(key)
+ end
+
+ # Retrieves the value object corresponding to the key object.
+ #
+ # @param key [Object] the key
+ #
+ # @return [Object,nil] the correspoding value, if present
+ #
+ # @since 0.3.0
+ #
+ # @see http://www.ruby-doc.org/core/Hash.html#method-i-5B-5D
+ def [](key)
+ @hash[key]
+ end
+
+ # Associates the value given by value with the key given by key.
+ #
+ # @param key [Object] the key to assign
+ # @param value [Object] the value to assign
+ #
+ # @since 0.3.0
+ #
+ # @see http://www.ruby-doc.org/core/Hash.html#method-i-5B-5D-3D
+ def []=(key, value)
+ @hash[key] = value
+ end
+
+ # Returns a Ruby Hash as duplicated version of self
+ #
+ # @return [::Hash] the hash
+ #
+ # @since 0.3.0
+ #
+ # @see http://www.ruby-doc.org/core/Hash.html#method-i-to_h
+ def to_h
+ @hash.each_with_object({}) do |(k, v), result|
+ v = v.to_h if v.is_a?(self.class)
+ result[k] = v
+ end
+ end
+
+ alias_method :to_hash, :to_h
+
+ # Converts into a nested array of [ key, value ] arrays.
+ #
+ # @return [::Array] the array
+ #
+ # @since 0.3.0
+ #
+ # @see http://www.ruby-doc.org/core/Hash.html#method-i-to_a
+ def to_a
+ @hash.to_a
+ end
+
+ # Equality
+ #
+ # @return [TrueClass,FalseClass]
+ #
+ # @since 0.3.0
+ def ==(other)
+ @hash == other.to_h
+ end
+
+ alias_method :eql?, :==
+
+ # Returns the hash of the internal @hash
+ #
+ # @return [Fixnum]
+ #
+ # @since 0.3.0
+ def hash
+ @hash.hash
+ end
+
+ # Returns a string describing the internal @hash
+ #
+ # @return [String]
+ #
+ # @since 0.3.0
+ def inspect
+ @hash.inspect
+ end
+
+ # Override Ruby's method_missing in order to provide ::Hash interface
+ #
+ # @api private
+ # @since 0.3.0
+ def method_missing(m, *args, &blk)
+ h = @hash.__send__(m, *args, &blk)
+ h = self.class.new(h) if h.is_a?(::Hash)
+ h
+ rescue NoMethodError
+ raise NoMethodError.new(%(undefined method `#{ m }' for #{ @hash }:#{ self.class }))
+ end
+
+ # Override Ruby's respond_to_missing? in order to support ::Hash interface
+ #
+ # @api private
+ # @since 0.3.0
+ def respond_to_missing?(m, include_private=false)
+ @hash.respond_to?(m, include_private)
end
end
end
end