1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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")
|