Skip to content

Commit c343d23

Browse files
authored
Merge pull request #42 from cloudblue/add_append_option_for_resourceset
Add resourceset_append option to the client
2 parents 8e76c7b + eb1c119 commit c343d23

4 files changed

Lines changed: 72 additions & 3 deletions

File tree

connect/client/fluent.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def __init__(
3131
max_retries=0,
3232
logger=None,
3333
timeout=(180.0, 180.0),
34+
resourceset_append=True,
3435
):
3536
"""
3637
Create a new instance of the ConnectClient.
@@ -39,13 +40,25 @@ def __init__(
3940
:type api_key: str
4041
:param endpoint: The API endpoint, defaults to CONNECT_ENDPOINT_URL
4142
:type endpoint: str, optional
43+
:param use_specs: Use the Connect OpenAPI specification for interactive help.
44+
:type specs_location: bool, optional
4245
:param specs_location: The Connect OpenAPI specification local path or URL, defaults to
4346
CONNECT_SPECS_URL
4447
:type specs_location: str, optional
48+
:param validate_using_specs: Use the Connect OpenAPI specification to validate the call.
49+
:type validate_using_specs: bool, optional
4550
:param default_headers: Http headers to apply to each request, defaults to {}
4651
:type default_headers: dict, optional
47-
:param logger: HTTPP Request logger class, defaults to None
52+
:param default_limit: Default value for pagination limit parameter.
53+
:type default_limit: int, optional
54+
:param max_retries: Max number of retries for a request before raising an error.
55+
:type max_retries: int, optional
56+
:param logger: HTTP Request logger class, defaults to None
4857
:type logger: RequestLogger, optional
58+
:param timeout: Timeout parameter to pass to the underlying http client.
59+
:type timeout: int or tuple of int, optional
60+
:param resourceset_append: Append all the page to the current resourceset.
61+
:type resourceset_append: bool, optional
4962
"""
5063
if default_headers and 'Authorization' in default_headers:
5164
raise ValueError('`default_headers` cannot contains `Authorization`')
@@ -65,6 +78,7 @@ def __init__(
6578
self.logger = logger
6679
self._help_formatter = DefaultFormatter(self.specs)
6780
self.timeout = timeout
81+
self.resourceset_append = resourceset_append
6882

6983
def __getattr__(self, name):
7084
"""

connect/client/models/iterators.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ def __next__(self):
5858
if not results:
5959
raise
6060
self._rs._content_range = cr
61-
self._rs._results.extend(results)
61+
if self._client.resourceset_append:
62+
self._rs._results.extend(results)
63+
else:
64+
self._rs._results = results
6265
self._results_iterator = iter(results)
6366
item = next(self._results_iterator)
6467

@@ -101,7 +104,10 @@ async def __anext__(self):
101104
if not results:
102105
raise StopAsyncIteration
103106
self._rs._content_range = cr
104-
self._rs._results.extend(results)
107+
if self._client.resourceset_append:
108+
self._rs._results.extend(results)
109+
else:
110+
self._rs._results = results
105111
self._results_iterator = iter(results)
106112
item = next(self._results_iterator)
107113

tests/async_client/test_models.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,32 @@ async def test_rs_pagination(mocker, async_client_mock, async_rs_factory):
982982
assert results == [{'id': i} for i in range(200)]
983983
assert rs._limit == 100
984984
assert rs._offset == 0
985+
assert len(rs._results) == 200
986+
987+
988+
@pytest.mark.asyncio
989+
async def test_rs_pagination_no_append(mocker, async_client_mock, async_rs_factory):
990+
mocker.patch(
991+
'connect.client.models.iterators.parse_content_range',
992+
side_effect=[
993+
ContentRange(0, 99, 200),
994+
ContentRange(100, 199, 200),
995+
],
996+
)
997+
998+
rs = async_rs_factory(
999+
client=async_client_mock(methods=['get']),
1000+
)
1001+
rs._client.resourceset_append = False
1002+
rs._client.get.side_effect = [
1003+
[{'id': i} for i in range(100)],
1004+
[{'id': i} for i in range(100, 200)],
1005+
]
1006+
results = [item async for item in rs]
1007+
assert results == [{'id': i} for i in range(200)]
1008+
assert rs._limit == 100
1009+
assert rs._offset == 0
1010+
assert len(rs._results) == 100
9851011

9861012

9871013
@pytest.mark.asyncio

tests/client/test_models.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,29 @@ def test_rs_pagination(mocker, rs_factory):
881881
assert results == [{'id': i} for i in range(200)]
882882
assert rs._limit == 100
883883
assert rs._offset == 0
884+
assert len(rs._results) == 200
885+
886+
887+
def test_rs_pagination_no_append(mocker, rs_factory):
888+
mocker.patch(
889+
'connect.client.models.iterators.parse_content_range',
890+
side_effect=[
891+
ContentRange(0, 99, 200),
892+
ContentRange(100, 199, 200),
893+
],
894+
)
895+
896+
rs = rs_factory()
897+
rs._client.get = mocker.MagicMock(side_effect=[
898+
[{'id': i} for i in range(100)],
899+
[{'id': i} for i in range(100, 200)],
900+
])
901+
rs._client.resourceset_append = False
902+
results = list(rs)
903+
assert results == [{'id': i} for i in range(200)]
904+
assert rs._limit == 100
905+
assert rs._offset == 0
906+
assert len(rs._results) == 100
884907

885908

886909
def test_rs_values_list_pagination(mocker, rs_factory):

0 commit comments

Comments
 (0)