Skip to content

Commit b764734

Browse files
feat(api): define pagination schemes
1 parent 5a8130d commit b764734

File tree

9 files changed

+191
-74
lines changed

9 files changed

+191
-74
lines changed

.stats.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
configured_endpoints: 55
22
openapi_spec_hash: f17890d85522687a4c68702da9ad2efb
3-
config_hash: f44faee9ff5bdf66e9e38fc69f6e4daa
3+
config_hash: 86582a50eb22b2866777cbd4d94f4e8d

api.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ from codex.types.projects import (
212212
Methods:
213213

214214
- <code title="get /api/projects/{project_id}/query_logs/{query_log_id}">client.projects.query_logs.<a href="./src/codex/resources/projects/query_logs.py">retrieve</a>(query_log_id, \*, project_id) -> <a href="./src/codex/types/projects/query_log_retrieve_response.py">QueryLogRetrieveResponse</a></code>
215-
- <code title="get /api/projects/{project_id}/query_logs/">client.projects.query_logs.<a href="./src/codex/resources/projects/query_logs.py">list</a>(project_id, \*\*<a href="src/codex/types/projects/query_log_list_params.py">params</a>) -> <a href="./src/codex/types/projects/query_log_list_response.py">QueryLogListResponse</a></code>
215+
- <code title="get /api/projects/{project_id}/query_logs/">client.projects.query_logs.<a href="./src/codex/resources/projects/query_logs.py">list</a>(project_id, \*\*<a href="src/codex/types/projects/query_log_list_params.py">params</a>) -> <a href="./src/codex/types/projects/query_log_list_response.py">SyncOffsetPageQueryLogs[QueryLogListResponse]</a></code>
216216
- <code title="get /api/projects/{project_id}/query_logs/logs_by_group">client.projects.query_logs.<a href="./src/codex/resources/projects/query_logs.py">list_by_group</a>(project_id, \*\*<a href="src/codex/types/projects/query_log_list_by_group_params.py">params</a>) -> <a href="./src/codex/types/projects/query_log_list_by_group_response.py">QueryLogListByGroupResponse</a></code>
217217
- <code title="get /api/projects/{project_id}/query_logs/groups">client.projects.query_logs.<a href="./src/codex/resources/projects/query_logs.py">list_groups</a>(project_id, \*\*<a href="src/codex/types/projects/query_log_list_groups_params.py">params</a>) -> <a href="./src/codex/types/projects/query_log_list_groups_response.py">QueryLogListGroupsResponse</a></code>
218218
- <code title="post /api/projects/{project_id}/query_logs/{query_log_id}/start_remediation">client.projects.query_logs.<a href="./src/codex/resources/projects/query_logs.py">start_remediation</a>(query_log_id, \*, project_id) -> <a href="./src/codex/types/projects/query_log_start_remediation_response.py">QueryLogStartRemediationResponse</a></code>
@@ -240,7 +240,7 @@ Methods:
240240

241241
- <code title="post /api/projects/{project_id}/remediations/">client.projects.remediations.<a href="./src/codex/resources/projects/remediations.py">create</a>(project_id, \*\*<a href="src/codex/types/projects/remediation_create_params.py">params</a>) -> <a href="./src/codex/types/projects/remediation_create_response.py">RemediationCreateResponse</a></code>
242242
- <code title="get /api/projects/{project_id}/remediations/{remediation_id}">client.projects.remediations.<a href="./src/codex/resources/projects/remediations.py">retrieve</a>(remediation_id, \*, project_id) -> <a href="./src/codex/types/projects/remediation_retrieve_response.py">RemediationRetrieveResponse</a></code>
243-
- <code title="get /api/projects/{project_id}/remediations/">client.projects.remediations.<a href="./src/codex/resources/projects/remediations.py">list</a>(project_id, \*\*<a href="src/codex/types/projects/remediation_list_params.py">params</a>) -> <a href="./src/codex/types/projects/remediation_list_response.py">RemediationListResponse</a></code>
243+
- <code title="get /api/projects/{project_id}/remediations/">client.projects.remediations.<a href="./src/codex/resources/projects/remediations.py">list</a>(project_id, \*\*<a href="src/codex/types/projects/remediation_list_params.py">params</a>) -> <a href="./src/codex/types/projects/remediation_list_response.py">SyncOffsetPageRemediations[RemediationListResponse]</a></code>
244244
- <code title="delete /api/projects/{project_id}/remediations/{remediation_id}">client.projects.remediations.<a href="./src/codex/resources/projects/remediations.py">delete</a>(remediation_id, \*, project_id) -> None</code>
245245
- <code title="patch /api/projects/{project_id}/remediations/{remediation_id}/edit_answer">client.projects.remediations.<a href="./src/codex/resources/projects/remediations.py">edit_answer</a>(remediation_id, \*, project_id, \*\*<a href="src/codex/types/projects/remediation_edit_answer_params.py">params</a>) -> <a href="./src/codex/types/projects/remediation_edit_answer_response.py">RemediationEditAnswerResponse</a></code>
246246
- <code title="patch /api/projects/{project_id}/remediations/{remediation_id}/edit_draft_answer">client.projects.remediations.<a href="./src/codex/resources/projects/remediations.py">edit_draft_answer</a>(remediation_id, \*, project_id, \*\*<a href="src/codex/types/projects/remediation_edit_draft_answer_params.py">params</a>) -> <a href="./src/codex/types/projects/remediation_edit_draft_answer_response.py">RemediationEditDraftAnswerResponse</a></code>

src/codex/pagination.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
"AsyncMyOffsetPageTopLevelArray",
1515
"SyncOffsetPageClusters",
1616
"AsyncOffsetPageClusters",
17+
"SyncOffsetPageQueryLogs",
18+
"AsyncOffsetPageQueryLogs",
19+
"SyncOffsetPageRemediations",
20+
"AsyncOffsetPageRemediations",
1721
]
1822

