Skip to content

Commit 6158d2b

Browse files
committed
Added generate_defaults.py tool
1 parent 1261dc8 commit 6158d2b

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

scripts/generate_defaults.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import argparse
2+
import json
3+
from collections import OrderedDict
4+
5+
6+
def find_rules(spec, pointer):
7+
return list(filter(lambda rule: rule["pointer"] == pointer, spec))
8+
9+
10+
def generate_defaults(spec, root="/"):
11+
defaults = {}
12+
rules = find_rules(spec, root)
13+
14+
default_rule = list(filter(lambda rule: "default" in rule, rules))
15+
assert(len(default_rule) <= 1)
16+
17+
object_rules = list(filter(lambda rule: rule["type"] == "object", rules))
18+
19+
if(default_rule and default_rule[0]["default"] is not None and not object_rules):
20+
return default_rule[0]["default"]
21+
else:
22+
for i, rule in enumerate(object_rules):
23+
for required in rule.get("required", []):
24+
ptr = ("" if root == "/" else root) + "/" + required
25+
if root == "/":
26+
defaults[required] = "REQUIRED!"
27+
else:
28+
defaults[ptr.split("/")[-1]] = "REQUIRED!"
29+
for optional in rule.get("optional", []):
30+
ptr = ("" if root == "/" else root) + "/" + optional
31+
subtree = generate_defaults(spec, ptr)
32+
if root == "/":
33+
defaults[optional] = subtree
34+
else:
35+
defaults[ptr.split("/")[-1]] = subtree
36+
r = OrderedDict()
37+
for k in sorted(defaults.keys()):
38+
r[k] = defaults[k]
39+
return r
40+
41+
42+
def main():
43+
parser = argparse.ArgumentParser("Generate defaults.json from spec.json")
44+
parser.add_argument("spec_path", help="Path to the JSON schema")
45+
parser.add_argument(
46+
"--output", help="Path to the output file", default="defaults.json")
47+
args = parser.parse_args()
48+
49+
with open(args.spec_path) as f:
50+
spec = json.load(f)
51+
52+
defaults = generate_defaults(spec)
53+
54+
with open(args.output, "w") as f:
55+
json.dump(defaults, f, indent=4)
56+
57+
58+
if __name__ == "__main__":
59+
main()

0 commit comments

Comments
 (0)