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