Skip to content

Commit ffd7cca

Browse files
tillahoffmanntseaver
authored andcommitted
Add keyword arguments to google.cloud.storage.Bucket.get_blob. (googleapis#3613)
1 parent 3d9461b commit ffd7cca

3 files changed

Lines changed: 41 additions & 4 deletions

File tree

storage/google/cloud/storage/blob.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class Blob(_PropertyMixin):
113113
:type encryption_key: bytes
114114
:param encryption_key:
115115
Optional 32 byte encryption key for customer-supplied encryption.
116-
See https://cloud.google.com/storage/docs/encryption#customer-supplied
116+
See https://cloud.google.com/storage/docs/encryption#customer-supplied.
117117
"""
118118

119119
_chunk_size = None # Default value for each instance.

storage/google/cloud/storage/bucket.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from google.cloud.storage.acl import BucketACL
3535
from google.cloud.storage.acl import DefaultObjectACL
3636
from google.cloud.storage.blob import Blob
37+
from google.cloud.storage.blob import _get_encryption_headers
3738

3839

3940
def _blobs_page_start(iterator, page, response):
@@ -228,7 +229,7 @@ def path(self):
228229

229230
return self.path_helper(self.name)
230231

231-
def get_blob(self, blob_name, client=None):
232+
def get_blob(self, blob_name, client=None, encryption_key=None, **kwargs):
232233
"""Get a blob object by name.
233234
234235
This will return None if the blob doesn't exist:
@@ -245,14 +246,27 @@ def get_blob(self, blob_name, client=None):
245246
:param client: Optional. The client to use. If not passed, falls back
246247
to the ``client`` stored on the current bucket.
247248
249+
:type encryption_key: bytes
250+
:param encryption_key:
251+
Optional 32 byte encryption key for customer-supplied encryption.
252+
See
253+
https://cloud.google.com/storage/docs/encryption#customer-supplied.
254+
255+
:type kwargs: dict
256+
:param kwargs: Keyword arguments to pass to the
257+
:class:`~google.cloud.storage.blob.Blob` constructor.
258+
248259
:rtype: :class:`google.cloud.storage.blob.Blob` or None
249260
:returns: The blob object if it exists, otherwise None.
250261
"""
251262
client = self._require_client(client)
252-
blob = Blob(bucket=self, name=blob_name)
263+
blob = Blob(bucket=self, name=blob_name, encryption_key=encryption_key,
264+
**kwargs)
253265
try:
266+
headers = _get_encryption_headers(encryption_key)
254267
response = client._connection.api_request(
255-
method='GET', path=blob.path, _target_object=blob)
268+
method='GET', path=blob.path, _target_object=blob,
269+
headers=headers)
256270
# NOTE: We assume response.get('name') matches `blob_name`.
257271
blob._set_properties(response)
258272
# NOTE: This will not fail immediately in a batch. However, when

storage/tests/unit/test_bucket.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,29 @@ def test_get_blob_hit(self):
245245
self.assertEqual(kw['method'], 'GET')
246246
self.assertEqual(kw['path'], '/b/%s/o/%s' % (NAME, BLOB_NAME))
247247

248+
def test_get_blob_hit_with_kwargs(self):
249+
from google.cloud.storage.blob import _get_encryption_headers
250+
251+
NAME = 'name'
252+
BLOB_NAME = 'blob-name'
253+
CHUNK_SIZE = 1024 * 1024
254+
KEY = b'01234567890123456789012345678901' # 32 bytes
255+
256+
connection = _Connection({'name': BLOB_NAME})
257+
client = _Client(connection)
258+
bucket = self._make_one(name=NAME)
259+
blob = bucket.get_blob(
260+
BLOB_NAME, client=client, encryption_key=KEY, chunk_size=CHUNK_SIZE
261+
)
262+
self.assertIs(blob.bucket, bucket)
263+
self.assertEqual(blob.name, BLOB_NAME)
264+
kw, = connection._requested
265+
self.assertEqual(kw['method'], 'GET')
266+
self.assertEqual(kw['path'], '/b/%s/o/%s' % (NAME, BLOB_NAME))
267+
self.assertEqual(kw['headers'], _get_encryption_headers(KEY))
268+
self.assertEqual(blob.chunk_size, CHUNK_SIZE)
269+
self.assertEqual(blob._encryption_key, KEY)
270+
248271
def test_list_blobs_defaults(self):
249272
NAME = 'name'
250273
connection = _Connection({'items': []})

0 commit comments

Comments
 (0)