diff --git a/src/runloop_api_client/sdk/async_.py b/src/runloop_api_client/sdk/async_.py index d91788857..b32310be6 100644 --- a/src/runloop_api_client/sdk/async_.py +++ b/src/runloop_api_client/sdk/async_.py @@ -330,22 +330,25 @@ async def list( async def upload_from_file( self, file_path: str | Path, - name: str | None = None, *, - content_type: ContentType | None = None, + name: Optional[str] = None, + content_type: Optional[ContentType] = None, metadata: Optional[Dict[str, str]] = None, + ttl: Optional[timedelta] = None, **options: Unpack[LongRequestOptions], ) -> AsyncStorageObject: """Create and upload an object from a local file path. :param file_path: Local filesystem path to read :type file_path: str | Path - :param name: Optional object name; defaults to the file name, defaults to None - :type name: str | None, optional - :param content_type: Optional MIME type to apply to the object, defaults to None - :type content_type: ContentType | None, optional - :param metadata: Optional key-value metadata, defaults to None - :type metadata: Optional[Dict[str, str]], optional + :param name: Optional object name; defaults to the file name + :type name: Optional[str] + :param content_type: Optional MIME type to apply to the object + :type content_type: Optional[ContentType] + :param metadata: Optional key-value metadata + :type metadata: Optional[Dict[str, str]] + :param ttl: Optional Time-To-Live, after which the object is automatically deleted + :type ttl: Optional[timedelta] :param options: See :typeddict:`~runloop_api_client.sdk._types.LongRequestOptions` for available options :return: Wrapper for the uploaded object :rtype: AsyncStorageObject @@ -360,7 +363,8 @@ async def upload_from_file( name = name or path.name content_type = content_type or detect_content_type(str(file_path)) - obj = await self.create(name=name, content_type=content_type, metadata=metadata, **options) + ttl_ms = int(ttl.total_seconds()) * 1000 if ttl else None + obj = await self.create(name=name, content_type=content_type, metadata=metadata, ttl_ms=ttl_ms, **options) await obj.upload_content(content) await obj.complete() return obj @@ -412,9 +416,10 @@ def synchronous_io() -> bytes: async def upload_from_text( self, text: str, - name: str, *, + name: str, metadata: Optional[Dict[str, str]] = None, + ttl: Optional[timedelta] = None, **options: Unpack[LongRequestOptions], ) -> AsyncStorageObject: """Create and upload an object from a text payload. @@ -423,13 +428,16 @@ async def upload_from_text( :type text: str :param name: Object display name :type name: str - :param metadata: Optional key-value metadata, defaults to None - :type metadata: Optional[Dict[str, str]], optional + :param metadata: Optional key-value metadata + :type metadata: Optional[Dict[str, str]] + :param ttl: Optional Time-To-Live, after which the object is automatically deleted + :type ttl: Optional[timedelta] :param options: See :typeddict:`~runloop_api_client.sdk._types.LongRequestOptions` for available options :return: Wrapper for the uploaded object :rtype: AsyncStorageObject """ - obj = await self.create(name=name, content_type="text", metadata=metadata, **options) + ttl_ms = int(ttl.total_seconds()) * 1000 if ttl else None + obj = await self.create(name=name, content_type="text", metadata=metadata, ttl_ms=ttl_ms, **options) await obj.upload_content(text) await obj.complete() return obj @@ -437,10 +445,11 @@ async def upload_from_text( async def upload_from_bytes( self, data: bytes, - name: str, *, + name: str, content_type: ContentType, metadata: Optional[Dict[str, str]] = None, + ttl: Optional[timedelta] = None, **options: Unpack[LongRequestOptions], ) -> AsyncStorageObject: """Create and upload an object from a bytes payload. @@ -451,13 +460,16 @@ async def upload_from_bytes( :type name: str :param content_type: MIME type describing the payload :type content_type: ContentType - :param metadata: Optional key-value metadata, defaults to None - :type metadata: Optional[Dict[str, str]], optional + :param metadata: Optional key-value metadata + :type metadata: Optional[Dict[str, str]] + :param ttl: Optional Time-To-Live, after which the object is automatically deleted + :type ttl: Optional[timedelta] :param options: See :typeddict:`~runloop_api_client.sdk._types.LongRequestOptions` for available options :return: Wrapper for the uploaded object :rtype: AsyncStorageObject """ - obj = await self.create(name=name, content_type=content_type, metadata=metadata, **options) + ttl_ms = int(ttl.total_seconds()) * 1000 if ttl else None + obj = await self.create(name=name, content_type=content_type, metadata=metadata, ttl_ms=ttl_ms, **options) await obj.upload_content(data) await obj.complete() return obj diff --git a/src/runloop_api_client/sdk/sync.py b/src/runloop_api_client/sdk/sync.py index b2bc53cee..7368a0f7a 100644 --- a/src/runloop_api_client/sdk/sync.py +++ b/src/runloop_api_client/sdk/sync.py @@ -329,22 +329,25 @@ def list( def upload_from_file( self, file_path: str | Path, - name: str | None = None, *, - content_type: ContentType | None = None, + name: Optional[str] = None, + content_type: Optional[ContentType] = None, metadata: Optional[Dict[str, str]] = None, + ttl: Optional[timedelta] = None, **options: Unpack[LongRequestOptions], ) -> StorageObject: """Create and upload an object from a local file path. :param file_path: Local filesystem path to read :type file_path: str | Path - :param name: Optional object name; defaults to the file name, defaults to None - :type name: str | None, optional - :param content_type: Optional MIME type to apply to the object, defaults to None - :type content_type: ContentType | None, optional - :param metadata: Optional key-value metadata, defaults to None - :type metadata: Optional[Dict[str, str]], optional + :param name: Optional object name; defaults to the file name + :type name: Optional[str] + :param content_type: Optional MIME type to apply to the object + :type content_type: Optional[ContentType] + :param metadata: Optional key-value metadata + :type metadata: Optional[Dict[str, str]] + :param ttl: Optional Time-To-Live, after which the object is automatically deleted + :type ttl: Optional[timedelta] :param options: See :typeddict:`~runloop_api_client.sdk._types.LongRequestOptions` for available options :return: Wrapper for the uploaded object :rtype: StorageObject @@ -359,7 +362,8 @@ def upload_from_file( name = name or path.name content_type = content_type or detect_content_type(str(file_path)) - obj = self.create(name=name, content_type=content_type, metadata=metadata, **options) + ttl_ms = int(ttl.total_seconds()) * 1000 if ttl else None + obj = self.create(name=name, content_type=content_type, metadata=metadata, ttl_ms=ttl_ms, **options) obj.upload_content(content) obj.complete() return obj @@ -407,9 +411,10 @@ def upload_from_dir( def upload_from_text( self, text: str, - name: str, *, + name: str, metadata: Optional[Dict[str, str]] = None, + ttl: Optional[timedelta] = None, **options: Unpack[LongRequestOptions], ) -> StorageObject: """Create and upload an object from a text payload. @@ -418,13 +423,16 @@ def upload_from_text( :type text: str :param name: Object display name :type name: str - :param metadata: Optional key-value metadata, defaults to None - :type metadata: Optional[Dict[str, str]], optional + :param metadata: Optional key-value metadata + :type metadata: Optional[Dict[str, str]] + :param ttl: Optional Time-To-Live, after which the object is automatically deleted + :type ttl: Optional[timedelta] :param options: See :typeddict:`~runloop_api_client.sdk._types.LongRequestOptions` for available options :return: Wrapper for the uploaded object :rtype: StorageObject """ - obj = self.create(name=name, content_type="text", metadata=metadata, **options) + ttl_ms = int(ttl.total_seconds()) * 1000 if ttl else None + obj = self.create(name=name, content_type="text", metadata=metadata, ttl_ms=ttl_ms, **options) obj.upload_content(text) obj.complete() return obj @@ -432,10 +440,11 @@ def upload_from_text( def upload_from_bytes( self, data: bytes, - name: str, *, + name: str, content_type: ContentType, metadata: Optional[Dict[str, str]] = None, + ttl: Optional[timedelta] = None, **options: Unpack[LongRequestOptions], ) -> StorageObject: """Create and upload an object from a bytes payload. @@ -446,13 +455,16 @@ def upload_from_bytes( :type name: str :param content_type: MIME type describing the payload :type content_type: ContentType - :param metadata: Optional key-value metadata, defaults to None - :type metadata: Optional[Dict[str, str]], optional + :param metadata: Optional key-value metadata + :type metadata: Optional[Dict[str, str]] + :param ttl: Optional Time-To-Live, after which the object is automatically deleted + :type ttl: Optional[timedelta] :param options: See :typeddict:`~runloop_api_client.sdk._types.LongRequestOptions` for available options :return: Wrapper for the uploaded object :rtype: StorageObject """ - obj = self.create(name=name, content_type=content_type, metadata=metadata, **options) + ttl_ms = int(ttl.total_seconds()) * 1000 if ttl else None + obj = self.create(name=name, content_type=content_type, metadata=metadata, ttl_ms=ttl_ms, **options) obj.upload_content(data) obj.complete() return obj diff --git a/tests/sdk/test_async_clients.py b/tests/sdk/test_async_clients.py index 92995eb1e..ebc8aba4a 100644 --- a/tests/sdk/test_async_clients.py +++ b/tests/sdk/test_async_clients.py @@ -239,13 +239,20 @@ async def test_list(self, mock_async_client: AsyncMock, object_view: MockObjectV name="test", search="query", starting_after="obj_000", - state="ready", + state="READ_ONLY", ) assert len(objects) == 1 assert isinstance(objects[0], AsyncStorageObject) assert objects[0].id == "obj_123" - mock_async_client.objects.list.assert_awaited_once() + mock_async_client.objects.list.assert_awaited_once_with( + content_type="text", + limit=10, + name="test", + search="query", + starting_after="obj_000", + state="READ_ONLY", + ) @pytest.mark.asyncio async def test_upload_from_file( @@ -268,9 +275,14 @@ async def test_upload_from_file( assert isinstance(obj, AsyncStorageObject) assert obj.id == "obj_123" - mock_async_client.objects.create.assert_awaited_once() - mock_async_client.objects.complete.assert_awaited_once() + mock_async_client.objects.create.assert_awaited_once_with( + name="test.txt", + content_type="text", + metadata=None, + ttl_ms=None, + ) http_client.put.assert_awaited_once_with(object_view.upload_url, content=b"test content") + mock_async_client.objects.complete.assert_awaited_once() @pytest.mark.asyncio async def test_upload_from_text(self, mock_async_client: AsyncMock, object_view: MockObjectView) -> None: @@ -284,7 +296,7 @@ async def test_upload_from_text(self, mock_async_client: AsyncMock, object_view: mock_async_client._client = http_client client = AsyncStorageObjectOps(mock_async_client) - obj = await client.upload_from_text("test content", "test.txt", metadata={"key": "value"}) + obj = await client.upload_from_text("test content", name="test.txt", metadata={"key": "value"}) assert isinstance(obj, AsyncStorageObject) assert obj.id == "obj_123" @@ -292,6 +304,7 @@ async def test_upload_from_text(self, mock_async_client: AsyncMock, object_view: name="test.txt", content_type="text", metadata={"key": "value"}, + ttl_ms=None, ) http_client.put.assert_awaited_once_with(object_view.upload_url, content="test content") mock_async_client.objects.complete.assert_awaited_once() @@ -308,7 +321,7 @@ async def test_upload_from_bytes(self, mock_async_client: AsyncMock, object_view mock_async_client._client = http_client client = AsyncStorageObjectOps(mock_async_client) - obj = await client.upload_from_bytes(b"test content", "test.bin", content_type="binary") + obj = await client.upload_from_bytes(b"test content", name="test.bin", content_type="binary") assert isinstance(obj, AsyncStorageObject) assert obj.id == "obj_123" @@ -316,6 +329,7 @@ async def test_upload_from_bytes(self, mock_async_client: AsyncMock, object_view name="test.bin", content_type="binary", metadata=None, + ttl_ms=None, ) http_client.put.assert_awaited_once_with(object_view.upload_url, content=b"test content") mock_async_client.objects.complete.assert_awaited_once() @@ -401,10 +415,12 @@ async def test_upload_from_dir_default_name( assert isinstance(obj, AsyncStorageObject) # Name should be directory name + .tar.gz - mock_async_client.objects.create.assert_awaited_once() - call_args = mock_async_client.objects.create.call_args - assert call_args[1]["name"] == "my_folder.tar.gz" - assert call_args[1]["content_type"] == "tgz" + mock_async_client.objects.create.assert_awaited_once_with( + name="my_folder.tar.gz", + content_type="tgz", + metadata=None, + ttl_ms=None, + ) @pytest.mark.asyncio async def test_upload_from_dir_with_ttl( @@ -429,10 +445,12 @@ async def test_upload_from_dir_with_ttl( obj = await client.upload_from_dir(test_dir, ttl=timedelta(hours=2)) assert isinstance(obj, AsyncStorageObject) - mock_async_client.objects.create.assert_awaited_once() - call_args = mock_async_client.objects.create.call_args - # 2 hours = 7200 seconds = 7200000 milliseconds - assert call_args[1]["ttl_ms"] == 7200000 + mock_async_client.objects.create.assert_awaited_once_with( + name="temp_dir.tar.gz", + content_type="tgz", + metadata=None, + ttl_ms=7200000, # 2 hours = 7200 seconds = 7200000 milliseconds + ) @pytest.mark.asyncio async def test_upload_from_dir_empty_directory( @@ -455,7 +473,12 @@ async def test_upload_from_dir_empty_directory( assert isinstance(obj, AsyncStorageObject) assert obj.id == "obj_123" - mock_async_client.objects.create.assert_awaited_once() + mock_async_client.objects.create.assert_awaited_once_with( + name="empty_dir.tar.gz", + content_type="tgz", + metadata=None, + ttl_ms=None, + ) http_client.put.assert_awaited_once() mock_async_client.objects.complete.assert_awaited_once() @@ -482,7 +505,14 @@ async def test_upload_from_dir_with_string_path( assert isinstance(obj, AsyncStorageObject) assert obj.id == "obj_123" - mock_async_client.objects.create.assert_awaited_once() + mock_async_client.objects.create.assert_awaited_once_with( + name="string_path_dir.tar.gz", + content_type="tgz", + metadata=None, + ttl_ms=None, + ) + http_client.put.assert_awaited_once() + mock_async_client.objects.complete.assert_awaited_once() class TestAsyncRunloopSDK: diff --git a/tests/sdk/test_clients.py b/tests/sdk/test_clients.py index f0e4b618d..18e1342e4 100644 --- a/tests/sdk/test_clients.py +++ b/tests/sdk/test_clients.py @@ -202,7 +202,11 @@ def test_create(self, mock_client: Mock, object_view: MockObjectView) -> None: assert isinstance(obj, StorageObject) assert obj.id == "obj_123" assert obj.upload_url == "https://upload.example.com/obj_123" - mock_client.objects.create.assert_called_once() + mock_client.objects.create.assert_called_once_with( + name="test.txt", + content_type="text", + metadata={"key": "value"}, + ) def test_from_id(self, mock_client: Mock) -> None: """Test from_id method.""" @@ -225,13 +229,20 @@ def test_list(self, mock_client: Mock, object_view: MockObjectView) -> None: name="test", search="query", starting_after="obj_000", - state="ready", + state="READ_ONLY", ) assert len(objects) == 1 assert isinstance(objects[0], StorageObject) assert objects[0].id == "obj_123" - mock_client.objects.list.assert_called_once() + mock_client.objects.list.assert_called_once_with( + content_type="text", + limit=10, + name="test", + search="query", + starting_after="obj_000", + state="READ_ONLY", + ) def test_upload_from_file(self, mock_client: Mock, object_view: MockObjectView, tmp_path: Path) -> None: """Test upload_from_file method.""" @@ -250,9 +261,14 @@ def test_upload_from_file(self, mock_client: Mock, object_view: MockObjectView, assert isinstance(obj, StorageObject) assert obj.id == "obj_123" - mock_client.objects.create.assert_called_once() - mock_client.objects.complete.assert_called_once() + mock_client.objects.create.assert_called_once_with( + name="test.txt", + content_type="text", + metadata=None, + ttl_ms=None, + ) http_client.put.assert_called_once_with(object_view.upload_url, content=b"test content") + mock_client.objects.complete.assert_called_once() def test_upload_from_text(self, mock_client: Mock, object_view: MockObjectView) -> None: """Test upload_from_text method.""" @@ -264,7 +280,7 @@ def test_upload_from_text(self, mock_client: Mock, object_view: MockObjectView) mock_client._client = http_client client = StorageObjectOps(mock_client) - obj = client.upload_from_text("test content", "test.txt", metadata={"key": "value"}) + obj = client.upload_from_text("test content", name="test.txt", metadata={"key": "value"}) assert isinstance(obj, StorageObject) assert obj.id == "obj_123" @@ -272,6 +288,7 @@ def test_upload_from_text(self, mock_client: Mock, object_view: MockObjectView) name="test.txt", content_type="text", metadata={"key": "value"}, + ttl_ms=None, ) http_client.put.assert_called_once_with(object_view.upload_url, content="test content") mock_client.objects.complete.assert_called_once() @@ -286,7 +303,7 @@ def test_upload_from_bytes(self, mock_client: Mock, object_view: MockObjectView) mock_client._client = http_client client = StorageObjectOps(mock_client) - obj = client.upload_from_bytes(b"test content", "test.bin", content_type="binary") + obj = client.upload_from_bytes(b"test content", name="test.bin", content_type="binary") assert isinstance(obj, StorageObject) assert obj.id == "obj_123" @@ -294,6 +311,7 @@ def test_upload_from_bytes(self, mock_client: Mock, object_view: MockObjectView) name="test.bin", content_type="binary", metadata=None, + ttl_ms=None, ) http_client.put.assert_called_once_with(object_view.upload_url, content=b"test content") mock_client.objects.complete.assert_called_once() @@ -362,10 +380,12 @@ def test_upload_from_dir_default_name(self, mock_client: Mock, object_view: Mock assert isinstance(obj, StorageObject) # Name should be directory name + .tar.gz - mock_client.objects.create.assert_called_once() - call_args = mock_client.objects.create.call_args - assert call_args[1]["name"] == "my_folder.tar.gz" - assert call_args[1]["content_type"] == "tgz" + mock_client.objects.create.assert_called_once_with( + name="my_folder.tar.gz", + content_type="tgz", + metadata=None, + ttl_ms=None, + ) def test_upload_from_dir_with_ttl(self, mock_client: Mock, object_view: MockObjectView, tmp_path: Path) -> None: """Test upload_from_dir with TTL.""" @@ -386,10 +406,12 @@ def test_upload_from_dir_with_ttl(self, mock_client: Mock, object_view: MockObje obj = client.upload_from_dir(test_dir, ttl=timedelta(hours=2)) assert isinstance(obj, StorageObject) - mock_client.objects.create.assert_called_once() - call_args = mock_client.objects.create.call_args - # 2 hours = 7200 seconds = 7200000 milliseconds - assert call_args[1]["ttl_ms"] == 7200000 + mock_client.objects.create.assert_called_once_with( + name="temp_dir.tar.gz", + content_type="tgz", + metadata=None, + ttl_ms=7200000, # 2 hours = 7200 seconds = 7200000 milliseconds + ) def test_upload_from_dir_empty_directory( self, mock_client: Mock, object_view: MockObjectView, tmp_path: Path @@ -410,7 +432,12 @@ def test_upload_from_dir_empty_directory( assert isinstance(obj, StorageObject) assert obj.id == "obj_123" - mock_client.objects.create.assert_called_once() + mock_client.objects.create.assert_called_once_with( + name="empty_dir.tar.gz", + content_type="tgz", + metadata=None, + ttl_ms=None, + ) http_client.put.assert_called_once() mock_client.objects.complete.assert_called_once() @@ -435,7 +462,14 @@ def test_upload_from_dir_with_string_path( assert isinstance(obj, StorageObject) assert obj.id == "obj_123" - mock_client.objects.create.assert_called_once() + mock_client.objects.create.assert_called_once_with( + name="string_path_dir.tar.gz", + content_type="tgz", + metadata=None, + ttl_ms=None, + ) + http_client.put.assert_called_once() + mock_client.objects.complete.assert_called_once() class TestRunloopSDK: diff --git a/tests/smoketests/sdk/test_async_storage_object.py b/tests/smoketests/sdk/test_async_storage_object.py index cec495b79..cbc4e3e22 100644 --- a/tests/smoketests/sdk/test_async_storage_object.py +++ b/tests/smoketests/sdk/test_async_storage_object.py @@ -98,7 +98,7 @@ async def test_upload_from_text(self, async_sdk_client: AsyncRunloopSDK) -> None text_content = "Hello from async upload_from_text!" obj = await async_sdk_client.storage_object.upload_from_text( text_content, - unique_name("sdk-async-text-upload"), + name=unique_name("sdk-async-text-upload"), metadata={"source": "upload_from_text"}, ) @@ -117,7 +117,7 @@ async def test_upload_from_bytes(self, async_sdk_client: AsyncRunloopSDK) -> Non bytes_content = b"Binary content from async SDK" obj = await async_sdk_client.storage_object.upload_from_bytes( bytes_content, - unique_name("sdk-async-bytes-upload"), + name=unique_name("sdk-async-bytes-upload"), content_type="text", metadata={"source": "upload_from_bytes"}, ) @@ -142,7 +142,7 @@ async def test_upload_from_file(self, async_sdk_client: AsyncRunloopSDK) -> None try: obj = await async_sdk_client.storage_object.upload_from_file( tmp_path, - unique_name("sdk-async-file-upload"), + name=unique_name("sdk-async-file-upload"), metadata={"source": "upload_from_file"}, ) @@ -206,7 +206,7 @@ async def test_download_as_text(self, async_sdk_client: AsyncRunloopSDK) -> None content = "Async text content to download" obj = await async_sdk_client.storage_object.upload_from_text( content, - unique_name("sdk-async-download-text"), + name=unique_name("sdk-async-download-text"), ) try: @@ -221,7 +221,7 @@ async def test_download_as_bytes(self, async_sdk_client: AsyncRunloopSDK) -> Non content = b"Async bytes content to download" obj = await async_sdk_client.storage_object.upload_from_bytes( content, - unique_name("sdk-async-download-bytes"), + name=unique_name("sdk-async-download-bytes"), content_type="text", ) @@ -237,7 +237,7 @@ async def test_get_download_url(self, async_sdk_client: AsyncRunloopSDK) -> None """Test getting download URL.""" obj = await async_sdk_client.storage_object.upload_from_text( "Content for async URL", - unique_name("sdk-async-download-url"), + name=unique_name("sdk-async-download-url"), ) try: @@ -266,7 +266,7 @@ async def test_get_storage_object_by_id(self, async_sdk_client: AsyncRunloopSDK) # Create an object created = await async_sdk_client.storage_object.upload_from_text( "Content for async retrieval", - unique_name("sdk-async-storage-retrieve"), + name=unique_name("sdk-async-storage-retrieve"), ) try: @@ -286,7 +286,7 @@ async def test_list_storage_objects_by_content_type(self, async_sdk_client: Asyn # Create object with specific content type obj = await async_sdk_client.storage_object.upload_from_text( "Text content", - unique_name("sdk-async-storage-list-type"), + name=unique_name("sdk-async-storage-list-type"), ) try: @@ -310,7 +310,7 @@ async def test_mount_storage_object_to_devbox(self, async_sdk_client: AsyncRunlo # Create storage object with content obj = await async_sdk_client.storage_object.upload_from_text( "Async mounted content from SDK", - unique_name("sdk-async-mount-object"), + name=unique_name("sdk-async-mount-object"), ) try: @@ -342,7 +342,7 @@ async def test_access_mounted_storage_object(self, async_sdk_client: AsyncRunloo # Create storage object obj = await async_sdk_client.storage_object.upload_from_text( "Async content to mount and access", - unique_name("sdk-async-mount-access"), + name=unique_name("sdk-async-mount-access"), ) try: @@ -385,7 +385,7 @@ async def test_storage_object_large_content(self, async_sdk_client: AsyncRunloop obj = await async_sdk_client.storage_object.upload_from_text( large_content, - unique_name("sdk-async-storage-large"), + name=unique_name("sdk-async-storage-large"), ) try: @@ -404,7 +404,7 @@ async def test_storage_object_binary_content(self, async_sdk_client: AsyncRunloo obj = await async_sdk_client.storage_object.upload_from_bytes( binary_content, - unique_name("sdk-async-storage-binary"), + name=unique_name("sdk-async-storage-binary"), content_type="binary", ) @@ -420,7 +420,7 @@ async def test_storage_object_empty_content(self, async_sdk_client: AsyncRunloop """Test uploading empty content.""" obj = await async_sdk_client.storage_object.upload_from_text( "", - unique_name("sdk-async-storage-empty"), + name=unique_name("sdk-async-storage-empty"), ) try: diff --git a/tests/smoketests/sdk/test_storage_object.py b/tests/smoketests/sdk/test_storage_object.py index da4740c06..126d194ac 100644 --- a/tests/smoketests/sdk/test_storage_object.py +++ b/tests/smoketests/sdk/test_storage_object.py @@ -98,7 +98,7 @@ def test_upload_from_text(self, sdk_client: RunloopSDK) -> None: text_content = "Hello from upload_from_text!" obj = sdk_client.storage_object.upload_from_text( text_content, - unique_name("sdk-text-upload"), + name=unique_name("sdk-text-upload"), metadata={"source": "upload_from_text"}, ) @@ -117,7 +117,7 @@ def test_upload_from_bytes(self, sdk_client: RunloopSDK) -> None: bytes_content = b"Binary content from SDK" obj = sdk_client.storage_object.upload_from_bytes( bytes_content, - unique_name("sdk-bytes-upload"), + name=unique_name("sdk-bytes-upload"), content_type="text", metadata={"source": "upload_from_bytes"}, ) @@ -142,7 +142,7 @@ def test_upload_from_file(self, sdk_client: RunloopSDK) -> None: try: obj = sdk_client.storage_object.upload_from_file( tmp_path, - unique_name("sdk-file-upload"), + name=unique_name("sdk-file-upload"), metadata={"source": "upload_from_file"}, ) @@ -206,7 +206,7 @@ def test_download_as_text(self, sdk_client: RunloopSDK) -> None: content = "Text content to download" obj = sdk_client.storage_object.upload_from_text( content, - unique_name("sdk-download-text"), + name=unique_name("sdk-download-text"), ) try: @@ -221,7 +221,7 @@ def test_download_as_bytes(self, sdk_client: RunloopSDK) -> None: content = b"Bytes content to download" obj = sdk_client.storage_object.upload_from_bytes( content, - unique_name("sdk-download-bytes"), + name=unique_name("sdk-download-bytes"), content_type="text", ) @@ -237,7 +237,7 @@ def test_get_download_url(self, sdk_client: RunloopSDK) -> None: """Test getting download URL.""" obj = sdk_client.storage_object.upload_from_text( "Content for URL", - unique_name("sdk-download-url"), + name=unique_name("sdk-download-url"), ) try: @@ -266,7 +266,7 @@ def test_get_storage_object_by_id(self, sdk_client: RunloopSDK) -> None: # Create an object created = sdk_client.storage_object.upload_from_text( "Content for retrieval", - unique_name("sdk-storage-retrieve"), + name=unique_name("sdk-storage-retrieve"), ) try: @@ -286,7 +286,7 @@ def test_list_storage_objects_by_content_type(self, sdk_client: RunloopSDK) -> N # Create object with specific content type obj = sdk_client.storage_object.upload_from_text( "Text content", - unique_name("sdk-storage-list-type"), + name=unique_name("sdk-storage-list-type"), ) try: @@ -310,7 +310,7 @@ def test_mount_storage_object_to_devbox(self, sdk_client: RunloopSDK) -> None: # Create storage object with content obj = sdk_client.storage_object.upload_from_text( "Mounted content from SDK", - unique_name("sdk-mount-object"), + name=unique_name("sdk-mount-object"), ) try: @@ -342,7 +342,7 @@ def test_access_mounted_storage_object(self, sdk_client: RunloopSDK) -> None: # Create storage object obj = sdk_client.storage_object.upload_from_text( "Content to mount and access", - unique_name("sdk-mount-access"), + name=unique_name("sdk-mount-access"), ) try: @@ -384,7 +384,7 @@ def test_storage_object_large_content(self, sdk_client: RunloopSDK) -> None: obj = sdk_client.storage_object.upload_from_text( large_content, - unique_name("sdk-storage-large"), + name=unique_name("sdk-storage-large"), ) try: @@ -403,7 +403,7 @@ def test_storage_object_binary_content(self, sdk_client: RunloopSDK) -> None: obj = sdk_client.storage_object.upload_from_bytes( binary_content, - unique_name("sdk-storage-binary"), + name=unique_name("sdk-storage-binary"), content_type="binary", ) @@ -419,7 +419,7 @@ def test_storage_object_empty_content(self, sdk_client: RunloopSDK) -> None: """Test uploading empty content.""" obj = sdk_client.storage_object.upload_from_text( "", - unique_name("sdk-storage-empty"), + name=unique_name("sdk-storage-empty"), ) try: diff --git a/uv.lock b/uv.lock index 6c083e7dd..e5bd5b8fd 100644 --- a/uv.lock +++ b/uv.lock @@ -2098,7 +2098,7 @@ wheels = [ [[package]] name = "runloop-api-client" -version = "0.68.0" +version = "0.69.0" source = { editable = "." } dependencies = [ { name = "anyio" },