From e1925e9ed069875e4926f6efc85a59b9d325c668 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 21:26:37 +0000 Subject: [PATCH] fix: update pagination scheme --- api.md | 4 ++-- src/codex/pagination.py | 18 --------------- src/codex/resources/projects/entries.py | 22 ++++++++++--------- src/codex/types/projects/__init__.py | 1 - .../types/projects/entry_list_response.py | 14 ------------ tests/api_resources/projects/test_entries.py | 18 +++++++-------- 6 files changed, 23 insertions(+), 54 deletions(-) delete mode 100644 src/codex/types/projects/entry_list_response.py diff --git a/api.md b/api.md index 3665b5b..d4720cc 100644 --- a/api.md +++ b/api.md @@ -116,7 +116,7 @@ Methods: Types: ```python -from codex.types.projects import Entry, EntryListResponse +from codex.types.projects import Entry ``` Methods: @@ -124,7 +124,7 @@ Methods: - client.projects.entries.create(project_id, \*\*params) -> Entry - client.projects.entries.retrieve(entry_id, \*, project_id) -> Entry - client.projects.entries.update(entry_id, \*, project_id, \*\*params) -> Entry -- client.projects.entries.list(project_id, \*\*params) -> EntryListResponse +- client.projects.entries.list(project_id, \*\*params) -> SyncOffsetPageEntries[Entry] - client.projects.entries.delete(entry_id, \*, project_id) -> None - client.projects.entries.add_question(project_id, \*\*params) -> Entry - client.projects.entries.query(project_id, \*\*params) -> Optional[Entry] diff --git a/src/codex/pagination.py b/src/codex/pagination.py index b38b5f4..48ed501 100644 --- a/src/codex/pagination.py +++ b/src/codex/pagination.py @@ -112,15 +112,6 @@ def next_page_info(self) -> Optional[PageInfo]: return None - @classmethod - def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseModelT: # noqa: ARG003 - return cls.construct( - None, - **{ - **(cast(Mapping[str, Any], data) if is_mapping(data) else {"entries": data}), - }, - ) - class AsyncOffsetPageEntries(BaseAsyncPage[_T], BasePage[_T], Generic[_T]): entries: List[_T] @@ -150,12 +141,3 @@ def next_page_info(self) -> Optional[PageInfo]: return PageInfo(params={"offset": current_count}) return None - - @classmethod - def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseModelT: # noqa: ARG003 - return cls.construct( - None, - **{ - **(cast(Mapping[str, Any], data) if is_mapping(data) else {"entries": data}), - }, - ) diff --git a/src/codex/resources/projects/entries.py b/src/codex/resources/projects/entries.py index 6121842..59bc9f7 100644 --- a/src/codex/resources/projects/entries.py +++ b/src/codex/resources/projects/entries.py @@ -20,7 +20,8 @@ async_to_raw_response_wrapper, async_to_streamed_response_wrapper, ) -from ..._base_client import make_request_options +from ...pagination import SyncOffsetPageEntries, AsyncOffsetPageEntries +from ..._base_client import AsyncPaginator, make_request_options from ...types.projects import ( entry_list_params, entry_query_params, @@ -29,7 +30,6 @@ entry_add_question_params, ) from ...types.projects.entry import Entry -from ...types.projects.entry_list_response import EntryListResponse __all__ = ["EntriesResource", "AsyncEntriesResource"] @@ -187,7 +187,7 @@ def list( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> EntryListResponse: + ) -> SyncOffsetPageEntries[Entry]: """ List knowledge entries for a project. @@ -200,8 +200,9 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ - return self._get( + return self._get_api_list( f"/api/projects/{project_id}/entries/", + page=SyncOffsetPageEntries[Entry], options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -219,7 +220,7 @@ def list( entry_list_params.EntryListParams, ), ), - cast_to=EntryListResponse, + model=Entry, ) def delete( @@ -469,7 +470,7 @@ async def update( cast_to=Entry, ) - async def list( + def list( self, project_id: int, *, @@ -485,7 +486,7 @@ async def list( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> EntryListResponse: + ) -> AsyncPaginator[Entry, AsyncOffsetPageEntries[Entry]]: """ List knowledge entries for a project. @@ -498,14 +499,15 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ - return await self._get( + return self._get_api_list( f"/api/projects/{project_id}/entries/", + page=AsyncOffsetPageEntries[Entry], options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout, - query=await async_maybe_transform( + query=maybe_transform( { "answered_only": answered_only, "limit": limit, @@ -517,7 +519,7 @@ async def list( entry_list_params.EntryListParams, ), ), - cast_to=EntryListResponse, + model=Entry, ) async def delete( diff --git a/src/codex/types/projects/__init__.py b/src/codex/types/projects/__init__.py index b79e23f..44c304f 100644 --- a/src/codex/types/projects/__init__.py +++ b/src/codex/types/projects/__init__.py @@ -7,7 +7,6 @@ from .entry_list_params import EntryListParams as EntryListParams from .entry_query_params import EntryQueryParams as EntryQueryParams from .entry_create_params import EntryCreateParams as EntryCreateParams -from .entry_list_response import EntryListResponse as EntryListResponse from .entry_update_params import EntryUpdateParams as EntryUpdateParams from .access_key_create_params import AccessKeyCreateParams as AccessKeyCreateParams from .access_key_list_response import AccessKeyListResponse as AccessKeyListResponse diff --git a/src/codex/types/projects/entry_list_response.py b/src/codex/types/projects/entry_list_response.py deleted file mode 100644 index f415058..0000000 --- a/src/codex/types/projects/entry_list_response.py +++ /dev/null @@ -1,14 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import List - -from .entry import Entry -from ..._models import BaseModel - -__all__ = ["EntryListResponse"] - - -class EntryListResponse(BaseModel): - entries: List[Entry] - - total_count: int diff --git a/tests/api_resources/projects/test_entries.py b/tests/api_resources/projects/test_entries.py index 32f55fd..e1c36e3 100644 --- a/tests/api_resources/projects/test_entries.py +++ b/tests/api_resources/projects/test_entries.py @@ -9,9 +9,9 @@ from codex import Codex, AsyncCodex from tests.utils import assert_matches_type +from codex.pagination import SyncOffsetPageEntries, AsyncOffsetPageEntries from codex.types.projects import ( Entry, - EntryListResponse, ) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -176,7 +176,7 @@ def test_method_list(self, client: Codex) -> None: entry = client.projects.entries.list( project_id=0, ) - assert_matches_type(EntryListResponse, entry, path=["response"]) + assert_matches_type(SyncOffsetPageEntries[Entry], entry, path=["response"]) @pytest.mark.skip() @parametrize @@ -190,7 +190,7 @@ def test_method_list_with_all_params(self, client: Codex) -> None: sort="created_at", unanswered_only=True, ) - assert_matches_type(EntryListResponse, entry, path=["response"]) + assert_matches_type(SyncOffsetPageEntries[Entry], entry, path=["response"]) @pytest.mark.skip() @parametrize @@ -202,7 +202,7 @@ def test_raw_response_list(self, client: Codex) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" entry = response.parse() - assert_matches_type(EntryListResponse, entry, path=["response"]) + assert_matches_type(SyncOffsetPageEntries[Entry], entry, path=["response"]) @pytest.mark.skip() @parametrize @@ -214,7 +214,7 @@ def test_streaming_response_list(self, client: Codex) -> None: assert response.http_request.headers.get("X-Stainless-Lang") == "python" entry = response.parse() - assert_matches_type(EntryListResponse, entry, path=["response"]) + assert_matches_type(SyncOffsetPageEntries[Entry], entry, path=["response"]) assert cast(Any, response.is_closed) is True @@ -498,7 +498,7 @@ async def test_method_list(self, async_client: AsyncCodex) -> None: entry = await async_client.projects.entries.list( project_id=0, ) - assert_matches_type(EntryListResponse, entry, path=["response"]) + assert_matches_type(AsyncOffsetPageEntries[Entry], entry, path=["response"]) @pytest.mark.skip() @parametrize @@ -512,7 +512,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncCodex) -> No sort="created_at", unanswered_only=True, ) - assert_matches_type(EntryListResponse, entry, path=["response"]) + assert_matches_type(AsyncOffsetPageEntries[Entry], entry, path=["response"]) @pytest.mark.skip() @parametrize @@ -524,7 +524,7 @@ async def test_raw_response_list(self, async_client: AsyncCodex) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" entry = await response.parse() - assert_matches_type(EntryListResponse, entry, path=["response"]) + assert_matches_type(AsyncOffsetPageEntries[Entry], entry, path=["response"]) @pytest.mark.skip() @parametrize @@ -536,7 +536,7 @@ async def test_streaming_response_list(self, async_client: AsyncCodex) -> None: assert response.http_request.headers.get("X-Stainless-Lang") == "python" entry = await response.parse() - assert_matches_type(EntryListResponse, entry, path=["response"]) + assert_matches_type(AsyncOffsetPageEntries[Entry], entry, path=["response"]) assert cast(Any, response.is_closed) is True