def _next_page(self): """Get the next page in the iterator. :rtype: :class:`~google.cloud.iterator.Page` :returns: The next page in the iterator (or :data:`None` if there are no pages left). """ if not self._more_results: return None query_pb = self._build_protobuf() transaction = self.client.current_transaction if transaction is None: read_options = _datastore_pb2.ReadOptions() else: read_options = _datastore_pb2.ReadOptions( transaction=transaction.id) partition_id = _entity_pb2.PartitionId( project_id=self._query.project, namespace_id=self._query.namespace) response_pb = self.client._datastore_api.run_query( self._query.project, partition_id, read_options, query=query_pb, ) entity_pbs = self._process_query_results(response_pb) return Page(self, entity_pbs, self._item_to_value)
def test_update_page_not_empty_fail(self): from google.cloud.iterator import Page iterator = self._makeOne(None, None, None) iterator._page = Page(None, {}, '', None) iterator._page._remaining = 1 with self.assertRaises(ValueError): iterator.update_page(require_empty=True)
def test_update_page_not_empty_success(self): from google.cloud.iterator import Page iterator = self._makeOne(None, None, None) page = Page(None, {}, '', None) iterator._page = page iterator._page._remaining = 1 iterator.update_page(require_empty=False) self.assertIs(iterator._page, page)
def test_page_empty_response(self): from google.cloud.iterator import Page project = 'PROJECT' credentials = _make_credentials() client = self._make_one(project=project, credentials=credentials) iterator = client.list_buckets() page = Page(iterator, (), None) iterator._page = page self.assertEqual(list(page), [])
def test_page_empty_response(self): from google.cloud.iterator import Page credentials = _Credentials() client = self._makeOne(credentials=credentials) iterator = client.list_projects() page = Page(iterator, {}, iterator._items_key, None) iterator._page = page self.assertEqual(page.num_items, 0) self.assertEqual(page.remaining, 0) self.assertEqual(list(page), [])
def test__items_iter(self): import types import six from google.cloud.iterator import Page # Items to be returned. item1 = 17 item2 = 100 item3 = 211 # Make pages from mock responses parent = object() page1 = Page(parent, (item1, item2), self._do_nothing) page2 = Page(parent, (item3, ), self._do_nothing) iterator = self._make_one(None, None) # Fake the page iterator on the object. incremented = [] def page_iter(increment): incremented.append(increment) return iter((page1, page2)) iterator._page_iter = page_iter items_iter = iterator._items_iter() # Make sure it is a generator. self.assertIsInstance(items_iter, types.GeneratorType) # Consume items and check the state of the iterator. self.assertEqual(iterator.num_results, 0) self.assertEqual(six.next(items_iter), (parent, item1)) self.assertEqual(iterator.num_results, 1) self.assertEqual(six.next(items_iter), (parent, item2)) self.assertEqual(iterator.num_results, 2) self.assertEqual(six.next(items_iter), (parent, item3)) self.assertEqual(iterator.num_results, 3) with self.assertRaises(StopIteration): six.next(items_iter) # Make sure our page_iter() was called correctly. self.assertEqual(incremented, [False])
def test_page_empty_response(self): from google.cloud.iterator import Page connection = _Connection() client = _Client(connection) name = 'name' bucket = self._make_one(client=client, name=name) iterator = bucket.list_blobs() page = Page(iterator, (), None) iterator._page = page blobs = list(page) self.assertEqual(blobs, []) self.assertEqual(iterator.prefixes, set())
def _recast_page_iterator(page_iter, iterator): """Wrap GAX pages generator. In particular, wrap each page and capture some state from the GAX iterator. Yields :class:`~google.cloud.iterator.Page` instances :type page_iter: :class:`~google.gax.PageIterator` :param page_iter: The iterator to wrap. :type iterator: :class:`~google.cloud.iterator.Iterator` :param iterator: The iterator that owns each page. """ for items in page_iter: fake_response = {_FAKE_ITEMS_KEY: items} page = Page( iterator, fake_response, _FAKE_ITEMS_KEY, _item_to_topic) iterator.next_page_token = page_iter.page_token or None iterator.num_results += page.num_items yield page
def _next_page(self): """Get the next page in the iterator. :rtype: :class:`~google.cloud.iterator.Page` :returns: The next page in the iterator (or :data:`None` if there are no pages left). """ if not self._more_results: return None pb = self._build_protobuf() transaction = self.client.current_transaction query_results = self.client._connection.run_query( query_pb=pb, project=self._query.project, namespace=self._query.namespace, transaction_id=transaction and transaction.id, ) entity_pbs = self._process_query_results(*query_results) return Page(self, entity_pbs, self._item_to_value)