Skip to content

Instantly share code, notes, and snippets.

@wteuber
Created October 5, 2015 15:36
Show Gist options
  • Select an option

  • Save wteuber/4c6cd3d273ac27d44c95 to your computer and use it in GitHub Desktop.

Select an option

Save wteuber/4c6cd3d273ac27d44c95 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'yaml'
class Hash
def deep_reject(&blk)
self.dup.deep_reject!(&blk)
end
def deep_reject!(&blk)
self.each do |k, v|
v.deep_reject!(&blk) if v.is_a?(Hash)
self.delete(k) if blk.call(k, v)
end
end
def to_hash_recursive
result = self.to_hash
result.each do |key, value|
case value
when Hash
result[key] = value.to_hash_recursive
when Array
result[key] = value.to_hash_recursive
end
end
result
end
def sort_by_key(recursive = false, &block)
self.keys.sort(&block).reduce({}) do |seed, key|
seed[key] = self[key]
if recursive && seed[key].is_a?(Hash)
seed[key] = seed[key].sort_by_key(true, &block)
end
seed
end
end
end
class Array
def to_hash_recursive
result = self
result.each_with_index do |value,i|
case value
when Hash
result[i] = value.to_hash_recursive
when Array
result[i] = value.to_hash_recursive
end
end
result
end
end
file = ARGV[0].to_s
raise "File not found: #{file}" unless File.exists?(file)
hash = YAML.load_file file
hash.deep_reject! { |k, v| v.nil? || v.empty? }
yaml = YAML.dump(hash.sort_by_key(true))[4..-1] # remove leading "---\n"
puts yaml
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment