./lib/hash_wia/module.rb in hash_wia-0.8.0 vs ./lib/hash_wia/module.rb in hash_wia-0.8.2
- old
+ new
@@ -11,64 +11,67 @@
self[el]
end
end
def [] key
- data = super key
- data = super key.to_s if data.nil?
- data = super key.to_sym if key.respond_to?(:to_sym) && data.nil?
+ data = super(key)
+ skey = key.to_s
+ data = super(skey) if data.nil?
+ data = super(skey.to_sym) if data.nil? && key.class != Symbol
- # if we are returning hash as a value, just include with wia methods hash
if data.is_a?(Hash)
data.extend HashWiaModule
+ data
+ else
+ data
end
-
- data
end
def []= key, value
- if @frozen_keys && !keys.include?(key)
- raise FrozenError, "HashWia keys are frozen and can't be modified (key: #{key})"
- end
-
- delete key
+ key = key.to_s unless key.class == Symbol
+
super key, value
end
+ def __val key
+ data = self[key.to_s]
+ data = self[to_s] if data.nil?
+ data
+ end
+
def delete key
- self[key].tap do
- super key
- super key.to_s
- super key.to_sym if key.respond_to?(:to_sym)
- end
+ data = super(key)
+ skey = key.to_s
+ data = super(skey) if data.nil?
+ data = super(skey.to_sym) if data.nil? && key.class != Symbol
+ data
end
# we never return array from hash, ruby internals
def to_ary
nil
end
# key is common id direct access
# allow direct get or fuction the same if name given
- def key name=nil
+ def key name = nil
name.nil? ? self[:key] : self[name.to_s]
end
# true clone of the hash with 0 references to the old one
def clone
Marshal.load(Marshal.dump(self))
end
def merge hash
dup.tap do |h|
- hash.each { |k, v| h[k] = v }
+ hash.each { |k, v| h[k.to_s] = v }
end
end
- def freeze_keys!
- @frozen_keys = true
- self
+ def merge! hash
+ hash.each { |k, v| self[k.to_s] = v }
end
def each &block
to_a.each do |key, data|
if data.is_a?(Hash)
@@ -79,30 +82,42 @@
end
self
end
+ def dig *args
+ root = self
+ while args[0]
+ key = args.shift
+ root = root[key] || root[key.to_s]
+ return if root.nil?
+ root = HashWia.new root if root.class == Hash
+ end
+ root
+ end
+
def method_missing name, *args, &block
strname = name.to_s
if strname.sub!(/\?$/, '')
# h.foo?
!!self[strname]
elsif strname.sub!(/=$/, '')
# h.foo = :bar
- self[strname.to_sym] = args.first
+ self[strname] = args.first
else
value = self[strname]
+ value = self[strname.to_sym] if value.nil?
if value.nil?
if block
- # h.foo { rand }
- self[name] = block
- elsif !keys.include?(name.to_sym)
- # h.foo
- raise NoMethodError.new('%s not defined' % strname)
+ self[strname.to_s] = block
else
- nil
+ if key?(strname) || key(strname.to_sym)
+ nil
+ else
+ raise NoMethodError.new('%s not defined in HashWia' % strname)
+ end
end
else
value
end
end