Skip to content

Commit 873ec53

Browse files
committed
Making all Blob/Bucket getters fail gracefully if keys don't exist.
Also replacing uses of dict.copy() (shallow) with copy.deepcopy().
1 parent 3af46b1 commit 873ec53

File tree

3 files changed

+24
-24
lines changed

3 files changed

+24
-24
lines changed

gcloud/exceptions.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
See: https://cloud.google.com/storage/docs/json_api/v1/status-codes
1818
"""
1919

20+
import copy
2021
import json
2122
import six
2223

@@ -38,7 +39,7 @@ def __init__(self, message, errors=()):
3839
super(GCloudError, self).__init__()
3940
# suppress deprecation warning under 2.6.x
4041
self.message = message
41-
self._errors = [error.copy() for error in errors]
42+
self._errors = errors
4243

4344
def __str__(self):
4445
return '%d %s' % (self.code, self.message)
@@ -50,7 +51,7 @@ def errors(self):
5051
:rtype: list(dict)
5152
:returns: a list of mappings describing each error.
5253
"""
53-
return [error.copy() for error in self._errors]
54+
return [copy.deepcopy(error) for error in self._errors]
5455

5556

5657
class Redirection(GCloudError):

gcloud/storage/blob.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ def component_count(self):
485485
486486
:rtype: integer
487487
"""
488-
return self._properties['componentCount']
488+
return self._properties.get('componentCount')
489489

490490
@property
491491
def etag(self):
@@ -496,7 +496,7 @@ def etag(self):
496496
497497
:rtype: string
498498
"""
499-
return self._properties['etag']
499+
return self._properties.get('etag')
500500

501501
@property
502502
def generation(self):
@@ -506,7 +506,7 @@ def generation(self):
506506
507507
:rtype: integer
508508
"""
509-
return self._properties['generation']
509+
return self._properties.get('generation')
510510

511511
@property
512512
def id(self):
@@ -516,7 +516,7 @@ def id(self):
516516
517517
:rtype: string
518518
"""
519-
return self._properties['id']
519+
return self._properties.get('id')
520520

521521
md5_hash = _scalar_property('md5Hash')
522522
"""MD5 hash for this object.
@@ -535,7 +535,7 @@ def media_link(self):
535535
536536
:rtype: string
537537
"""
538-
return self._properties['mediaLink']
538+
return self._properties.get('mediaLink')
539539

540540
@property
541541
def metadata(self):
@@ -545,7 +545,7 @@ def metadata(self):
545545
546546
:rtype: dict
547547
"""
548-
return copy.deepcopy(self._properties['metadata'])
548+
return copy.deepcopy(self._properties.get('metadata'))
549549

550550
@metadata.setter
551551
def metadata(self, value):
@@ -565,7 +565,7 @@ def metageneration(self):
565565
566566
:rtype: integer
567567
"""
568-
return self._properties['metageneration']
568+
return self._properties.get('metageneration')
569569

570570
@property
571571
def owner(self):
@@ -576,7 +576,7 @@ def owner(self):
576576
:rtype: dict
577577
:returns: mapping of owner's role/ID.
578578
"""
579-
return self._properties['owner'].copy()
579+
return copy.deepcopy(self._properties.get('owner'))
580580

581581
@property
582582
def self_link(self):
@@ -586,7 +586,7 @@ def self_link(self):
586586
587587
:rtype: string
588588
"""
589-
return self._properties['selfLink']
589+
return self._properties.get('selfLink')
590590

591591
@property
592592
def size(self):
@@ -596,7 +596,7 @@ def size(self):
596596
597597
:rtype: integer
598598
"""
599-
return self._properties['size']
599+
return self._properties.get('size')
600600

601601
@property
602602
def storage_class(self):
@@ -608,7 +608,7 @@ def storage_class(self):
608608
:rtype: string
609609
:returns: Currently one of "STANDARD", "DURABLE_REDUCED_AVAILABILITY"
610610
"""
611-
return self._properties['storageClass']
611+
return self._properties.get('storageClass')
612612

613613
@property
614614
def time_deleted(self):
@@ -631,7 +631,7 @@ def updated(self):
631631
:rtype: string
632632
:returns: timestamp in RFC 3339 format.
633633
"""
634-
return self._properties['updated']
634+
return self._properties.get('updated')
635635

636636

637637
class _UploadConfig(object):

gcloud/storage/bucket.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ def etag(self):
515515
516516
:rtype: string
517517
"""
518-
return self._properties['etag']
518+
return self._properties.get('etag')
519519

520520
@property
521521
def id(self):
@@ -525,7 +525,7 @@ def id(self):
525525
526526
:rtype: string
527527
"""
528-
return self._properties['id']
528+
return self._properties.get('id')
529529

530530
@property
531531
def lifecycle_rules(self):
@@ -571,8 +571,7 @@ def get_logging(self):
571571
(if logging is enabled), or None (if not).
572572
"""
573573
info = self._properties.get('logging')
574-
if info is not None:
575-
return info.copy()
574+
return copy.deepcopy(info)
576575

577576
def enable_logging(self, bucket_name, object_prefix=''):
578577
"""Enable access logging for this bucket.
@@ -603,7 +602,7 @@ def metageneration(self):
603602
604603
:rtype: integer
605604
"""
606-
return self._properties['metageneration']
605+
return self._properties.get('metageneration')
607606

608607
@property
609608
def owner(self):
@@ -614,7 +613,7 @@ def owner(self):
614613
:rtype: dict
615614
:returns: mapping of owner's role/ID.
616615
"""
617-
return self._properties['owner'].copy()
616+
return copy.deepcopy(self._properties.get('owner'))
618617

619618
@property
620619
def project_number(self):
@@ -624,7 +623,7 @@ def project_number(self):
624623
625624
:rtype: integer
626625
"""
627-
return self._properties['projectNumber']
626+
return self._properties.get('projectNumber')
628627

629628
@property
630629
def self_link(self):
@@ -634,7 +633,7 @@ def self_link(self):
634633
635634
:rtype: string
636635
"""
637-
return self._properties['selfLink']
636+
return self._properties.get('selfLink')
638637

639638
@property
640639
def storage_class(self):
@@ -646,7 +645,7 @@ def storage_class(self):
646645
:rtype: string
647646
:returns: Currently one of "STANDARD", "DURABLE_REDUCED_AVAILABILITY"
648647
"""
649-
return self._properties['storageClass']
648+
return self._properties.get('storageClass')
650649

651650
@property
652651
def time_created(self):
@@ -657,7 +656,7 @@ def time_created(self):
657656
:rtype: string
658657
:returns: timestamp in RFC 3339 format.
659658
"""
660-
return self._properties['timeCreated']
659+
return self._properties.get('timeCreated')
661660

662661
@property
663662
def versioning_enabled(self):

0 commit comments

Comments
 (0)