Skip to content

Skończona polityka ponowień + sekwencyjny iterator stron (RetryPolicy, iter_pages)#5

Merged
mpasternak merged 1 commit into
mainfrom
feat/pbn-page-getter-retry
Jul 14, 2026
Merged

Skończona polityka ponowień + sekwencyjny iterator stron (RetryPolicy, iter_pages)#5
mpasternak merged 1 commit into
mainfrom
feat/pbn-page-getter-retry

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Co i po co

Nowy moduł pbn_client.paging dodaje wielokrotnego użytku prymitywy retry na poziomie stron, naprawiające dwa defekty historycznego simple_page_getter (obecnie w django-pbn-client):

  1. Nieskończona ciasna pętla przy HTTP 500 — teraz RetryPolicy ogranicza liczbę prób (max_attempts, domyślnie 3) z prostym wykładniczym backoffem (backoff * 2**(attempt-1), domyślnie 0);
  2. skip_page_on_failure=True połykało WSZYSTKIE HttpException (w tym 401/403) → ciche, niekompletne wyniki. iter_pages() ponawia WYŁĄCZNIE statusy przejściowe ({500, 502, 503, 504}); pozostałe propagują natychmiast. Strona wyczerpująca ponowienia jest raportowana jawnie przez on_skipped(page_number, error), a bez callbacka — re-raise.

Zakres

  • RetryPolicy — frozen dataclass, niezależna od frameworka (zero Django).
  • iter_pages(resource, *, retry_policy=None, on_skipped=None, sleep=time.sleep) — działa z każdym paginatorem o interfejsie total_pages + fetch_page(n) (PageableResource). sleep wstrzykiwalne; przy zerowym opóźnieniu nie jest wołane w ogóle.
  • Eksport RetryPolicy i iter_pages z korzenia pakietu.
  • Komentarz w module dokumentuje złożenie z niskopoziomowym retry transportu (_make_get_request_with_retry) — obie warstwy się składają, łączna liczba prób pozostaje ograniczona.
  • Poza zakresem: relokacja samego simple_page_getter z django-pbn-client (skoordynowane wydanie, osobny PR).

Testy (TDD)

Nowy tests/test_paging.py (fake resource ze skryptowanymi próbami per strona): skończone retry 500 → raise; 401/403 propagują natychmiast (nigdy nie połykane, nawet z callbackiem); sukces w 2. próbie yielduje poprawnie; on_skipped(page, error) po wyczerpaniu prób + kontynuacja iteracji; brak realnego spania (sleep wstrzykiwalny, backoff=0); nie-HTTP wyjątki propagują.

Pełna suita: uv run --isolated pytest -q → 55 passed. ruff check czysty, format bez zmian.

🤖 Generated with Claude Code

Nowy moduł pbn_client.paging wprowadza RetryPolicy (skończone
max_attempts, wykładniczy backoff, ponawiane tylko statusy
przejściowe 500/502/503/504) oraz iter_pages() — sekwencyjny
iterator stron paginatora naprawiający dwa defekty historycznego
simple_page_getter:

1. HTTP 500 nie jest już ponawiane w nieskończonej ciasnej pętli —
   liczba prób jest ograniczona, z opcjonalnym backoffem;
2. błędy nie-retryowalne (401/403 itd.) propagują natychmiast i nigdy
   nie są po cichu połykane; strona wyczerpująca ponowienia jest
   raportowana jawnie przez callback on_skipped(page, error) albo
   re-raise'owana.

RetryPolicy i iter_pages eksportowane z korzenia pakietu. Sam
simple_page_getter pozostaje na razie w django-pbn-client — jego
relokacja nastąpi przy skoordynowanym wydaniu.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mpasternak
mpasternak force-pushed the feat/pbn-page-getter-retry branch from c785426 to 838131b Compare July 14, 2026 17:21
@mpasternak
mpasternak merged commit 760eab5 into main Jul 14, 2026
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