Skip to content

Commit 796da0a

Browse files
feat(api): api update (#188)
1 parent 44964cb commit 796da0a

7 files changed

Lines changed: 226 additions & 2 deletions

File tree

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
configured_endpoints: 27
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-c56cac6f18dfcb269710c97b59e78c611f00fabf2ffcbee728de67e02e154a3a.yml
1+
configured_endpoints: 28
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-0df6d6ebd504bc4dd8734a3e0ddc1eb48adb3e93dcbd9f693a45421276733887.yml

api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ from runloop_api_client.types import (
5454
DevboxListView,
5555
DevboxView,
5656
DevboxCreateSSHKeyResponse,
57+
DevboxDiskSnapshotsResponse,
5758
DevboxReadFileContentsResponse,
5859
DevboxUploadFileResponse,
5960
)
@@ -65,6 +66,7 @@ Methods:
6566
- <code title="get /v1/devboxes/{id}">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/devbox_view.py">DevboxView</a></code>
6667
- <code title="get /v1/devboxes">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">list</a>(\*\*<a href="src/runloop_api_client/types/devbox_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_list_view.py">DevboxListView</a></code>
6768
- <code title="post /v1/devboxes/{id}/create_ssh_key">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">create_ssh_key</a>(id) -> <a href="./src/runloop_api_client/types/devbox_create_ssh_key_response.py">DevboxCreateSSHKeyResponse</a></code>
69+
- <code title="get /v1/devboxes/disk_snapshots">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">disk_snapshots</a>(\*\*<a href="src/runloop_api_client/types/devbox_disk_snapshots_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_disk_snapshots_response.py">DevboxDiskSnapshotsResponse</a></code>
6870
- <code title="post /v1/devboxes/{id}/download_file">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">download_file</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_download_file_params.py">params</a>) -> BinaryAPIResponse</code>
6971
- <code title="post /v1/devboxes/{id}/execute_async">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">execute_async</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_execute_async_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_async_execution_detail_view.py">DevboxAsyncExecutionDetailView</a></code>
7072
- <code title="post /v1/devboxes/{id}/execute_sync">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">execute_sync</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_execute_sync_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_execution_detail_view.py">DevboxExecutionDetailView</a></code>

src/runloop_api_client/resources/devboxes/devboxes.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
devbox_execute_sync_params,
2323
devbox_download_file_params,
2424
devbox_execute_async_params,
25+
devbox_disk_snapshots_params,
2526
devbox_read_file_contents_params,
2627
)
2728
from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven, FileTypes
@@ -61,6 +62,7 @@
6162
from ...types.code_mount_parameters_param import CodeMountParametersParam
6263
from ...types.devbox_execution_detail_view import DevboxExecutionDetailView
6364
from ...types.devbox_create_ssh_key_response import DevboxCreateSSHKeyResponse
65+
from ...types.devbox_disk_snapshots_response import DevboxDiskSnapshotsResponse
6466
from ...types.devbox_async_execution_detail_view import DevboxAsyncExecutionDetailView
6567

6668
__all__ = ["DevboxesResource", "AsyncDevboxesResource"]
@@ -304,6 +306,52 @@ def create_ssh_key(
304306
cast_to=DevboxCreateSSHKeyResponse,
305307
)
306308

