diff --git a/gcloud/iterator.py b/gcloud/iterator.py index 1adf9201ef43..1126e39eef91 100644 --- a/gcloud/iterator.py +++ b/gcloud/iterator.py @@ -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. @@ -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 @@ -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 diff --git a/gcloud/storage/bucket.py b/gcloud/storage/bucket.py index fb138ec78949..748333789302 100644 --- a/gcloud/storage/bucket.py +++ b/gcloud/storage/bucket.py @@ -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): diff --git a/gcloud/storage/client.py b/gcloud/storage/client.py index ca82cf1b2528..9cf3629f7a0a 100644 --- a/gcloud/storage/client.py +++ b/gcloud/storage/client.py @@ -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. @@ -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): @@ -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 diff --git a/gcloud/storage/test_bucket.py b/gcloud/storage/test_bucket.py index 8f070d7026ac..03947b4db318 100644 --- a/gcloud/storage/test_bucket.py +++ b/gcloud/storage/test_bucket.py @@ -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) diff --git a/gcloud/storage/test_client.py b/gcloud/storage/test_client.py index 4404a1202e32..d668f66c8410 100644 --- a/gcloud/storage/test_client.py +++ b/gcloud/storage/test_client.py @@ -301,14 +301,17 @@ 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): @@ -316,7 +319,8 @@ def test_get_items_from_response_non_empty(self): 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] @@ -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 diff --git a/gcloud/test_iterator.py b/gcloud/test_iterator.py index 83be77266703..04ea5908acb1 100644 --- a/gcloud/test_iterator.py +++ b/gcloud/test_iterator.py @@ -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) @@ -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 @@ -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() @@ -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): @@ -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) @@ -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() @@ -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()) @@ -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