2026-09-18 16:08:41 -04:00
|
|
|
"""The command line's answer, which every other surface is measured against."""
|
|
|
|
|
import json
|
|
|
|
|
import os
|
|
|
|
|
import subprocess
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
FIELDS = [
|
|
|
|
|
"date", "weekday", "jurisdiction", "calendar", "churchDate", "season",
|
2026-09-21 09:25:56 -04:00
|
|
|
"cycle", "week", "feast", "rank", "sign", "tradition", "title", "commemorations",
|
2026-09-18 16:08:41 -04:00
|
|
|
"fast", "fastLabel", "emoji", "reason", "obligation", "binds", "pascha",
|
|
|
|
|
"daysToPascha", "julianOffset",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
cli, probes_path, out_path = sys.argv[1:4]
|
|
|
|
|
|
|
|
|
|
# Neither a config file nor a fetched menaion may reach any surface, or the
|
|
|
|
|
# comparison measures the machine rather than the code. The caller has already
|
|
|
|
|
# pointed these at empty directories; this only refuses to run without them,
|
|
|
|
|
# because an oracle that quietly read the developer's own jurisdiction would
|
|
|
|
|
# make every surface agree about the wrong thing.
|
|
|
|
|
env = dict(os.environ)
|
|
|
|
|
for var in ("XDG_CONFIG_HOME", "XDG_DATA_HOME"):
|
|
|
|
|
if not env.get(var):
|
|
|
|
|
sys.exit(f"{var} must be set to an empty directory before reckoning the oracle")
|
|
|
|
|
|
|
|
|
|
out = {}
|
|
|
|
|
for date, jurisdiction, typikon in json.load(open(probes_path)):
|
|
|
|
|
args = [cli, "--date", date, "--jurisdiction", jurisdiction, "--json",
|
|
|
|
|
"--typikon" if typikon else "--no-typikon"]
|
|
|
|
|
day = json.loads(subprocess.run(args, capture_output=True, text=True,
|
|
|
|
|
env=env, check=True).stdout)
|
|
|
|
|
out[f"{date}|{jurisdiction}|{int(typikon)}"] = {k: day[k] for k in FIELDS}
|
|
|
|
|
|
|
|
|
|
json.dump(out, open(out_path, "w"), ensure_ascii=False)
|
|
|
|
|
print(f"oracle: {len(out)} probes, {len(FIELDS)} fields")
|