1923
_BaseModelT = TypeVar("_BaseModelT", bound=BaseModel)
@@ -141,3 +145,123 @@ def next_page_info(self) -> Optional[PageInfo]:
141145
return PageInfo(params={"offset": current_count})
142146

143147
return None
148+
149+
150+
class SyncOffsetPageQueryLogs(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
151+
query_logs: List[_T]
152+
total_count: Optional[int] = None
153+
154+
@override
155+
def _get_page_items(self) -> List[_T]:
156+
query_logs = self.query_logs
157+
if not query_logs:
158+
return []
159+
return query_logs
160+
161+
@override
162+
def next_page_info(self) -> Optional[PageInfo]:
163+
offset = self._options.params.get("offset") or 0
164+
if not isinstance(offset, int):
165+
raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
166+
167+
length = len(self._get_page_items())
168+
current_count = offset + length
169+
170+
total_count = self.total_count
171+
if total_count is None:
172+
return None
173+
174+
if current_count < total_count:
175+
return PageInfo(params={"offset": current_count})
176+
177+
return None
178+
179+
180+
class AsyncOffsetPageQueryLogs(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
181+
query_logs: List[_T]
182+
total_count: Optional[int] = None
183+
184+
@override
185+
def _get_page_items(self) -> List[_T]:
186+
query_logs = self.query_logs
187+
if not query_logs:
188+
return []
189+
return query_logs
190+
191+
@override
192+
def next_page_info(self) -> Optional[PageInfo]:
193+
offset = self._options.params.get("offset") or 0
194+
if not isinstance(offset, int):
195+
raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
196+
197+
length = len(self._get_page_items())
198+
current_count = offset + length
199+
200+
total_count = self.total_count
201+
if total_count is None:
202+
return None
203+
204+
if current_count < total_count:
205+
return PageInfo(params={"offset": current_count})
206+
207+
return None
208+
209+
210+
class SyncOffsetPageRemediations(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
211+
remediations: List[_T]
212+
total_count: Optional[int] = None
213+
214+
@override
215+
def _get_page_items(self) -> List[_T]:
216+
remediations = self.remediations
217+
if not remediations:
218+
return []
219+
return remediations
220+
221+
@override
222+
def next_page_info(self) -> Optional[PageInfo]:
223+
offset = self._options.params.get("offset") or 0
224+
if not isinstance(offset, int):
225+
raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
226+
227+
length = len(self._get_page_items())
228+
current_count = offset + length
229+
230+
total_count = self.total_count
231+
if total_count is None:
232+
return None
233+
234+
if current_count < total_count:
235+
return PageInfo(params={"offset": current_count})
236+
237+
return None
238+
239+
240+
class AsyncOffsetPageRemediations(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
241+
remediations: List[_T]
242+
total_count: Optional[int] = None
243+
244+
@override
245+
def _get_page_items(self) -> List[_T]:
246+
remediations = self.remediations
247+
if not remediations:
248+
return []
249+
return remediations
250+
251+
@override
252+
def next_page_info(self) -> Optional[PageInfo]:
253+
offset = self._options.params.get("offset") or 0
254+
if not isinstance(offset, int):
255+
raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
256+
257+
length = len(self._get_page_items())
258+
current_count = offset + length
259+
260+
total_count = self.total_count
261+
if total_count is None:
262+
return None
263+
264+
if current_count < total_count:
265+
return PageInfo(params={"offset": current_count})
266+
267+
return None

src/codex/resources/projects/query_logs.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
async_to_raw_response_wrapper,
1919
async_to_streamed_response_wrapper,
2020
)
21-
from ..._base_client import make_request_options
21+
from ...pagination import SyncOffsetPageQueryLogs, AsyncOffsetPageQueryLogs
22+
from ..._base_client import AsyncPaginator, make_request_options
2223
from ...types.projects import query_log_list_params, query_log_list_groups_params, query_log_list_by_group_params
2324
from ...types.projects.query_log_list_response import QueryLogListResponse
2425
from ...types.projects.query_log_retrieve_response import QueryLogRetrieveResponse
@@ -110,7 +111,7 @@ def list(
110111
extra_query: Query | None = None,
111112
extra_body: Body | None = None,
112113
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
113-
) -> QueryLogListResponse:
114+
) -> SyncOffsetPageQueryLogs[QueryLogListResponse]:
114115
"""
115116
List query logs by project ID.
116117
@@ -141,8 +142,9 @@ def list(
141142
"""
142143
if not project_id:
143144
raise ValueError(f"Expected a non-empty value for `project_id` but received {project_id!r}")
144-
return self._get(
145+
return self._get_api_list(
145146
f"/api/projects/{project_id}/query_logs/",
147+
page=SyncOffsetPageQueryLogs[QueryLogListResponse],
146148
options=make_request_options(
147149
extra_headers=extra_headers,
148150
extra_query=extra_query,
@@ -166,7 +168,7 @@ def list(
166168
query_log_list_params.QueryLogListParams,
167169
),
168170
),
169-
cast_to=QueryLogListResponse,
171+
model=QueryLogListResponse,
170172
)
171173

172174
def list_by_group(
@@ -443,7 +445,7 @@ async def retrieve(
443445
cast_to=QueryLogRetrieveResponse,
444446
)
445447

446-
async def list(
448+
def list(
447449
self,
448450
project_id: str,
449451
*,
@@ -468,7 +470,7 @@ async def list(
468470
extra_query: Query | None = None,
469471
extra_body: Body | None = None,
470472
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
471-
) -> QueryLogListResponse:
473+
) -> AsyncPaginator[QueryLogListResponse, AsyncOffsetPageQueryLogs[QueryLogListResponse]]:
472474
"""
473475
List query logs by project ID.
474476
@@ -499,14 +501,15 @@ async def list(
499501
"""
500502
if not project_id:
501503
raise ValueError(f"Expected a non-empty value for `project_id` but received {project_id!r}")
502-
return await self._get(
504+
return self._get_api_list(
503505
f"/api/projects/{project_id}/query_logs/",
506+
page=AsyncOffsetPageQueryLogs[QueryLogListResponse],
504507
options=make_request_options(
505508
extra_headers=extra_headers,
506509
extra_query=extra_query,
507510
extra_body=extra_body,
508511
timeout=timeout,
509-
query=await async_maybe_transform(
512+
query=maybe_transform(
510513
{
511514
"created_at_end": created_at_end,
512515
"created_at_start": created_at_start,
@@ -524,7 +527,7 @@ async def list(
524527
query_log_list_params.QueryLogListParams,
525528
),
526529
),
527-
cast_to=QueryLogListResponse,
530+
model=QueryLogListResponse,
528531
)
529532

530533
async def list_by_group(

src/codex/resources/projects/remediations.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
async_to_raw_response_wrapper,
1919
async_to_streamed_response_wrapper,
2020
)
21-
from ..._base_client import make_request_options
21+
from ...pagination import SyncOffsetPageRemediations, AsyncOffsetPageRemediations
22+
from ..._base_client import AsyncPaginator, make_request_options
2223
from ...types.projects import (
2324
remediation_list_params,
2425
remediation_create_params,
@@ -159,7 +160,7 @@ def list(
159160
extra_query: Query | None = None,
160161
extra_body: Body | None = None,
161162
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
162-
) -> RemediationListResponse:
163+
) -> SyncOffsetPageRemediations[RemediationListResponse]:
163164
"""
164165
List remediations by project ID.
165166
@@ -186,8 +187,9 @@ def list(
186187
"""
187188
if not project_id:
188189
raise ValueError(f"Expected a non-empty value for `project_id` but received {project_id!r}")
189-
return self._get(
190+
return self._get_api_list(
190191
f"/api/projects/{project_id}/remediations/",
192+
page=SyncOffsetPageRemediations[RemediationListResponse],
191193
options=make_request_options(
192194
extra_headers=extra_headers,
193195
extra_query=extra_query,
@@ -209,7 +211,7 @@ def list(
209211
remediation_list_params.RemediationListParams,
210212
),
211213
),
212-
cast_to=RemediationListResponse,
214+
model=RemediationListResponse,
213215
)
214216

215217
def delete(
@@ -608,7 +610,7 @@ async def retrieve(
608610
cast_to=RemediationRetrieveResponse,
609611
)
610612

611-
async def list(
613+
def list(
612614
self,
613615
project_id: str,
614616
*,
@@ -628,7 +630,7 @@ async def list(
628630
extra_query: Query | None = None,
629631
extra_body: Body | None = None,
630632
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
631-
) -> RemediationListResponse:
633+
) -> AsyncPaginator[RemediationListResponse, AsyncOffsetPageRemediations[RemediationListResponse]]:
632634
"""
633635
List remediations by project ID.
634636
@@ -655,14 +657,15 @@ async def list(
655657
"""
656658
if not project_id:
657659
raise ValueError(f"Expected a non-empty value for `project_id` but received {project_id!r}")
658-
return await self._get(
660+
return self._get_api_list(
659661
f"/api/projects/{project_id}/remediations/",
662+
page=AsyncOffsetPageRemediations[RemediationListResponse],
660663
options=make_request_options(
661664
extra_headers=extra_headers,
662665
extra_query=extra_query,
663666
extra_body=extra_body,
664667
timeout=timeout,
665-
query=await async_maybe_transform(
668+
query=maybe_transform(
666669
{
667670
"created_at_end": created_at_end,
668671
"created_at_start": created_at_start,
@@ -678,7 +681,7 @@ async def list(
678681
remediation_list_params.RemediationListParams,
679682
),
680683
),
681-
cast_to=RemediationListResponse,
684+
model=RemediationListResponse,
682685
)
683686

684687
async def delete(

0 commit comments

Comments
 (0)