Skip to content

Commit 7b99797

Browse files
committed
#825: Allow passing explicit connection to 'Bucket.{list_blobs,make_public}'.
1 parent 7db8d38 commit 7b99797

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

gcloud/storage/bucket.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ def get_blob(self, blob_name, connection=None):
258258

259259
def list_blobs(self, max_results=None, page_token=None, prefix=None,
260260
delimiter=None, versions=None,
261-
projection='noAcl', fields=None):
261+
projection='noAcl', fields=None, connection=None):
262262
"""Return an iterator used to find blobs in the bucket.
263263
264264
:type max_results: integer or ``NoneType``
@@ -290,6 +290,11 @@ def list_blobs(self, max_results=None, page_token=None, prefix=None,
290290
and the language of each blob returned:
291291
'items/contentLanguage,nextPageToken'
292292
293+
:type connection: :class:`gcloud.storage.connection.Connection` or
294+
``NoneType``
295+
:param connection: Optional. The connection to use when sending
296+
requests. If not provided, falls back to default.
297+
293298
:rtype: :class:`_BlobIterator`.
294299
:returns: An iterator of blobs.
295300
"""
@@ -312,7 +317,8 @@ def list_blobs(self, max_results=None, page_token=None, prefix=None,
312317
if fields is not None:
313318
extra_params['fields'] = fields
314319

315-
result = self._iterator_class(self, extra_params=extra_params)
320+
result = self._iterator_class(
321+
self, extra_params=extra_params, connection=connection)
316322
# Page token must be handled specially since the base `Iterator`
317323
# class has it as a reserved property.
318324
if page_token is not None:
@@ -836,7 +842,7 @@ def disable_website(self):
836842
"""
837843
return self.configure_website(None, None)
838844

839-
def make_public(self, recursive=False, future=False):
845+
def make_public(self, recursive=False, future=False, connection=None):
840846
"""Make a bucket public.
841847
842848
:type recursive: boolean
@@ -846,18 +852,26 @@ def make_public(self, recursive=False, future=False):
846852
:type future: boolean
847853
:param future: If True, this will make all objects created in the
848854
future public as well.
855+
856+
:type connection: :class:`gcloud.storage.connection.Connection` or
857+
``NoneType``
858+
:param connection: Optional. The connection to use when sending
859+
requests. If not provided, falls back to default.
849860
"""
861+
connection = _require_connection(connection)
862+
850863
self.acl.all().grant_read()
851-
self.acl.save()
864+
self.acl.save(connection=connection)
852865

853866
if future:
854867
doa = self.default_object_acl
855868
if not doa.loaded:
856-
doa.reload()
869+
doa.reload(connection=connection)
857870
doa.all().grant_read()
858-
doa.save()
871+
doa.save(connection=connection)
859872

860873
if recursive:
861-
for blob in self:
874+
for blob in self.list_blobs(projection='full',
875+
connection=connection):
862876
blob.acl.all().grant_read()
863-
blob.save_acl()
877+
blob.acl.save(connection=connection)

gcloud/storage/test_bucket.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,18 @@ def test_list_blobs_explicit(self):
335335
self.assertEqual(kw['path'], '/b/%s/o' % NAME)
336336
self.assertEqual(kw['query_params'], EXPECTED)
337337

338+
def test_list_blobs_w_explicit_connection(self):
339+
NAME = 'name'
340+
connection = _Connection({'items': []})
341+
bucket = self._makeOne(NAME, None)
342+
iterator = bucket.list_blobs(connection=connection)
343+
blobs = list(iterator)
344+
self.assertEqual(blobs, [])
345+
kw, = connection._requested
346+
self.assertEqual(kw['method'], 'GET')
347+
self.assertEqual(kw['path'], '/b/%s/o' % NAME)
348+
self.assertEqual(kw['query_params'], {'projection': 'noAcl'})
349+
338350
def test_delete_default_miss(self):
339351
from gcloud.exceptions import NotFound
340352
NAME = 'name'
@@ -887,10 +899,10 @@ def test_make_public_defaults(self):
887899
permissive = [{'entity': 'allUsers', 'role': _ACLEntity.READER_ROLE}]
888900
after = {'acl': permissive, 'defaultObjectAcl': []}
889901
connection = _Connection(after)
890-
bucket = self._makeOne(NAME, connection)
902+
bucket = self._makeOne(NAME, None)
891903
bucket.acl.loaded = True
892904
bucket.default_object_acl.loaded = True
893-
bucket.make_public()
905+
bucket.make_public(connection=connection)
894906
self.assertEqual(list(bucket.acl), permissive)
895907
self.assertEqual(list(bucket.default_object_acl), [])
896908
kw = connection._requested
@@ -914,10 +926,10 @@ def _make_public_w_future_helper(self, default_object_acl_loaded=True):
914926
# We return the same value for default_object_acl.reload()
915927
# to consume.
916928
connection = _Connection(after1, after1, after2)
917-
bucket = self._makeOne(NAME, connection)
929+
bucket = self._makeOne(NAME, None)
918930
bucket.acl.loaded = True
919931
bucket.default_object_acl.loaded = default_object_acl_loaded
920-
bucket.make_public(future=True)
932+
bucket.make_public(future=True, connection=connection)
921933
self.assertEqual(list(bucket.acl), permissive)
922934
self.assertEqual(list(bucket.default_object_acl), permissive)
923935
kw = connection._requested
@@ -957,14 +969,16 @@ def __init__(self, bucket, name):
957969
def acl(self):
958970
return self
959971

972+
# Faux ACL methods
960973
def all(self):
961974
return self
962975

963976
def grant_read(self):
964977
self._granted = True
965978

966-
def save_acl(self):
967-
_saved.append((self._bucket, self._name, self._granted))
979+
def save(self, connection=None):
980+
_saved.append(
981+
(self._bucket, self._name, self._granted, connection))
968982

969983
class _Iterator(_BlobIterator):
970984
def get_items_from_response(self, response):
@@ -976,14 +990,14 @@ def get_items_from_response(self, response):
976990
permissive = [{'entity': 'allUsers', 'role': _ACLEntity.READER_ROLE}]
977991
after = {'acl': permissive, 'defaultObjectAcl': []}
978992
connection = _Connection(after, {'items': [{'name': BLOB_NAME}]})
979-
bucket = self._makeOne(NAME, connection)
993+
bucket = self._makeOne(NAME, None)
980994
bucket.acl.loaded = True
981995
bucket.default_object_acl.loaded = True
982996
bucket._iterator_class = _Iterator
983-
bucket.make_public(recursive=True)
997+
bucket.make_public(recursive=True, connection=connection)
984998
self.assertEqual(list(bucket.acl), permissive)
985999
self.assertEqual(list(bucket.default_object_acl), [])
986-
self.assertEqual(_saved, [(bucket, BLOB_NAME, True)])
1000+
self.assertEqual(_saved, [(bucket, BLOB_NAME, True, connection)])
9871001
kw = connection._requested
9881002
self.assertEqual(len(kw), 2)
9891003
self.assertEqual(kw[0]['method'], 'PATCH')
@@ -992,7 +1006,7 @@ def get_items_from_response(self, response):
9921006
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
9931007
self.assertEqual(kw[1]['method'], 'GET')
9941008
self.assertEqual(kw[1]['path'], '/b/%s/o' % NAME)
995-
self.assertEqual(kw[1]['query_params'], {'projection': 'noAcl'})
1009+
self.assertEqual(kw[1]['query_params'], {'projection': 'full'})
9961010

9971011

9981012
class _Connection(object):

0 commit comments

Comments
 (0)