Skip to content

Commit baddf92

Browse files
committed
remove contexts and correct lint
1 parent f64d6ea commit baddf92

3 files changed

Lines changed: 81 additions & 67 deletions

File tree

packages/google-cloud-storage/google/cloud/storage/_grpc_conversions.py

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,14 @@ def blob_to_proto(blob):
4444
if value is not None:
4545
resource_params[proto_field] = value
4646

47-
# custom_time (field 26): google.protobuf.Timestamp
4847
custom_time = getattr(blob, "custom_time", None)
4948
if custom_time is not None:
5049
custom_time_proto = timestamp_pb2.Timestamp()
5150
custom_time_proto.FromDatetime(custom_time)
5251
resource_params["custom_time"] = custom_time_proto
5352

54-
# acl (field 10): repeated ObjectAccessControl
5553
acl = getattr(blob, "acl", None)
56-
if acl is not None and getattr(acl, "loaded", False):
54+
if acl:
5755
acl_entries = []
5856
for entry in acl:
5957
acl_entries.append(
@@ -65,23 +63,6 @@ def blob_to_proto(blob):
6563
if acl_entries:
6664
resource_params["acl"] = acl_entries
6765

68-
# contexts (field 38): ObjectContexts
69-
contexts = getattr(blob, "contexts", None)
70-
if contexts is not None:
71-
custom_map = {}
72-
# contexts is expected to be a dict of key-value pairs
73-
if isinstance(contexts, dict):
74-
for k, v in contexts.items():
75-
if isinstance(v, str):
76-
payload = _storage_v2.ObjectCustomContextPayload(value=v)
77-
else:
78-
payload = v
79-
custom_map[k] = payload
80-
81-
if custom_map:
82-
resource_params["contexts"] = _storage_v2.ObjectContexts(custom=custom_map)
83-
84-
# retention (field 30): Object.Retention
8566
retention = getattr(blob, "retention", None)
8667
if retention:
8768
mode_str = retention.get("mode")

packages/google-cloud-storage/tests/unit/asyncio/test_async_write_object_stream.py

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import datetime
1516
import unittest.mock as mock
1617
from unittest.mock import AsyncMock, MagicMock
1718

@@ -170,17 +171,33 @@ async def test_open_new_object_with_blob_sync_attrs(
170171
mock_blob.bucket = mock_bucket
171172
mock_blob.content_type = "text/plain"
172173
mock_blob.metadata = {"test-key": "test-value"}
173-
mock_blob.kms_key_name = None
174-
mock_blob.cache_control = None
175-
mock_blob.content_disposition = None
176-
mock_blob.content_encoding = None
177-
mock_blob.content_language = None
178-
mock_blob.temporary_hold = None
179-
mock_blob.event_based_hold = None
180-
mock_blob.custom_time = None
181-
mock_blob.acl = None
182-
mock_blob.retention = None
183-
mock_blob.contexts = None
174+
mock_blob.kms_key_name = "kms-key-name"
175+
mock_blob.cache_control = "cache-control"
176+
mock_blob.content_disposition = "content-disposition"
177+
mock_blob.content_encoding = "content-encoding"
178+
mock_blob.content_language = "content-language"
179+
mock_blob.temporary_hold = True
180+
mock_blob.event_based_hold = True
181+
182+
custom_time = datetime.datetime(
183+
2025, 1, 1, 12, 0, 0, tzinfo=datetime.timezone.utc
184+
)
185+
mock_blob.custom_time = custom_time
186+
187+
acl_mock = MagicMock()
188+
acl_mock.loaded = True
189+
acl_mock.__iter__.return_value = iter(
190+
[{"role": "READER", "entity": "allUsers"}]
191+
)
192+
mock_blob.acl = acl_mock
193+
194+
retain_until_time = datetime.datetime(
195+
2026, 1, 1, 12, 0, 0, tzinfo=datetime.timezone.utc
196+
)
197+
mock_blob.retention = {
198+
"mode": "Locked",
199+
"retain_until_time": retain_until_time,
200+
}
184201

185202
stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT, blob=mock_blob)
186203
await stream.open()
@@ -191,6 +208,24 @@ async def test_open_new_object_with_blob_sync_attrs(
191208

192209
assert resource.content_type == "text/plain"
193210
assert resource.metadata == {"test-key": "test-value"}
211+
assert resource.kms_key == "kms-key-name"
212+
assert resource.cache_control == "cache-control"
213+
assert resource.content_disposition == "content-disposition"
214+
assert resource.content_encoding == "content-encoding"
215+
assert resource.content_language == "content-language"
216+
assert resource.temporary_hold is True
217+
assert resource.event_based_hold is True
218+
219+
assert int(resource.custom_time.timestamp()) == int(custom_time.timestamp())
220+
221+
assert len(resource.acl) == 1
222+
assert resource.acl[0].role == "READER"
223+
assert resource.acl[0].entity == "allUsers"
224+
225+
assert resource.retention.mode == _storage_v2.Object.Retention.Mode.LOCKED
226+
assert int(resource.retention.retain_until_time.timestamp()) == int(
227+
retain_until_time.timestamp()
228+
)
194229

195230
@pytest.mark.asyncio
196231
async def test_open_already_open_raises(self, mock_client):

packages/google-cloud-storage/tests/unit/test__grpc_conversions.py

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,24 @@
2121

2222

2323
def test_blob_to_proto_simple_fields():
24-
blob = mock.Mock(spec=["name", "bucket", "content_type", "metadata", "kms_key_name", "cache_control", "content_disposition", "content_encoding", "content_language", "temporary_hold", "event_based_hold", "custom_time", "acl", "retention", "contexts"])
24+
blob = mock.Mock(
25+
spec=[
26+
"name",
27+
"bucket",
28+
"content_type",
29+
"metadata",
30+
"kms_key_name",
31+
"cache_control",
32+
"content_disposition",
33+
"content_encoding",
34+
"content_language",
35+
"temporary_hold",
36+
"event_based_hold",
37+
"custom_time",
38+
"acl",
39+
"retention",
40+
]
41+
)
2542
blob.name = "blob-name"
2643
blob.bucket.name = "bucket-name"
2744
blob.content_type = "text/plain"
@@ -36,7 +53,6 @@ def test_blob_to_proto_simple_fields():
3653
blob.custom_time = None
3754
blob.acl = None
3855
blob.retention = None
39-
blob.contexts = None
4056

4157
proto = _grpc_conversions.blob_to_proto(blob)
4258

@@ -54,13 +70,14 @@ def test_blob_to_proto_simple_fields():
5470

5571

5672
def test_blob_to_proto_custom_time():
57-
blob = mock.Mock(spec=["name", "bucket", "custom_time", "acl", "retention", "contexts"])
73+
blob = mock.Mock(spec=["name", "bucket", "custom_time", "acl", "retention"])
5874
blob.name = "blob-name"
5975
blob.bucket.name = "bucket-name"
60-
blob.custom_time = datetime.datetime(2025, 1, 1, 12, 0, 0, tzinfo=datetime.timezone.utc)
76+
blob.custom_time = datetime.datetime(
77+
2025, 1, 1, 12, 0, 0, tzinfo=datetime.timezone.utc
78+
)
6179
blob.acl = None
6280
blob.retention = None
63-
blob.contexts = None
6481
# ensure other fields don't cause issues if missing
6582
for attr in _grpc_conversions._BLOB_ATTR_TO_PROTO_FIELD:
6683
setattr(blob, attr, None)
@@ -71,21 +88,22 @@ def test_blob_to_proto_custom_time():
7188

7289

7390
def test_blob_to_proto_acl():
74-
blob = mock.Mock(spec=["name", "bucket", "acl", "custom_time", "retention", "contexts"])
91+
blob = mock.Mock(spec=["name", "bucket", "acl", "custom_time", "retention"])
7592
blob.name = "blob-name"
7693
blob.bucket.name = "bucket-name"
7794

7895
acl_mock = mock.MagicMock()
7996
acl_mock.loaded = True
80-
acl_mock.__iter__.return_value = iter([
81-
{"role": "READER", "entity": "allUsers"},
82-
{"role": "OWNER", "entity": "user-123"},
83-
])
97+
acl_mock.__iter__.return_value = iter(
98+
[
99+
{"role": "READER", "entity": "allUsers"},
100+
{"role": "OWNER", "entity": "user-123"},
101+
]
102+
)
84103
blob.acl = acl_mock
85104

86105
blob.custom_time = None
87106
blob.retention = None
88-
blob.contexts = None
89107
for attr in _grpc_conversions._BLOB_ATTR_TO_PROTO_FIELD:
90108
setattr(blob, attr, None)
91109

@@ -98,42 +116,22 @@ def test_blob_to_proto_acl():
98116
assert proto.acl[1].entity == "user-123"
99117

100118

101-
def test_blob_to_proto_contexts():
102-
blob = mock.Mock(spec=["name", "bucket", "contexts", "custom_time", "acl", "retention"])
103-
blob.name = "blob-name"
104-
blob.bucket.name = "bucket-name"
105-
blob.contexts = {"c1": "v1", "c2": "v2"}
106-
blob.custom_time = None
107-
blob.acl = None
108-
blob.retention = None
109-
for attr in _grpc_conversions._BLOB_ATTR_TO_PROTO_FIELD:
110-
setattr(blob, attr, None)
111-
112-
proto = _grpc_conversions.blob_to_proto(blob)
113-
114-
assert len(proto.contexts.custom) == 2
115-
contexts_dict = {k: v.value for k, v in proto.contexts.custom.items()}
116-
assert contexts_dict == {"c1": "v1", "c2": "v2"}
117-
118-
119119
def test_blob_to_proto_retention():
120-
blob = mock.Mock(spec=["name", "bucket", "retention", "custom_time", "acl", "contexts"])
120+
blob = mock.Mock(spec=["name", "bucket", "retention", "custom_time", "acl"])
121121
blob.name = "blob-name"
122122
blob.bucket.name = "bucket-name"
123123

124124
retain_until_time = datetime.datetime(2026, 1, 1, tzinfo=datetime.timezone.utc)
125-
blob.retention = {
126-
"mode": "Locked",
127-
"retain_until_time": retain_until_time
128-
}
125+
blob.retention = {"mode": "Locked", "retain_until_time": retain_until_time}
129126

130127
blob.custom_time = None
131128
blob.acl = None
132-
blob.contexts = None
133129
for attr in _grpc_conversions._BLOB_ATTR_TO_PROTO_FIELD:
134130
setattr(blob, attr, None)
135131

136132
proto = _grpc_conversions.blob_to_proto(blob)
137133

138134
assert proto.retention.mode == _storage_v2.Object.Retention.Mode.LOCKED
139-
assert int(proto.retention.retain_until_time.timestamp()) == int(retain_until_time.timestamp())
135+
assert int(proto.retention.retain_until_time.timestamp()) == int(
136+
retain_until_time.timestamp()
137+
)

0 commit comments

Comments
 (0)