Skip to content

Commit 318d75c

Browse files
committed
feat: adds ability to paginate using the pages API which was originally hidden to the user
1 parent 5faa450 commit 318d75c

5 files changed

Lines changed: 59 additions & 8 deletions

File tree

hostingde/dns/dns.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def list_zones(
4747
limit: Optional[int] = None,
4848
filter: Optional[FilterElement] = None,
4949
sort: Optional[SortConfiguration] = None,
50+
page: Optional[int] = None,
5051
*args: list,
5152
**kwargs: dict
5253
) -> HostingDePaginator[Zone]:
@@ -110,18 +111,20 @@ def list_zones(
110111
:param limit: The limit of objects to retrieve per call. If not set, defaults to 25.
111112
:param filter: A filter that is applied to the query
112113
:param sort: Configuration how results are sorted.
114+
:param page: The page to retrieve. If limit is unset, 25 items will be retrieved.
113115
:return: An iterator that yields Zone objects.
114116
"""
115117

116118
uri = self._build_uri('dns', 'zonesFind')
117119

118-
return self._iter(uri, Zone, filter, limit, sort)
120+
return self._iter(uri, Zone, filter, limit, sort, page)
119121

120122
def list_zone_configs(
121123
self,
122124
limit: Optional[int] = None,
123125
filter: Optional[FilterElement] = None,
124126
sort: Optional[SortConfiguration] = None,
127+
page: Optional[int] = None,
125128
*args: list,
126129
**kwargs: dict
127130
) -> HostingDePaginator[ZoneConfig]:
@@ -171,18 +174,20 @@ def list_zone_configs(
171174
:param limit: The limit of objects to retrieve per call. If not set, defaults to 25.
172175
:param filter: A filter that is applied to the query
173176
:param sort: Configuration how results are sorted.
177+
:param page: The page to retrieve. If limit is unset, 25 items will be retrieved.
174178
:return: An iterator that yields Zone objects.
175179
"""
176180

177181
uri = self._build_uri('dns', 'zoneConfigsFind')
178182

179-
return self._iter(uri, ZoneConfig, filter, limit, sort)
183+
return self._iter(uri, ZoneConfig, filter, limit, sort, page)
180184

181185
def list_records(
182186
self,
183187
limit: Optional[int] = None,
184188
filter: Optional[FilterElement] = None,
185189
sort: Optional[SortConfiguration] = None,
190+
page: Optional[int] = None,
186191
*args: list,
187192
**kwargs: dict
188193
) -> HostingDePaginator[Record]:
@@ -212,12 +217,13 @@ def list_records(
212217
:param limit: The limit of objects to retrieve per call. If not set, defaults to 25.
213218
:param filter: A filter that is applied to the query
214219
:param sort: Configuration how results are sorted.
220+
:param page: The page to retrieve. If limit is unset, 25 items will be retrieved.
215221
:return: An iterator that yields Zone objects.
216222
"""
217223

218224
uri = self._build_uri('dns', 'recordsFind')
219225

220-
return self._iter(uri, Record, filter, limit, sort)
226+
return self._iter(uri, Record, filter, limit, sort, page)
221227

222228
def delete_zone(
223229
self, zone_config_id: Optional[str] = None, zone_name: Optional[str] = None, asynchronous: bool = None
@@ -254,6 +260,7 @@ def jobs_find(
254260
limit: Optional[int] = None,
255261
filter: Optional[FilterElement] = None,
256262
sort: Optional[SortConfiguration] = None,
263+
page: Optional[int] = None,
257264
*args: list,
258265
**kwargs: dict
259266
) -> HostingDePaginator[Job]:
@@ -263,11 +270,12 @@ def jobs_find(
263270
:param limit: The limit of objects to retrieve per call. If not set, defaults to 25.
264271
:param filter: A filter that is applied to the query
265272
:param sort: Configuration how results are sorted.
273+
:param page: The page to retrieve. If limit is unset, 25 items will be retrieved.
266274
:return: An iterator that yields ZoneConfig objects.
267275
"""
268276
uri = self._build_uri('dns', 'jobsFind')
269277

270-
return self._iter(uri, Job, filter, limit, sort)
278+
return self._iter(uri, Job, filter, limit, sort, page)
271279

272280
def update_zone(
273281
self,

hostingde/domain/domain.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def jobs_find(
3636
limit: Optional[int] = None,
3737
filter: Optional[FilterElement] = None,
3838
sort: Optional[SortConfiguration] = None,
39+
page: Optional[int] = None,
3940
*args: list,
4041
**kwargs: dict
4142
) -> HostingDePaginator[Job]:
@@ -45,11 +46,12 @@ def jobs_find(
4546
:param limit: The limit of objects to retrieve per call. If not set, defaults to 25.
4647
:param filter: A filter that is applied to the query
4748
:param sort: Configuration how results are sorted.
49+
:param page: The page to retrieve. If limit is unset, 25 items will be retrieved.
4850
:return: An iterator that yields ZoneConfig objects.
4951
"""
5052
uri = self._build_uri('domain', 'jobsFind')
5153

52-
return self._iter(uri, Job, filter, limit, sort)
54+
return self._iter(uri, Job, filter, limit, sort, page)
5355

5456
def check_domain_name_availability(self, domain_names: Union[str, List[str]]) -> List[CheckAvailabilityResponse]:
5557
uri = self.build_uri('domainStatus')
@@ -71,6 +73,7 @@ def list_domains(
7173
limit: Optional[int] = None,
7274
filter: Optional[FilterElement] = None,
7375
sort: Optional[SortConfiguration] = None,
76+
page: Optional[int] = None,
7477
*args: list,
7578
**kwargs: dict
7679
) -> HostingDePaginator[Domain]:
@@ -80,18 +83,20 @@ def list_domains(
8083
:param limit: The limit of objects to retrieve per call. If not set, defaults to 25.
8184
:param filter: A filter that is applied to the query
8285
:param sort: Configuration how results are sorted.
86+
:param page: The page to retrieve. If limit is unset, 25 items will be retrieved.
8387
:return: An iterator that yields Zone objects.
8488
"""
8589

8690
uri = self._build_uri('domain', 'domainsFind')
8791

88-
return self._iter(uri, Domain, filter, limit, sort)
92+
return self._iter(uri, Domain, filter, limit, sort, page)
8993

9094
def list_contacts(
9195
self,
9296
limit: Optional[int] = None,
9397
filter: Optional[FilterElement] = None,
9498
sort: Optional[SortConfiguration] = None,
99+
page: Optional[int] = None,
95100
*args: list,
96101
**kwargs: dict
97102
) -> HostingDePaginator[DomainContact]:
@@ -101,12 +106,13 @@ def list_contacts(
101106
:param limit: The limit of objects to retrieve per call. If not set, defaults to 25.
102107
:param filter: A filter that is applied to the query
103108
:param sort: Configuration how results are sorted.
109+
:param page: The page to retrieve. If limit is unset, 25 items will be retrieved.
104110
:return: An iterator that yields Zone objects.
105111
"""
106112

107113
uri = self._build_uri('domain', 'contactsFind')
108114

109-
return self._iter(uri, DomainContact, filter, limit, sort)
115+
return self._iter(uri, DomainContact, filter, limit, sort, page)
110116

111117
def register_domain(
112118
self,

hostingde/hostingde.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ def _iter(
9696
filter: Optional[FilterElement] = None,
9797
limit: Optional[int] = None,
9898
sort: Optional[SortConfiguration] = None,
99+
page: Optional[int] = None,
99100
) -> 'hostingde.HostingDePaginator[T]':
100101
"""
101102
Use the generic filtering and sorting API to paginate over results.
@@ -108,7 +109,7 @@ def _iter(
108109
:return: The iterator for the resultset
109110
"""
110111

111-
return hostingde.HostingDePaginator(self, instance_class, url, filter=filter, limit=limit, sort=sort)
112+
return hostingde.HostingDePaginator(self, instance_class, url, filter=filter, limit=limit, sort=sort, page=page)
112113

113114
def login(self, url: str, token: str) -> None:
114115
"""

hostingde/paginator.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def __init__(
3232
limit: Optional[int] = 25,
3333
filter: Optional[FilterElement] = None,
3434
sort: Optional[SortConfiguration] = None,
35+
page: Optional[int] = None
3536
):
3637
"""
3738
Construct a new paginator.
@@ -43,8 +44,10 @@ def __init__(
4344
:param limit: The maximum number of entries to retrieve per API call
4445
:param filter: Filter the results based on a filter expression
4546
:param sort: Sort the results by a given field
47+
:param page: Which page to query. Requires limit to be set, which defaults to 25.
4648
"""
4749
super().__init__(parent)
50+
4851
self.current_page = 1
4952
self.total_pages = -1
5053
self.results: List[R] = []
@@ -57,6 +60,10 @@ def __init__(
5760
self.instance_class = instance_class
5861
self._total_entries = -1
5962

63+
if page:
64+
self.current_page = page
65+
self.count = self.limit
66+
6067
def __iter__(self):
6168
"""
6269
This object is a iterator itself.

tests/unit/test_paginator.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,35 @@ def test_paginator_no_more_data():
105105
assert count == 23
106106

107107

108+
@responses.activate
109+
def test_paginator_paged():
110+
api = login('https://example.de/api', 'token')
111+
112+
url = 'https://example.de/api/demo'
113+
114+
paginator: HostingDePaginator = HostingDePaginator(api, instance_class=Record, url=url, page=2)
115+
116+
responses.add(
117+
'POST',
118+
url,
119+
body=json.dumps(
120+
{
121+
"response": {
122+
"data": [
123+
Record.create_new_record('cloud.de', RecordType.A, f'127.0.0.{i}').to_json() for i in range(50)
124+
],
125+
"totalPages": 2,
126+
},
127+
"status": "success",
128+
}
129+
),
130+
)
131+
132+
responses.add('POST', url, body=json.dumps({"response": {"data": [], "totalPages": 2}, "status": "success"}))
133+
134+
assert len(paginator.fetchall()) == 25
135+
136+
108137
@responses.activate
109138
def test_paginator_multipage():
110139
api = login('https://example.de/api', 'token')

0 commit comments

Comments
 (0)