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
add(k, v)
Alias for: []=
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
collect()
Alias for: map
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
find_all()
Alias for: select
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
include?(k)
Alias for: has_key?
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
reduce(init = 0)
Alias for: inject
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
reject!()
Alias for: delete_if
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
size()
Alias for: count
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_ary()
Alias for: to_a
to_h()
Alias for: to_hash
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
update(hash)
Alias for: merge!
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