diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 0b8a7c68d..a9d0cc147 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.68.0" + ".": "0.69.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 33e553ff2..bc705b998 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 97 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-5f33221208c1febba343daf570f73a5086f150a9b128df045ebddc3fe2c86607.yml -openapi_spec_hash: 0aea07130ddbe43a665a13a68231e2ca +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-0dd27c6877ed117c50fe0af95cee4d54c646d2484368e131b8e3315eba3fffcc.yml +openapi_spec_hash: 68f663172747aef8e66f2b23289efc7b config_hash: 2363f563f42501d2b1587a4f64bdccaf diff --git a/CHANGELOG.md b/CHANGELOG.md index ae56707e5..c322055c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 0.69.0 (2025-11-21) + +Full Changelog: [v0.68.0...v0.69.0](https://github.com/runloopai/api-client-python/compare/v0.68.0...v0.69.0) + +### Features + +* **blueprints:** blueprints create_and_await_build_complete now take in build_context and named_build_context arguments ([#681](https://github.com/runloopai/api-client-python/issues/681)) ([1febe28](https://github.com/runloopai/api-client-python/commit/1febe28e2cadb23eae0cc411922646ce7b8875d3)) +* **devbox:** unify api for devbox mounts ([01c7d14](https://github.com/runloopai/api-client-python/commit/01c7d14091961822d7fe706d6fa7528b6607f87a)) +* **docs:** add documentation for the object oriented sdk, rendered with sphinx ([#677](https://github.com/runloopai/api-client-python/issues/677)) ([e8d1053](https://github.com/runloopai/api-client-python/commit/e8d1053edd15c07f8e8099e9736f97e5fd72fcfb)) +* **storage-objects:** Add upload_from_dir helper method ([#680](https://github.com/runloopai/api-client-python/issues/680)) ([be5d99e](https://github.com/runloopai/api-client-python/commit/be5d99ef9983a64658c38ae5e0364122d11b86c4)) + + +### Documentation + +* restructured sync vs async sdk and resources, added support for more type references ([#679](https://github.com/runloopai/api-client-python/issues/679)) ([6af891e](https://github.com/runloopai/api-client-python/commit/6af891e0b87d038b5b61a683fdf410df94f495b6)) + ## 0.68.0 (2025-11-19) Full Changelog: [v0.67.0...v0.68.0](https://github.com/runloopai/api-client-python/compare/v0.67.0...v0.68.0) diff --git a/pyproject.toml b/pyproject.toml index 0793cac4e..79ffe90b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "runloop_api_client" -version = "0.68.0" +version = "0.69.0" description = "The official Python library for the runloop API" dynamic = ["readme"] license = "MIT" diff --git a/src/runloop_api_client/_version.py b/src/runloop_api_client/_version.py index 03a1aaf1c..42253e2b3 100644 --- a/src/runloop_api_client/_version.py +++ b/src/runloop_api_client/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "runloop_api_client" -__version__ = "0.68.0" # x-release-please-version +__version__ = "0.69.0" # x-release-please-version diff --git a/src/runloop_api_client/resources/devboxes/devboxes.py b/src/runloop_api_client/resources/devboxes/devboxes.py index b8ddfb976..dbddfde64 100644 --- a/src/runloop_api_client/resources/devboxes/devboxes.py +++ b/src/runloop_api_client/resources/devboxes/devboxes.py @@ -231,7 +231,7 @@ def create( metadata: User defined metadata to attach to the devbox for organization. - mounts: A list of file system mounts to be included in the Devbox. + mounts: A list of mounts to be included in the Devbox. name: (Optional) A user specified name to give the Devbox. @@ -1769,7 +1769,7 @@ async def create( metadata: User defined metadata to attach to the devbox for organization. - mounts: A list of file system mounts to be included in the Devbox. + mounts: A list of mounts to be included in the Devbox. name: (Optional) A user specified name to give the Devbox. diff --git a/src/runloop_api_client/types/devbox_create_params.py b/src/runloop_api_client/types/devbox_create_params.py index 2d27d6546..f211e0444 100644 --- a/src/runloop_api_client/types/devbox_create_params.py +++ b/src/runloop_api_client/types/devbox_create_params.py @@ -44,7 +44,7 @@ class DevboxBaseCreateParams(TypedDict, total=False): """User defined metadata to attach to the devbox for organization.""" mounts: Optional[Iterable[Mount]] - """A list of file system mounts to be included in the Devbox.""" + """A list of mounts to be included in the Devbox.""" name: Optional[str] """(Optional) A user specified name to give the Devbox.""" diff --git a/src/runloop_api_client/types/shared/code_mount_parameters.py b/src/runloop_api_client/types/shared/code_mount_parameters.py index b430f1513..5e509359b 100644 --- a/src/runloop_api_client/types/shared/code_mount_parameters.py +++ b/src/runloop_api_client/types/shared/code_mount_parameters.py @@ -1,6 +1,7 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional +from typing_extensions import Literal from ..._models import BaseModel @@ -17,6 +18,8 @@ class CodeMountParameters(BaseModel): repo_owner: str """The owner of the repo.""" + type: Literal["code_mount"] + token: Optional[str] = None """The authentication token necessary to pull repo.""" diff --git a/src/runloop_api_client/types/shared/mount.py b/src/runloop_api_client/types/shared/mount.py index 7fb68f24a..4ebc3eafb 100644 --- a/src/runloop_api_client/types/shared/mount.py +++ b/src/runloop_api_client/types/shared/mount.py @@ -1,12 +1,29 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from typing import Union -from typing_extensions import Annotated, TypeAlias +from typing import Dict, Union +from typing_extensions import Literal, Annotated, TypeAlias from ..._utils import PropertyInfo +from ..._models import BaseModel +from .code_mount_parameters import CodeMountParameters from .agent_mount_parameters import AgentMountParameters from .object_mount_parameters import ObjectMountParameters -__all__ = ["Mount"] +__all__ = ["Mount", "FileMountParameters"] -Mount: TypeAlias = Annotated[Union[ObjectMountParameters, AgentMountParameters], PropertyInfo(discriminator="type")] + +class FileMountParameters(BaseModel): + files: Dict[str, str] + """Map of file paths to file contents to be written before setup. + + Keys are absolute paths where files should be created, values are the file + contents. + """ + + type: Literal["file_mount"] + + +Mount: TypeAlias = Annotated[ + Union[ObjectMountParameters, AgentMountParameters, CodeMountParameters, FileMountParameters], + PropertyInfo(discriminator="type"), +] diff --git a/src/runloop_api_client/types/shared_params/code_mount_parameters.py b/src/runloop_api_client/types/shared_params/code_mount_parameters.py index 5afa72523..6b3a64511 100644 --- a/src/runloop_api_client/types/shared_params/code_mount_parameters.py +++ b/src/runloop_api_client/types/shared_params/code_mount_parameters.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import Optional -from typing_extensions import Required, TypedDict +from typing_extensions import Literal, Required, TypedDict __all__ = ["CodeMountParameters"] @@ -18,6 +18,8 @@ class CodeMountParameters(TypedDict, total=False): repo_owner: Required[str] """The owner of the repo.""" + type: Required[Literal["code_mount"]] + token: Optional[str] """The authentication token necessary to pull repo.""" diff --git a/src/runloop_api_client/types/shared_params/mount.py b/src/runloop_api_client/types/shared_params/mount.py index fb7e05ba7..9f9631013 100644 --- a/src/runloop_api_client/types/shared_params/mount.py +++ b/src/runloop_api_client/types/shared_params/mount.py @@ -2,12 +2,25 @@ from __future__ import annotations -from typing import Union -from typing_extensions import TypeAlias +from typing import Dict, Union +from typing_extensions import Literal, Required, TypeAlias, TypedDict +from .code_mount_parameters import CodeMountParameters from .agent_mount_parameters import AgentMountParameters from .object_mount_parameters import ObjectMountParameters -__all__ = ["Mount"] +__all__ = ["Mount", "FileMountParameters"] -Mount: TypeAlias = Union[ObjectMountParameters, AgentMountParameters] + +class FileMountParameters(TypedDict, total=False): + files: Required[Dict[str, str]] + """Map of file paths to file contents to be written before setup. + + Keys are absolute paths where files should be created, values are the file + contents. + """ + + type: Required[Literal["file_mount"]] + + +Mount: TypeAlias = Union[ObjectMountParameters, AgentMountParameters, CodeMountParameters, FileMountParameters] diff --git a/tests/api_resources/test_blueprints.py b/tests/api_resources/test_blueprints.py index 030e12112..ab53bf0db 100644 --- a/tests/api_resources/test_blueprints.py +++ b/tests/api_resources/test_blueprints.py @@ -44,6 +44,7 @@ def test_method_create_with_all_params(self, client: Runloop) -> None: { "repo_name": "repo_name", "repo_owner": "repo_owner", + "type": "code_mount", "token": "token", "install_command": "install_command", } @@ -412,6 +413,7 @@ def test_method_preview_with_all_params(self, client: Runloop) -> None: { "repo_name": "repo_name", "repo_owner": "repo_owner", + "type": "code_mount", "token": "token", "install_command": "install_command", } @@ -514,6 +516,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncRunloop) - { "repo_name": "repo_name", "repo_owner": "repo_owner", + "type": "code_mount", "token": "token", "install_command": "install_command", } @@ -882,6 +885,7 @@ async def test_method_preview_with_all_params(self, async_client: AsyncRunloop) { "repo_name": "repo_name", "repo_owner": "repo_owner", + "type": "code_mount", "token": "token", "install_command": "install_command", } diff --git a/tests/api_resources/test_devboxes.py b/tests/api_resources/test_devboxes.py index ede4c70cf..358c675f0 100644 --- a/tests/api_resources/test_devboxes.py +++ b/tests/api_resources/test_devboxes.py @@ -58,6 +58,7 @@ def test_method_create_with_all_params(self, client: Runloop) -> None: { "repo_name": "repo_name", "repo_owner": "repo_owner", + "type": "code_mount", "token": "token", "install_command": "install_command", } @@ -1606,6 +1607,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncRunloop) - { "repo_name": "repo_name", "repo_owner": "repo_owner", + "type": "code_mount", "token": "token", "install_command": "install_command", }