File tree Expand file tree Collapse file tree 3 files changed +37
-3
lines changed
Expand file tree Collapse file tree 3 files changed +37
-3
lines changed 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