Skip to content

Commit 622d994

Browse files
committed
Merge pull request #760 from dhermes/remove-properties-from-constructor
Remove properties= from Blob and Bucket constructors
2 parents 3906245 + 44e5b74 commit 622d994

File tree

8 files changed

+51
-86
lines changed

8 files changed

+51
-86
lines changed

gcloud/storage/_helpers.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,15 @@ def path(self):
3939
"""Abstract getter for the object path."""
4040
raise NotImplementedError
4141

42-
def __init__(self, name=None, properties=None):
42+
def __init__(self, name=None):
4343
"""_PropertyMixin constructor.
4444
4545
:type name: string
4646
:param name: The name of the object.
47-
48-
:type properties: dict
49-
:param properties: All the other data provided by Cloud Storage.
5047
"""
5148
self.name = name
5249
self._properties = {}
5350
self._changes = set()
54-
if properties is not None:
55-
self._properties.update(properties)
5651

5752
@property
5853
def properties(self):

gcloud/storage/api.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ def get_bucket(bucket_name, connection=None):
125125
if connection is None:
126126
connection = get_default_connection()
127127

128-
bucket_path = Bucket.path_helper(bucket_name)
129-
response = connection.api_request(method='GET', path=bucket_path)
130-
return Bucket(properties=response, connection=connection)
128+
bucket = Bucket(bucket_name, connection=connection)
129+
bucket._reload_properties()
130+
return bucket
131131

132132

133133
def create_bucket(bucket_name, project=None, connection=None):
@@ -169,7 +169,10 @@ def create_bucket(bucket_name, project=None, connection=None):
169169
response = connection.api_request(method='POST', path='/b',
170170
query_params=query_params,
171171
data={'name': bucket_name})
172-
return Bucket(properties=response, connection=connection)
172+
name = response.get('name')
173+
bucket = Bucket(name, connection=connection)
174+
bucket._properties = response
175+
return bucket
173176

174177

175178
class _BucketIterator(Iterator):
@@ -194,4 +197,7 @@ def get_items_from_response(self, response):
194197
:param response: The JSON API response for a page of buckets.
195198
"""
196199
for item in response.get('items', []):
197-
yield Bucket(properties=item, connection=self.connection)
200+
name = item.get('name')
201+
bucket = Bucket(name, connection=self.connection)
202+
bucket._properties = item
203+
yield bucket

gcloud/storage/blob.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,14 @@ class Blob(_PropertyMixin):
6262
# ACL rules are lazily retrieved.
6363
_acl = None
6464

65-
def __init__(self, name, bucket=None, properties=None):
66-
if name is None and properties is not None:
67-
name = properties.get('name')
68-
65+
def __init__(self, name, bucket=None):
6966
if bucket is None:
7067
bucket = _implicit_environ.get_default_bucket()
7168

7269
if bucket is None:
7370
raise ValueError('A Blob must have a bucket set.')
7471

75-
super(Blob, self).__init__(name=name, properties=properties)
72+
super(Blob, self).__init__(name=name)
7673

7774
self.bucket = bucket
7875

gcloud/storage/bucket.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ def get_items_from_response(self, response):
6969
"""
7070
self.prefixes = tuple(response.get('prefixes', ()))
7171
for item in response.get('items', []):
72-
yield Blob(None, properties=item, bucket=self.bucket)
72+
name = item.get('name')
73+
blob = Blob(name, bucket=self.bucket)
74+
blob._properties = item
75+
yield blob
7376

7477

7578
class Bucket(_PropertyMixin):
@@ -92,10 +95,8 @@ class Bucket(_PropertyMixin):
9295
# ACL rules are lazily retrieved.
9396
_acl = _default_object_acl = None
9497

95-
def __init__(self, name=None, connection=None, properties=None):
96-
if name is None and properties is not None:
97-
name = properties.get('name')
98-
super(Bucket, self).__init__(name=name, properties=properties)
98+
def __init__(self, name=None, connection=None):
99+
super(Bucket, self).__init__(name=name)
99100
self._connection = connection
100101

