Skip to content

Commit

Permalink
Add 'Bucket.iterator' method.
Browse files Browse the repository at this point in the history
Exposes additional paramters for narrowing / batching key search.

Fixes #26.
  • Loading branch information
tseaver committed Nov 8, 2014
1 parent 6a2577f commit 77ccaf1
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
36 changes: 36 additions & 0 deletions gcloud/storage/bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,42 @@ def get_all_keys(self):
"""
return list(self)

def iterator(self, prefix=None, delimiter=None, max_results=None,
versions=None):
"""Return an iterator used to find keys in the bucket.
:type prefix: string or None
:param prefix: optional prefix used to filter keys.
:type delimiter: string or None
:param delimiter: optional delimter, used with ``prefix`` to
emulate hierarchy.
:type max_results: integer or None
:param max_results: maximum number of keys to return.
:type versions: boolean or None
:param versions: whether object versions should be returned as
separate keys.
:rtype: :class:`_KeyIterator`
"""
extra_params = {}

if prefix is not None:
extra_params['prefix'] = prefix

if delimiter is not None:
extra_params['delimiter'] = delimiter

if max_results is not None:
extra_params['maxResults'] = max_results

if versions is not None:
extra_params['versions'] = versions

return self._iterator_class(self, extra_params=extra_params)

def new_key(self, key):
"""Given path name (or Key), return a :class:`.storage.key.Key` object.
Expand Down
35 changes: 35 additions & 0 deletions gcloud/storage/test_bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,41 @@ def test_get_all_keys_non_empty(self):
self.assertEqual(kw['path'], '/b/%s/o' % NAME)
self.assertEqual(kw['query_params'], {})

def test_iterator_defaults(self):
NAME = 'name'
connection = _Connection({'items': []})
bucket = self._makeOne(connection, NAME)
iterator = bucket.iterator()
keys = list(iterator)
self.assertEqual(keys, [])
kw, = connection._requested
self.assertEqual(kw['method'], 'GET')
self.assertEqual(kw['path'], '/b/%s/o' % NAME)
self.assertEqual(kw['query_params'], {})

def test_iterator_explicit(self):
NAME = 'name'
EXPECTED = {
'prefix': 'subfolder',
'delimiter': '/',
'maxResults': 10,
'versions': True,
}
connection = _Connection({'items': []})
bucket = self._makeOne(connection, NAME)
iterator = bucket.iterator(
prefix='subfolder',
delimiter='/',
max_results=10,
versions=True,
)
keys = list(iterator)
self.assertEqual(keys, [])
kw, = connection._requested
self.assertEqual(kw['method'], 'GET')
self.assertEqual(kw['path'], '/b/%s/o' % NAME)
self.assertEqual(kw['query_params'], EXPECTED)

def test_new_key_existing(self):
from gcloud.storage.key import Key
existing = Key()
Expand Down

0 comments on commit 77ccaf1

Please sign in to comment.