refactor(clew): compact Ren'Py AST JSON

This commit is contained in:
2026-09-07 19:47:22 -04:00
parent 493088a904
commit 3b96f5fca6

View File

@@ -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)