Skip to content

Commit fc068ec

Browse files
feat: Neil/kernel 1017 profile pagination query parameter
1 parent 0bf69ce commit fc068ec

File tree

7 files changed

+129
-42
lines changed

7 files changed

+129
-42
lines changed

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 101
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-ea5c9cb25c29fa5a8758bbf8732eb306783bb6f13b4df29bf1ad5ad3cb32da1e.yml
3-
openapi_spec_hash: 597031840469b011f5cf22a4d8b9d750
4-
config_hash: 147340811dd6fbb9c2d80515a7e31f9a
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-fc4a441d80d9a26574ef8af390a0c76265f5d4190daf90a04b6b353b128bbd97.yml
3+
openapi_spec_hash: 192987649d3797c3a80e6ef201667b64
4+
config_hash: 8af430e19f4af86c05f2987241cae72f

api.md

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,17 +221,11 @@ Methods:
221221

222222
# Profiles
223223

224-
Types:
225-
226-
```python
227-
from kernel.types import ProfileListResponse
228-
```
229-
230224
Methods:
231225

232226
- <code title="post /profiles">client.profiles.<a href="./src/kernel/resources/profiles.py">create</a>(\*\*<a href="src/kernel/types/profile_create_params.py">params</a>) -> <a href="./src/kernel/types/profile.py">Profile</a></code>
233227
- <code title="get /profiles/{id_or_name}">client.profiles.<a href="./src/kernel/resources/profiles.py">retrieve</a>(id_or_name) -> <a href="./src/kernel/types/profile.py">Profile</a></code>
234-
- <code title="get /profiles">client.profiles.<a href="./src/kernel/resources/profiles.py">list</a>() -> <a href="./src/kernel/types/profile_list_response.py">ProfileListResponse</a></code>
228+
- <code title="get /profiles">client.profiles.<a href="./src/kernel/resources/profiles.py">list</a>(\*\*<a href="src/kernel/types/profile_list_params.py">params</a>) -> <a href="./src/kernel/types/profile.py">SyncOffsetPagination[Profile]</a></code>
235229
- <code title="delete /profiles/{id_or_name}">client.profiles.<a href="./src/kernel/resources/profiles.py">delete</a>(id_or_name) -> None</code>
236230
- <code title="get /profiles/{id_or_name}/download">client.profiles.<a href="./src/kernel/resources/profiles.py">download</a>(id_or_name) -> BinaryAPIResponse</code>
237231

src/kernel/resources/profiles.py

Lines changed: 78 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import httpx
66

7-
from ..types import profile_create_params
7+
from ..types import profile_list_params, profile_create_params
88
from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
99
from .._utils import maybe_transform, async_maybe_transform
1010
from .._compat import cached_property
@@ -23,9 +23,9 @@
2323
async_to_custom_raw_response_wrapper,
2424
async_to_custom_streamed_response_wrapper,
2525
)
26-
from .._base_client import make_request_options
26+
from ..pagination import SyncOffsetPagination, AsyncOffsetPagination
27+
from .._base_client import AsyncPaginator, make_request_options
2728
from ..types.profile import Profile
28-
from ..types.profile_list_response import ProfileListResponse
2929

3030
__all__ = ["ProfilesResource", "AsyncProfilesResource"]
3131

