Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions gcloud/iterator.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ def get_items_from_response(self, response):
class Iterator(object):
"""A generic class for iterating through Cloud JSON APIs list responses.

:type connection: :class:`gcloud.connection.Connection`
:param connection: The connection to use to make requests.
:type client: :class:`gcloud.client.Client`
:param client: The client, which owns a connection to make requests.

:type path: string
:param path: The path to query for the list of items.
Expand All @@ -61,8 +61,8 @@ class Iterator(object):
PAGE_TOKEN = 'pageToken'
RESERVED_PARAMS = frozenset([PAGE_TOKEN])

def __init__(self, connection, path, extra_params=None):
self.connection = connection
def __init__(self, client, path, extra_params=None):
self.client = client
self.path = path
self.page_number = 0
self.next_page_token = None
Expand Down Expand Up @@ -111,7 +111,7 @@ def get_next_page_response(self):
if not self.has_next_page():
raise RuntimeError('No more pages. Try resetting the iterator.')

response = self.connection.api_request(
response = self.client.connection.api_request(
method='GET', path=self.path, query_params=self.get_query_params())

self.page_number += 1
Expand Down
2 changes: 1 addition & 1 deletion gcloud/storage/bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def __init__(self, bucket, extra_params=None, client=None):
self.prefixes = set()
self._current_prefixes = None
super(_BlobIterator, self).__init__(
connection=client.connection, path=bucket.path + '/o',
client=client, path=bucket.path + '/o',
extra_params=extra_params)

def get_items_from_response(self, response):
Expand Down
12 changes: 6 additions & 6 deletions gcloud/storage/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ def list_buckets(self, max_results=None, page_token=None, prefix=None,
if fields is not None:
extra_params['fields'] = fields

result = _BucketIterator(connection=self.connection,
result = _BucketIterator(client=self,
extra_params=extra_params)
# Page token must be handled specially since the base `Iterator`
# class has it as a reserved property.
Expand All @@ -186,15 +186,15 @@ class _BucketIterator(Iterator):
helper methods on :class:`gcloud.storage.connection.Connection`
objects.

:type connection: :class:`gcloud.storage.connection.Connection`
:param connection: The connection to use for querying the list of buckets.
:type client: :class:`gcloud.storage.client.Client`
:param client: The client to use for making connections.

:type extra_params: dict or ``NoneType``
:param extra_params: Extra query string parameters for the API call.
"""

