diff --git a/thousandeyes-sdk-core/README.md b/thousandeyes-sdk-core/README.md index 2f3c285b..267e4af2 100644 --- a/thousandeyes-sdk-core/README.md +++ b/thousandeyes-sdk-core/README.md @@ -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. -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 -from thousandeyes_sdk.core import PaginatorIterator -from thousandeyes_sdk.dashboards.api.dashboards_api import DashboardsApi +from thousandeyes_sdk.core import Configuration, ApiClient, PaginatorIterator +from thousandeyes_sdk.dashboards import DashboardsApi +from itertools import islice -dashboards_api = DashboardsApi() -for widget_data in PaginatorIterator( - dashboards_api.get_dashboard_widget_data, - lambda response: response.data.tests if response.data else [], - dashboard_id="dashboard-id", - widget_id="widget-id", -): - print(widget_data) +configuration = Configuration( + host = "https://api.thousandeyes.com/v7", + access_token = "an_access_token", +) + + +def get_dashboard_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) ``` diff --git a/thousandeyes-sdk-core/src/thousandeyes_sdk/core/pagination_iterator.py b/thousandeyes-sdk-core/src/thousandeyes_sdk/core/pagination_iterator.py index 11b90a9f..cffe6fbd 100644 --- a/thousandeyes-sdk-core/src/thousandeyes_sdk/core/pagination_iterator.py +++ b/thousandeyes-sdk-core/src/thousandeyes_sdk/core/pagination_iterator.py @@ -60,7 +60,8 @@ class PaginatorIterator(Generic[P, R, I]): while True: 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 next_cursor = self._next_cursor_from_response(response) @@ -71,14 +72,10 @@ class PaginatorIterator(Generic[P, R, I]): last_cursor = next_cursor def _next_cursor_from_response(self, response: Any) -> Optional[str]: - data = getattr(response, "data", response) - links = getattr(data, "links", None) + links = getattr(response, "links", None) if links is None: - links = getattr(data, "_links", None) - - if links is None and isinstance(data, Mapping): - links = data.get("_links") or data.get("links") + links = getattr(response, "_links", None) if links is None: return None