"""Narrow field projection model, not an Avro serializer. Python standard library.""" import csv import json from pathlib import Path ROOT = Path(__file__).parent SCHEMAS = { "v1": {"account": None, "region": "unknown"}, "v2": {"account": None}, "v3": {"account": None, "region": None}, } MESSAGES = { "v1": {"account": "a1", "region": "west"}, "v2": {"account": "a1"}, "v3": {"account": "a1", "region": "east"}, } def project(reader, message): result = {} for field, default in SCHEMAS[reader].items(): if field in message: result[field] = message[field] elif default is not None: result[field] = default else: return {"status": "reject", "reason": "missing " + field} return {"status": "read", "value": result} rows = [] for reader in SCHEMAS: for writer, message in MESSAGES.items(): out = project(reader, message) rows.append({"reader": reader, "writer": writer, **out}) assert len(rows) == 9 assert sum(r["status"] == "reject" for r in rows) == 1 assert project("v1", MESSAGES["v2"])["value"]["region"] == "unknown" assert project("v3", MESSAGES["v2"]) == {"status": "reject", "reason": "missing region"} assert "region" not in project("v2", MESSAGES["v1"])["value"] (ROOT / "results.json").write_text(json.dumps(rows, indent=2) + "\n") with (ROOT / "compatibility.csv").open("w", newline="") as f: writer = csv.writer(f) writer.writerow(["reader", "writer", "result", "detail"]) for r in rows: writer.writerow([r["reader"], r["writer"], r["status"], json.dumps(r.get("value", r.get("reason")))]) print("9 reader/writer pairs: 8 read, 1 rejects; defaults and ignored fields checked")