Skip to content

Commit 0853604

Browse files
committed
keeping the context of the last request builder as the pagination scheme could get changed in between the pagination calls
1 parent afc3ae4 commit 0853604

7 files changed

Lines changed: 19 additions & 37 deletions

File tree

apimatic_core/pagination/paginated_data.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,15 @@ def last_response(self):
1515
"""
1616
Returns the most recent HTTP response received during pagination.
1717
"""
18-
return self._http_call_context.response
18+
return self._http_call_context.response if self._last_request_builder is not None else None
1919

2020
@property
2121
def request_builder(self):
2222
"""
2323
Returns the appropriate request builder for the current pagination state.
2424
"""
25-
if self.last_response is None:
26-
return self._initial_request_builder
25+
return self._initial_request_builder if self._last_request_builder is None else self._last_request_builder
2726

28-
return self._api_call.request_builder
2927

3028
@property
3129
def page_size(self):
@@ -52,12 +50,14 @@ def __init__(self, api_call, paginated_items_converter):
5250
self._api_call = copy.deepcopy(api_call)
5351
self._paginated_items_converter = paginated_items_converter
5452
self._initial_request_builder = api_call.request_builder
53+
self._last_request_builder = None
5554
self._pagination_strategies = self._api_call.get_pagination_strategies
5655
self._http_call_context =\
5756
self._api_call.global_configuration.get_http_client_configuration().http_callback or HttpCallContext()
5857
_http_client_configuration = self._api_call.global_configuration.get_http_client_configuration().clone(
5958
http_callback=self._http_call_context)
60-
self._global_configuration = self._api_call.global_configuration.clone_with()
59+
self._global_configuration = self._api_call.global_configuration.clone_with(
60+
http_client_configuration=_http_client_configuration)
6161
self._paged_response = None
6262
self._items = []
6363
self._page_size = 0
@@ -128,6 +128,8 @@ def _fetch_next_page(self):
128128
if request_builder is None:
129129
continue
130130

131+
self._last_request_builder = request_builder
132+
131133
response = self._api_call.clone(
132134
global_configuration=self._global_configuration, request_builder=request_builder
133135
).execute()

apimatic_core/pagination/strategies/cursor_pagination.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,10 @@ def apply(self, paginated_data):
5353
"""
5454
last_response = paginated_data.last_response
5555
request_builder = paginated_data.request_builder
56+
self._cursor_value = self._get_initial_cursor_value(request_builder, self._input)
5657

58+
# The last response is none which means this is going to be the 1st page
5759
if last_response is None:
58-
self._cursor_value = self._get_initial_cursor_value(request_builder, self._input)
5960
return request_builder
6061

6162
self._cursor_value = ApiHelper.resolve_response_pointer(

apimatic_core/pagination/strategies/link_pagination.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def apply(self, paginated_data):
4545
last_response = paginated_data.last_response
4646
request_builder = paginated_data.request_builder
4747

48+
# The last response is none which means this is going to be the 1st page
4849
if last_response is None:
4950
return request_builder
5051

apimatic_core/pagination/strategies/offset_pagination.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ def apply(self, paginated_data):
4646
"""
4747
last_response = paginated_data.last_response
4848
request_builder = paginated_data.request_builder
49-
last_page_size = paginated_data.page_size
49+
self._offset = self._get_initial_request_param_value(request_builder, self._input)
50+
5051
# The last response is none which means this is going to be the 1st page
5152
if last_response is None:
52-
self._offset = self._get_initial_request_param_value(request_builder, self._input)
5353
return request_builder
5454

55-
self._offset += last_page_size
55+
self._offset += paginated_data.page_size
5656

5757
return self.get_updated_request_builder(request_builder, self._input, self._offset)
5858

apimatic_core/pagination/strategies/page_pagination.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ def apply(self, paginated_data):
4141
"""
4242
last_response = paginated_data.last_response
4343
request_builder = paginated_data.request_builder
44-
last_page_size = paginated_data.page_size
44+
self._page_number = self._get_initial_request_param_value(request_builder, self._input, 1)
45+
4546
# The last response is none which means this is going to be the 1st page
4647
if last_response is None:
47-
self._page_number = self._get_initial_request_param_value(request_builder, self._input, 1)
4848
return request_builder
49-
self._page_number += 1 if last_page_size > 0 else 0
49+
50+
self._page_number += 1 if paginated_data.page_size > 0 else 0
5051

5152
return self.get_updated_request_builder(request_builder, self._input, self._page_number)
5253

tests/apimatic_core/pagination_tests/strategies/test_page_pagination.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ def test_apply_subsequent_call_does_not_increment_page_with_no_results(self, moc
144144

145145
pp.apply(mock_paginated_data_subsequent_call_no_results)
146146

147-
assert pp._page_number == 3
147+
assert pp._page_number == 2
148148
mock_get_updated_request_builder.assert_called_once_with(
149-
mock_request_builder, "$request.query#/page", 3
149+
mock_request_builder, "$request.query#/page", 2
150150
)
151151

152152
def test_apply_metadata_wrapper(self, mock_metadata_wrapper, mocker):

tests/apimatic_core/pagination_tests/test_paginated_data.py

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -71,29 +71,6 @@ def test_init_paginated_items_converter_none_raises_error(self, mock_api_call):
7171
with pytest.raises(ValueError, match="paginated_items_converter cannot be None"):
7272
PaginatedData(api_call=mock_api_call, paginated_items_converter=None)
7373

74-
# Test properties
75-
def test_last_response_property(self, mock_paginated_data_instance, mocker):
76-
# Manually set the internal _http_call_context.response for testing
77-
mock_response = mocker.Mock()
78-
mock_paginated_data_instance._http_call_context.response = mock_response
79-
assert mock_paginated_data_instance.last_response == mock_response
80-
81-
def test_last_response_property_none(self, mock_paginated_data_instance):
82-
mock_paginated_data_instance._http_call_context.response = None
83-
assert mock_paginated_data_instance.last_response is None
84-
85-
def test_request_builder_property_initial(self, mock_paginated_data_instance):
86-
mock_paginated_data_instance._http_call_context.response = None
87-
assert mock_paginated_data_instance.request_builder == mock_paginated_data_instance._initial_request_builder
88-
89-
def test_request_builder_property_after_response(self, mock_paginated_data_instance, mocker):
90-
mock_paginated_data_instance._http_call_context.response = mocker.Mock()
91-
assert mock_paginated_data_instance.request_builder == mock_paginated_data_instance._api_call.request_builder
92-
93-
def test_page_size_property(self, mock_paginated_data_instance):
94-
mock_paginated_data_instance._page_size = 10
95-
assert mock_paginated_data_instance.page_size == 10
96-
9774
# Test __next__
9875
def test_next_iterates_current_items(self, mock_paginated_data_instance):
9976
mock_paginated_data_instance._items = ["item1", "item2"]

0 commit comments

Comments
 (0)