Implement auto-pagination iterators for all endpoints

Implementation:
- Added iter_all() method to all sync endpoints
  - PagesEndpoint.iter_all() - automatic pagination for pages
  - UsersEndpoint.iter_all() - automatic pagination for users
  - GroupsEndpoint.iter_all() - iterate over all groups
  - AssetsEndpoint.iter_all() - iterate over all assets

- Added async iter_all() to all async endpoints
  - AsyncPagesEndpoint - async generator with pagination
  - AsyncUsersEndpoint - async generator with pagination
  - AsyncGroupsEndpoint - async iterator
  - AsyncAssetsEndpoint - async iterator

Features:
- Automatic batch fetching (configurable batch size, default: 50)
- Transparent pagination - users don't manage offsets
- Memory efficient - fetches data in chunks
- Filtering support - pass through all filter parameters
- Consistent interface across all endpoints

Usage:
  # Sync iteration
  for page in client.pages.iter_all(batch_size=100):
      print(page.title)

  # Async iteration
  async for user in client.users.iter_all():
      print(user.name)

Tests:
- 7 comprehensive pagination tests
- Single batch, multiple batch, and empty result scenarios
- Both sync and async iterator testing
- All tests passing (100%)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude
2025-10-22 20:45:59 +00:00
parent cbbf801d7c
commit 40b6640590
9 changed files with 484 additions and 1 deletions

View File

@@ -676,3 +676,62 @@ class PagesEndpoint(BaseEndpoint):
normalized["tags"] = []
return normalized
def iter_all(
self,
batch_size: int = 50,
search: Optional[str] = None,
tags: Optional[List[str]] = None,
locale: Optional[str] = None,
author_id: Optional[int] = None,
order_by: str = "title",
order_direction: str = "ASC",
):
"""Iterate over all pages with automatic pagination.
This method automatically handles pagination, fetching pages in batches
and yielding them one at a time.
Args:
batch_size: Number of pages to fetch per request (default: 50)
search: Search term to filter pages
tags: Filter by tags
locale: Filter by locale
author_id: Filter by author ID
order_by: Field to sort by
order_direction: Sort direction (ASC or DESC)
Yields:
Page objects one at a time
Example:
>>> for page in client.pages.iter_all():
... print(f"{page.title}: {page.path}")
>>>
>>> # With filtering
>>> for page in client.pages.iter_all(search="api", batch_size=100):
... print(page.title)
"""
offset = 0
while True:
batch = self.list(
limit=batch_size,
offset=offset,
search=search,
tags=tags,
locale=locale,
author_id=author_id,
order_by=order_by,
order_direction=order_direction,
)
if not batch:
break
for page in batch:
yield page
if len(batch) < batch_size:
break
offset += batch_size