Skończona polityka ponowień + sekwencyjny iterator stron (RetryPolicy, iter_pages)#5
Merged
Merged
Conversation
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
force-pushed
the
feat/pbn-page-getter-retry
branch
from
July 14, 2026 17:21
c785426 to
838131b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Co i po co
Nowy moduł
pbn_client.pagingdodaje wielokrotnego użytku prymitywy retry na poziomie stron, naprawiające dwa defekty historycznegosimple_page_getter(obecnie w django-pbn-client):RetryPolicyogranicza liczbę prób (max_attempts, domyślnie 3) z prostym wykładniczym backoffem (backoff * 2**(attempt-1), domyślnie 0);skip_page_on_failure=Truepołykało WSZYSTKIEHttpException(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 przezon_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 interfejsietotal_pages+fetch_page(n)(PageableResource).sleepwstrzykiwalne; przy zerowym opóźnieniu nie jest wołane w ogóle.RetryPolicyiiter_pagesz korzenia pakietu._make_get_request_with_retry) — obie warstwy się składają, łączna liczba prób pozostaje ograniczona.simple_page_getterz 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 (sleepwstrzykiwalny, backoff=0); nie-HTTP wyjątki propagują.Pełna suita:
uv run --isolated pytest -q→ 55 passed.ruff checkczysty, format bez zmian.🤖 Generated with Claude Code