309+
def disk_snapshots(
310+
self,
311+
*,
312+
limit: int | NotGiven = NOT_GIVEN,
313+
starting_after: str | NotGiven = NOT_GIVEN,
314+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
315+
# The extra values given here take precedence over values defined on the client or passed to this method.
316+
extra_headers: Headers | None = None,
317+
extra_query: Query | None = None,
318+
extra_body: Body | None = None,
319+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
320+
) -> DevboxDiskSnapshotsResponse:
321+
"""
322+
List all snapshots of a devbox by id.
323+
324+
Args:
325+
limit: Page Limit
326+
327+
starting_after: Load the next page starting after the given token.
328+
329+
extra_headers: Send extra headers
330+
331+
extra_query: Add additional query parameters to the request
332+
333+
extra_body: Add additional JSON properties to the request
334+
335+
timeout: Override the client-level default timeout for this request, in seconds
336+
"""
337+
return self._get(
338+
"/v1/devboxes/disk_snapshots",
339+
options=make_request_options(
340+
extra_headers=extra_headers,
341+
extra_query=extra_query,
342+
extra_body=extra_body,
343+
timeout=timeout,
344+
query=maybe_transform(
345+
{
346+
"limit": limit,
347+
"starting_after": starting_after,
348+
},
349+
devbox_disk_snapshots_params.DevboxDiskSnapshotsParams,
350+
),
351+
),
352+
cast_to=DevboxDiskSnapshotsResponse,
353+
)
354+
307355
def download_file(
308356
self,
309357
id: str,
@@ -841,6 +889,52 @@ async def create_ssh_key(
841889
cast_to=DevboxCreateSSHKeyResponse,
842890
)
843891

892+
async def disk_snapshots(
893+
self,
894+
*,
895+
limit: int | NotGiven = NOT_GIVEN,
896+
starting_after: str | NotGiven = NOT_GIVEN,
897+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
898+
# The extra values given here take precedence over values defined on the client or passed to this method.
899+
extra_headers: Headers | None = None,
900+
extra_query: Query | None = None,
901+
extra_body: Body | None = None,
902+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
903+
) -> DevboxDiskSnapshotsResponse:
904+
"""
905+
List all snapshots of a devbox by id.
906+
907+
Args:
908+
limit: Page Limit
909+
910+
starting_after: Load the next page starting after the given token.
911+
912+
extra_headers: Send extra headers
913+
914+
extra_query: Add additional query parameters to the request
915+
916+
extra_body: Add additional JSON properties to the request
917+
918+
timeout: Override the client-level default timeout for this request, in seconds
919+
"""
920+
return await self._get(
921+
"/v1/devboxes/disk_snapshots",
922+
options=make_request_options(
923+
extra_headers=extra_headers,
924+
extra_query=extra_query,
925+
extra_body=extra_body,
926+
timeout=timeout,
927+
query=await async_maybe_transform(
928+
{
929+
"limit": limit,
930+
"starting_after": starting_after,
931+
},
932+
devbox_disk_snapshots_params.DevboxDiskSnapshotsParams,
933+
),
934+
),
935+
cast_to=DevboxDiskSnapshotsResponse,
936+
)
937+
844938
async def download_file(
845939
self,
846940
id: str,
@@ -1156,6 +1250,9 @@ def __init__(self, devboxes: DevboxesResource) -> None:
11561250
self.create_ssh_key = to_raw_response_wrapper(
11571251
devboxes.create_ssh_key,
11581252
)
1253+
self.disk_snapshots = to_raw_response_wrapper(
1254+
devboxes.disk_snapshots,
1255+
)
11591256
self.download_file = to_custom_raw_response_wrapper(
11601257
devboxes.download_file,
11611258
BinaryAPIResponse,
@@ -1204,6 +1301,9 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
12041301
self.create_ssh_key = async_to_raw_response_wrapper(
12051302
devboxes.create_ssh_key,
12061303
)
1304+
self.disk_snapshots = async_to_raw_response_wrapper(
1305+
devboxes.disk_snapshots,
1306+
)
12071307
self.download_file = async_to_custom_raw_response_wrapper(
12081308
devboxes.download_file,
12091309
AsyncBinaryAPIResponse,
@@ -1252,6 +1352,9 @@ def __init__(self, devboxes: DevboxesResource) -> None:
12521352
self.create_ssh_key = to_streamed_response_wrapper(
12531353
devboxes.create_ssh_key,
12541354
)
1355+
self.disk_snapshots = to_streamed_response_wrapper(
1356+
devboxes.disk_snapshots,
1357+
)
12551358
self.download_file = to_custom_streamed_response_wrapper(
12561359
devboxes.download_file,
12571360
StreamedBinaryAPIResponse,
@@ -1300,6 +1403,9 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
13001403
self.create_ssh_key = async_to_streamed_response_wrapper(
13011404
devboxes.create_ssh_key,
13021405
)
1406+
self.disk_snapshots = async_to_streamed_response_wrapper(
1407+
devboxes.disk_snapshots,
1408+
)
13031409
self.download_file = async_to_custom_streamed_response_wrapper(
13041410
devboxes.download_file,
13051411
AsyncStreamedBinaryAPIResponse,

src/runloop_api_client/types/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@
2929
from .devbox_download_file_params import DevboxDownloadFileParams as DevboxDownloadFileParams
3030
from .devbox_execute_async_params import DevboxExecuteAsyncParams as DevboxExecuteAsyncParams
3131
from .function_invoke_sync_params import FunctionInvokeSyncParams as FunctionInvokeSyncParams
32+
from .devbox_disk_snapshots_params import DevboxDiskSnapshotsParams as DevboxDiskSnapshotsParams
3233
from .devbox_execution_detail_view import DevboxExecutionDetailView as DevboxExecutionDetailView
3334
from .function_invoke_async_params import FunctionInvokeAsyncParams as FunctionInvokeAsyncParams
3435
from .blueprint_build_logs_list_view import BlueprintBuildLogsListView as BlueprintBuildLogsListView
3536
from .devbox_create_ssh_key_response import DevboxCreateSSHKeyResponse as DevboxCreateSSHKeyResponse
37+
from .devbox_disk_snapshots_response import DevboxDiskSnapshotsResponse as DevboxDiskSnapshotsResponse
3638
from .devbox_read_file_contents_params import DevboxReadFileContentsParams as DevboxReadFileContentsParams
3739
from .devbox_async_execution_detail_view import DevboxAsyncExecutionDetailView as DevboxAsyncExecutionDetailView
3840
from .devbox_read_file_contents_response import DevboxReadFileContentsResponse as DevboxReadFileContentsResponse
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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__ = ["DevboxDiskSnapshotsParams"]
8+
9+
10+
class DevboxDiskSnapshotsParams(TypedDict, total=False):
11+
limit: int
12+
"""Page Limit"""
13+
14+
starting_after: str
15+
"""Load the next page starting after the given token."""
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Dict, List, Optional
4+
5+
from pydantic import Field as FieldInfo
6+
7+
from .._models import BaseModel
8+
9+
__all__ = ["DevboxDiskSnapshotsResponse", "Snapshot"]
10+
11+
12+
class Snapshot(BaseModel):
13+
id: str
14+
"""The unique identifier of the snapshot."""
15+
16+
metadata: Dict[str, str]
17+
"""metadata associated with the snapshot."""
18+
19+
source_devbox_id: str = FieldInfo(alias="sourceDevboxId")
20+
"""The source devbox identifier."""
21+
22+
name: Optional[str] = None
23+
"""(Optional) The custom name of the snapshot."""
24+
25+
26+
class DevboxDiskSnapshotsResponse(BaseModel):
27+
has_more: bool
28+
29+
snapshots: List[Snapshot]
30+
"""List of snapshots matching filter."""
31+
32+
total_count: int

tests/api_resources/test_devboxes.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
DevboxListView,
1717
DevboxExecutionDetailView,
1818
DevboxCreateSSHKeyResponse,
19+
DevboxDiskSnapshotsResponse,
1920
DevboxAsyncExecutionDetailView,
2021
)
2122
from runloop_api_client._response import (
@@ -207,6 +208,39 @@ def test_path_params_create_ssh_key(self, client: Runloop) -> None:
207208
"",
208209
)
209210

211+
@parametrize
212+
def test_method_disk_snapshots(self, client: Runloop) -> None:
213+
devbox = client.devboxes.disk_snapshots()
214+
assert_matches_type(DevboxDiskSnapshotsResponse, devbox, path=["response"])
215+
216+
@parametrize
217+
def test_method_disk_snapshots_with_all_params(self, client: Runloop) -> None:
218+
devbox = client.devboxes.disk_snapshots(
219+
limit=0,
220+
starting_after="starting_after",
221+
)
222+
assert_matches_type(DevboxDiskSnapshotsResponse, devbox, path=["response"])
223+
224+
@parametrize
225+
def test_raw_response_disk_snapshots(self, client: Runloop) -> None:
226+
response = client.devboxes.with_raw_response.disk_snapshots()
227+
228+
assert response.is_closed is True
229+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
230+
devbox = response.parse()
231+
assert_matches_type(DevboxDiskSnapshotsResponse, devbox, path=["response"])
232+
233+
@parametrize
234+
def test_streaming_response_disk_snapshots(self, client: Runloop) -> None:
235+
with client.devboxes.with_streaming_response.disk_snapshots() as response:
236+
assert not response.is_closed
237+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
238+
239+
devbox = response.parse()
240+
assert_matches_type(DevboxDiskSnapshotsResponse, devbox, path=["response"])
241+
242+
assert cast(Any, response.is_closed) is True
243+
210244
@parametrize
211245
@pytest.mark.respx(base_url=base_url)
212246
def test_method_download_file(self, client: Runloop, respx_mock: MockRouter) -> None:
@@ -716,6 +750,39 @@ async def test_path_params_create_ssh_key(self, async_client: AsyncRunloop) -> N
716750
"",
717751
)
718752

753+
@parametrize
754+
async def test_method_disk_snapshots(self, async_client: AsyncRunloop) -> None:
755+
devbox = await async_client.devboxes.disk_snapshots()
756+
assert_matches_type(DevboxDiskSnapshotsResponse, devbox, path=["response"])
757+
758+
@parametrize
759+
async def test_method_disk_snapshots_with_all_params(self, async_client: AsyncRunloop) -> None:
760+
devbox = await async_client.devboxes.disk_snapshots(
761+
limit=0,
762+
starting_after="starting_after",
763+
)
764+
assert_matches_type(DevboxDiskSnapshotsResponse, devbox, path=["response"])
765+
766+
@parametrize
767+
async def test_raw_response_disk_snapshots(self, async_client: AsyncRunloop) -> None:
768+
response = await async_client.devboxes.with_raw_response.disk_snapshots()
769+
770+
assert response.is_closed is True
771+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
772+
devbox = await response.parse()
773+
assert_matches_type(DevboxDiskSnapshotsResponse, devbox, path=["response"])
774+
775+
@parametrize
776+
async def test_streaming_response_disk_snapshots(self, async_client: AsyncRunloop) -> None:
777+
async with async_client.devboxes.with_streaming_response.disk_snapshots() as response:
778+
assert not response.is_closed
779+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
780+
781+
devbox = await response.parse()
782+
assert_matches_type(DevboxDiskSnapshotsResponse, devbox, path=["response"])
783+
784+
assert cast(Any, response.is_closed) is True
785+
719786
@parametrize
720787
@pytest.mark.respx(base_url=base_url)
721788
async def test_method_download_file(self, async_client: AsyncRunloop, respx_mock: MockRouter) -> None:

0 commit comments

Comments
 (0)