From 4e186762f5a1bdcb6cea999dd9d8925bd2d8da38 Mon Sep 17 00:00:00 2001 From: Siddarth Chalasani Date: Tue, 31 Mar 2026 17:39:28 -0700 Subject: [PATCH 1/2] fix(sdk): remove incorrect remove_tunnel DeprecationWarning --- src/runloop_api_client/sdk/async_devbox.py | 17 +++++------------ src/runloop_api_client/sdk/devbox.py | 17 +++++------------ tests/sdk/async_devbox/test_interfaces.py | 15 +++++++-------- tests/sdk/devbox/test_interfaces.py | 15 +++++++-------- 4 files changed, 24 insertions(+), 40 deletions(-) diff --git a/src/runloop_api_client/sdk/async_devbox.py b/src/runloop_api_client/sdk/async_devbox.py index 98f150e9a..0cb108b93 100644 --- a/src/runloop_api_client/sdk/async_devbox.py +++ b/src/runloop_api_client/sdk/async_devbox.py @@ -4,7 +4,7 @@ import asyncio import logging -import warnings + from typing import TYPE_CHECKING, Any, Callable, Optional, Sequence, Awaitable, cast from typing_extensions import Unpack, override @@ -835,7 +835,7 @@ async def remove_tunnel( self, **params: Unpack[SDKDevboxRemoveTunnelParams], ) -> object: - """[Deprecated] V2 tunnels cannot be removed and close on devbox shutdown. + """Remove a tunnel from the devbox. :param params: See :typeddict:`~runloop_api_client.sdk._types.SDKDevboxRemoveTunnelParams` for available parameters :return: Response confirming the tunnel removal @@ -844,14 +844,7 @@ async def remove_tunnel( Example: >>> await devbox.net.remove_tunnel() """ - warnings.warn( - "remove_tunnel is deprecated; V2 tunnels cannot be removed and close on devbox shutdown.", - DeprecationWarning, - stacklevel=2, + return await self._devbox._client.devboxes.remove_tunnel( + self._devbox.id, + **params, ) - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - return await self._devbox._client.devboxes.remove_tunnel( # type: ignore[deprecated] - self._devbox.id, - **params, - ) diff --git a/src/runloop_api_client/sdk/devbox.py b/src/runloop_api_client/sdk/devbox.py index 3580d8167..0e190d93b 100644 --- a/src/runloop_api_client/sdk/devbox.py +++ b/src/runloop_api_client/sdk/devbox.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging -import warnings + import threading from typing import TYPE_CHECKING, Any, Callable, Optional, Sequence from typing_extensions import Unpack, override @@ -838,7 +838,7 @@ def remove_tunnel( self, **params: Unpack[SDKDevboxRemoveTunnelParams], ) -> object: - """[Deprecated] V2 tunnels cannot be removed and close on devbox shutdown. + """Remove a tunnel from the devbox. :param params: See :typeddict:`~runloop_api_client.sdk._types.SDKDevboxRemoveTunnelParams` for available parameters :return: Response confirming the tunnel removal @@ -847,14 +847,7 @@ def remove_tunnel( Example: >>> devbox.net.remove_tunnel() """ - warnings.warn( - "remove_tunnel is deprecated; V2 tunnels cannot be removed and close on devbox shutdown.", - DeprecationWarning, - stacklevel=2, + return self._devbox._client.devboxes.remove_tunnel( + self._devbox.id, + **params, ) - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - return self._devbox._client.devboxes.remove_tunnel( # type: ignore[deprecated] - self._devbox.id, - **params, - ) diff --git a/tests/sdk/async_devbox/test_interfaces.py b/tests/sdk/async_devbox/test_interfaces.py index 79376132e..06ac528ab 100644 --- a/tests/sdk/async_devbox/test_interfaces.py +++ b/tests/sdk/async_devbox/test_interfaces.py @@ -184,14 +184,13 @@ async def test_remove_tunnel(self, mock_async_client: AsyncMock) -> None: mock_async_client.devboxes.remove_tunnel = AsyncMock(return_value=object()) devbox = AsyncDevbox(mock_async_client, "dbx_123") - with pytest.warns(DeprecationWarning, match="remove_tunnel is deprecated"): - result = await devbox.net.remove_tunnel( - extra_headers={"X-Custom": "value"}, - extra_query={"param": "value"}, - extra_body={"key": "value"}, - timeout=30.0, - idempotency_key="key-123", - ) + result = await devbox.net.remove_tunnel( + extra_headers={"X-Custom": "value"}, + extra_query={"param": "value"}, + extra_body={"key": "value"}, + timeout=30.0, + idempotency_key="key-123", + ) assert result is not None # Verify return value is propagated mock_async_client.devboxes.remove_tunnel.assert_called_once() diff --git a/tests/sdk/devbox/test_interfaces.py b/tests/sdk/devbox/test_interfaces.py index 7d0c1d567..3eab928dd 100644 --- a/tests/sdk/devbox/test_interfaces.py +++ b/tests/sdk/devbox/test_interfaces.py @@ -285,14 +285,13 @@ def test_remove_tunnel(self, mock_client: Mock) -> None: mock_client.devboxes.remove_tunnel.return_value = object() devbox = Devbox(mock_client, "dbx_123") - with pytest.warns(DeprecationWarning, match="remove_tunnel is deprecated"): - result = devbox.net.remove_tunnel( - extra_headers={"X-Custom": "value"}, - extra_query={"param": "value"}, - extra_body={"key": "value"}, - timeout=30.0, - idempotency_key="key-123", - ) + result = devbox.net.remove_tunnel( + extra_headers={"X-Custom": "value"}, + extra_query={"param": "value"}, + extra_body={"key": "value"}, + timeout=30.0, + idempotency_key="key-123", + ) assert result is not None # Verify return value is propagated mock_client.devboxes.remove_tunnel.assert_called_once_with( From ab495f841915c06a4ba1f5de0c4c87a771348862 Mon Sep 17 00:00:00 2001 From: Siddarth Chalasani Date: Tue, 31 Mar 2026 18:24:45 -0700 Subject: [PATCH 2/2] formatting --- src/runloop_api_client/sdk/async_devbox.py | 1 - src/runloop_api_client/sdk/devbox.py | 1 - tests/sdk/devbox/test_interfaces.py | 1 - uv.lock | 2 +- 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/runloop_api_client/sdk/async_devbox.py b/src/runloop_api_client/sdk/async_devbox.py index 0cb108b93..bed785a7d 100644 --- a/src/runloop_api_client/sdk/async_devbox.py +++ b/src/runloop_api_client/sdk/async_devbox.py @@ -4,7 +4,6 @@ import asyncio import logging - from typing import TYPE_CHECKING, Any, Callable, Optional, Sequence, Awaitable, cast from typing_extensions import Unpack, override diff --git a/src/runloop_api_client/sdk/devbox.py b/src/runloop_api_client/sdk/devbox.py index 0e190d93b..c97ea2682 100644 --- a/src/runloop_api_client/sdk/devbox.py +++ b/src/runloop_api_client/sdk/devbox.py @@ -3,7 +3,6 @@ from __future__ import annotations import logging - import threading from typing import TYPE_CHECKING, Any, Callable, Optional, Sequence from typing_extensions import Unpack, override diff --git a/tests/sdk/devbox/test_interfaces.py b/tests/sdk/devbox/test_interfaces.py index 3eab928dd..41ec46c3a 100644 --- a/tests/sdk/devbox/test_interfaces.py +++ b/tests/sdk/devbox/test_interfaces.py @@ -11,7 +11,6 @@ from unittest.mock import Mock import httpx -import pytest from tests.sdk.conftest import MockExecutionView from runloop_api_client.sdk import Devbox diff --git a/uv.lock b/uv.lock index 536ecad8e..e2e199a71 100644 --- a/uv.lock +++ b/uv.lock @@ -2386,7 +2386,7 @@ wheels = [ [[package]] name = "runloop-api-client" -version = "1.13.3" +version = "1.14.0" source = { editable = "." } dependencies = [ { name = "anyio" },