101102
def __repr__(self):
@@ -190,7 +191,10 @@ def get_blob(self, blob_name):
190191
try:
191192
response = self.connection.api_request(method='GET',
192193
path=blob.path)
193-
return Blob(None, bucket=self, properties=response)
194+
name = response.get('name') # Expect this to be blob_name
195+
blob = Blob(name, bucket=self)
196+
blob._properties = response
197+
return blob
194198
except NotFound:
195199
return None
196200

gcloud/storage/iterator.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ class MyIterator(Iterator):
2525
def get_items_from_response(self, response):
2626
items = response.get('items', [])
2727
for item in items:
28-
yield MyItemClass(properties=item, other_arg=True)
28+
my_item = MyItemClass(other_arg=True)
29+
my_item._properties = item
30+
yield my_item
2931
3032
You then can use this to get **all** the results from a resource::
3133

gcloud/storage/test_api.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_miss(self):
3030
'storage',
3131
conn.API_VERSION,
3232
'b',
33-
'nonesuch',
33+
'nonesuch?projection=noAcl',
3434
])
3535
http = conn._http = Http(
3636
{'status': '404', 'content-type': 'application/json'},
@@ -52,7 +52,7 @@ def _lookup_bucket_hit_helper(self, use_default=False):
5252
'storage',
5353
conn.API_VERSION,
5454
'b',
55-
'%s' % (BLOB_NAME,),
55+
'%s?projection=noAcl' % (BLOB_NAME,),
5656
])
5757
http = conn._http = Http(
5858
{'status': '200', 'content-type': 'application/json'},
@@ -156,7 +156,7 @@ def test_miss(self):
156156
'storage',
157157
conn.API_VERSION,
158158
'b',
159-
'nonesuch',
159+
'nonesuch?projection=noAcl',
160160
])
161161
http = conn._http = Http(
162162
{'status': '404', 'content-type': 'application/json'},
@@ -177,7 +177,7 @@ def _get_bucket_hit_helper(self, use_default=False):
177177
'storage',
178178
conn.API_VERSION,
179179
'b',
180-
'%s' % (BLOB_NAME,),
180+
'%s?projection=noAcl' % (BLOB_NAME,),
181181
])
182182
http = conn._http = Http(
183183
{'status': '200', 'content-type': 'application/json'},

gcloud/storage/test_blob.py

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ class Test_Blob(unittest2.TestCase):
1919

2020
def _makeOne(self, *args, **kw):
2121
from gcloud.storage.blob import Blob
22-
return Blob(*args, **kw)
22+
properties = kw.pop('properties', None)
23+
blob = Blob(*args, **kw)
24+
blob._properties = properties or {}
25+
return blob
2326

2427
def test_ctor_no_bucket(self):
2528
self.assertRaises(ValueError, self._makeOne, None)
@@ -63,29 +66,6 @@ def test_ctor_explicit(self):
6366
self.assertEqual(blob.properties, properties)
6467
self.assertTrue(blob._acl is None)
6568

66-
def test_ctor_no_name_defaults(self):
67-
BLOB_NAME = 'blob-name'
68-
properties = {'key': 'value', 'name': BLOB_NAME}
69-
FAKE_BUCKET = _Bucket(None)
70-
blob = self._makeOne(None, bucket=FAKE_BUCKET, properties=properties)
71-
self.assertEqual(blob.bucket, FAKE_BUCKET)
72-
self.assertEqual(blob.connection, None)
73-
self.assertEqual(blob.name, BLOB_NAME)
74-
self.assertEqual(blob.properties, properties)
75-
self.assertTrue(blob._acl is None)
76-
77-
def test_ctor_no_name_explicit(self):
78-
BLOB_NAME = 'blob-name'
79-
connection = _Connection()
80-
bucket = _Bucket(connection)
81-
properties = {'key': 'value', 'name': BLOB_NAME}
82-
blob = self._makeOne(None, properties=properties, bucket=bucket)
83-
self.assertTrue(blob.bucket is bucket)
84-
self.assertTrue(blob.connection is connection)
85-
self.assertEqual(blob.name, BLOB_NAME)
86-
self.assertEqual(blob.properties, properties)
87-
self.assertTrue(blob._acl is None)
88-
8969
def test_acl_property(self):
9070
from gcloud.storage.acl import ObjectACL
9171
FAKE_BUCKET = _Bucket(None)
@@ -1043,8 +1023,7 @@ def __init__(self, connection):
10431023

10441024
def copy_blob(self, blob, destination_bucket, new_name):
10451025
destination_bucket._blobs[new_name] = self._blobs[blob.name]
1046-
return blob.__class__(None, bucket=destination_bucket,
1047-
properties={'name': new_name})
1026+
return blob.__class__(new_name, bucket=destination_bucket)
10481027

10491028
def delete_blob(self, blob_name):
10501029
del self._blobs[blob_name]

gcloud/storage/test_bucket.py

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ class Test_Bucket(unittest2.TestCase):
6464

6565
def _makeOne(self, *args, **kw):
6666
from gcloud.storage.bucket import Bucket
67-
return Bucket(*args, **kw)
67+
properties = kw.pop('properties', None)
68+
bucket = Bucket(*args, **kw)
69+
bucket._properties = properties or {}
70+
return bucket
6871

6972
def test_ctor_defaults(self):
7073
bucket = self._makeOne()
@@ -78,34 +81,13 @@ def test_ctor_explicit(self):
7881
NAME = 'name'
7982
connection = _Connection()
8083
properties = {'key': 'value'}
81-
bucket = self._makeOne(NAME, connection, properties)
84+
bucket = self._makeOne(NAME, connection, properties=properties)
8285
self.assertTrue(bucket.connection is connection)
8386
self.assertEqual(bucket.name, NAME)
8487
self.assertEqual(bucket._properties, properties)
8588
self.assertTrue(bucket._acl is None)
8689
self.assertTrue(bucket._default_object_acl is None)
8790

88-
def test_ctor_no_name_defaults(self):
89-
NAME = 'name'
90-
properties = {'key': 'value', 'name': NAME}
91-
bucket = self._makeOne(properties=properties)
92-
self.assertEqual(bucket.connection, None)
93-
self.assertEqual(bucket.name, NAME)
94-
self.assertEqual(bucket.properties, properties)
95-
self.assertTrue(bucket._acl is None)
96-
self.assertTrue(bucket._default_object_acl is None)
97-
98-
def test_ctor_no_name_explicit(self):
99-
NAME = 'name'
100-
connection = _Connection()
101-
properties = {'key': 'value', 'name': NAME}
102-
bucket = self._makeOne(connection=connection, properties=properties)
103-
self.assertTrue(bucket.connection is connection)
104-
self.assertEqual(bucket.name, NAME)
105-
self.assertEqual(bucket.properties, properties)
106-
self.assertTrue(bucket._acl is None)
107-
self.assertTrue(bucket._default_object_acl is None)
108-
10991
def test___iter___empty(self):
11092
NAME = 'name'
11193
connection = _Connection({'items': []})
@@ -164,7 +146,7 @@ def api_request(cls, *args, **kwargs):
164146
raise NotFound(args)
165147

166148
BUCKET_NAME = 'bucket-name'
167-
bucket = self._makeOne(connection=_FakeConnection, name=BUCKET_NAME)
149+
bucket = self._makeOne(BUCKET_NAME, connection=_FakeConnection)
168150
self.assertFalse(bucket.exists())
169151
expected_called_kwargs = {
170152
'method': 'GET',
@@ -188,7 +170,7 @@ def api_request(cls, *args, **kwargs):
188170
return object()
189171

190172
BUCKET_NAME = 'bucket-name'
191-
bucket = self._makeOne(connection=_FakeConnection, name=BUCKET_NAME)
173+
bucket = self._makeOne(BUCKET_NAME, connection=_FakeConnection)
192174
self.assertTrue(bucket.exists())
193175
expected_called_kwargs = {
194176
'method': 'GET',
@@ -592,7 +574,7 @@ def test_get_cors_eager(self):
592574
}
593575
before = {'cors': [CORS_ENTRY, {}]}
594576
connection = _Connection()
595-
bucket = self._makeOne(NAME, connection, before)
577+
bucket = self._makeOne(NAME, connection, properties=before)
596578
entries = bucket.get_cors()
597579
self.assertEqual(len(entries), 2)
598580
self.assertEqual(entries[0]['maxAgeSeconds'],
@@ -697,7 +679,7 @@ def test_get_lifecycle_eager(self):
697679
LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}}
698680
before = {'lifecycle': {'rule': [LC_RULE]}}
699681
connection = _Connection()
700-
bucket = self._makeOne(NAME, connection, before)
682+
bucket = self._makeOne(NAME, connection, properties=before)
701683
entries = bucket.get_lifecycle()
702684
self.assertEqual(len(entries), 1)
703685
self.assertEqual(entries[0]['action']['type'], 'Delete')
@@ -744,7 +726,7 @@ def test_location_getter(self):
744726
NAME = 'name'
745727
connection = _Connection()
746728
before = {'location': 'AS'}
747-
bucket = self._makeOne(NAME, connection, before)
729+
bucket = self._makeOne(NAME, connection, properties=before)
748730
self.assertEqual(bucket.location, 'AS')
749731
kw = connection._requested
750732
self.assertEqual(len(kw), 0)
@@ -795,7 +777,7 @@ def test_enable_logging_defaults(self):
795777
}
796778
connection = _Connection(resp_to_reload, resp_to_enable_logging,
797779
resp_to_enable_logging)
798-
bucket = self._makeOne(NAME, connection, before)
780+
bucket = self._makeOne(NAME, connection, properties=before)
799781
self.assertTrue(bucket.get_logging() is None)
800782
bucket.enable_logging(LOG_BUCKET)
801783
info = bucket.get_logging()
@@ -826,7 +808,7 @@ def test_enable_logging_explicit(self):
826808
connection = _Connection(resp_to_reload,
827809
resp_to_enable_logging,
828810
resp_to_enable_logging)
829-
bucket = self._makeOne(NAME, connection, before)
811+
bucket = self._makeOne(NAME, connection, properties=before)
830812
self.assertTrue(bucket.get_logging() is None)
831813
bucket.enable_logging(LOG_BUCKET, LOG_PFX)
832814
info = bucket.get_logging()
@@ -852,7 +834,7 @@ def test_disable_logging(self):
852834
resp_to_disable_logging = {'logging': None}
853835
connection = _Connection(resp_to_reload, resp_to_disable_logging,
854836
resp_to_disable_logging)
855-
bucket = self._makeOne(NAME, connection, before)
837+
bucket = self._makeOne(NAME, connection, properties=before)
856838
self.assertTrue(bucket.get_logging() is not None)
857839
bucket.disable_logging()
858840
self.assertTrue(bucket.get_logging() is None)
@@ -923,7 +905,7 @@ def test_versioning_enabled_getter(self):
923905
NAME = 'name'
924906
before = {'versioning': {'enabled': True}}
925907
connection = _Connection()
926-
bucket = self._makeOne(NAME, connection, before)
908+
bucket = self._makeOne(NAME, connection, properties=before)
927909
self.assertEqual(bucket.versioning_enabled, True)
928910
kw = connection._requested
929911
self.assertEqual(len(kw), 0)
@@ -933,7 +915,7 @@ def test_versioning_enabled_setter(self):
933915
before = {'versioning': {'enabled': False}}
934916
after = {'versioning': {'enabled': True}}
935917
connection = _Connection(after)
936-
bucket = self._makeOne(NAME, connection, before)
918+
bucket = self._makeOne(NAME, connection, properties=before)
937919
self.assertFalse(bucket.versioning_enabled)
938920
bucket.versioning_enabled = True
939921
bucket.patch()

0 commit comments

Comments
 (0)