File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 2121from hashlib import md5
2222
2323
24+ def _validate_name (name ):
25+ """Pre-flight ``Bucket`` name validation.
26+
27+ :type name: str or :data:`NoneType`
28+ :param name: Proposed bucket name.
29+
30+ :rtype: str or :data:`NoneType`
31+ :returns: ``name`` if valid.
32+ """
33+ if name is None :
34+ return
35+
36+ # The first and las characters must be alphanumeric.
37+ if not all ([name [0 ].isalnum (), name [- 1 ].isalnum ()]):
38+ raise ValueError (
39+ 'Bucket names must start and end with a number or letter.' )
40+ return name
41+
42+
2443class _PropertyMixin (object ):
2544 """Abstract mixin for cloud storage classes with associated propertties.
2645
@@ -29,11 +48,12 @@ class _PropertyMixin(object):
2948 - path
3049
3150 :type name: str
32- :param name: The name of the object.
51+ :param name: The name of the object. Bucket names must start and end with a
52+ number or letter.
3353 """
3454
3555 def __init__ (self , name = None ):
36- self .name = name
56+ self .name = _validate_name ( name )
3757 self ._properties = {}
3858 self ._changes = set ()
3959
Original file line number Diff line number Diff line change @@ -81,7 +81,8 @@ class Bucket(_PropertyMixin):
8181 for the bucket (which requires a project).
8282
8383 :type name: str
84- :param name: The name of the bucket.
84+ :param name: The name of the bucket. Bucket names must start and end with a
85+ number or letter.
8586 """
8687
8788 _MAX_OBJECTS_FOR_ITERATION = 256
Original file line number Diff line number Diff line change @@ -46,6 +46,19 @@ def test_client_is_abstract(self):
4646 mixin = self ._make_one ()
4747 self .assertRaises (NotImplementedError , lambda : mixin .client )
4848
49+ def test_bucket_name_value (self ):
50+ bucket_name = 'testing123'
51+ mixin = self ._make_one (name = bucket_name )
52+ self .assertEqual (mixin .name , bucket_name )
53+
54+ bad_start_bucket_name = '/testing123'
55+ with self .assertRaises (ValueError ):
56+ self ._make_one (name = bad_start_bucket_name )
57+
58+ bad_end_bucket_name = 'testing123/'
59+ with self .assertRaises (ValueError ):
60+ self ._make_one (name = bad_end_bucket_name )
61+
4962 def test_reload (self ):
5063 connection = _Connection ({'foo' : 'Foo' })
5164 client = _Client (connection )
You can’t perform that action at this time.
0 commit comments