Class: Hash

Inherits:
Object
  • Object
show all
Defined in:
app/deep.rb

Overview

Deep extensions for Hash.

Instance Method Summary collapse

Instance Method Details

#deep_delete(*path) ⇒ Object

Raises:

  • (ArgumentError)


54
55
56
57
58
59
60
61
62
63
64
65
# File 'app/deep.rb', line 54

def deep_delete(*path)
  raise ArgumentError, 'no path specified' if path.empty?
  raise KeyError, "key not found: #{path[0]}" unless key?(path[0])

  if path.size == 1
    delete(path[0])
  else
    raise ArgumentError, "value for key is not a hash: #{path[0]}" unless self.[](path[0]).is_a?(Hash)

    self.[](path[0]).deep_delete(*path[1..])
  end
end

#deep_dup(result = {}) ⇒ Object



34
35
36
37
38
39
# File 'app/deep.rb', line 34

def deep_dup(result = {})
  each do |key, value|
    result[key] = value.respond_to?(:deep_dup) ? value.deep_dup : value.clone
  end
  result
end

#deep_merge!(hash) ⇒ Object



67
68
69
70
71
72
73
74
75
76
# File 'app/deep.rb', line 67

def deep_merge!(hash)
  hash.each do |key, value|
    if self[key].is_a?(Hash) && value.is_a?(Hash)
      self[key].deep_merge!(value)
    else
      self[key] = value
    end
  end
  self
end

#deep_set(*path, value:) ⇒ Object

Raises:

  • (ArgumentError)


41
42
43
44
45
46
47
48
49
50
51
52
# File 'app/deep.rb', line 41

def deep_set(*path, value:)
  raise ArgumentError, 'no path specified' if path.empty?

  if path.size == 1
    self[path[0]] = value
  else
    raise KeyError, "key not found: #{path[0]}" unless key?(path[0])
    raise ArgumentError, "value for key is not a hash: #{path[0]}" unless self.[](path[0]).is_a?(Hash)

    self.[](path[0]).deep_set(*path[1..], value: value)
  end
end

#deep_symbolize_keys!Object



30
31
32
# File 'app/deep.rb', line 30

def deep_symbolize_keys!
  deep_transform_keys!(&:to_sym)
end

#deep_transform_keys!(&block) ⇒ Object



24
25
26
27
28
# File 'app/deep.rb', line 24

def deep_transform_keys!(&block)
  transform_keys!(&block)
  each_value { |value| value.deep_transform_keys!(&block) if value.respond_to?(:deep_transform_keys!) }
  self
end