Skip to content

Instantly share code, notes, and snippets.

@iazel
Last active August 29, 2015 14:02
Show Gist options
  • Save iazel/4f5c9fcd9b33c3ea994c to your computer and use it in GitHub Desktop.
Save iazel/4f5c9fcd9b33c3ea994c to your computer and use it in GitHub Desktop.
YAML Updater
#!/usr/bin/env ruby
# encoding: UTF-8
require 'yaml'
require 'delegate'
class TagNew < SimpleDelegator
def object_class
__getobj__.class
end
end
def main
src = YAML.load_file('test.yml')
rpl = YAML.load_file('rpl.yml')
ksrc = collect_keys(src)
kdiff = ksrc.keys - collect_keys(rpl).keys
update_keys(kdiff, ksrc, rpl)
puts rpl.to_yaml
end
def collect_keys yaml, key = ''
keys = {}
key += '.' unless key.empty?
yaml.each do |k, v|
k = key + k.to_s
if v.is_a? Hash
keys.merge! collect_keys(v, k)
else
keys[k] = v
end
end
keys
end
def update_keys(keys_list, src, yaml)
keys_list.each do |k|
ks = k.split('.')
already_tagged = false
rpl = ks[0...-1].inject(yaml) do |hash, k|
if hash[k].is_a? Hash
hash[k]
elsif already_tagged
hash[k] = {}
else
already_tagged = true
hash[k] = TagNew.new({})
end
end
rpl[ ks[-1] ] = already_tagged ? src[k] : TagNew.new(src[k])
end
end
main() if $0 == __FILE__
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment