diff --git a/core/google/cloud/iterator.py b/core/google/cloud/iterator.py index ac1323a35e19..06242e57597d 100644 --- a/core/google/cloud/iterator.py +++ b/core/google/cloud/iterator.py @@ -246,10 +246,11 @@ def __init__(self, client, path, item_to_value, items_key=DEFAULT_ITEMS_KEY, page_token=None, max_results=None, extra_params=None, page_start=_do_nothing_page_start): + self._started = False self.client = client self.path = path - self._items_key = items_key self._item_to_value = item_to_value + self._items_key = items_key self.max_results = max_results self.extra_params = extra_params self._page_start = page_start @@ -288,7 +289,15 @@ def page(self): return self._page def __iter__(self): - """The :class:`Iterator` is an iterator.""" + """The :class:`Iterator` is an iterator. + + :rtype: :class:`Iterator` + :returns: Current instance. + :raises ValueError: If the iterator has already been started. + """ + if self._started: + raise ValueError('Iterator has already started', self) + self._started = True return self def update_page(self, require_empty=True): @@ -385,10 +394,3 @@ def _get_next_page_response(self): self.next_page_token = response.get('nextPageToken') return response - - def reset(self): - """Resets the iterator to the beginning.""" - self.page_number = 0 - self.next_page_token = None - self.num_results = 0 - self._page = _UNSET diff --git a/core/unit_tests/test_iterator.py b/core/unit_tests/test_iterator.py index 81a3738ffc1f..e16edaaa00fa 100644 --- a/core/unit_tests/test_iterator.py +++ b/core/unit_tests/test_iterator.py @@ -101,14 +101,26 @@ def _makeOne(self, *args, **kw): return self._getTargetClass()(*args, **kw) def test_constructor(self): + from google.cloud.iterator import _do_nothing_page_start + from google.cloud.iterator import _UNSET + connection = _Connection() client = _Client(connection) path = '/foo' iterator = self._makeOne(client, path, None) + self.assertFalse(iterator._started) self.assertIs(iterator.client, client) self.assertEqual(iterator.path, path) + self.assertIsNone(iterator._item_to_value) + self.assertEqual(iterator._items_key, 'items') + self.assertIsNone(iterator.max_results) + self.assertEqual(iterator.extra_params, {}) + self.assertIs(iterator._page_start, _do_nothing_page_start) + # Changing attributes. self.assertEqual(iterator.page_number, 0) self.assertIsNone(iterator.next_page_token) + self.assertEqual(iterator.num_results, 0) + self.assertIs(iterator._page, _UNSET) def test_constructor_w_extra_param_collision(self): connection = _Connection() @@ -193,6 +205,13 @@ def test___iter__(self): iterator = self._makeOne(None, None, None) self.assertIs(iter(iterator), iterator) + def test___iter___started(self): + iterator = self._makeOne(None, None, None) + iter_obj = iter(iterator) + self.assertIs(iter_obj, iterator) + with self.assertRaises(ValueError): + iter(iterator) + def test_iterate(self): import six @@ -336,23 +355,6 @@ def test__get_next_page_response_new_no_token_in_response(self): self.assertEqual(kw['path'], path) self.assertEqual(kw['query_params'], {}) - def test_reset(self): - from google.cloud.iterator import _UNSET - - connection = _Connection() - client = _Client(connection) - path = '/foo' - token = 'token' - iterator = self._makeOne(client, path, None) - iterator.page_number = 1 - iterator.next_page_token = token - iterator._page = object() - iterator.reset() - self.assertEqual(iterator.page_number, 0) - self.assertEqual(iterator.num_results, 0) - self.assertIsNone(iterator.next_page_token) - self.assertIs(iterator._page, _UNSET) - class _Connection(object):