diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 000572ec..b0699969 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0-alpha.13" + ".": "0.1.0-alpha.14" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index f0d8544e..2b23cedd 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 6 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-19b0d17ba368f32827ee322d15a7f4ff7e1f3bbf66606fad227b3465f8ffc5ab.yml -openapi_spec_hash: 4a3cb766898e8a134ef99fe6c4c87736 +configured_endpoints: 7 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-c9d64df733f286f09d2203f4e3d820ce57e8d4c629c5e2db4e2bfac91fbc1598.yml +openapi_spec_hash: fa407611fc566d55f403864fbfaa6c23 config_hash: 4dfa4d870ce0e23e31ce33ab6a53dd21 diff --git a/CHANGELOG.md b/CHANGELOG.md index 49c41f1a..d6257f94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.1.0-alpha.14 (2025-05-20) + +Full Changelog: [v0.1.0-alpha.13...v0.1.0-alpha.14](https://github.com/onkernel/kernel-python-sdk/compare/v0.1.0-alpha.13...v0.1.0-alpha.14) + +### Features + +* **api:** update via SDK Studio ([43ca550](https://github.com/onkernel/kernel-python-sdk/commit/43ca55001379577ccd8f76106ba61d34e4d19579)) + ## 0.1.0-alpha.13 (2025-05-20) Full Changelog: [v0.1.0-alpha.12...v0.1.0-alpha.13](https://github.com/onkernel/kernel-python-sdk/compare/v0.1.0-alpha.12...v0.1.0-alpha.13) diff --git a/api.md b/api.md index 32a9bb03..63d7b00d 100644 --- a/api.md +++ b/api.md @@ -1,5 +1,15 @@ # Apps +Types: + +```python +from kernel.types import AppListResponse +``` + +Methods: + +- client.apps.list(\*\*params) -> AppListResponse + ## Deployments Types: diff --git a/pyproject.toml b/pyproject.toml index 4e20f732..ad8a73b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kernel" -version = "0.1.0-alpha.13" +version = "0.1.0-alpha.14" description = "The official Python library for the kernel API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/kernel/_version.py b/src/kernel/_version.py index d48ee69d..3ee690e4 100644 --- a/src/kernel/_version.py +++ b/src/kernel/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "kernel" -__version__ = "0.1.0-alpha.13" # x-release-please-version +__version__ = "0.1.0-alpha.14" # x-release-please-version diff --git a/src/kernel/resources/apps/apps.py b/src/kernel/resources/apps/apps.py index 848b765b..9a5f6670 100644 --- a/src/kernel/resources/apps/apps.py +++ b/src/kernel/resources/apps/apps.py @@ -2,8 +2,19 @@ from __future__ import annotations +import httpx + +from ...types import app_list_params +from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from ..._utils import maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource +from ..._response import ( + to_raw_response_wrapper, + to_streamed_response_wrapper, + async_to_raw_response_wrapper, + async_to_streamed_response_wrapper, +) from .deployments import ( DeploymentsResource, AsyncDeploymentsResource, @@ -20,6 +31,8 @@ InvocationsResourceWithStreamingResponse, AsyncInvocationsResourceWithStreamingResponse, ) +from ..._base_client import make_request_options +from ...types.app_list_response import AppListResponse __all__ = ["AppsResource", "AsyncAppsResource"] @@ -52,6 +65,54 @@ def with_streaming_response(self) -> AppsResourceWithStreamingResponse: """ return AppsResourceWithStreamingResponse(self) + def list( + self, + *, + app_name: str | NotGiven = NOT_GIVEN, + version: str | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> AppListResponse: + """List application versions for the authenticated user. + + Optionally filter by app + name and/or version label. + + Args: + app_name: Filter results by application name. + + version: Filter results by version label. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get( + "/apps", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "app_name": app_name, + "version": version, + }, + app_list_params.AppListParams, + ), + ), + cast_to=AppListResponse, + ) + class AsyncAppsResource(AsyncAPIResource): @cached_property @@ -81,11 +142,63 @@ def with_streaming_response(self) -> AsyncAppsResourceWithStreamingResponse: """ return AsyncAppsResourceWithStreamingResponse(self) + async def list( + self, + *, + app_name: str | NotGiven = NOT_GIVEN, + version: str | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> AppListResponse: + """List application versions for the authenticated user. + + Optionally filter by app + name and/or version label. + + Args: + app_name: Filter results by application name. + + version: Filter results by version label. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return await self._get( + "/apps", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + { + "app_name": app_name, + "version": version, + }, + app_list_params.AppListParams, + ), + ), + cast_to=AppListResponse, + ) + class AppsResourceWithRawResponse: def __init__(self, apps: AppsResource) -> None: self._apps = apps + self.list = to_raw_response_wrapper( + apps.list, + ) + @cached_property def deployments(self) -> DeploymentsResourceWithRawResponse: return DeploymentsResourceWithRawResponse(self._apps.deployments) @@ -99,6 +212,10 @@ class AsyncAppsResourceWithRawResponse: def __init__(self, apps: AsyncAppsResource) -> None: self._apps = apps + self.list = async_to_raw_response_wrapper( + apps.list, + ) + @cached_property def deployments(self) -> AsyncDeploymentsResourceWithRawResponse: return AsyncDeploymentsResourceWithRawResponse(self._apps.deployments) @@ -112,6 +229,10 @@ class AppsResourceWithStreamingResponse: def __init__(self, apps: AppsResource) -> None: self._apps = apps + self.list = to_streamed_response_wrapper( + apps.list, + ) + @cached_property def deployments(self) -> DeploymentsResourceWithStreamingResponse: return DeploymentsResourceWithStreamingResponse(self._apps.deployments) @@ -125,6 +246,10 @@ class AsyncAppsResourceWithStreamingResponse: def __init__(self, apps: AsyncAppsResource) -> None: self._apps = apps + self.list = async_to_streamed_response_wrapper( + apps.list, + ) + @cached_property def deployments(self) -> AsyncDeploymentsResourceWithStreamingResponse: return AsyncDeploymentsResourceWithStreamingResponse(self._apps.deployments) diff --git a/src/kernel/types/__init__.py b/src/kernel/types/__init__.py index 282c8899..e7c3cecd 100644 --- a/src/kernel/types/__init__.py +++ b/src/kernel/types/__init__.py @@ -2,6 +2,8 @@ from __future__ import annotations +from .app_list_params import AppListParams as AppListParams +from .app_list_response import AppListResponse as AppListResponse from .browser_create_params import BrowserCreateParams as BrowserCreateParams from .browser_create_response import BrowserCreateResponse as BrowserCreateResponse from .browser_retrieve_response import BrowserRetrieveResponse as BrowserRetrieveResponse diff --git a/src/kernel/types/app_list_params.py b/src/kernel/types/app_list_params.py new file mode 100644 index 00000000..d4506a3e --- /dev/null +++ b/src/kernel/types/app_list_params.py @@ -0,0 +1,15 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import TypedDict + +__all__ = ["AppListParams"] + + +class AppListParams(TypedDict, total=False): + app_name: str + """Filter results by application name.""" + + version: str + """Filter results by version label.""" diff --git a/src/kernel/types/app_list_response.py b/src/kernel/types/app_list_response.py new file mode 100644 index 00000000..8a6f6218 --- /dev/null +++ b/src/kernel/types/app_list_response.py @@ -0,0 +1,28 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Dict, List, Optional +from typing_extensions import TypeAlias + +from .._models import BaseModel + +__all__ = ["AppListResponse", "AppListResponseItem"] + + +class AppListResponseItem(BaseModel): + id: str + """Unique identifier for the app version""" + + app_name: str + """Name of the application""" + + region: str + """Deployment region code""" + + version: str + """Version label for the application""" + + env_vars: Optional[Dict[str, str]] = None + """Environment variables configured for this app version""" + + +AppListResponse: TypeAlias = List[AppListResponseItem] diff --git a/tests/api_resources/test_apps.py b/tests/api_resources/test_apps.py new file mode 100644 index 00000000..b902576a --- /dev/null +++ b/tests/api_resources/test_apps.py @@ -0,0 +1,96 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from kernel import Kernel, AsyncKernel +from tests.utils import assert_matches_type +from kernel.types import AppListResponse + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestApps: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @pytest.mark.skip() + @parametrize + def test_method_list(self, client: Kernel) -> None: + app = client.apps.list() + assert_matches_type(AppListResponse, app, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_method_list_with_all_params(self, client: Kernel) -> None: + app = client.apps.list( + app_name="app_name", + version="version", + ) + assert_matches_type(AppListResponse, app, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_raw_response_list(self, client: Kernel) -> None: + response = client.apps.with_raw_response.list() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + app = response.parse() + assert_matches_type(AppListResponse, app, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_streaming_response_list(self, client: Kernel) -> None: + with client.apps.with_streaming_response.list() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + app = response.parse() + assert_matches_type(AppListResponse, app, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncApps: + parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) + + @pytest.mark.skip() + @parametrize + async def test_method_list(self, async_client: AsyncKernel) -> None: + app = await async_client.apps.list() + assert_matches_type(AppListResponse, app, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_method_list_with_all_params(self, async_client: AsyncKernel) -> None: + app = await async_client.apps.list( + app_name="app_name", + version="version", + ) + assert_matches_type(AppListResponse, app, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_raw_response_list(self, async_client: AsyncKernel) -> None: + response = await async_client.apps.with_raw_response.list() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + app = await response.parse() + assert_matches_type(AppListResponse, app, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_streaming_response_list(self, async_client: AsyncKernel) -> None: + async with async_client.apps.with_streaming_response.list() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + app = await response.parse() + assert_matches_type(AppListResponse, app, path=["response"]) + + assert cast(Any, response.is_closed) is True