class CleanHash
raise error if accessing hash with method and key not found stict_hash = { foo: :bar }.to_ch :strict stict_hash # nil stict_hash.foo # :bar stict_hash.not_found # ArgumentError
Creates dynamic struct based on arguments
Public Class Methods
create_struct(hash)
click to toggle source
# File lib/clean-hash/types/struct_type.rb, line 6 def self.create_struct hash raise ArgumentError.new('Not a hash') unless hash.is_a?(Hash) name = 'DynStruct_' + hash.keys.join('_') CH_STRUCTS[name] ||= ::Struct.new(name, *hash.keys.sort) CH_STRUCTS[name].new.tap do |o| hash.each do |k, v| o.send('%s=' % k, v) unless v.nil? end end end
new(data)
click to toggle source
# File lib/clean-hash/types/indifferent_type.rb, line 10 def initialize data @data = data end
pollute!()
click to toggle source
# File lib/clean-hash/hash_pollute.rb, line 2 def self.pollute! ::Hash.class_eval do # merge but to not overwrite keys def deep_merge hash klass = ::CleanHash::DeepMerge klass[deep_clone].deep_merge klass[hash] end # true clone of the hash with 0 references to the old one def deep_clone Marshal.load(Marshal.dump(self)) end def to_ch mode=nil if mode.is_a?(Array) if not_alowed = (keys - mode).first raise ArgumentError.new('CleanHash option "%s" is not alowed (%s)' % [not_alowed, mode.join(', ')]) end mode.each { |el| self[el] = nil if self[el].nil? } CleanHash.create_struct self else CleanHash.new self end end end end
Public Instance Methods
[](key)
click to toggle source
# File lib/clean-hash/types/indifferent_type.rb, line 51 def [] key data = @data[key] data = @data[key.to_s] if data.nil? && !key.is_a?(String) data = @data[key.to_sym] if data.nil? && key.respond_to?(:to_sym) if data.is_a?(Hash) self.class.new data else data end end
[]=(key, value)
click to toggle source
# File lib/clean-hash/types/indifferent_type.rb, line 63 def []= key, value delete key MUTEX.synchronize do @data[key] = value end end
deep_clone()
click to toggle source
true clone of the hash with 0 references to the old one
# File lib/clean-hash/hash_pollute.rb, line 11 def deep_clone Marshal.load(Marshal.dump(self)) end
deep_merge(hash)
click to toggle source
merge but to not overwrite keys
# File lib/clean-hash/hash_pollute.rb, line 5 def deep_merge hash klass = ::CleanHash::DeepMerge klass[deep_clone].deep_merge klass[hash] end
delete(key)
click to toggle source
# File lib/clean-hash/types/indifferent_type.rb, line 34 def delete key out = [] out.push @data.delete(key) out.push @data.delete(key.to_s) out.push @data.delete(key.to_sym) if key.respond_to?(:to_sym) out.each { |el| return el unless el.nil? } nil end
key()
click to toggle source
overload key ruby method because it is common hash key name still accessible via to_h.key
# File lib/clean-hash/types/indifferent_type.rb, line 26 def key self[:key] end
key?(name)
click to toggle source
# File lib/clean-hash/types/indifferent_type.rb, line 30 def key? name @data.key?(name) || @data.key?(name.to_s) || (name.respond_to?(:to_sym) ? @data.key?(name.to_sym) : nil) end
method_missing(name, *args, &block)
click to toggle source
# File lib/clean-hash/types/indifferent_type.rb, line 70 def method_missing name, *args, &block return @data.send(name, *args, &block) if @data.respond_to?(name) m = name.to_s if m.end_with?('=') m = m.sub('=', '') self[m] = args.first elsif m.end_with?('?') !self[m.sub('?', '')].nil? elsif block self[m] = block else _method_missing_key m end end
to_ary()
click to toggle source
for puts
# File lib/clean-hash/types/indifferent_type.rb, line 20 def to_ary [@data] end
to_ch(mode=nil)
click to toggle source
# File lib/clean-hash/hash_pollute.rb, line 15 def to_ch mode=nil if mode.is_a?(Array) if not_alowed = (keys - mode).first raise ArgumentError.new('CleanHash option "%s" is not alowed (%s)' % [not_alowed, mode.join(', ')]) end mode.each { |el| self[el] = nil if self[el].nil? } CleanHash.create_struct self else CleanHash.new self end end
to_h()
click to toggle source
# File lib/clean-hash/types/indifferent_type.rb, line 43 def to_h @data end
to_json()
click to toggle source
for debug
# File lib/clean-hash/types/indifferent_type.rb, line 15 def to_json JSON.pretty_generate @data end
Private Instance Methods
_method_missing_key(key)
click to toggle source
# File lib/clean-hash/types/indifferent_type.rb, line 89 def _method_missing_key key self[key].tap do |value| raise ArgumentError.new('Key not found: %s' % key) if value.nil? end end