# encoding: utf-8 require 'yaml' # this class loads a yml file, symbolizes the keys and make the hash # accessable via object attributes class EasyHtmlGenerator::Config def self.from_file(path) return unless File.exist? path ConfigHash.new YAML.load(File.open(path)) end # symbolizes the keys and makes the hash accessable via object attributes class ConfigHash < Hash def initialize(hash = nil) super return unless hash hash = self.class.symbolize_keys hash hash.each { |k, v| self[k] = v } end def method_missing(name, *args) # setter if /^(\w+)=$/ =~ name self[Regexp.last_match(1).to_sym] = args[0] # getter else return super.method_missing name unless key? name end self[name] end def self.symbolize_keys(obj) case obj when Array obj.inject([]) do |res, val| res << case val when Hash, Array symbolize_keys(val) else val end res end when Hash obj.inject(ConfigHash.new) do |res, (key, val)| nkey = case key when String key.to_sym else key end nval = case val when Hash, Array symbolize_keys(val) else val end res[nkey] = nval res end else obj end end end end # class EasyHtmlGenerator::Config # def self.from_file(path) # return unless File.exist? path # # ConfigHash.new YAML.load(File.open(path)) # end # # # symbolizes the keys and makes the hash accessable via object attributes # class ConfigHash < Hash # def initialize(hash = nil) # super # return unless hash # # hash = self.class.symbolize_keys hash # hash.each { |k, v| self[k] = v } # end # # def method_missing(name, *args) # # setter # if /^(\w+)=$/ =~ name # self[Regexp.last_match(1).to_sym] = args[0] # # getter # else # return super.method_missing name unless key? name # end # # self[name] # end # # def self.symbolize_keys(obj) # case obj # when Array # inject_array(obj) # when Hash # inject_hash(obj) # else # obj # end # end # # def self.inject_array(obj) # obj.each_with_object([]) do |res, val| # res << case val # when Hash, Array # symbolize_keys(val) # else # val # end # res # end # end # # def self.inject_hash(obj) # obj.each_with_object(ConfigHash.new) do |res, (key, val)| # nkey = inject_hash_key key # nval = inject_hash_value val # res[nkey] = nval # res # end # end # # def self.inject_hash_key(key) # case key # when String then return key.to_sym # else return key # end # end # # def self.inject_hash_value(val) # case val # when Hash, Array then symbolize_keys(val) # else val # end # end # end # end