diff --git a/storage/samples/snippets/snippets_test.py b/storage/samples/snippets/snippets_test.py index 1d3c8c1c44..9786f01012 100644 --- a/storage/samples/snippets/snippets_test.py +++ b/storage/samples/snippets/snippets_test.py @@ -15,10 +15,10 @@ import asyncio import io import os +import sys import tempfile import time import uuid -import sys from google.cloud import storage import google.cloud.exceptions @@ -673,6 +673,7 @@ def test_storage_compose_file(test_bucket): blob = test_bucket.blob(source) blob.upload_from_string(source) + # Test with delete_source_objects = False (default) with tempfile.NamedTemporaryFile() as dest_file: destination = storage_compose_file.compose_file( test_bucket.name, @@ -683,6 +684,29 @@ def test_storage_compose_file(test_bucket): composed = destination.download_as_bytes() assert composed.decode("utf-8") == source_files[0] + source_files[1] + assert test_bucket.blob(source_files[0]).exists() + assert test_bucket.blob(source_files[1]).exists() + + # Clean up destination file + destination.delete() + + # Test with delete_source_objects = True + with tempfile.NamedTemporaryFile() as dest_file: + destination = storage_compose_file.compose_file( + test_bucket.name, + source_files[0], + source_files[1], + dest_file.name, + delete_source_objects=True, + ) + composed = destination.download_as_bytes() + + assert composed.decode("utf-8") == source_files[0] + source_files[1] + assert not test_bucket.blob(source_files[0]).exists() + assert not test_bucket.blob(source_files[1]).exists() + + # Clean up destination file + destination.delete() def test_cors_configuration(test_bucket, capsys): diff --git a/storage/samples/snippets/storage_compose_file.py b/storage/samples/snippets/storage_compose_file.py index e673912725..dc05675df9 100644 --- a/storage/samples/snippets/storage_compose_file.py +++ b/storage/samples/snippets/storage_compose_file.py @@ -20,12 +20,19 @@ from google.cloud import storage -def compose_file(bucket_name, first_blob_name, second_blob_name, destination_blob_name): +def compose_file( + bucket_name, + first_blob_name, + second_blob_name, + destination_blob_name, + delete_source_objects=False, +): """Concatenate source blobs into destination blob.""" # bucket_name = "your-bucket-name" # first_blob_name = "first-object-name" # second_blob_name = "second-blob-name" # destination_blob_name = "destination-object-name" + # delete_source_objects = False storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) @@ -44,11 +51,20 @@ def compose_file(bucket_name, first_blob_name, second_blob_name, destination_blo # There is also an `if_source_generation_match` parameter, which is not used in this example. destination_generation_match_precondition = 0 - destination.compose(sources, if_generation_match=destination_generation_match_precondition) + destination.compose( + sources, + if_generation_match=destination_generation_match_precondition, + delete_source_objects=delete_source_objects, + ) + suffix = " Source objects were deleted." if delete_source_objects else "" print( - "New composite object {} in the bucket {} was created by combining {} and {}".format( - destination_blob_name, bucket_name, first_blob_name, second_blob_name + "New composite object {} in the bucket {} was created by combining {} and {}.{}".format( + destination_blob_name, + bucket_name, + first_blob_name, + second_blob_name, + suffix, ) ) return destination