63 lines
1.3 KiB
Ruby
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 |