Skip to content

Commit d52d81f

Browse files
committed
Add support for the Bucket's 'versioning' field.
See: https://cloud.google.com/storage/docs/object-versioning Addresses part of #314.
1 parent 826ea69 commit d52d81f

2 files changed

Lines changed: 85 additions & 0 deletions

File tree

gcloud/storage/bucket.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class Bucket(_MetadataMixin):
2525
'acl': 'get_acl',
2626
'defaultObjectAcl': 'get_default_object_acl',
2727
'lifecycle': 'get_lifecycle',
28+
'versioning': 'get_versioning',
2829
}
2930
"""Mapping of field name -> accessor for fields w/ custom accessors."""
3031

@@ -471,6 +472,36 @@ def update_lifecycle(self, rules):
471472
"""
472473
self.patch_metadata({'lifecycle': {'rule': rules}})
473474

475+
def get_versioning(self):
476+
"""Is versioning enabled for this bucket?
477+
478+
See: https://cloud.google.com/storage/docs/object-versioning for
479+
details.
480+
481+
:rtype: boolean
482+
:returns: True if enabled, else False.
483+
"""
484+
if not self.has_metadata(field='versioning'):
485+
self.reload_metadata()
486+
versioning = self.metadata.get('versioning', {})
487+
return versioning.get('enabled', False)
488+
489+
def enable_versioning(self):
490+
"""Enable versioning for this bucket.
491+
492+
See: https://cloud.google.com/storage/docs/object-versioning for
493+
details.
494+
"""
495+
self.patch_metadata({'versioning': {'enabled': True}})
496+
497+
def disable_versioning(self):
498+
"""Disable versioning for this bucket.
499+
500+
See: https://cloud.google.com/storage/docs/object-versioning for
501+
details.
502+
"""
503+
self.patch_metadata({'versioning': {'enabled': False}})
504+
474505

475506
class BucketIterator(Iterator):
476507
"""An iterator listing all buckets.

gcloud/storage/test_bucket.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,60 @@ def test_update_lifecycle(self):
781781
self.assertEqual(entries[0]['action']['type'], 'Delete')
782782
self.assertEqual(entries[0]['condition']['age'], 42)
783783

784+
def test_get_versioning_eager(self):
785+
NAME = 'name'
786+
before = {'bar': 'Bar', 'versioning': {'enabled': True}}
787+
connection = _Connection()
788+
bucket = self._makeOne(connection, NAME, before)
789+
self.assertEqual(bucket.get_versioning(), True)
790+
kw = connection._requested
791+
self.assertEqual(len(kw), 0)
792+
793+
def test_get_versioning_lazy(self):
794+
NAME = 'name'
795+
before = {'bar': 'Bar'}
796+
after = {'bar': 'Bar', 'versioning': {'enabled': True}}
797+
connection = _Connection(after)
798+
bucket = self._makeOne(connection, NAME, before)
799+
self.assertEqual(bucket.get_versioning(), True)
800+
kw = connection._requested
801+
self.assertEqual(len(kw), 1)
802+
self.assertEqual(kw[0]['method'], 'GET')
803+
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
804+
self.assertEqual(kw[0]['query_params'], {'projection': 'noAcl'})
805+
806+
def test_enable_versioning(self):
807+
NAME = 'name'
808+
before = {'versioning': {'enabled': False}}
809+
after = {'versioning': {'enabled': True}}
810+
connection = _Connection(after)
811+
bucket = self._makeOne(connection, NAME, before)
812+
self.assertFalse(bucket.get_versioning())
813+
bucket.enable_versioning()
814+
self.assertTrue(bucket.get_versioning())
815+
kw = connection._requested
816+
self.assertEqual(len(kw), 1)
817+
self.assertEqual(kw[0]['method'], 'PATCH')
818+
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
819+
self.assertEqual(kw[0]['data'], {'versioning': {'enabled': True}})
820+
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
821+
822+
def test_disable_versioning(self):
823+
NAME = 'name'
824+
before = {'versioning': {'enabled': True}}
825+
after = {'versioning': {'enabled': False}}
826+
connection = _Connection(after)
827+
bucket = self._makeOne(connection, NAME, before)
828+
self.assertTrue(bucket.get_versioning())
829+
bucket.disable_versioning()
830+
self.assertFalse(bucket.get_versioning())
831+
kw = connection._requested
832+
self.assertEqual(len(kw), 1)
833+
self.assertEqual(kw[0]['method'], 'PATCH')
834+
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
835+
self.assertEqual(kw[0]['data'], {'versioning': {'enabled': False}})
836+
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
837+
784838

785839
class TestBucketIterator(unittest2.TestCase):
786840

0 commit comments

Comments
 (0)