import csv
import io
import json

def records(text):
    reader = csv.DictReader(io.StringIO(text, newline=""), strict=True)
    headers = reader.fieldnames or []
    if headers != ["code", "description"]:
        raise ValueError("Expected unique code,description headers in that order")
    result = []
    for row in reader:
        if None in row or any(value is None for value in row.values()):
            raise ValueError("Record width differs from the header")
        result.append(row)
    if not result:
        raise ValueError("No data records")
    return result

good = 'code,description\n0012,"bolt, large"\n0013,"first\nsecond"\n0014,"say ""ready"""\n'
rows = records(good)
assert rows[0]["code"] == "0012"
assert rows[0]["description"] == "bolt, large"
assert rows[1]["description"] == "first\nsecond"
assert rows[2]["description"] == 'say "ready"'
bad = 'code,description\n0012,"unfinished\n'
try:
    records(bad)
except csv.Error:
    pass
else:
    raise AssertionError("Unterminated quote was accepted")
for text in ("code,code\n0012,bolt\n",
             "code,description\n0012,bolt,extra\n",
             "code,description\n0012\n",
             "code,description\n"):
    try:
        records(text)
    except (csv.Error, ValueError):
        pass
    else:
        raise AssertionError("Invalid shape was accepted")
print(json.dumps({"valid_records": len(rows),
                  "leading_zero_preserved": True,
                  "malformed_quote_rejected": True,
                  "invalid_shapes_rejected": 4}, indent=2))
