8000 Move 'key._KeyIterator' -> 'bucket._KeyIterator'. · googleapis/google-cloud-python@d0cff2c · GitHub
[go: up one dir, main page]

Skip to content

Commit d0cff2c

Browse files
committed
Move 'key._KeyIterator' -> 'bucket._KeyIterator'.
The iterator is an implementation detail of 'Bucket'.
1 parent 47b23fb commit d0cff2c

File tree

5 files changed

+83
-77
lines changed

5 files changed

+83
-77
lines changed

gcloud/storage/bucket.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,31 @@
99
from gcloud.storage.acl import DefaultObjectACL
1010
from gcloud.storage.iterator import Iterator
1111
from gcloud.storage.key import Key
12-
from gcloud.storage.key import _KeyIterator
12+
13+
14+
class _KeyIterator(Iterator):
15+
"""An iterator listing keys in a bucket
16+
17+
You shouldn't have to use this directly, but instead should use the
18+
helper methods on :class:`gcloud.storage.key.Bucket` objects.
19+
20+
:type bucket: :class:`gcloud.storage.bucket.Bucket`
21+
:param bucket: The bucket from which to list keys.
22+
"""
23+
def __init__(self, bucket, connection=None, extra_params=None):
24+
self.bucket = bucket
25+
super(_KeyIterator, self).__init__(
26+
connection=bucket.connection, path=bucket.path + '/o',
27+
extra_params=extra_params)
28+
29+
def get_items_from_response(self, response):
30+
"""Yield :class:`.storage.key.Key` items from response.
31+
32+
:type response: dict
33+
:param response: The JSON API response for a page of keys.
34+
"""
35+
for item in response.get('items', []):
36+
yield Key.from_dict(item, bucket=self.bucket)
1337

1438

1539
class Bucket(_PropertyMixin):
@@ -21,6 +45,7 @@ class Bucket(_PropertyMixin):
2145
:type name: string
2246
:param name: The name of the bucket.
2347
"""
48+
_iterator_class = _KeyIterator
2449

2550
CUSTOM_PROPERTY_ACCESSORS = {
2651
'acl': 'get_acl()',
@@ -66,7 +91,7 @@ def __repr__(self):
6691
return '<Bucket: %s>' % self.name
6792

6893
def __iter__(self):
69-
return iter(_KeyIterator(bucket=self))
94+
return iter(self._iterator_class(bucket=self))
7095

7196
def __contains__(self, key):
7297
return self.get_key(key) is not None
@@ -640,6 +665,7 @@ def make_public(self, recursive=False, future=False):
640665
doa.save()
641666

642667
if recursive:
643-
for key in self:
668+
iterator = self._iterator_class(self)
669+
for key in iterator:
644670
key.get_acl().all().grant_read()
645671
key.save_acl()

gcloud/storage/connection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from OpenSSL import crypto
1313
import pytz
1414

15-
from gcloud import connection
15+
from gcloud.connection import Connection as _Base
1616
from gcloud.storage import exceptions
1717
from gcloud.storage.bucket import Bucket
1818
from gcloud.storage.iterator import Iterator
@@ -26,7 +26,7 @@ def _utcnow(): # pragma: NO COVER testing replaces
2626
return datetime.datetime.utcnow()
2727

2828

29-
class Connection(connection.Connection):
29+
class Connection(_Base):
3030
"""A connection to Google Cloud Storage via the JSON REST API.
3131
3232
This class should understand only the basic types (and protobufs)

gcloud/storage/key.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from gcloud.storage._helpers import _scalar_property
1010
from gcloud.storage.acl import ObjectACL
1111
from gcloud.storage.exceptions import StorageError
12-
from gcloud.storage.iterator import Iterator
1312

1413

1514
class Key(_PropertyMixin):
@@ -595,31 +594,6 @@ def updated(self):
595594
return self.properties['updated']
596595

597596

