Skip to content

Commit 41f00af

Browse files
fix: update pagination scheme (#10)
1 parent e8499dc commit 41f00af

File tree

1 file changed

+111
-4
lines changed

1 file changed

+111
-4
lines changed

src/codex/pagination.py

Lines changed: 111 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
from typing import List, Generic, TypeVar, Optional
3+
from typing import Any, List, Type, Generic, Mapping, TypeVar, Optional, cast
44
from typing_extensions import override
55

6+
from httpx import Response
7+
8+
from ._utils import is_mapping
9+
from ._models import BaseModel
610
from ._base_client import BasePage, PageInfo, BaseSyncPage, BaseAsyncPage
711

8-
__all__ = ["SyncMyOffsetPage", "AsyncMyOffsetPage"]
12+
__all__ = [
13+
"SyncMyOffsetPageTopLevelArray",
14+
"AsyncMyOffsetPageTopLevelArray",
15+
"SyncOffsetPageEntries",
16+
"AsyncOffsetPageEntries",
17+
]
18+
19+
_BaseModelT = TypeVar("_BaseModelT", bound=BaseModel)
920

1021
_T = TypeVar("_T")
1122

1223

13-
class SyncMyOffsetPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
24+
class SyncMyOffsetPageTopLevelArray(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
1425
items: List[_T]
1526

1627
@override
@@ -31,8 +42,17 @@ def next_page_info(self) -> Optional[PageInfo]:
3142

3243
return PageInfo(params={"offset": current_count})
3344

45+
@classmethod
46+
def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseModelT: # noqa: ARG003
47+
return cls.construct(
48+
None,
49+
**{
50+
**(cast(Mapping[str, Any], data) if is_mapping(data) else {"items": data}),
51+
},
52+
)
53+
3454

35-
class AsyncMyOffsetPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
55+
class AsyncMyOffsetPageTopLevelArray(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
3656
items: List[_T]
3757

3858
@override
@@ -52,3 +72,90 @@ def next_page_info(self) -> Optional[PageInfo]:
5272
current_count = offset + length
5373

5474
return PageInfo(params={"offset": current_count})
75+
76+
@classmethod
77+
def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseModelT: # noqa: ARG003
78+
return cls.construct(
79+
None,
80+
**{
81+
**(cast(Mapping[str, Any], data) if is_mapping(data) else {"items": data}),
82+
},
83+
)
84+
85+
86+
class SyncOffsetPageEntries(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
87+
entries: List[_T]
88+
total_count: Optional[int] = None
89+
90+
@override
91+
def _get_page_items(self) -> List[_T]:
92+
entries = self.entries
93+
if not entries:
94+
return []
95+
return entries
96+
97+
@override
98+
def next_page_info(self) -> Optional[PageInfo]:
99+
offset = self._options.params.get("offset") or 0
100+
if not isinstance(offset, int):
101+
raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
102+
103+
length = len(self._get_page_items())
104+
current_count = offset + length
105+
106+
total_count = self.total_count
107+
if total_count is None:
108+
return None
109+
110+
if current_count < total_count:
111+
return PageInfo(params={"offset": current_count})
112+
113+
return None
114+
115+
@classmethod
116+
def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseModelT: # noqa: ARG003
117+
return cls.construct(
118+
None,
119+
**{
120+
**(cast(Mapping[str, Any], data) if is_mapping(data) else {"entries": data}),
121+
},
122+
)
123+
124+
125+
class AsyncOffsetPageEntries(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
126+
entries: List[_T]
127+
total_count: Optional[int] = None
128+
129+
@override
130+
def _get_page_items(self) -> List[_T]:
131+
entries = self.entries
132+
if not entries:
133+
return []
134+
return entries
135+
136+
@override
137+
def next_page_info(self) -> Optional[PageInfo]:
138+
offset = self._options.params.get("offset") or 0
139+
if not isinstance(offset, int):
140+
raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
141+
142+
length = len(self._get_page_items())
143+
current_count = offset + length
144+
145+
total_count = self.total_count
146+
if total_count is None:
147+
return None
148+
149+
if current_count < total_count:
150+
return PageInfo(params={"offset": current_count})
151+
152+
return None
153+
154+
@classmethod
155+
def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseModelT: # noqa: ARG003
156+
return cls.construct(
157+
None,
158+
**{
159+
**(cast(Mapping[str, Any], data) if is_mapping(data) else {"entries": data}),
160+
},
161+
)

0 commit comments

Comments
 (0)