Sha256: ad6eed4b53cacff43d1d34983262872f975513fe619ffa797438b61dcfc22139
Contents?: true
Size: 1.5 KB
Versions: 9
Compression:
Stored size: 1.5 KB
Contents
# frozen_string_literal: true # Deep extensions for Enumerable. module Enumerable def deep_transform_keys!(&block) each { |value| value.deep_transform_keys!(&block) if value.respond_to?(:deep_transform_keys!) } self end def deep_dup(result = {}) map do |value| value.respond_to?(:deep_dup) ? value.deep_dup : value.clone end result end end # Deep extensions for Hash. class Hash def deep_transform_keys!(&block) transform_keys!(&:to_s) each_value { |value| value.deep_transform_keys!(&block) if value.respond_to?(:deep_transform_keys!) } self end def deep_dup(result = {}) each do |key, value| result[key] = value.respond_to?(:deep_dup) ? value.deep_dup : value.clone end result end 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 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 end
Version data entries
9 entries across 9 versions & 1 rubygems