class Deep::Hash::Struct::Wrapper
Attributes
chain[RW]
chain?[RW]
default[R]
keys[RW]
parent_ins[RW]
parent_key[RW]
Public Class Methods
new(h = {}, opt = {})
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 16 def initialize(h = {}, opt = {}) self.keys = [] self.chain = opt[:chain].nil? ? false : opt[:chain] self.parent_ins = opt[:parent_ins] self.parent_key = opt[:parent_key] return if h.nil? || h.count.zero? wrap h, self end
Public Instance Methods
==(hash)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 40 def ==(hash) if hash.class == self.class to_h == hash.to_h else to_h == hash end end
===(klass)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 48 def ===(klass) self.class == klass end
[](k)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 31 def [](k) __send__ k end
[]=(k, v)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 35 def []=(k, v) __send__ "#{k}=", v end
Also aliased as: add
blank?()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 95 def blank? keys.size.zero? end
clear()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 333 def clear unless default.nil? remove_instance_variable "@default" keys.delete :default end each_key do |k| remove_instance_variable "@#{k}" end self.keys = [] self end
compact()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 394 def compact klass = dup klass.each do |k, v| klass.delete(k) if (v.class == self.class && v.blank?) || v.nil? end klass end
compact!()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 404 def compact! each do |k, v| delete(k) if (v.class == self.class && v.blank?) || v.nil? end self end
count()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 90 def count keys.size end
Also aliased as: size
deep_compact()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 412 def deep_compact klass = deep_dup del_keys = klass.map do |k, v| flag = if v.class == self.class klass[k] = v.deep_compact klass[k].present? else !v.nil? end next if flag k end.compact del_keys.each do |k| klass.delete k end klass end
deep_compact!()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 433 def deep_compact! del_keys = map do |k, v| flag = if v.class == self.class self[k] = v.deep_compact self[k].present? else !v.nil? end next if flag k end.compact del_keys.each do |k| delete k end self end
deep_dup(klass = self)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 520 def deep_dup(klass = self) new_klass = self.class.new klass.each do |k, v| new_klass[k] = hash?(v) ? v.deep_dup(v) : v end new_klass end
deep_merge(hash, klass = self)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 129 def deep_merge(hash, klass = self) klass = klass.deep_dup hash.each do |k , v| klass[k] = hash?(v) ? klass.deep_merge(v, klass[k]) : v end klass end
deep_merge!(hash, klass = self)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 139 def deep_merge!(hash, klass = self) hash.each do |k, v| klass[k] = hash?(v) ? deep_merge!(v, klass[k]) : v end klass end
delete(k)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 272 def delete(k) keys.delete k.to_sym remove_instance_variable "@#{k}" end
delete_if() { |k, v| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 277 def delete_if del_keys = map do |k, v| k if yield(k, v) end.compact del_keys.each do |k| delete k end self end
Also aliased as: reject!
dig(*syms)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 103 def dig(*syms) syms.inject(self) do |h, k| h[k] end rescue nil end
dup()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 516 def dup self.class.new(to_h) end
each() { |k, self| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 52 def each if block_given? keys.each do |k| yield k, self[k] end else to_h.each end end
each_key() { |k| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 78 def each_key keys.each do |k| yield k end end
each_value() { |v| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 84 def each_value values.each do |v| yield v end end
each_with_index() { |[k, self, index| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 62 def each_with_index index = 0 keys.each do |k| yield [k, self[k]], index index += 1 end end
each_with_object(init) { |[k, v], init| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 70 def each_with_object(init) each do |k, v| yield [k, v], init end init end
exclude?(k)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 376 def exclude?(k) !include? k end
fetch(k, msg = nil) { |k| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 185 def fetch(k, msg = nil) v = self[k] if block_given? if v.class == self.class || v.nil? yield k else v end else case v when self.class if v.blank? msg else to_h end when nil msg else v end end end
fetch_values(*syms) { |sym| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 244 def fetch_values(*syms) syms.map do |sym| if block_given? if keys.include?(sym) self[sym] else yield sym end else raise KeyError, "key not found: :#{sym}" unless keys.include?(sym) self[sym] end end end
find() { |k, v| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 288 def find klass = self.class.new each do |k, v| if yield(k, v) klass[k] = v break end end klass end
flatten()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 358 def flatten to_h.flatten end
has_key?(k)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 362 def has_key?(k) keys.include? k end
Also aliased as: include?
has_keys?(*syms)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 367 def has_keys?(*syms) syms.inject(self) do |klass, sym| val = klass[sym] return false if val.class == self.class && val.blank? klass[sym] end true end
inject(init = 0) { |Float, Fixnum].include?(class) ? init : dup, [k, v| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 322 def inject(init = 0) value = [Float, Fixnum].include?(init.class) ? init : init.dup each do |k, v| val = yield [Float, Fixnum].include?(init.class) ? init : init.dup, [k, v] next if val.nil? value += val end value end
Also aliased as: reduce
invert()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 266 def invert each_with_object({}) do |(k, v), h| h[v] = k end end
map() { |k, v| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 209 def map if block_given? vs = [] each do |k, v| vs << yield(k, v) end vs else to_h.map end end
Also aliased as: collect
map_key() { |k| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 224 def map_key vs = [] keys.each do |k| vs << yield(k) end vs end
map_value() { |v| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 234 def map_value vs = [] values.each do |v| vs << yield(v) end vs end
max_stages(klass = self, i = 1)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 483 def max_stages(klass = self, i = 1) klass.map_value do |v| case v when self.class max_stages v, i + 1 else i end end.sort.last || 0 end
merge(hash)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 111 def merge(hash) klass = dup hash.each do |k, v| klass[k] = v end klass end
merge!(hash)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 121 def merge!(hash) hash.each do |k, v| self[k] = v end self end
Also aliased as: update
min_stages(klass = self, i = 1)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 494 def min_stages(klass = self, i = 1) klass.map_value do |v| case v when self.class min_stages v, i + 1 else i end end.delete_if(&:zero?).sort.first || 0 end
present?()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 99 def present? !blank? end
reject() { |k, v| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 312 def reject klass = self.class.new each do |k, v| klass[k] = v unless yield(k, v) end klass end
replace(other)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 345 def replace(other) h = if other.class == self.class other.to_hash elsif hash? other other else other.to_hash end clear wrap h, self end
reverse_deep_merge(hash, klass = self)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 165 def reverse_deep_merge(hash, klass = self) klass = klass.deep_dup hash.each do |k , v| next if !hash?(v) && klass.include?(k) klass[k] = hash?(v) ? klass.reverse_deep_merge(v, klass[k]) : v end klass end
reverse_deep_merge!(hash)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 176 def reverse_deep_merge!(hash) hash.each do |k, v| next if !hash?(v) && include?(k) self[k] = hash?(v) ? reverse_deep_merge(v, self[k]) : v end self end
reverse_merge(hash)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 147 def reverse_merge(hash) klass = dup hash.each do |k, v| klass[k] = v if klass.exclude?(k) end klass end
reverse_merge!(hash)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 157 def reverse_merge!(hash) hash.each do |k, v| self[k] = v if exclude?(k) end self end
select() { |k, v| ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 301 def select klass = self.class.new each do |k, v| klass[k] = v if yield(k, v) end klass end
Also aliased as: find_all
shift()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 384 def shift k = keys.shift [k, remove_instance_variable("@#{k}")] end
slice(*syms)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 452 def slice(*syms) klass = self.class.new each_key do |k| klass[k] = self[k] if syms.map(&:to_sym).include?(k) end klass end
slice!(*syms)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 462 def slice!(*syms) del_keys = keys.map do |k| k unless syms.map(&:to_sym).include?(k) end.compact del_keys.each do |k| delete k end self end
sort()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 380 def sort to_h.sort end
to_a()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 389 def to_a to_h.to_a end
Also aliased as: to_ary
to_hash()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 474 def to_hash deep_hash self end
Also aliased as: to_h
to_json()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 479 def to_json to_h.to_json end
to_table(side_name = nil)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 506 def to_table(side_name = nil) if min_stages >= 2 values.flat_map(&:keys).uniq.map do |side| map_value { |v| v[side] }.unshift side end.unshift keys.unshift(side_name) else deep_table to_h end end
values()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 25 def values keys.map do |k| self[k] end end
values_at(*syms)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 259 def values_at(*syms) syms.map do |sym| v = self[sym] (v.nil? || (v.class == self.class && v.blank?)) ? nil : v end end
Private Instance Methods
chain!()
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 552 def chain! self.chain = true end
deep_hash(klass)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 563 def deep_hash(klass) h = {} klass.each do |k, v| h[k] = if v.class == self.class deep_hash(v) if v.present? else v end end h end
deep_table(hash)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 577 def deep_table(hash) hash.to_a.transpose.map do |val| val.map do |v| if hash? v deep_table v else v end end end end
hash?(val)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 599 def hash?(val) !val.is_a?(Array) && val.respond_to?(:each) end
method_missing(method_name, arg = nil) { || ... }
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 532 def method_missing(method_name, arg = nil) name = method_name.to_s.delete("=") if method_name.to_s.end_with? "=" setting_chain_instance!(self, name, arg) keys << name.to_sym unless keys.include?(name.to_sym) elsif block_given? __send__ "#{name}=", yield keys << name.to_sym unless keys.include?(name.to_sym) else val = instance_variable_get "@#{name}" return val unless val.nil? return self.class.new({}, chain: true, parent_ins: self, parent_key: method_name) if default.nil? default end rescue => e e.backtrace.shift raise end
setting_chain_instance!(klass, key, val)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 556 def setting_chain_instance!(klass, key, val) klass.instance_variable_set "@#{key}", hash?(val) && (!(self === val.class) || klass.chain?) ? wrap(val) : val klass.keys << key.to_sym unless klass.keys.include?(key.to_sym) return val unless klass.chain? setting_chain_instance!(klass.parent_ins, klass.parent_key, klass) end
wrap(hash, klass = nil)
click to toggle source
# File lib/deep/hash/struct/wrapper.rb, line 589 def wrap(hash, klass = nil) base = klass || self.class.new hash.each do |k, v| base[k] = hash?(v) ? wrap(v) : v end base end