Class: Hash
- Inherits:
-
Object
- Object
- Hash
- Defined in:
- app/deep.rb
Overview
Deep extensions for Hash.
Instance Method Summary collapse
- #deep_delete(*path) ⇒ Object
- #deep_dup(result = {}) ⇒ Object
- #deep_merge!(hash) ⇒ Object
- #deep_set(*path, value:) ⇒ Object
- #deep_symbolize_keys! ⇒ Object
- #deep_transform_keys!(&block) ⇒ Object
Instance Method Details
#deep_delete(*path) ⇒ Object
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
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 |