def __init__(self, connection, extra_params=None):
super(_BucketIterator, self).__init__(connection=connection, path='/b',
def __init__(self, client, extra_params=None):
super(_BucketIterator, self).__init__(client=client, path='/b',
extra_params=extra_params)

def get_items_from_response(self, response):
Expand All @@ -205,6 +205,6 @@ def get_items_from_response(self, response):
"""
for item in response.get('items', []):
name = item.get('name')
bucket = Bucket(None, name)
bucket = Bucket(self.client, name)
bucket._set_properties(item)
yield bucket
2 changes: 1 addition & 1 deletion gcloud/storage/test_bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def test_ctor_w_explicit_connection(self):
bucket = _Bucket()
iterator = self._makeOne(bucket, client=client)
self.assertTrue(iterator.bucket is bucket)
self.assertTrue(iterator.connection is connection)
self.assertTrue(iterator.client is client)
self.assertEqual(iterator.path, '%s/o' % bucket.path)
self.assertEqual(iterator.page_number, 0)
self.assertEqual(iterator.next_page_token, None)
Expand Down
16 changes: 13 additions & 3 deletions gcloud/storage/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,22 +301,26 @@ def _makeOne(self, *args, **kw):

def test_ctor(self):
connection = object()
iterator = self._makeOne(connection)
client = _Client(connection)
iterator = self._makeOne(client)
self.assertEqual(iterator.path, '/b')
self.assertEqual(iterator.page_number, 0)
self.assertEqual(iterator.next_page_token, None)
self.assertTrue(iterator.client is client)

def test_get_items_from_response_empty(self):
connection = object()
iterator = self._makeOne(connection)
client = _Client(connection)
iterator = self._makeOne(client)
self.assertEqual(list(iterator.get_items_from_response({})), [])

def test_get_items_from_response_non_empty(self):
from gcloud.storage.bucket import Bucket
BLOB_NAME = 'blob-name'
response = {'items': [{'name': BLOB_NAME}]}
connection = object()
iterator = self._makeOne(connection)
client = _Client(connection)
iterator = self._makeOne(client)
buckets = list(iterator.get_items_from_response(response))
self.assertEqual(len(buckets), 1)
bucket = buckets[0]
Expand Down Expand Up @@ -349,3 +353,9 @@ def __init__(self, headers, content):
def request(self, **kw):
self._called_with = kw
return self._response, self._content


class _Client(object):

def __init__(self, connection):
self.connection = connection
50 changes: 35 additions & 15 deletions gcloud/test_iterator.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ def _makeOne(self, *args, **kw):

def test_ctor(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
iterator = self._makeOne(connection, PATH)
self.assertTrue(iterator.connection is connection)
iterator = self._makeOne(client, PATH)
self.assertTrue(iterator.client is client)
self.assertEqual(iterator.path, PATH)
self.assertEqual(iterator.page_number, 0)
self.assertEqual(iterator.next_page_token, None)
Expand All @@ -44,7 +45,8 @@ def _get_items(response):
for item in response.get('items', []):
yield ITEMS[item['name']]
connection = _Connection({'items': [{'name': KEY1}, {'name': KEY2}]})
iterator = self._makeOne(connection, PATH)
client = _Client(connection)
iterator = self._makeOne(client, PATH)
iterator.get_items_from_response = _get_items
self.assertEqual(list(iterator), [ITEM1, ITEM2])
kw, = connection._requested
Expand All @@ -54,54 +56,61 @@ def _get_items(response):

def test_has_next_page_new(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
iterator = self._makeOne(connection, PATH)
iterator = self._makeOne(client, PATH)
self.assertTrue(iterator.has_next_page())

def test_has_next_page_w_number_no_token(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
iterator = self._makeOne(connection, PATH)
iterator = self._makeOne(client, PATH)
iterator.page_number = 1
self.assertFalse(iterator.has_next_page())

def test_has_next_page_w_number_w_token(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
TOKEN = 'token'
iterator = self._makeOne(connection, PATH)
iterator = self._makeOne(client, PATH)
iterator.page_number = 1
iterator.next_page_token = TOKEN
self.assertTrue(iterator.has_next_page())

def test_get_query_params_no_token(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
iterator = self._makeOne(connection, PATH)
iterator = self._makeOne(client, PATH)
self.assertEqual(iterator.get_query_params(), {})

def test_get_query_params_w_token(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
TOKEN = 'token'
iterator = self._makeOne(connection, PATH)
iterator = self._makeOne(client, PATH)
iterator.next_page_token = TOKEN
self.assertEqual(iterator.get_query_params(),
{'pageToken': TOKEN})

def test_get_query_params_extra_params(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
extra_params = {'key': 'val'}
iterator = self._makeOne(connection, PATH, extra_params=extra_params)
iterator = self._makeOne(client, PATH, extra_params=extra_params)
self.assertEqual(iterator.get_query_params(), extra_params)

def test_get_query_params_w_token_and_extra_params(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
TOKEN = 'token'
extra_params = {'key': 'val'}
iterator = self._makeOne(connection, PATH, extra_params=extra_params)
iterator = self._makeOne(client, PATH, extra_params=extra_params)
iterator.next_page_token = TOKEN

expected_query = extra_params.copy()
Expand All @@ -110,9 +119,10 @@ def test_get_query_params_w_token_and_extra_params(self):

def test_get_query_params_w_token_collision(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
extra_params = {'pageToken': 'val'}
self.assertRaises(ValueError, self._makeOne, connection, PATH,
self.assertRaises(ValueError, self._makeOne, client, PATH,
extra_params=extra_params)

def test_get_next_page_response_new_no_token_in_response(self):
Expand All @@ -122,7 +132,8 @@ def test_get_next_page_response_new_no_token_in_response(self):
KEY2 = 'key2'
connection = _Connection({'items': [{'name': KEY1}, {'name': KEY2}],
'nextPageToken': TOKEN})
iterator = self._makeOne(connection, PATH)
client = _Client(connection)
iterator = self._makeOne(client, PATH)
response = iterator.get_next_page_response()
self.assertEqual(response['items'], [{'name': KEY1}, {'name': KEY2}])
self.assertEqual(iterator.page_number, 1)
Expand All @@ -134,16 +145,18 @@ def test_get_next_page_response_new_no_token_in_response(self):

def test_get_next_page_response_no_token(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
iterator = self._makeOne(connection, PATH)
iterator = self._makeOne(client, PATH)
iterator.page_number = 1
self.assertRaises(RuntimeError, iterator.get_next_page_response)

def test_reset(self):
connection = _Connection()
client = _Client(connection)
PATH = '/foo'
TOKEN = 'token'
iterator = self._makeOne(connection, PATH)
iterator = self._makeOne(client, PATH)
iterator.page_number = 1
iterator.next_page_token = TOKEN
iterator.reset()
Expand All @@ -153,7 +166,8 @@ def test_reset(self):
def test_get_items_from_response_raises_NotImplementedError(self):
PATH = '/foo'
connection = _Connection()
iterator = self._makeOne(connection, PATH)
client = _Client(connection)
iterator = self._makeOne(client, PATH)
self.assertRaises(NotImplementedError,
iterator.get_items_from_response, object())

Expand All @@ -168,3 +182,9 @@ def api_request(self, **kw):
self._requested.append(kw)
response, self._responses = self._responses[0], self._responses[1:]
return response


class _Client(object):

def __init__(self, connection):
self.connection = connection