@@ -202,6 +202,14 @@ class Iterator(object):
202202 takes the :class:`Iterator` that started the page,
203203 the :class:`Page` that was started and the dictionary
204204 containing the page response.
205+
206+ :type page_iter: callable
207+ :param page_iter: (Optional) Callable to produce a pages iterator from the
208+ current iterator. Assumed signature takes the
209+ :class:`Iterator` that started the page. By default uses
210+ the HTTP pages iterator. Meant to provide a custom
211+ way to create pages (potentially with a custom
212+ transport such as gRPC).
205213 """
206214
207215 _PAGE_TOKEN = 'pageToken'
@@ -211,7 +219,7 @@ class Iterator(object):
211219 def __init__ (self , client , path , item_to_value ,
212220 items_key = DEFAULT_ITEMS_KEY ,
213221 page_token = None , max_results = None , extra_params = None ,
214- page_start = _do_nothing_page_start ):
222+ page_start = _do_nothing_page_start , page_iter = None ):
215223 self ._started = False
216224 self .client = client
217225 self .path = path
@@ -220,8 +228,14 @@ def __init__(self, client, path, item_to_value,
220228 self .max_results = max_results
221229 self .extra_params = extra_params
222230 self ._page_start = page_start
231+ self ._page_iter = None
232+ # Verify inputs / provide defaults.
223233 if self .extra_params is None :
224234 self .extra_params = {}
235+ if page_iter is None :
236+ self ._page_iter = self ._default_page_iter ()
237+ else :
238+ self ._page_iter = page_iter (self )
225239 self ._verify_params ()
226240 # The attributes below will change over the life of the iterator.
227241 self .page_number = 0
@@ -239,7 +253,7 @@ def _verify_params(self):
239253 raise ValueError ('Using a reserved parameter' ,
240254 reserved_in_use )
241255
242- def _pages_iter (self ):
256+ def _default_page_iter (self ):
243257 """Generator of pages of API responses.
244258
245259 Yields :class:`Page` instances.
@@ -263,11 +277,11 @@ def pages(self):
263277 if self ._started :
264278 raise ValueError ('Iterator has already started' , self )
265279 self ._started = True
266- return self ._pages_iter ()
280+ return self ._page_iter
267281
268282 def _items_iter (self ):
269283 """Iterator for each item returned."""
270- for page in self ._pages_iter () :
284+ for page in self ._page_iter :
271285 # Decrement the total results since the pages iterator adds
272286 # to it when each page is encountered.
273287 self .num_results -= page .num_items
0 commit comments