598-
class _KeyIterator(Iterator):
599-
"""An iterator listing keys.
600-
601-
You shouldn't have to use this directly, but instead should use the
602-
helper methods on :class:`gcloud.storage.key.Key` objects.
603-
604-
:type bucket: :class:`gcloud.storage.bucket.Bucket`
605-
:param bucket: The bucket from which to list keys.
606-
"""
607-
def __init__(self, bucket, extra_params=None):
608-
self.bucket = bucket
609-
super(_KeyIterator, self).__init__(
610-
connection=bucket.connection, path=bucket.path + '/o',
611-
extra_params=extra_params)
612-
613-
def get_items_from_response(self, response):
614-
"""Yield :class:`.storage.key.Key` items from response.
615-
616-
:type response: dict
617-
:param response: The JSON API response for a page of keys.
618-
"""
619-
for item in response.get('items', []):
620-
yield Key.from_dict(item, bucket=self.bucket)
621-
622-
623597
class _KeyDataIterator(object):
624598
"""An iterator listing data stored in a key.
625599

gcloud/storage/test_bucket.py

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -832,9 +832,7 @@ def test_make_public_w_future(self):
832832

833833
def test_make_public_recursive(self):
834834
from gcloud.storage.acl import _ACLEntity
835-
from gcloud._testing import _Monkey
836-
from gcloud.storage import key
837-
from gcloud.storage import bucket as MUT
835+
from gcloud.storage.bucket import _KeyIterator
838836
_saved = []
839837

840838
class _Key(object):
@@ -856,7 +854,7 @@ def grant_read(self):
856854
def save_acl(self):
857855
_saved.append((self._bucket, self._name, self._granted))
858856

859-
class _KeyIterator(key._KeyIterator):
857+
class _Iterator(_KeyIterator):
860858
def get_items_from_response(self, response):
861859
for item in response.get('items', []):
862860
yield _Key(self.bucket, item['name'])
@@ -868,8 +866,8 @@ def get_items_from_response(self, response):
868866
connection = _Connection(after, {'items': [{'name': KEY}]})
869867
bucket = self._makeOne(connection, NAME)
870868
bucket.acl.loaded = True
871-
with _Monkey(MUT, _KeyIterator=_KeyIterator):
872-
bucket.make_public(recursive=True)
869+
bucket._iterator_class = _Iterator
870+
bucket.make_public(recursive=True)
873871
self.assertEqual(list(bucket.acl), permissive)
874872
self.assertEqual(list(bucket.default_object_acl), [])
875873
self.assertEqual(_saved, [(bucket, KEY, True)])
@@ -884,6 +882,46 @@ def get_items_from_response(self, response):
884882
self.assertEqual(kw[1]['query_params'], {})
885883

886884

885+
class Test__KeyIterator(unittest2.TestCase):
886+
887+
def _getTargetClass(self):
888+
from gcloud.storage.bucket import _KeyIterator
889+
return _KeyIterator
890+
891+
def _makeOne(self, *args, **kw):
892+
return self._getTargetClass()(*args, **kw)
893+
894+
def test_ctor(self):
895+
connection = _Connection()
896+
bucket = _Bucket(connection)
897+
iterator = self._makeOne(bucket)
898+
self.assertTrue(iterator.bucket is bucket)
899+
self.assertTrue(iterator.connection is connection)
900+
self.assertEqual(iterator.path, '%s/o' % bucket.path)
901+
self.assertEqual(iterator.page_number, 0)
902+
self.assertEqual(iterator.next_page_token, None)
903+
904+
def test_get_items_from_response_empty(self):
905+
connection = _Connection()
906+
bucket = _Bucket(connection)
907+
iterator = self._makeOne(bucket)
908+
self.assertEqual(list(iterator.get_items_from_response({})), [])
909+
910+
def test_get_items_from_response_non_empty(self):
911+
from gcloud.storage.key import Key
912+
KEY = 'key'
913+
response = {'items': [{'name': KEY}]}
914+
connection = _Connection()
915+
bucket = _Bucket(connection)
916+
iterator = self._makeOne(bucket)
917+
keys = list(iterator.get_items_from_response(response))
918+
self.assertEqual(len(keys), 1)
919+
key = keys[0]
920+
self.assertTrue(isinstance(key, Key))
921+
self.assertTrue(key.connection is connection)
922+
self.assertEqual(key.name, KEY)
923+
924+
887925
class _Connection(object):
888926
_delete_ok = False
889927

@@ -911,6 +949,14 @@ def delete_bucket(self, bucket, force=False):
911949
return True
912950

913951

952+
class _Bucket(object):
953+
path = '/b/name'
954+
name = 'name'
955+
956+
def __init__(self, connection):
957+
self.connection = connection
958+
959+
914960
class MockFile(io.StringIO):
915961
name = None
916962

gcloud/storage/test_key.py

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -662,46 +662,6 @@ def test_updated(self):
662662
self.assertEqual(key.updated, UPDATED)
663663

664664

665-
class Test__KeyIterator(unittest2.TestCase):
666-
667-
def _getTargetClass(self):
668-
from gcloud.storage.key import _KeyIterator
669-
return _KeyIterator
670-
671-
def _makeOne(self, *args, **kw):
672-
return self._getTargetClass()(*args, **kw)
673-
674-
def test_ctor(self):
675-
connection = _Connection()
676-
bucket = _Bucket(connection)
677-
iterator = self._makeOne(bucket)
678-
self.assertTrue(iterator.bucket is bucket)
679-
self.assertTrue(iterator.connection is connection)
680-
self.assertEqual(iterator.path, '%s/o' % bucket.path)
681-
self.assertEqual(iterator.page_number, 0)
682-
self.assertEqual(iterator.next_page_token, None)
683-
684-
def test_get_items_from_response_empty(self):
685-
connection = _Connection()
686-
bucket = _Bucket(connection)
687-
iterator = self._makeOne(bucket)
688-
self.assertEqual(list(iterator.get_items_from_response({})), [])
689-
690-
def test_get_items_from_response_non_empty(self):
691-
from gcloud.storage.key import Key
692-
KEY = 'key'
693-
response = {'items': [{'name': KEY}]}
694-
connection = _Connection()
695-
bucket = _Bucket(connection)
696-
iterator = self._makeOne(bucket)
697-
keys = list(iterator.get_items_from_response(response))
698-
self.assertEqual(len(keys), 1)
699-
key = keys[0]
700-
self.assertTrue(isinstance(key, Key))
701-
self.assertTrue(key.connection is connection)
702-
self.assertEqual(key.name, KEY)
703-
704-
705665
class Test__KeyDataIterator(unittest2.TestCase):
706666

707667
def _getTargetClass(self):

0 commit comments

Comments
 (0)
0