Skip to content

Instantly share code, notes, and snippets.

@dmitry-ilyashevich
Created May 12, 2011 09:43
Show Gist options
  • Save dmitry-ilyashevich/968257 to your computer and use it in GitHub Desktop.
Save dmitry-ilyashevich/968257 to your computer and use it in GitHub Desktop.
HashStorage
require 'json'
class Hash
def deep_merge(tree)
merger = proc { |key,v1,v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
self.merge(tree, &merger)
end
end
class HashStorage
def initialize
@opts = {}
end
def add options
tree = Hash.new { |h,k| h[k] = Hash.new(&tree.default_proc) }
tree = options
@opts = @opts.deep_merge tree
end
def to_s
@opts.to_json
end
end
st = HashStorage.new
st.add({'dev' => {'db' => {'host' => "localhost:2828"}}})
st.add({'dev' => {'db' => {'user' => "me"}}})
st.add({'dev' => {'db' => {'password' => "secret"}}})
st.add({'test' => {'db' => {'host' => "localhost:2828"}}})
st.add({'test' => {'db' => {'user' => "test_user"}}})
st.add({'test' => {'db' => {'password' => "test_secret"}}})
puts st.to_s
# => {"dev":{"db":{"host":"localhost:2828","user":"me","password":"secret"}},"test":{"db":{"host":"localhost:2828","user":"test_user","password":"test_secret"}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment