"""The town's command line. Run through tools/pasture/town.sh. selftest ... each driver against its own server: accounts, posts, likes, replies, polls, edits, deletes, and that its database view agrees with its API drive '' one action as one town account, printed as JSON stored ... what a peer holds of each object (from its database, never fetching) seen ... what one account can see of each object plan the deterministic plan of a spec, printed as JSON lines seed replays a spec's plan against the pasture, writing out//ledger.jsonl check [run] sweeps every peer for what the ledger expects report [run] out//report.html backlog [run] [--write] docs/INTEROP-BACKLOG.md from the latest results """ import json import os import sys HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, HERE) from dialects import DRIVERS, driver # noqa: E402 from dialects.base import Account, PostSpec # noqa: E402 import state # noqa: E402 def main(argv): if not argv or argv[0] in ("-h", "--help", "help"): print(__doc__) return 0 cmd, args = argv[0], argv[1:] if cmd == "selftest": import selftest return selftest.run(args or [p for p in DRIVERS]) if cmd == "drive": peer, user, verb = args[0], args[1], args[2] params = json.loads(args[3]) if len(args) > 3 else {} s = state.session(peer, user) d = driver(peer) if verb == "post": made = d.post(s, PostSpec(**params)) print(json.dumps(made.__dict__)) else: result = getattr(d, verb)(s, **params) print(json.dumps(result if not hasattr(result, "__dict__") else result.__dict__, default=str, ensure_ascii=False)) return 0 if cmd == "stored": rows = driver(args[0]).stored(args[1:]) print(json.dumps({u: {k: v for k, v in r.__dict__.items() if k != "raw"} for u, r in rows.items()}, default=str)) return 0 if cmd == "seen": s = state.session(args[0], args[1]) print(json.dumps(driver(args[0]).seen(s, args[2:]))) return 0 if cmd in ("plan", "seed", "check", "report", "backlog", "gaps", "expect", "load"): module = __import__(cmd if cmd not in ("plan",) else "gen") return module.main(args) print(f"unknown command {cmd}", file=sys.stderr) return 2 if __name__ == "__main__": sys.exit(main(sys.argv[1:]) or 0)