refactor(clew): compact Ren'Py AST JSON
This commit is contained in:
@@ -110,14 +110,14 @@ def is_primitive(value):
|
||||
return value is None or isinstance(value, (bool, int, long, float, basestring))
|
||||
|
||||
|
||||
class Dumper(object):
|
||||
class Serializer(object):
|
||||
def __init__(self, max_depth):
|
||||
self.max_depth = max_depth
|
||||
self.next_id = 1
|
||||
self.seen = {}
|
||||
self.active_containers = set()
|
||||
|
||||
def dump(self, value, depth=0):
|
||||
def serialize(self, value, depth=0):
|
||||
if is_primitive(value):
|
||||
return safe_text(value)
|
||||
|
||||
@@ -133,7 +133,7 @@ class Dumper(object):
|
||||
if object_id in self.active_containers:
|
||||
return {"type": "recursion", "class": class_name(value)}
|
||||
self.active_containers.add(object_id)
|
||||
items = [self.dump(item, depth + 1) for item in value]
|
||||
items = [self.serialize(item, depth + 1) for item in value]
|
||||
self.active_containers.remove(object_id)
|
||||
return {"type": "tuple" if isinstance(value, tuple) else "list", "items": items}
|
||||
|
||||
@@ -144,7 +144,7 @@ class Dumper(object):
|
||||
self.active_containers.add(object_id)
|
||||
items = []
|
||||
for key, item in sorted(value.items(), key=lambda pair: repr(pair[0])):
|
||||
items.append({"key": self.dump(key, depth + 1), "value": self.dump(item, depth + 1)})
|
||||
items.append({"key": self.serialize(key, depth + 1), "value": self.serialize(item, depth + 1)})
|
||||
self.active_containers.remove(object_id)
|
||||
return {"type": "dict", "items": items}
|
||||
|
||||
@@ -159,9 +159,9 @@ class Dumper(object):
|
||||
if identity in self.seen:
|
||||
return {"type": "ref", "id": self.seen[identity]}
|
||||
|
||||
dump_id = self.next_id
|
||||
value_id = self.next_id
|
||||
self.next_id += 1
|
||||
self.seen[identity] = dump_id
|
||||
self.seen[identity] = value_id
|
||||
|
||||
attributes = {}
|
||||
for slot in collect_slots(value):
|
||||
@@ -178,7 +178,7 @@ class Dumper(object):
|
||||
"repr": repr(error),
|
||||
}
|
||||
continue
|
||||
attributes[slot] = self.dump(slot_value, depth + 1)
|
||||
attributes[slot] = self.serialize(slot_value, depth + 1)
|
||||
|
||||
value_dict = getattr(value, "__dict__", None)
|
||||
if value_dict:
|
||||
@@ -187,7 +187,7 @@ class Dumper(object):
|
||||
key_text = safe_text(key)
|
||||
else:
|
||||
key_text = repr(key)
|
||||
attributes[key_text] = self.dump(item, depth + 1)
|
||||
attributes[key_text] = self.serialize(item, depth + 1)
|
||||
|
||||
if not attributes:
|
||||
del self.seen[identity]
|
||||
@@ -199,7 +199,7 @@ class Dumper(object):
|
||||
|
||||
return {
|
||||
"type": "object",
|
||||
"id": dump_id,
|
||||
"id": value_id,
|
||||
"class": class_name(value),
|
||||
"attributes": attributes,
|
||||
}
|
||||
@@ -210,7 +210,7 @@ def write_json(path, document):
|
||||
if parent and not os.path.isdir(parent):
|
||||
os.makedirs(parent)
|
||||
|
||||
data = json.dumps(document, indent=2, sort_keys=True)
|
||||
data = json.dumps(document, separators=(",", ":"), sort_keys=True)
|
||||
if not isinstance(data, bytes):
|
||||
data = data.encode("utf-8")
|
||||
|
||||
@@ -242,7 +242,7 @@ def main(argv):
|
||||
renpy = import_renpy(args.game_root)
|
||||
slot, metadata, roots = load_compiled_script(args.input)
|
||||
|
||||
dumper = Dumper(args.max_depth)
|
||||
serializer = Serializer(args.max_depth)
|
||||
document = {
|
||||
"schema": SCHEMA,
|
||||
"source": os.path.abspath(args.input),
|
||||
@@ -250,8 +250,8 @@ def main(argv):
|
||||
"slot": slot,
|
||||
"python_version": sys.version,
|
||||
"renpy_version": getattr(renpy, "version", None),
|
||||
"metadata": dumper.dump(metadata),
|
||||
"roots": dumper.dump(roots),
|
||||
"metadata": serializer.serialize(metadata),
|
||||
"roots": serializer.serialize(roots),
|
||||
}
|
||||
write_json(args.output, document)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user