Skip to content

Commit 71e937b

Browse files
committed
Merge pull request #353 from tseaver/refactor-bucket_scalar_properties
Refactor bucket scalar properties
2 parents 8cd4c5e + 5e14e12 commit 71e937b

File tree

5 files changed

+79
-91
lines changed

5 files changed

+79
-91
lines changed

gcloud/storage/_helpers.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,17 @@ def __exit__(self, type, value, traceback):
168168
if type is None:
169169
if self._deferred:
170170
self._wrapped._patch_properties(self._deferred)
171+
172+
173+
def _scalar_property(fieldname):
174+
"""Create a property descriptor around the :class:`_PropertyMixin` helpers.
175+
"""
176+
def _getter(self):
177+
"""Scalar property getter."""
178+
return self.properties[fieldname]
179+
180+
def _setter(self, value):
181+
"""Scalar property setter."""
182+
self._patch_properties({fieldname: value})
183+
184+
return property(_getter, _setter)

gcloud/storage/bucket.py

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44

55
from gcloud.storage._helpers import _PropertyMixin
6+
from gcloud.storage._helpers import _scalar_property
67
from gcloud.storage import exceptions
78
from gcloud.storage.acl import BucketACL
89
from gcloud.storage.acl import DefaultObjectACL
@@ -28,7 +29,7 @@ class Bucket(_PropertyMixin):
2829
'etag': 'etag',
2930
'id': 'id',
3031
'lifecycle': 'get_lifecycle()',
31-
'location': 'get_location()',
32+
'location': 'location',
3233
'logging': 'get_logging()',
3334
'metageneration': 'metageneration',
3435
'name': 'name',
@@ -37,7 +38,7 @@ class Bucket(_PropertyMixin):
3738
'selfLink': 'self_link',
3839
'storageClass': 'storage_class',
3940
'timeCreated': 'time_created',
40-
'versioning': 'get_versioning()',
41+
'versioning': 'versioning_enabled',
4142
}
4243
"""Map field name -> accessor for fields w/ custom accessors."""
4344

@@ -436,27 +437,14 @@ def update_lifecycle(self, rules):
436437
"""
437438
self._patch_properties({'lifecycle': {'rule': rules}})
438439

439-
def get_location(self):
440-
"""Retrieve location configured for this bucket.
440+
location = _scalar_property('location')
441+
"""Retrieve location configured for this bucket.
441442
442-
See: https://cloud.google.com/storage/docs/json_api/v1/buckets and
443-
https://cloud.google.com/storage/docs/concepts-techniques#specifyinglocations
444-
445-
:rtype: string
446-
:returns: The configured location.
447-
"""
448-
return self.properties.get('location')
449-
450-
def set_location(self, location):
451-
"""Update location configured for this bucket.
452-
453-
See: https://cloud.google.com/storage/docs/json_api/v1/buckets and
454-
https://cloud.google.com/storage/docs/concepts-techniques#specifyinglocations
443+
See: https://cloud.google.com/storage/docs/json_api/v1/buckets and
444+
https://cloud.google.com/storage/docs/concepts-techniques#specifyinglocations
455445
456-
:type location: string
457-
:param location: The new configured location.
458-
"""
459-
self._patch_properties({'location': location})
446+
:rtype: string
447+
"""
460448

461449
def get_logging(self):
462450
"""Return info about access logging for this bucket.
@@ -556,7 +544,8 @@ def time_created(self):
556544
"""
557545
return self.properties['timeCreated']
558546

559-
def get_versioning(self):
547+
@property
548+
def versioning_enabled(self):
560549
"""Is versioning enabled for this bucket?
561550
562551
See: https://cloud.google.com/storage/docs/object-versioning for
@@ -568,21 +557,17 @@ def get_versioning(self):
568557
versioning = self.properties.get('versioning', {})
569558
return versioning.get('enabled', False)
570559

