Website/lib/jdb.rb

63 lines
1.3 KiB
Ruby

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