Skip to content

Dodaj ErrorRecord: zunifikowany, wersjonowany kontrakt błędów PBN#7

Open
mpasternak wants to merge 2 commits into
mainfrom
feat/error-record
Open

Dodaj ErrorRecord: zunifikowany, wersjonowany kontrakt błędów PBN#7
mpasternak wants to merge 2 commits into
mainfrom
feat/error-record

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Co i po co

Nowy moduł pbn_client.error_record — czysta, framework-niezależna
reprezentacja błędów PBN, którą host (BPP) parsował dotąd w wielu miejscach
kruchą, rozjeżdżającą się logiką.

  • ErrorRecord (frozen dataclass) — znormalizowany błąd PBN.
  • parse(stored) — TOTALNE (nigdy nie rzuca; łapie też
    RecursionError/OverflowError/MemoryError na wrogim body z PBN).
    Rozpoznaje legacy tuple-repr HttpException, traceback z prefiksem
    pbn_api/pbn_client, ORAZ nowy format v1.
  • serialize(rec) — stabilny format v1 (jednoliniowy JSON). Każde pole
    capowane → blob dowodliwie < 65535 (mieści się w TextField hosta).
  • Pola wire (v1/legacy/empty) i content_json_valid (odróżnia JSON
    null od niepoprawnego body) pozwalają adapterom hosta renderować bez
    rozjazdów i wdrożyć reader-first rollout (czyta v1 zanim zacznie zapisywać).

Publiczne API: ErrorRecord, parse_error_record, serialize_error_record.

Wersja

0.2.0 → 0.2.1 — dodatek API, additive. Świadomie 0.2.1 (nie 0.3.0), żeby
zmieścić się w <0.3 — dzięki temu django-pbn-client 0.2.0 (pin
pbn-client>=0.2,<0.3) pozostaje kompatybilny bez skoordynowanego release'u.

Testy

tests/test_error_record.py (41 testów): totalność (fuzz + głęboki JSON +
OverflowError), rozpoznanie każdej gałęzi, brak kolizji legacy↔v1, round-trip
serialize/parse, dowodliwy limit rozmiaru. Pełna suita pakietu: 140 passed.

Konsument: BPP repointuje display na ten moduł (osobny PR na iplweb/bpp).

🤖 Generated with Claude Code

Nowy moduł pbn_client.error_record z ErrorRecord (frozen dataclass), totalną
funkcją parse() (NIGDY nie rzuca — łapie też RecursionError/OverflowError/
MemoryError na wrogich body) i serialize() do stabilnego formatu v1
(jednoliniowy JSON, każde pole capowane → blob dowodliwie < 65535).

parse() rozpoznaje formaty legacy (tuple-repr HttpException, traceback z
prefiksem pbn_api/pbn_client) ORAZ v1 — umożliwia hostowi reader-first
rollout. Pole `wire` (v1/legacy/empty) i `content_json_valid` (odróżnia JSON
null od niepoprawnego body) pozwalają adapterom hosta renderować bez rozjazdów.

Publiczne API: ErrorRecord, parse_error_record, serialize_error_record.
Bump 0.2.0 -> 0.2.1 (dodatek API; mieści się w <0.3, django-pbn-client 0.2.0
pozostaje kompatybilny).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
json.loads głęboko zagnieżdżonego body na CPythonie <3.14 rzuca RecursionError
(content_json None), a 3.14+ parsuje głębiej bez błędu (content_json = lista).
Test asertował sztywno content_json is None → fail na 3.14. Kontrakt „parse()
nigdy nie rzuca" trzyma w obu przypadkach; test sprawdza teraz totalność +
rozpoznanie krotki niezależnie od głębi, a content_json_valid spójnie z
content_json.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant