import json import sys from argparse import ArgumentParser from pathlib import Path def read(f: str) -> dict[str, dict]: with open(f) as infile: next(infile) return { (d := json.loads(s))["name"]: d for line in infile if (s := line.strip().strip(",")) != "]" } parser = ArgumentParser( prog="DB Merger", description="Merge database files", ) parser.add_argument( "-c", "--compare", action="store_true", help="Just do a DB comparison" ) parser.add_argument( "-d", "--pokedex", help="Pokedex file" ) parser.add_argument( "-o", "--output", default="data/latest.db", help="Output database file" ) parser.add_argument("sources", metavar="file", type=Path, nargs="+") args = parser.parse_args() if args.compare: left, right = [set(read(s).keys()) for s in args.sources] print("Right Missing") for d in sorted(left - right): print(" ", d) print("Left Missing") for d in sorted(right - left): print(" ", d) sys.exit(0) db = {} for s in args.sources: db.update(read(s)) if args.pokedex is not None: with open(args.pokedex) as dex_file: dex = json.load(dex_file) for name, info in db.items(): traits = next( f["traits"] for f in dex[str(info["num"])]["forms"] if f["name"] == name ) db[name] = { **info, "traits": sorted(set([*info["traits"], *traits])), } output = [ f" {json.dumps(s)},\n" for s in sorted( db.values(), key=lambda x: (x["num"], x["name"]) ) ] if args.output == "-": for o in output: print(o) else: with open(args.output, "w") as outfile: outfile.write("const database = [\n") outfile.writelines(output) outfile.write("]\n")