diff options
author | elijah <elijah@riseup.net> | 2014-11-24 22:45:27 -0800 |
---|---|---|
committer | elijah <elijah@riseup.net> | 2014-11-24 22:45:27 -0800 |
commit | b839376a507e37a048ea2df53127ed0884310f60 (patch) | |
tree | 68ba30a77c51a3ee1a2c9ddd7187e6743cff08f1 /lib/leap_cli/core_ext/hash.rb | |
parent | 8450768268c2bdf82cd6d6bfa9972c70bc5cdcac (diff) | |
download | leap_cli-b839376a507e37a048ea2df53127ed0884310f60.tar.gz leap_cli-b839376a507e37a048ea2df53127ed0884310f60.tar.bz2 |
moved core_ext and lib_ext under leap_clidevelop
Diffstat (limited to 'lib/leap_cli/core_ext/hash.rb')
-rw-r--r-- | lib/leap_cli/core_ext/hash.rb | 35 |
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 |