571-
def enable_versioning(self):
560+
@versioning_enabled.setter
561+
def versioning_enabled(self, value):
572562
"""Enable versioning for this bucket.
573563
574564
See: https://cloud.google.com/storage/docs/object-versioning for
575565
details.
576-
"""
577-
self._patch_properties({'versioning': {'enabled': True}})
578566
579-
def disable_versioning(self):
580-
"""Disable versioning for this bucket.
581-
582-
See: https://cloud.google.com/storage/docs/object-versioning for
583-
details.
567+
:type value: convertible to bool
568+
:param value: should versioning be anabled for the bucket?
584569
"""
585-
self._patch_properties({'versioning': {'enabled': False}})
570+
self._patch_properties({'versioning': {'enabled': bool(value)}})
586571

587572
def configure_website(self, main_page_suffix=None, not_found_page=None):
588573
"""Configure website-related properties.

gcloud/storage/key.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,12 @@
66
from StringIO import StringIO
77

88
from gcloud.storage._helpers import _PropertyMixin
9+
from gcloud.storage._helpers import _scalar_property
910
from gcloud.storage.acl import ObjectACL
1011
from gcloud.storage.exceptions import StorageError
1112
from gcloud.storage.iterator import Iterator
1213

1314

14-
def _scalar_property(fieldname):
15-
"""Create a property descriptor around the :class:`_PropertyMixin` helpers.
16-
"""
17-
def _getter(self):
18-
"""Scalar property getter."""
19-
return self.properties[fieldname]
20-
21-
def _setter(self, value):
22-
"""Scalar property setter."""
23-
self._patch_properties({fieldname: value})
24-
25-
return property(_getter, _setter)
26-
27-
2815
class Key(_PropertyMixin):
2916
"""A wrapper around Cloud Storage's concept of an ``Object``."""
3017

gcloud/storage/test__helpers.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,34 @@ def test___exit___no_error_aggregates__patch_properties(self):
214214
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
215215

216216

217+
class Test__scalar_property(unittest2.TestCase):
218+
219+
def _callFUT(self, fieldName):
220+
from gcloud.storage._helpers import _scalar_property
221+
return _scalar_property(fieldName)
222+
223+
def test_getter(self):
224+
225+
class Test(object):
226+
def __init__(self, **kw):
227+
self.properties = kw.copy()
228+
do_re_mi = self._callFUT('solfege')
229+
230+
test = Test(solfege='Latido')
231+
self.assertEqual(test.do_re_mi, 'Latido')
232+
233+
def test_setter(self):
234+
235+
class Test(object):
236+
def _patch_properties(self, mapping):
237+
self._patched = mapping.copy()
238+
do_re_mi = self._callFUT('solfege')
239+
240+
test = Test()
241+
test.do_re_mi = 'Latido'
242+
self.assertEqual(test._patched, {'solfege': 'Latido'})
243+
244+
217245
class _Connection(object):
218246

219247
def __init__(self, *responses):

gcloud/storage/test_bucket.py

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -562,31 +562,21 @@ def test_update_lifecycle(self):
562562
self.assertEqual(entries[0]['action']['type'], 'Delete')
563563
self.assertEqual(entries[0]['condition']['age'], 42)
564564

565-
def test_get_location_eager(self):
565+
def test_location_getter(self):
566566
NAME = 'name'
567567
connection = _Connection()
568568
before = {'location': 'AS'}
569569
bucket = self._makeOne(connection, NAME, before)
570-
self.assertEqual(bucket.get_location(), 'AS')
570+
self.assertEqual(bucket.location, 'AS')
571571
kw = connection._requested
572572
self.assertEqual(len(kw), 0)
573573

