CP-2451 fix bugs, add warning to readme and improve example

This commit is contained in:
Rodrigo Rodrigues 2026-01-22 09:49:29 +00:00
parent abea9a244a
commit 3ad6e074bf
2 changed files with 25 additions and 18 deletions

View File

@ -2,18 +2,28 @@
This package provides core functionality for interacting with the ThousandEyes API and should be installed before using any of the published SDKs. This package provides core functionality for interacting with the ThousandEyes API and should be installed before using any of the published SDKs.
Usage example for iterating paginated responses: `PaginatorIterator` is unbounded, so wrap it with `itertools.islice` to cap the number of items and avoid making unintended, potentially expensive API calls.
Pick a slice size that matches your UI or batch size so you only fetch what you plan to process:
```python ```python
from thousandeyes_sdk.core import PaginatorIterator from thousandeyes_sdk.core import Configuration, ApiClient, PaginatorIterator
from thousandeyes_sdk.dashboards.api.dashboards_api import DashboardsApi from thousandeyes_sdk.dashboards import DashboardsApi
from itertools import islice
dashboards_api = DashboardsApi() configuration = Configuration(
for widget_data in PaginatorIterator( host = "https://api.thousandeyes.com/v7",
dashboards_api.get_dashboard_widget_data, access_token = "an_access_token",
lambda response: response.data.tests if response.data else [], )
dashboard_id="dashboard-id",
widget_id="widget-id",
): def get_dashboard_widget_data():
print(widget_data) with ApiClient(configuration) as client:
dashboards_api = DashboardsApi(client)
for item in list(islice(PaginatorIterator(
dashboards_api.get_dashboard_widget_data,
lambda response: response.data.tests,
dashboard_id="a_dashboard_id",
widget_id="a_widget_id",
), 20)):
print(item.test_id)
``` ```

View File

@ -60,7 +60,8 @@ class PaginatorIterator(Generic[P, R, I]):
while True: while True:
response = self._method(**params) response = self._method(**params)
for item in self._items_getter(response): items = self._items_getter(response)
for item in items if items else []:
yield item yield item
next_cursor = self._next_cursor_from_response(response) next_cursor = self._next_cursor_from_response(response)
@ -71,14 +72,10 @@ class PaginatorIterator(Generic[P, R, I]):
last_cursor = next_cursor last_cursor = next_cursor
def _next_cursor_from_response(self, response: Any) -> Optional[str]: def _next_cursor_from_response(self, response: Any) -> Optional[str]:
data = getattr(response, "data", response) links = getattr(response, "links", None)
links = getattr(data, "links", None)
if links is None: if links is None:
links = getattr(data, "_links", None) links = getattr(response, "_links", None)
if links is None and isinstance(data, Mapping):
links = data.get("_links") or data.get("links")
if links is None: if links is None:
return None return None