aboutsummaryrefslogtreecommitdiff
path: root/lib/leap_cli/core_ext/hash.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/leap_cli/core_ext/hash.rb')
-rw-r--r--lib/leap_cli/core_ext/hash.rb35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/leap_cli/core_ext/hash.rb b/lib/leap_cli/core_ext/hash.rb
new file mode 100644
index 0000000..7df33b2
--- /dev/null
+++ b/lib/leap_cli/core_ext/hash.rb
@@ -0,0 +1,35 @@
+class Hash
+
+ ##
+ ## CONVERTING
+ ##
+
+ #
+ # convert self into a hash, but only include the specified keys
+ #
+ def pick(*keys)
+ keys.map(&:to_s).inject({}) do |hsh, key|
+ if has_key?(key)
+ hsh[key] = self[key]
+ end
+ hsh
+ end
+ end
+
+ #
+ # recursive merging (aka deep merge)
+ # taken from ActiveSupport::CoreExtensions::Hash::DeepMerge
+ #
+ def deep_merge(other_hash)
+ self.merge(other_hash) do |key, oldval, newval|
+ oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
+ newval = newval.to_hash if newval.respond_to?(:to_hash)
+ oldval.class.to_s == 'Hash' && newval.class.to_s == 'Hash' ? oldval.deep_merge(newval) : newval
+ end
+ end
+
+ def deep_merge!(other_hash)
+ replace(deep_merge(other_hash))
+ end
+
+end