require 'json' class JDB attr_reader :data, :files def initialize(path) @data, @files = JDB.json(path) end def [](k) k = k.to_s.split(/\//).delete_if { |f| f == "" } get(k) end def []=(k, v) path = k.to_s.split(/\//).delete_if { |f| f == "" } k = path.pop container = get(path) container[k] = v end def get(path, root = @data) return root if path.length == 0 return nil if root.nil? get(path[1..-1], root[path[0]]) end def JDB.json(name) data, files = if File.exists?("#{name}.json") then begin [ JSON.parse(File.open("#{name}.json") { |f| f.readlines.join }), ["#{name}.json"] ] rescue => e raise "Error parsing #{name}.json" end else [ Hash.new, [] ] end if File.exists?(name) then nested_files = Dir["#{name}/*"].map do |f| case f when /(.*)\.json$/ then $1 when /[^.]/ then f else raise "Unknown file: #{name}" end end nested_files.sort.uniq.map do |f| new_data, new_files = json(f) data[File.basename f] = new_data files += new_files end end [data, files] end def keys @data.keys end end