@@ -121,20 +121,52 @@ def retrieve(
121121
def list(
122122
self,
123123
*,
124+
limit: int | Omit = omit,
125+
offset: int | Omit = omit,
126+
query: str | Omit = omit,
124127
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
125128
# The extra values given here take precedence over values defined on the client or passed to this method.
126129
extra_headers: Headers | None = None,
127130
extra_query: Query | None = None,
128131
extra_body: Body | None = None,
129132
timeout: float | httpx.Timeout | None | NotGiven = not_given,
130-
) -> ProfileListResponse:
131-
"""List profiles with optional filtering and pagination."""
132-
return self._get(
133+
) -> SyncOffsetPagination[Profile]:
134+
"""
135+
List profiles with optional filtering and pagination.
136+
137+
Args:
138+
limit: Limit the number of profiles to return.
139+
140+
offset: Offset the number of profiles to return.
141+
142+
query: Search profiles by name or ID.
143+
144+
extra_headers: Send extra headers
145+
146+
extra_query: Add additional query parameters to the request
147+
148+
extra_body: Add additional JSON properties to the request
149+
150+
timeout: Override the client-level default timeout for this request, in seconds
151+
"""
152+
return self._get_api_list(
133153
"/profiles",
154+
page=SyncOffsetPagination[Profile],
134155
options=make_request_options(
135-
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
156+
extra_headers=extra_headers,
157+
extra_query=extra_query,
158+
extra_body=extra_body,
159+
timeout=timeout,
160+
query=maybe_transform(
161+
{
162+
"limit": limit,
163+
"offset": offset,
164+
"query": query,
165+
},
166+
profile_list_params.ProfileListParams,
167+
),
136168
),
137-
cast_to=ProfileListResponse,
169+
model=Profile,
138170
)
139171

140172
def delete(
@@ -296,23 +328,55 @@ async def retrieve(
296328
cast_to=Profile,
297329
)
298330

299-
async def list(
331+
def list(
300332
self,
301333
*,
334+
limit: int | Omit = omit,
335+
offset: int | Omit = omit,
336+
query: str | Omit = omit,
302337
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
303338
# The extra values given here take precedence over values defined on the client or passed to this method.
304339
extra_headers: Headers | None = None,
305340
extra_query: Query | None = None,
306341
extra_body: Body | None = None,
307342
timeout: float | httpx.Timeout | None | NotGiven = not_given,
308-
) -> ProfileListResponse:
309-
"""List profiles with optional filtering and pagination."""
310-
return await self._get(
343+
) -> AsyncPaginator[Profile, AsyncOffsetPagination[Profile]]:
344+
"""
345+
List profiles with optional filtering and pagination.
346+
347+
Args:
348+
limit: Limit the number of profiles to return.
349+
350+
offset: Offset the number of profiles to return.
351+
352+
query: Search profiles by name or ID.
353+
354+
extra_headers: Send extra headers
355+
356+
extra_query: Add additional query parameters to the request
357+
358+
extra_body: Add additional JSON properties to the request
359+
360+
timeout: Override the client-level default timeout for this request, in seconds
361+
"""
362+
return self._get_api_list(
311363
"/profiles",
364+
page=AsyncOffsetPagination[Profile],
312365
options=make_request_options(
313-
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
366+
extra_headers=extra_headers,
367+
extra_query=extra_query,
368+
extra_body=extra_body,
369+
timeout=timeout,
370+
query=maybe_transform(
371+
{
372+
"limit": limit,
373+
"offset": offset,
374+
"query": query,
375+
},
376+
profile_list_params.ProfileListParams,
377+
),
314378
),
315-
cast_to=ProfileListResponse,
379+
model=Profile,
316380
)
317381

318382
async def delete(

src/kernel/types/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from .browser_list_params import BrowserListParams as BrowserListParams
2222
from .browser_persistence import BrowserPersistence as BrowserPersistence
2323
from .credential_provider import CredentialProvider as CredentialProvider
24+
from .profile_list_params import ProfileListParams as ProfileListParams
2425
from .proxy_create_params import ProxyCreateParams as ProxyCreateParams
2526
from .proxy_list_response import ProxyListResponse as ProxyListResponse
2627
from .proxy_check_response import ProxyCheckResponse as ProxyCheckResponse
@@ -29,7 +30,6 @@
2930
from .browser_list_response import BrowserListResponse as BrowserListResponse
3031
from .browser_update_params import BrowserUpdateParams as BrowserUpdateParams
3132
from .profile_create_params import ProfileCreateParams as ProfileCreateParams
32-
from .profile_list_response import ProfileListResponse as ProfileListResponse
3333
from .proxy_create_response import ProxyCreateResponse as ProxyCreateResponse
3434
from .credential_list_params import CredentialListParams as CredentialListParams
3535
from .deployment_list_params import DeploymentListParams as DeploymentListParams
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
from typing_extensions import TypedDict
6+
7+
__all__ = ["ProfileListParams"]
8+
9+
10+
class ProfileListParams(TypedDict, total=False):
11+
limit: int
12+
"""Limit the number of profiles to return."""
13+
14+
offset: int
15+
"""Offset the number of profiles to return."""
16+
17+
query: str
18+
"""Search profiles by name or ID."""

src/kernel/types/profile_list_response.py

Lines changed: 0 additions & 10 deletions
This file was deleted.

tests/api_resources/test_profiles.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@
1111

1212
from kernel import Kernel, AsyncKernel
1313
from tests.utils import assert_matches_type
14-
from kernel.types import Profile, ProfileListResponse
14+
from kernel.types import Profile
1515
from kernel._response import (
1616
BinaryAPIResponse,
1717
AsyncBinaryAPIResponse,
1818
StreamedBinaryAPIResponse,
1919
AsyncStreamedBinaryAPIResponse,
2020
)
21+
from kernel.pagination import SyncOffsetPagination, AsyncOffsetPagination
2122

2223
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
2324

@@ -107,7 +108,17 @@ def test_path_params_retrieve(self, client: Kernel) -> None:
107108
@parametrize
108109
def test_method_list(self, client: Kernel) -> None:
109110
profile = client.profiles.list()
110-
assert_matches_type(ProfileListResponse, profile, path=["response"])
111+
assert_matches_type(SyncOffsetPagination[Profile], profile, path=["response"])
112+
113+
@pytest.mark.skip(reason="Mock server tests are disabled")
114+
@parametrize
115+
def test_method_list_with_all_params(self, client: Kernel) -> None:
116+
profile = client.profiles.list(
117+
limit=1,
118+
offset=0,
119+
query="query",
120+
)
121+
assert_matches_type(SyncOffsetPagination[Profile], profile, path=["response"])
111122

112123
@pytest.mark.skip(reason="Mock server tests are disabled")
113124
@parametrize
@@ -117,7 +128,7 @@ def test_raw_response_list(self, client: Kernel) -> None:
117128
assert response.is_closed is True
118129
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
119130
profile = response.parse()
120-
assert_matches_type(ProfileListResponse, profile, path=["response"])
131+
assert_matches_type(SyncOffsetPagination[Profile], profile, path=["response"])
121132

122133
@pytest.mark.skip(reason="Mock server tests are disabled")
123134
@parametrize
@@ -127,7 +138,7 @@ def test_streaming_response_list(self, client: Kernel) -> None:
127138
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
128139

129140
profile = response.parse()
130-
assert_matches_type(ProfileListResponse, profile, path=["response"])
141+
assert_matches_type(SyncOffsetPagination[Profile], profile, path=["response"])
131142

132143
assert cast(Any, response.is_closed) is True
133144

@@ -311,7 +322,17 @@ async def test_path_params_retrieve(self, async_client: AsyncKernel) -> None:
311322
@parametrize
312323
async def test_method_list(self, async_client: AsyncKernel) -> None:
313324
profile = await async_client.profiles.list()
314-
assert_matches_type(ProfileListResponse, profile, path=["response"])
325+
assert_matches_type(AsyncOffsetPagination[Profile], profile, path=["response"])
326+
327+
@pytest.mark.skip(reason="Mock server tests are disabled")
328+
@parametrize
329+
async def test_method_list_with_all_params(self, async_client: AsyncKernel) -> None:
330+
profile = await async_client.profiles.list(
331+
limit=1,
332+
offset=0,
333+
query="query",
334+
)
335+
assert_matches_type(AsyncOffsetPagination[Profile], profile, path=["response"])
315336

316337
@pytest.mark.skip(reason="Mock server tests are disabled")
317338
@parametrize
@@ -321,7 +342,7 @@ async def test_raw_response_list(self, async_client: AsyncKernel) -> None:
321342
assert response.is_closed is True
322343
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
323344
profile = await response.parse()
324-
assert_matches_type(ProfileListResponse, profile, path=["response"])
345+
assert_matches_type(AsyncOffsetPagination[Profile], profile, path=["response"])
325346

326347
@pytest.mark.skip(reason="Mock server tests are disabled")
327348
@parametrize
@@ -331,7 +352,7 @@ async def test_streaming_response_list(self, async_client: AsyncKernel) -> None:
331352
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
332353

333354
profile = await response.parse()
334-
assert_matches_type(ProfileListResponse, profile, path=["response"])
355+
assert_matches_type(AsyncOffsetPagination[Profile], profile, path=["response"])
335356

336357
assert cast(Any, response.is_closed) is True
337358

0 commit comments

Comments
 (0)