diff --git a/gcloud/storage/bucket.py b/gcloud/storage/bucket.py index 0200d766d126..2dc28e0c6abd 100644 --- a/gcloud/storage/bucket.py +++ b/gcloud/storage/bucket.py @@ -33,6 +33,7 @@ ... print blob """ +import copy import os import six @@ -513,8 +514,9 @@ def id(self): """ return self.properties['id'] - def get_lifecycle(self): - """Retrieve lifecycle rules configured for this bucket. + @property + def lifecycle_rules(self): + """Lifecycle rules configured for this bucket. See: https://cloud.google.com/storage/docs/lifecycle and https://cloud.google.com/storage/docs/json_api/v1/buckets @@ -522,20 +524,20 @@ def get_lifecycle(self): :rtype: list(dict) :returns: A sequence of mappings describing each lifecycle rule. """ - info = self.properties.get('lifecycle', {}) - return [rule.copy() for rule in info.get('rule', ())] + info = self._properties.get('lifecycle', {}) + return [copy.deepcopy(rule) for rule in info.get('rule', ())] - def update_lifecycle(self, rules): - """Update CORS policies configured for this bucket. + @lifecycle_rules.setter + def lifecycle_rules(self, rules): + """Update the lifecycle rules configured for this bucket. See: https://cloud.google.com/storage/docs/lifecycle and https://cloud.google.com/storage/docs/json_api/v1/buckets - :type rules: list(dict) - :param rules: A sequence of mappings describing each lifecycle rule. + :rtype: list(dict) + :returns: A sequence of mappings describing each lifecycle rule. """ self._patch_properties({'lifecycle': {'rule': rules}}) - self.patch() location = _scalar_property('location') """Retrieve location configured for this bucket. diff --git a/gcloud/storage/test_bucket.py b/gcloud/storage/test_bucket.py index 081344598825..72ba8e73d97e 100644 --- a/gcloud/storage/test_bucket.py +++ b/gcloud/storage/test_bucket.py @@ -674,75 +674,57 @@ def test_id(self): bucket = self._makeOne(properties=properties) self.assertEqual(bucket.id, ID) - def test_get_lifecycle_eager(self): + def test_location_getter(self): NAME = 'name' - LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}} - before = {'lifecycle': {'rule': [LC_RULE]}} connection = _Connection() + before = {'location': 'AS'} bucket = self._makeOne(NAME, connection, properties=before) - entries = bucket.get_lifecycle() - self.assertEqual(len(entries), 1) - self.assertEqual(entries[0]['action']['type'], 'Delete') - self.assertEqual(entries[0]['condition']['age'], 42) + self.assertEqual(bucket.location, 'AS') kw = connection._requested self.assertEqual(len(kw), 0) - def test_get_lifecycle_lazy(self): - NAME = 'name' - LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}} - after = {'lifecycle': {'rule': [LC_RULE]}} - connection = _Connection(after) - bucket = self._makeOne(NAME, connection) - bucket._reload_properties() - entries = bucket.get_lifecycle() - self.assertEqual(len(entries), 1) - self.assertEqual(entries[0]['action']['type'], 'Delete') - self.assertEqual(entries[0]['condition']['age'], 42) - kw = connection._requested - self.assertEqual(len(kw), 1) - self.assertEqual(kw[0]['method'], 'GET') - self.assertEqual(kw[0]['path'], '/b/%s' % NAME) - self.assertEqual(kw[0]['query_params'], {'projection': 'noAcl'}) - - def test_update_lifecycle(self): + def test_location_setter(self): NAME = 'name' - LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}} - after = {'lifecycle': {'rule': [LC_RULE]}} - connection = _Connection(after) + connection = _Connection({'location': 'AS'}) bucket = self._makeOne(NAME, connection) - bucket.update_lifecycle([LC_RULE]) + bucket.location = 'AS' + bucket.patch() + self.assertEqual(bucket.location, 'AS') kw = connection._requested self.assertEqual(len(kw), 1) self.assertEqual(kw[0]['method'], 'PATCH') self.assertEqual(kw[0]['path'], '/b/%s' % NAME) - self.assertEqual(kw[0]['data'], after) + self.assertEqual(kw[0]['data'], {'location': 'AS'}) self.assertEqual(kw[0]['query_params'], {'projection': 'full'}) - entries = bucket.get_lifecycle() - self.assertEqual(len(entries), 1) - self.assertEqual(entries[0]['action']['type'], 'Delete') - self.assertEqual(entries[0]['condition']['age'], 42) - def test_location_getter(self): + def test_lifecycle_rules_getter(self): NAME = 'name' - connection = _Connection() - before = {'location': 'AS'} - bucket = self._makeOne(NAME, connection, properties=before) - self.assertEqual(bucket.location, 'AS') - kw = connection._requested - self.assertEqual(len(kw), 0) - - def test_location_setter(self): + LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}} + rules = [LC_RULE] + properties = {'lifecycle': {'rule': rules}} + bucket = self._makeOne(NAME, properties=properties) + self.assertEqual(bucket.lifecycle_rules, rules) + # Make sure it's a copy + self.assertFalse(bucket.lifecycle_rules is rules) + + def test_lifecycle_rules_setter(self): NAME = 'name' - connection = _Connection({'location': 'AS'}) + LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}} + rules = [LC_RULE] + after = {'lifecycle': {'rule': rules}} + connection = _Connection(after) + bucket = self._makeOne(NAME, connection) - bucket.location = 'AS' + self.assertEqual(bucket.lifecycle_rules, []) + + bucket.lifecycle_rules = rules bucket.patch() - self.assertEqual(bucket.location, 'AS') + self.assertEqual(bucket.lifecycle_rules, rules) kw = connection._requested self.assertEqual(len(kw), 1) self.assertEqual(kw[0]['method'], 'PATCH') self.assertEqual(kw[0]['path'], '/b/%s' % NAME) - self.assertEqual(kw[0]['data'], {'location': 'AS'}) + self.assertEqual(kw[0]['data'], after) self.assertEqual(kw[0]['query_params'], {'projection': 'full'}) def test_get_logging_w_prefix(self):