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