Source code for qiskit_quantuminspire.api.pagination
from typing import Any, Awaitable, Callable, Generic, List, Optional, TypeVar, Union, cast
from pydantic import BaseModel, Field
from typing_extensions import Annotated
PageType = TypeVar("PageType")
ItemType = TypeVar("ItemType")
[docs]
class PageInterface(BaseModel, Generic[ItemType]):
"""The page models in the generated API client don't inherit from a common base class, so we have to trick the
typing system a bit with this fake base class."""
items: List[ItemType]
total: Optional[Annotated[int, Field(strict=True, ge=0)]]
page: Optional[Annotated[int, Field(strict=True, ge=1)]]
size: Optional[Annotated[int, Field(strict=True, ge=1)]]
pages: Optional[Annotated[int, Field(strict=True, ge=0)]] = None
[docs]
class PageReader(Generic[PageType, ItemType]):
"""Helper class for reading fastapi-pagination style pages returned by the compute_api_client."""
[docs]
async def get_all(self, api_call: Callable[..., Awaitable[PageType]], **kwargs: Any) -> List[ItemType]:
"""Get all items from an API call that supports paging."""
items: List[ItemType] = []
page = 1
while True:
response = cast(PageInterface[ItemType], await api_call(page=page, **kwargs))
items.extend(response.items)
page += 1
if response.pages is None or page > response.pages:
break
return items
[docs]
async def get_single(self, api_call: Callable[..., Awaitable[PageType]], **kwargs: Any) -> Union[ItemType, None]:
"""Get a single item from an API call that supports paging."""
response = cast(PageInterface[ItemType], await api_call(**kwargs))
if len(response.items) > 1:
raise RuntimeError(f"Response contains more than one item -> {kwargs}.")
return response.items[0] if response.items else None