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