Skip to content

Commit b282abb

Browse files
committed
Putting optional connection on Bucket upload methods and copy_blob.
Also adding stubs on some tests which were accidentally relying on the implicit environment.
1 parent dd1ae8d commit b282abb

File tree

2 files changed

+52
-28
lines changed

2 files changed

+52
-28
lines changed

gcloud/storage/bucket.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,9 @@ def delete_blobs(self, blobs, on_error=None, connection=None):
428428
else:
429429
raise
430430

431-
def copy_blob(self, blob, destination_bucket, new_name=None):
431+
@staticmethod
432+
def copy_blob(blob, destination_bucket, new_name=None,
433+
connection=None):
432434
"""Copy the given blob to the given bucket, optionally with a new name.
433435
434436
:type blob: string or :class:`gcloud.storage.blob.Blob`
@@ -441,18 +443,24 @@ def copy_blob(self, blob, destination_bucket, new_name=None):
441443
:type new_name: string
442444
:param new_name: (optional) the new name for the copied file.
443445
446+
:type connection: :class:`gcloud.storage.connection.Connection` or
447+
``NoneType``
448+
:param connection: Optional. The connection to use when sending
449+
requests. If not provided, falls back to default.
450+
444451
:rtype: :class:`gcloud.storage.blob.Blob`
445452
:returns: The new Blob.
446453
"""
454+
connection = _require_connection(connection)
447455
if new_name is None:
448456
new_name = blob.name
449457
new_blob = Blob(bucket=destination_bucket, name=new_name)
450458
api_path = blob.path + '/copyTo' + new_blob.path
451-
copy_result = self.connection.api_request(method='POST', path=api_path)
459+
copy_result = connection.api_request(method='POST', path=api_path)
452460
new_blob._set_properties(copy_result)
453461
return new_blob
454462

455-
def upload_file(self, filename, blob_name=None):
463+
def upload_file(self, filename, blob_name=None, connection=None):
456464
"""Shortcut method to upload a file into this bucket.
457465
458466
Use this method to quickly put a local file in Cloud Storage.
@@ -485,16 +493,21 @@ def upload_file(self, filename, blob_name=None):
485493
of the bucket with the same name as on your local
486494
file system.
487495
496+
:type connection: :class:`gcloud.storage.connection.Connection` or
497+
``NoneType``
498+
:param connection: Optional. The connection to use when sending
499+
requests. If not provided, falls back to default.
500+
488501
:rtype: :class:`Blob`
489502
:returns: The updated Blob object.
490503
"""
491504
if blob_name is None:
492505
blob_name = os.path.basename(filename)
493506
blob = Blob(bucket=self, name=blob_name)
494-
blob.upload_from_filename(filename)
507+
blob.upload_from_filename(filename, connection=connection)
495508
return blob
496509

497-
def upload_file_object(self, file_obj, blob_name=None):
510+
def upload_file_object(self, file_obj, blob_name=None, connection=None):
498511
"""Shortcut method to upload a file object into this bucket.
499512
500513
Use this method to quickly put a local file in Cloud Storage.
@@ -527,13 +540,18 @@ def upload_file_object(self, file_obj, blob_name=None):
527540
of the bucket with the same name as on your local
528541
file system.
529542
543+
:type connection: :class:`gcloud.storage.connection.Connection` or
544+
``NoneType``
545+
:param connection: Optional. The connection to use when sending
546+
requests. If not provided, falls back to default.
547+
530548
:rtype: :class:`Blob`
531549
:returns: The updated Blob object.
532550
"""
533551
if blob_name is None:
534552
blob_name = os.path.basename(file_obj.name)
535553
blob = Blob(bucket=self, name=blob_name)
536-
blob.upload_from_file(file_obj)
554+
blob.upload_from_file(file_obj, connection=connection)
537555
return blob
538556

539557
@property

gcloud/storage/test_bucket.py

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,10 @@ def test_create_no_project(self):
194194
from gcloud._testing import _monkey_defaults
195195
BUCKET_NAME = 'bucket-name'
196196
bucket = self._makeOne(BUCKET_NAME)
197+
CONNECTION = object()
197198
with _monkey_defaults(project=None):
198-
self.assertRaises(EnvironmentError, bucket.create)
199+
self.assertRaises(EnvironmentError, bucket.create,
200+
connection=CONNECTION)
199201

200202
def test_create_hit_explicit_project(self):
201203
BUCKET_NAME = 'bucket-name'
@@ -391,7 +393,8 @@ def test_delete_explicit_too_many(self):
391393

392394
# Make the Bucket refuse to delete with 2 objects.
393395
bucket._MAX_OBJECTS_FOR_BUCKET_DELETE = 1
394-
self.assertRaises(ValueError, bucket.delete, force=True)
396+
self.assertRaises(ValueError, bucket.delete, force=True,
397+
connection=connection)
395398
self.assertEqual(connection._deleted_buckets, [])
396399

397400
def test_delete_blob_miss(self):
@@ -420,8 +423,8 @@ def test_delete_blob_hit(self):
420423
def test_delete_blobs_empty(self):
421424
NAME = 'name'
422425
connection = _Connection()
423-
bucket = self._makeOne(NAME, connection)
424-
bucket.delete_blobs([])
426+
bucket = self._makeOne(NAME)
427+
bucket.delete_blobs([], connection=connection)
425428
self.assertEqual(connection._requested, [])
426429