574-
def test_get_location_lazy(self):
574+
def test_location_setter(self):
575575
NAME = 'name'
576576
connection = _Connection({'location': 'AS'})
577577
bucket = self._makeOne(connection, NAME)
578-
self.assertEqual(bucket.get_location(), 'AS')
579-
kw = connection._requested
580-
self.assertEqual(len(kw), 1)
581-
self.assertEqual(kw[0]['method'], 'GET')
582-
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
583-
584-
def test_update_location(self):
585-
NAME = 'name'
586-
connection = _Connection({'location': 'AS'})
587-
bucket = self._makeOne(connection, NAME)
588-
bucket.set_location('AS')
589-
self.assertEqual(bucket.get_location(), 'AS')
578+
bucket.location = 'AS'
579+
self.assertEqual(bucket.location, 'AS')
590580
kw = connection._requested
591581
self.assertEqual(len(kw), 1)
592582
self.assertEqual(kw[0]['method'], 'PATCH')
@@ -718,55 +708,39 @@ def test_time_created(self):
718708
bucket = self._makeOne(properties=properties)
719709
self.assertEqual(bucket.time_created, TIME_CREATED)
720710

721-
def test_get_versioning_eager(self):
711+
def test_versioning_enabled_getter_missing(self):
722712
NAME = 'name'
723-
before = {'bar': 'Bar', 'versioning': {'enabled': True}}
724-
connection = _Connection()
725-
bucket = self._makeOne(connection, NAME, before)
726-
self.assertEqual(bucket.get_versioning(), True)
727-
kw = connection._requested
728-
self.assertEqual(len(kw), 0)
729-
730-
def test_get_versioning_lazy(self):
731-
NAME = 'name'
732-
after = {'bar': 'Bar', 'versioning': {'enabled': True}}
733-
connection = _Connection(after)
713+
connection = _Connection({})
734714
bucket = self._makeOne(connection, NAME)
735-
self.assertEqual(bucket.get_versioning(), True)
715+
self.assertEqual(bucket.versioning_enabled, False)
736716
kw = connection._requested
737717
self.assertEqual(len(kw), 1)
738718
self.assertEqual(kw[0]['method'], 'GET')
739719
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
740720
self.assertEqual(kw[0]['query_params'], {'projection': 'noAcl'})
741721

742-
def test_enable_versioning(self):
722+
def test_versioning_enabled_getter(self):
743723
NAME = 'name'
744-
before = {'versioning': {'enabled': False}}
745-
after = {'versioning': {'enabled': True}}
746-
connection = _Connection(after)
724+
before = {'versioning': {'enabled': True}}
725+
connection = _Connection()
747726
bucket = self._makeOne(connection, NAME, before)
748-
self.assertFalse(bucket.get_versioning())
749-
bucket.enable_versioning()
750-
self.assertTrue(bucket.get_versioning())
727+
self.assertEqual(bucket.versioning_enabled, True)
751728
kw = connection._requested
752-
self.assertEqual(len(kw), 1)
753-
self.assertEqual(kw[0]['method'], 'PATCH')
754-
self.assertEqual(kw[0]['data'], {'versioning': {'enabled': True}})
755-
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
729+
self.assertEqual(len(kw), 0)
756730

757-
def test_disable_versioning(self):
731+
def test_versioning_enabled_setter(self):
758732
NAME = 'name'
759-
before = {'versioning': {'enabled': True}}
760-
after = {'versioning': {'enabled': False}}
733+
before = {'versioning': {'enabled': False}}
734+
after = {'versioning': {'enabled': True}}
761735
connection = _Connection(after)
762736
bucket = self._makeOne(connection, NAME, before)
763-
self.assertTrue(bucket.get_versioning())
764-
bucket.disable_versioning()
765-
self.assertFalse(bucket.get_versioning())
737+
self.assertFalse(bucket.versioning_enabled)
738+
bucket.versioning_enabled = True
739+
self.assertTrue(bucket.versioning_enabled)
766740
kw = connection._requested
767741
self.assertEqual(len(kw), 1)
768742
self.assertEqual(kw[0]['method'], 'PATCH')
769-
self.assertEqual(kw[0]['data'], after)
743+
self.assertEqual(kw[0]['data'], {'versioning': {'enabled': True}})
770744
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
771745

772746
def test_configure_website_defaults(self):

0 commit comments

Comments
 (0)