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)
示例#4
0
    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())
示例#8
0
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)