427430
def test_delete_blobs_hit(self):
@@ -478,10 +481,10 @@ class _Blob(object):
478481
path = '/b/%s/o/%s' % (SOURCE, BLOB_NAME)
479482

480483
connection = _Connection({})
481-
source = self._makeOne(SOURCE, connection)
482-
dest = self._makeOne(DEST, connection)
484+
source = self._makeOne(SOURCE)
485+
dest = self._makeOne(DEST)
483486
blob = _Blob()
484-
new_blob = source.copy_blob(blob, dest)
487+
new_blob = source.copy_blob(blob, dest, connection=connection)
485488
self.assertTrue(new_blob.bucket is dest)
486489
self.assertEqual(new_blob.name, BLOB_NAME)
487490
kw, = connection._requested
@@ -501,10 +504,11 @@ class _Blob(object):
501504
path = '/b/%s/o/%s' % (SOURCE, BLOB_NAME)
502505

503506
connection = _Connection({})
504-
source = self._makeOne(SOURCE, connection)
505-
dest = self._makeOne(DEST, connection)
507+
source = self._makeOne(SOURCE)
508+
dest = self._makeOne(DEST)
506509
blob = _Blob()
507-
new_blob = source.copy_blob(blob, dest, NEW_NAME)
510+
new_blob = source.copy_blob(blob, dest, NEW_NAME,
511+
connection=connection)
508512
self.assertTrue(new_blob.bucket is dest)
509513
self.assertEqual(new_blob.name, NEW_NAME)
510514
kw, = connection._requested
@@ -526,13 +530,14 @@ def __init__(self, bucket, name):
526530
self._bucket = bucket
527531
self._name = name
528532

529-
def upload_from_filename(self, filename):
530-
_uploaded.append((self._bucket, self._name, filename))
533+
def upload_from_filename(self, filename, connection=None):
534+
_uploaded.append((self._bucket, self._name, filename,
535+
connection))
531536

532537
bucket = self._makeOne()
533538
with _Monkey(MUT, Blob=_Blob):
534539
bucket.upload_file(FILENAME)
535-
self.assertEqual(_uploaded, [(bucket, BASENAME, FILENAME)])
540+
self.assertEqual(_uploaded, [(bucket, BASENAME, FILENAME, None)])
536541

537542
def test_upload_file_explicit_blob(self):
538543
from gcloud._testing import _Monkey
@@ -547,13 +552,14 @@ def __init__(self, bucket, name):
547552
self._bucket = bucket
548553
self._name = name
549554

550-
def upload_from_filename(self, filename):
551-
_uploaded.append((self._bucket, self._name, filename))
555+
def upload_from_filename(self, filename, connection=None):
556+
_uploaded.append((self._bucket, self._name, filename,
557+
connection))
552558

553559
bucket = self._makeOne()
554560
with _Monkey(MUT, Blob=_Blob):
555561
bucket.upload_file(FILENAME, BLOB_NAME)
556-
self.assertEqual(_uploaded, [(bucket, BLOB_NAME, FILENAME)])
562+
self.assertEqual(_uploaded, [(bucket, BLOB_NAME, FILENAME, None)])
557563

558564
def test_upload_file_object_no_blob(self):
559565
from gcloud._testing import _Monkey
@@ -568,13 +574,13 @@ def __init__(self, bucket, name):
568574
self._bucket = bucket
569575
self._name = name
570576

571-
def upload_from_file(self, fh):
572-
_uploaded.append((self._bucket, self._name, fh))
577+
def upload_from_file(self, fh, connection=None):
578+
_uploaded.append((self._bucket, self._name, fh, connection))
573579

574580
bucket = self._makeOne()
575581
with _Monkey(MUT, Blob=_Blob):
576582
found = bucket.upload_file_object(FILEOBJECT)
577-
self.assertEqual(_uploaded, [(bucket, FILENAME, FILEOBJECT)])
583+
self.assertEqual(_uploaded, [(bucket, FILENAME, FILEOBJECT, None)])
578584
self.assertTrue(isinstance(found, _Blob))
579585
self.assertEqual(found._name, FILENAME)
580586
self.assertTrue(found._bucket is bucket)
@@ -593,13 +599,13 @@ def __init__(self, bucket, name):
593599
self._bucket = bucket
594600
self._name = name
595601

596-
def upload_from_file(self, fh):
597-
_uploaded.append((self._bucket, self._name, fh))
602+
def upload_from_file(self, fh, connection=None):
603+
_uploaded.append((self._bucket, self._name, fh, connection))
598604

599605
bucket = self._makeOne()
600606
with _Monkey(MUT, Blob=_Blob):
601607
found = bucket.upload_file_object(FILEOBJECT, BLOB_NAME)
602-
self.assertEqual(_uploaded, [(bucket, BLOB_NAME, FILEOBJECT)])
608+
self.assertEqual(_uploaded, [(bucket, BLOB_NAME, FILEOBJECT, None)])
603609
self.assertTrue(isinstance(found, _Blob))
604610
self.assertEqual(found._name, BLOB_NAME)
605611
self.assertTrue(found._bucket is bucket)

0 commit comments

Comments
 (0)