diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index c175b367e..33b809d3c 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -3620,13 +3620,16 @@ def metadata(self): def metadata(self, value): """Update arbitrary/application specific metadata for the object. + Values are stored to GCS as strings. To delete a key, set its value to + None and call blob.patch(). + See https://cloud.google.com/storage/docs/json_api/v1/objects :type value: dict :param value: The blob metadata to set. """ if value is not None: - value = {k: str(v) for k, v in value.items()} + value = {k: str(v) if v is not None else None for k, v in value.items()} self._patch_property("metadata", value) @property diff --git a/tests/system/test_system.py b/tests/system/test_system.py index 5973e6c73..9e7a86c2f 100644 --- a/tests/system/test_system.py +++ b/tests/system/test_system.py @@ -874,6 +874,19 @@ def test_write_metadata(self): blob.content_type = "image/png" self.assertEqual(blob.content_type, "image/png") + metadata = {"foo": "Foo", "bar": "Bar"} + blob.metadata = metadata + blob.patch() + blob.reload() + self.assertEqual(blob.metadata, metadata) + + # Ensure that metadata keys can be deleted by setting equal to None. + new_metadata = {"foo": "Foo", "bar": None} + blob.metadata = new_metadata + blob.patch() + blob.reload() + self.assertEqual(blob.metadata, {"foo": "Foo"}) + def test_direct_write_and_read_into_file(self): blob = self.bucket.blob("MyBuffer") file_contents = b"Hello World"