Skip to content

Commit d6ba90f

Browse files
stainless-app[bot]stainless-bot
authored andcommitted
feat(api): OpenAPI spec update via Stainless API (#93)
1 parent 0c34d9a commit d6ba90f

6 files changed

Lines changed: 213 additions & 3 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: 22
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-f8e5f5af651b36c2ceed0edd7ad24bc9227ebd55a782be369428c38bde32c3d2.yml
1+
configured_endpoints: 23
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-b8fcc87544efea42048d01a4c7ba4c8abf1725337cfbb6bff607d5fea5cd1e1a.yml

api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ from runloop_api_client.types import (
5353
DevboxListView,
5454
DevboxView,
5555
DevboxReadFileContentsResponse,
56+
DevboxUploadFileResponse,
5657
)
5758
```
5859

@@ -65,6 +66,7 @@ Methods:
6566
- <code title="post /v1/devboxes/{id}/read_file">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">read_file</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_read_file_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_execution_detail_view.py">DevboxExecutionDetailView</a></code>
6667
- <code title="post /v1/devboxes/{id}/read_file_contents">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">read_file_contents</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_read_file_contents_params.py">params</a>) -> str</code>
6768
- <code title="post /v1/devboxes/{id}/shutdown">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">shutdown</a>(id) -> <a href="./src/runloop_api_client/types/devbox_view.py">DevboxView</a></code>
69+
- <code title="post /v1/devboxes/{id}/upload_file">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">upload_file</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_upload_file_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_upload_file_response.py">object</a></code>
6870
- <code title="post /v1/devboxes/{id}/write_file">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">write_file</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_write_file_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_execution_detail_view.py">DevboxExecutionDetailView</a></code>
6971

7072
## Logs

src/runloop_api_client/resources/devboxes/devboxes.py

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
devbox_create_params,
2020
devbox_read_file_params,
2121
devbox_write_file_params,
22+
devbox_upload_file_params,
2223
devbox_execute_sync_params,
2324
devbox_read_file_contents_params,
2425
)
25-
from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven
26+
from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven, FileTypes
2627
from ..._utils import (
2728
maybe_transform,
2829
async_maybe_transform,
@@ -365,6 +366,48 @@ def shutdown(
365366
cast_to=DevboxView,
366367
)
367368

369+
def upload_file(
370+
self,
371+
id: str,
372+
*,
373+
file_input_stream: FileTypes | NotGiven = NOT_GIVEN,
374+
path: str | NotGiven = NOT_GIVEN,
375+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
376+
# The extra values given here take precedence over values defined on the client or passed to this method.
377+
extra_headers: Headers | None = None,
378+
extra_query: Query | None = None,
379+
extra_body: Body | None = None,
380+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
381+
) -> object:
382+
"""
383+
Upload file contents to a file at path on the Devbox.
384+
385+
Args:
386+
extra_headers: Send extra headers
387+
388+
extra_query: Add additional query parameters to the request
389+
390+
extra_body: Add additional JSON properties to the request
391+
392+
timeout: Override the client-level default timeout for this request, in seconds
393+
"""
394+
if not id:
395+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
396+
return self._post(
397+
f"/v1/devboxes/{id}/upload_file",
398+
body=maybe_transform(
399+
{
400+
"file_input_stream": file_input_stream,
401+
"path": path,
402+
},
403+
devbox_upload_file_params.DevboxUploadFileParams,
404+
),
405+
options=make_request_options(
406+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
407+
),
408+
cast_to=object,
409+
)
410+
368411
def write_file(
369412
self,
370413
id: str,
@@ -734,6 +777,48 @@ async def shutdown(
734777
cast_to=DevboxView,
735778
)
736779

780+
async def upload_file(
781+
self,
782+
id: str,
783+
*,
784+
file_input_stream: FileTypes | NotGiven = NOT_GIVEN,
785+
path: str | NotGiven = NOT_GIVEN,
786+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
787+
# The extra values given here take precedence over values defined on the client or passed to this method.
788+
extra_headers: Headers | None = None,
789+
extra_query: Query | None = None,
790+
extra_body: Body | None = None,
791+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
792+
) -> object:
793+
"""
794+
Upload file contents to a file at path on the Devbox.
795+
796+
Args:
797+
extra_headers: Send extra headers
798+
799+
extra_query: Add additional query parameters to the request
800+
801+
extra_body: Add additional JSON properties to the request
802+
803+
timeout: Override the client-level default timeout for this request, in seconds
804+
"""
805+
if not id:
806+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
807+
return await self._post(
808+
f"/v1/devboxes/{id}/upload_file",
809+
body=await async_maybe_transform(
810+
{
811+
"file_input_stream": file_input_stream,
812+
"path": path,
813+
},
814+
devbox_upload_file_params.DevboxUploadFileParams,
815+
),
816+
options=make_request_options(
817+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
818+
),
819+
cast_to=object,
820+
)
821+
737822
async def write_file(
738823
self,
739824
id: str,
@@ -806,6 +891,9 @@ def __init__(self, devboxes: DevboxesResource) -> None:
806891
self.shutdown = to_raw_response_wrapper(
807892
devboxes.shutdown,
808893
)
894+
self.upload_file = to_raw_response_wrapper(
895+
devboxes.upload_file,
896+
)
809897
self.write_file = to_raw_response_wrapper(
810898
devboxes.write_file,
811899
)
@@ -840,6 +928,9 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
840928
self.shutdown = async_to_raw_response_wrapper(
841929
devboxes.shutdown,
842930
)
931+
self.upload_file = async_to_raw_response_wrapper(
932+
devboxes.upload_file,
933+
)
843934
self.write_file = async_to_raw_response_wrapper(
844935
devboxes.write_file,
845936
)
@@ -874,6 +965,9 @@ def __init__(self, devboxes: DevboxesResource) -> None:
874965
self.shutdown = to_streamed_response_wrapper(
875966
devboxes.shutdown,
876967
)
968+
self.upload_file = to_streamed_response_wrapper(
969+
devboxes.upload_file,
970+
)
877971
self.write_file = to_streamed_response_wrapper(
878972
devboxes.write_file,
879973
)
@@ -908,6 +1002,9 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
9081002
self.shutdown = async_to_streamed_response_wrapper(
9091003
devboxes.shutdown,
9101004
)
1005+
self.upload_file = async_to_streamed_response_wrapper(
1006+
devboxes.upload_file,
1007+
)
9111008
self.write_file = async_to_streamed_response_wrapper(
9121009
devboxes.write_file,
9131010
)

src/runloop_api_client/types/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from .devbox_read_file_params import DevboxReadFileParams as DevboxReadFileParams
2424
from .blueprint_preview_params import BlueprintPreviewParams as BlueprintPreviewParams
2525
from .devbox_write_file_params import DevboxWriteFileParams as DevboxWriteFileParams
26+
from .devbox_upload_file_params import DevboxUploadFileParams as DevboxUploadFileParams
2627
from .blueprint_build_parameters import BlueprintBuildParameters as BlueprintBuildParameters
2728
from .devbox_execute_sync_params import DevboxExecuteSyncParams as DevboxExecuteSyncParams
2829
from .code_mount_parameters_param import CodeMountParametersParam as CodeMountParametersParam
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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 Annotated, TypedDict
6+
7+
from .._types import FileTypes
8+
from .._utils import PropertyInfo
9+
10+
__all__ = ["DevboxUploadFileParams"]
11+
12+
13+
class DevboxUploadFileParams(TypedDict, total=False):
14+
file_input_stream: Annotated[FileTypes, PropertyInfo(alias="fileInputStream")]
15+
16+
path: str

tests/api_resources/test_devboxes.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,53 @@ def test_path_params_shutdown(self, client: Runloop) -> None:
312312
"",
313313
)
314314

315+
@parametrize
316+
def test_method_upload_file(self, client: Runloop) -> None:
317+
devbox = client.devboxes.upload_file(
318+
id="id",
319+
)
320+
assert_matches_type(object, devbox, path=["response"])
321+
322+
@parametrize
323+
def test_method_upload_file_with_all_params(self, client: Runloop) -> None:
324+
devbox = client.devboxes.upload_file(
325+
id="id",
326+
file_input_stream=b"raw file contents",
327+
path="path",
328+
)
329+
assert_matches_type(object, devbox, path=["response"])
330+
331+
@parametrize
332+
def test_raw_response_upload_file(self, client: Runloop) -> None:
333+
response = client.devboxes.with_raw_response.upload_file(
334+
id="id",
335+
)
336+
337+
assert response.is_closed is True
338+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
339+
devbox = response.parse()
340+
assert_matches_type(object, devbox, path=["response"])
341+
342+
@parametrize
343+
def test_streaming_response_upload_file(self, client: Runloop) -> None:
344+
with client.devboxes.with_streaming_response.upload_file(
345+
id="id",
346+
) as response:
347+
assert not response.is_closed
348+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
349+
350+
devbox = response.parse()
351+
assert_matches_type(object, devbox, path=["response"])
352+
353+
assert cast(Any, response.is_closed) is True
354+
355+
@parametrize
356+
def test_path_params_upload_file(self, client: Runloop) -> None:
357+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
358+
client.devboxes.with_raw_response.upload_file(
359+
id="",
360+
)
361+
315362
@parametrize
316363
def test_method_write_file(self, client: Runloop) -> None:
317364
devbox = client.devboxes.write_file(
@@ -654,6 +701,53 @@ async def test_path_params_shutdown(self, async_client: AsyncRunloop) -> None:
654701
"",
655702
)
656703

704+
@parametrize
705+
async def test_method_upload_file(self, async_client: AsyncRunloop) -> None:
706+
devbox = await async_client.devboxes.upload_file(
707+
id="id",
708+
)
709+
assert_matches_type(object, devbox, path=["response"])
710+
711+
@parametrize
712+
async def test_method_upload_file_with_all_params(self, async_client: AsyncRunloop) -> None:
713+
devbox = await async_client.devboxes.upload_file(
714+
id="id",
715+
file_input_stream=b"raw file contents",
716+
path="path",
717+
)
718+
assert_matches_type(object, devbox, path=["response"])
719+
720+
@parametrize
721+
async def test_raw_response_upload_file(self, async_client: AsyncRunloop) -> None:
722+
response = await async_client.devboxes.with_raw_response.upload_file(
723+
id="id",
724+
)
725+
726+
assert response.is_closed is True
727+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
728+
devbox = await response.parse()
729+
assert_matches_type(object, devbox, path=["response"])
730+
731+
@parametrize
732+
async def test_streaming_response_upload_file(self, async_client: AsyncRunloop) -> None:
733+
async with async_client.devboxes.with_streaming_response.upload_file(
734+
id="id",
735+
) as response:
736+
assert not response.is_closed
737+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
738+
739+
devbox = await response.parse()
740+
assert_matches_type(object, devbox, path=["response"])
741+
742+
assert cast(Any, response.is_closed) is True
743+
744+
@parametrize
745+
async def test_path_params_upload_file(self, async_client: AsyncRunloop) -> None:
746+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
747+
await async_client.devboxes.with_raw_response.upload_file(
748+
id="",
749+
)
750+
657751
@parametrize
658752
async def test_method_write_file(self, async_client: AsyncRunloop) -> None:
659753
devbox = await async_client.devboxes.write_file(

0 commit comments

Comments
 (0)