Skip to content

Commit d6370bc

Browse files
stainless-app[bot]stainless-bot
authored andcommitted
feat(api): OpenAPI spec update via Stainless API (#76)
1 parent 213734e commit d6370bc

7 files changed

Lines changed: 214 additions & 2 deletions

File tree

.stats.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
configured_endpoints: 21
1+
configured_endpoints: 22
22
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-8d8e0503acc9538a16d75214afccccbd96e178b8ca1ec56ceb9316a20b6daba6.yml

api.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,12 @@ from runloop_api_client.types import CodeMountParameters
4848
Types:
4949

5050
```python
51-
from runloop_api_client.types import DevboxExecutionDetailView, DevboxListView, DevboxView
51+
from runloop_api_client.types import (
52+
DevboxExecutionDetailView,
53+
DevboxListView,
54+
DevboxView,
55+
DevboxReadFileContentsResponse,
56+
)
5257
```
5358

5459
Methods:
@@ -58,6 +63,7 @@ Methods:
5863
- <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>
5964
- <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>
6065
- <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>
66+
- <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>
6167
- <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>
6268
- <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>
6369

src/runloop_api_client/resources/devboxes/devboxes.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
devbox_read_file_params,
2121
devbox_write_file_params,
2222
devbox_execute_sync_params,
23+
devbox_read_file_contents_params,
2324
)
2425
from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven
2526
from ..._utils import (
@@ -290,6 +291,46 @@ def read_file(
290291
cast_to=DevboxExecutionDetailView,
291292
)
292293

294+
def read_file_contents(
295+
self,
296+
id: str,
297+
*,
298+
file_path: str | NotGiven = NOT_GIVEN,
299+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
300+
# The extra values given here take precedence over values defined on the client or passed to this method.
301+
extra_headers: Headers | None = None,
302+
extra_query: Query | None = None,
303+
extra_body: Body | None = None,
304+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
305+
) -> str:
306+
"""
307+
Read file contents from a file on given Devbox.
308+
309+
Args:
310+
file_path: The path of the file to read.
311+
312+
extra_headers: Send extra headers
313+
314+
extra_query: Add additional query parameters to the request
315+
316+
extra_body: Add additional JSON properties to the request
317+
318+
timeout: Override the client-level default timeout for this request, in seconds
319+
"""
320+
if not id:
321+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
322+
extra_headers = {"Accept": "text/plain", **(extra_headers or {})}
323+
return self._post(
324+
f"/v1/devboxes/{id}/read_file_contents",
325+
body=maybe_transform(
326+
{"file_path": file_path}, devbox_read_file_contents_params.DevboxReadFileContentsParams
327+
),
328+
options=make_request_options(
329+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
330+
),
331+
cast_to=str,
332+
)
333+
293334
def shutdown(
294335
self,
295336
id: str,
@@ -619,6 +660,46 @@ async def read_file(
619660
cast_to=DevboxExecutionDetailView,
620661
)
621662

663+
async def read_file_contents(
664+
self,
665+
id: str,
666+
*,
667+
file_path: str | NotGiven = NOT_GIVEN,
668+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
669+
# The extra values given here take precedence over values defined on the client or passed to this method.
670+
extra_headers: Headers | None = None,
671+
extra_query: Query | None = None,
672+
extra_body: Body | None = None,
673+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
674+
) -> str:
675+
"""
676+
Read file contents from a file on given Devbox.
677+
678+
Args:
679+
file_path: The path of the file to read.
680+
681+
extra_headers: Send extra headers
682+
683+
extra_query: Add additional query parameters to the request
684+
685+
extra_body: Add additional JSON properties to the request
686+
687+
timeout: Override the client-level default timeout for this request, in seconds
688+
"""
689+
if not id:
690+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
691+
extra_headers = {"Accept": "text/plain", **(extra_headers or {})}
692+
return await self._post(
693+
f"/v1/devboxes/{id}/read_file_contents",
694+
body=await async_maybe_transform(
695+
{"file_path": file_path}, devbox_read_file_contents_params.DevboxReadFileContentsParams
696+
),
697+
options=make_request_options(
698+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
699+
),
700+
cast_to=str,
701+
)
702+
622703
async def shutdown(
623704
self,
624705
id: str,
@@ -719,6 +800,9 @@ def __init__(self, devboxes: DevboxesResource) -> None:
719800
self.read_file = to_raw_response_wrapper(
720801
devboxes.read_file,
721802
)
803+
self.read_file_contents = to_raw_response_wrapper(
804+
devboxes.read_file_contents,
805+
)
722806
self.shutdown = to_raw_response_wrapper(
723807
devboxes.shutdown,
724808
)
@@ -750,6 +834,9 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
750834
self.read_file = async_to_raw_response_wrapper(
751835
devboxes.read_file,
752836
)
837+
self.read_file_contents = async_to_raw_response_wrapper(
838+
devboxes.read_file_contents,
839+
)
753840
self.shutdown = async_to_raw_response_wrapper(
754841
devboxes.shutdown,
755842
)
@@ -781,6 +868,9 @@ def __init__(self, devboxes: DevboxesResource) -> None:
781868
self.read_file = to_streamed_response_wrapper(
782869
devboxes.read_file,
783870
)
871+
self.read_file_contents = to_streamed_response_wrapper(
872+
devboxes.read_file_contents,
873+
)
784874
self.shutdown = to_streamed_response_wrapper(
785875
devboxes.shutdown,
786876
)
@@ -812,6 +902,9 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
812902
self.read_file = async_to_streamed_response_wrapper(
813903
devboxes.read_file,
814904
)
905+
self.read_file_contents = async_to_streamed_response_wrapper(
906+
devboxes.read_file_contents,
907+
)
815908
self.shutdown = async_to_streamed_response_wrapper(
816909
devboxes.shutdown,
817910
)

src/runloop_api_client/types/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,5 @@
3030
from .devbox_execution_detail_view import DevboxExecutionDetailView as DevboxExecutionDetailView
3131
from .function_invoke_async_params import FunctionInvokeAsyncParams as FunctionInvokeAsyncParams
3232
from .blueprint_build_logs_list_view import BlueprintBuildLogsListView as BlueprintBuildLogsListView
33+
from .devbox_read_file_contents_params import DevboxReadFileContentsParams as DevboxReadFileContentsParams
34+
from .devbox_read_file_contents_response import DevboxReadFileContentsResponse as DevboxReadFileContentsResponse
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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__ = ["DevboxReadFileContentsParams"]
8+
9+
10+
class DevboxReadFileContentsParams(TypedDict, total=False):
11+
file_path: str
12+
"""The path of the file to read."""
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing_extensions import TypeAlias
4+
5+
__all__ = ["DevboxReadFileContentsResponse"]
6+
7+
DevboxReadFileContentsResponse: TypeAlias = str

tests/api_resources/test_devboxes.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,52 @@ def test_path_params_read_file(self, client: Runloop) -> None:
224224
id="",
225225
)
226226

227+
@parametrize
228+
def test_method_read_file_contents(self, client: Runloop) -> None:
229+
devbox = client.devboxes.read_file_contents(
230+
id="id",
231+
)
232+
assert_matches_type(str, devbox, path=["response"])
233+
234+
@parametrize
235+
def test_method_read_file_contents_with_all_params(self, client: Runloop) -> None:
236+
devbox = client.devboxes.read_file_contents(
237+
id="id",
238+
file_path="file_path",
239+
)
240+
assert_matches_type(str, devbox, path=["response"])
241+
242+
@parametrize
243+
def test_raw_response_read_file_contents(self, client: Runloop) -> None:
244+
response = client.devboxes.with_raw_response.read_file_contents(
245+
id="id",
246+
)
247+
248+
assert response.is_closed is True
249+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
250+
devbox = response.parse()
251+
assert_matches_type(str, devbox, path=["response"])
252+
253+
@parametrize
254+
def test_streaming_response_read_file_contents(self, client: Runloop) -> None:
255+
with client.devboxes.with_streaming_response.read_file_contents(
256+
id="id",
257+
) as response:
258+
assert not response.is_closed
259+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
260+
261+
devbox = response.parse()
262+
assert_matches_type(str, devbox, path=["response"])
263+
264+
assert cast(Any, response.is_closed) is True
265+
266+
@parametrize
267+
def test_path_params_read_file_contents(self, client: Runloop) -> None:
268+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
269+
client.devboxes.with_raw_response.read_file_contents(
270+
id="",
271+
)
272+
227273
@parametrize
228274
def test_method_shutdown(self, client: Runloop) -> None:
229275
devbox = client.devboxes.shutdown(
@@ -516,6 +562,52 @@ async def test_path_params_read_file(self, async_client: AsyncRunloop) -> None:
516562
id="",
517563
)
518564

565+
@parametrize
566+
async def test_method_read_file_contents(self, async_client: AsyncRunloop) -> None:
567+
devbox = await async_client.devboxes.read_file_contents(
568+
id="id",
569+
)
570+
assert_matches_type(str, devbox, path=["response"])
571+
572+
@parametrize
573+
async def test_method_read_file_contents_with_all_params(self, async_client: AsyncRunloop) -> None:
574+
devbox = await async_client.devboxes.read_file_contents(
575+
id="id",
576+
file_path="file_path",
577+
)
578+
assert_matches_type(str, devbox, path=["response"])
579+
580+
@parametrize
581+
async def test_raw_response_read_file_contents(self, async_client: AsyncRunloop) -> None:
582+
response = await async_client.devboxes.with_raw_response.read_file_contents(
583+
id="id",
584+
)
585+
586+
assert response.is_closed is True
587+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
588+
devbox = await response.parse()
589+
assert_matches_type(str, devbox, path=["response"])
590+
591+
@parametrize
592+
async def test_streaming_response_read_file_contents(self, async_client: AsyncRunloop) -> None:
593+
async with async_client.devboxes.with_streaming_response.read_file_contents(
594+
id="id",
595+
) as response:
596+
assert not response.is_closed
597+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
598+
599+
devbox = await response.parse()
600+
assert_matches_type(str, devbox, path=["response"])
601+
602+
assert cast(Any, response.is_closed) is True
603+
604+
@parametrize
605+
async def test_path_params_read_file_contents(self, async_client: AsyncRunloop) -> None:
606+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
607+
await async_client.devboxes.with_raw_response.read_file_contents(
608+
id="",
609+
)
610+
519611
@parametrize
520612
async def test_method_shutdown(self, async_client: AsyncRunloop) -> None:
521613
devbox = await async_client.devboxes.shutdown(

0 commit comments

Comments
 (0)