From 0f5ecb646863ae528bd1808799435b0844cdd088 Mon Sep 17 00:00:00 2001 From: Paul Maisondieu Date: Thu, 3 Oct 2024 18:08:36 +0200 Subject: [PATCH] fix: PageNumberPaginator not reset when iterating through multiple parent ressources --- dlt/sources/helpers/rest_client/paginators.py | 8 +++-- .../helpers/rest_client/test_paginators.py | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/dlt/sources/helpers/rest_client/paginators.py b/dlt/sources/helpers/rest_client/paginators.py index 872d4f34e8..82b97e253b 100644 --- a/dlt/sources/helpers/rest_client/paginators.py +++ b/dlt/sources/helpers/rest_client/paginators.py @@ -1,9 +1,10 @@ import warnings from abc import ABC, abstractmethod from typing import Any, Dict, List, Optional -from urllib.parse import urlparse, urljoin +from urllib.parse import urljoin, urlparse + +from requests import Request, Response -from requests import Response, Request from dlt.common import jsonpath @@ -127,6 +128,7 @@ def __init__( " provided." ) self.param_name = param_name + self.initial_value = initial_value self.current_value = initial_value self.value_step = value_step self.base_index = base_index @@ -136,6 +138,8 @@ def __init__( self.stop_after_empty_page = stop_after_empty_page def init_request(self, request: Request) -> None: + self._has_next_page = True + self.current_value = self.initial_value if request.params is None: request.params = {} diff --git a/tests/sources/helpers/rest_client/test_paginators.py b/tests/sources/helpers/rest_client/test_paginators.py index 39e3d767a0..35d9a2750e 100644 --- a/tests/sources/helpers/rest_client/test_paginators.py +++ b/tests/sources/helpers/rest_client/test_paginators.py @@ -380,6 +380,35 @@ def test_update_state(self): paginator.update_state(response, data=NON_EMPTY_PAGE) assert paginator.has_next_page is False + + def test_init_request(self): + paginator = PageNumberPaginator(base_page=1, total_path=None) + request = Mock(Request) + request.params = {} + response = Mock(Response, json=lambda: "OK") + + assert paginator.current_value == 1 + assert paginator.has_next_page is True + paginator.init_request(request) + + paginator.update_state(response, data=NON_EMPTY_PAGE) + paginator.update_request(request) + + assert paginator.current_value == 2 + assert paginator.has_next_page is True + assert request.params["page"] == 2 + + paginator.update_state(response, data=None) + paginator.update_request(request) + + assert paginator.current_value == 2 + assert paginator.has_next_page is False + + paginator.init_request(request) + assert paginator.current_value == 1 + assert paginator.has_next_page is True + + def test_update_state_with_string_total_pages(self): paginator = PageNumberPaginator(base_page=1, page=1) response = Mock(Response, json=lambda: {"total": "3"})