2
2
3
3
from __future__ import annotations
4
4
5
+ import sys
5
6
import typing as t
6
7
from abc import ABCMeta , abstractmethod
7
8
from urllib .parse import ParseResult , urlparse
8
9
9
10
from singer_sdk .helpers .jsonpath import extract_jsonpath
10
11
12
+ if sys .version_info < (3 , 12 ):
13
+ from typing_extensions import override
14
+ else :
15
+ from typing import override # noqa: ICN003
16
+
11
17
if t .TYPE_CHECKING :
12
- from requests import Response
18
+ import requests
13
19
14
20
T = t .TypeVar ("T" )
15
21
TPageToken = t .TypeVar ("TPageToken" )
@@ -87,7 +93,7 @@ def __repr__(self) -> str:
87
93
"""
88
94
return str (self )
89
95
90
- def advance (self , response : Response ) -> None :
96
+ def advance (self , response : requests . Response ) -> None :
91
97
"""Get a new page value and advance the current one.
92
98
93
99
Args:
@@ -118,7 +124,7 @@ def advance(self, response: Response) -> None:
118
124
else :
119
125
self ._value = new_value
120
126
121
- def has_more (self , response : Response ) -> bool : # noqa: ARG002, PLR6301
127
+ def has_more (self , response : requests . Response ) -> bool : # noqa: ARG002, PLR6301
122
128
"""Override this method to check if the endpoint has any pages left.
123
129
124
130
Args:
@@ -130,7 +136,7 @@ def has_more(self, response: Response) -> bool: # noqa: ARG002, PLR6301
130
136
return True
131
137
132
138
@abstractmethod
133
- def get_next (self , response : Response ) -> TPageToken | None :
139
+ def get_next (self , response : requests . Response ) -> TPageToken | None :
134
140
"""Get the next pagination token or index from the API response.
135
141
136
142
Args:
@@ -155,15 +161,12 @@ def __init__(self, *args: t.Any, **kwargs: t.Any) -> None:
155
161
"""
156
162
super ().__init__ (None , * args , ** kwargs )
157
163
158
- def get_next (self , response : Response ) -> None : # noqa: ARG002, PLR6301
159
- """Get the next pagination token or index from the API response.
164
+ @override
165
+ def get_next (self , response : requests .Response ) -> None :
166
+ """Always return None to indicate pagination is complete after the first page.
160
167
161
168
Args:
162
169
response: API response object.
163
-
164
- Returns:
165
- The next page token or index. Return `None` from this method to indicate
166
- the end of pagination.
167
170
"""
168
171
return
169
172
@@ -220,15 +223,16 @@ def __init__(self, *args: t.Any, **kwargs: t.Any) -> None:
220
223
super ().__init__ (None , * args , ** kwargs )
221
224
222
225
@abstractmethod
223
- def get_next_url (self , response : Response ) -> str | None :
226
+ def get_next_url (self , response : requests . Response ) -> str | None :
224
227
"""Override this method to extract a HATEOAS link from the response.
225
228
226
229
Args:
227
230
response: API response object.
228
231
"""
229
232
...
230
233
231
- def get_next (self , response : Response ) -> ParseResult | None :
234
+ @override
235
+ def get_next (self , response : requests .Response ) -> ParseResult | None :
232
236
"""Get the next pagination token or index from the API response.
233
237
234
238
Args:
@@ -249,7 +253,8 @@ class HeaderLinkPaginator(BaseHATEOASPaginator):
249
253
- https://datatracker.ietf.org/doc/html/rfc8288#section-3
250
254
"""
251
255
252
- def get_next_url (self , response : Response ) -> str | None : # noqa: PLR6301
256
+ @override
257
+ def get_next_url (self , response : requests .Response ) -> str | None :
253
258
"""Override this method to extract a HATEOAS link from the response.
254
259
255
260
Args:
@@ -281,7 +286,8 @@ def __init__(
281
286
super ().__init__ (None , * args , ** kwargs )
282
287
self ._jsonpath = jsonpath
283
288
284
- def get_next (self , response : Response ) -> str | None :
289
+ @override
290
+ def get_next (self , response : requests .Response ) -> str | None :
285
291
"""Get the next page token.
286
292
287
293
Args:
@@ -313,7 +319,8 @@ def __init__(
313
319
super ().__init__ (None , * args , ** kwargs )
314
320
self ._key = key
315
321
316
- def get_next (self , response : Response ) -> str | None :
322
+ @override
323
+ def get_next (self , response : requests .Response ) -> str | None :
317
324
"""Get the next page token.
318
325
319
326
Args:
@@ -328,7 +335,8 @@ def get_next(self, response: Response) -> str | None:
328
335
class BasePageNumberPaginator (BaseAPIPaginator [int ], metaclass = ABCMeta ):
329
336
"""Paginator class for APIs that use page number."""
330
337
331
- def get_next (self , response : Response ) -> int | None : # noqa: ARG002
338
+ @override
339
+ def get_next (self , response : requests .Response ) -> int | None :
332
340
"""Get the next page number.
333
341
334
342
Args:
@@ -361,7 +369,8 @@ def __init__(
361
369
super ().__init__ (start_value , * args , ** kwargs )
362
370
self ._page_size = page_size
363
371
364
- def get_next (self , response : Response ) -> int | None : # noqa: ARG002
372
+ @override
373
+ def get_next (self , response : requests .Response ) -> int | None :
365
374
"""Get the next page offset.
366
375
367
376
Args:
@@ -378,7 +387,7 @@ class LegacyPaginatedStreamProtocol(t.Protocol[TPageToken]):
378
387
379
388
def get_next_page_token (
380
389
self ,
381
- response : Response ,
390
+ response : requests . Response ,
382
391
previous_token : TPageToken | None ,
383
392
) -> TPageToken | None :
384
393
"""Get the next page token.
@@ -411,7 +420,8 @@ def __init__(
411
420
super ().__init__ (None , * args , ** kwargs )
412
421
self .stream = stream
413
422
414
- def get_next (self , response : Response ) -> TPageToken | None :
423
+ @override
424
+ def get_next (self , response : requests .Response ) -> TPageToken | None :
415
425
"""Get next page value by calling the stream method.
416
426
417
427
Args:
0 commit comments