Skip to content

Commit 3d28a5c

Browse files
authored
Merge pull request #2560 from dhermes/dns-iterators-alt
Moving to iterators in DNS.
2 parents b402216 + ea9c653 commit 3d28a5c

File tree

4 files changed

+155
-136
lines changed

4 files changed

+155
-136
lines changed

dns/google/cloud/dns/client.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from google.cloud.client import JSONClient
1919
from google.cloud.dns.connection import Connection
2020
from google.cloud.dns.zone import ManagedZone
21+
from google.cloud.iterator import Iterator
2122

2223

2324
class Client(JSONClient):
@@ -70,31 +71,19 @@ def list_zones(self, max_results=None, page_token=None):
7071
:param max_results: maximum number of zones to return, If not
7172
passed, defaults to a value set by the API.
7273
73-
:type page_token: string
74+
:type page_token: str
7475
:param page_token: opaque marker for the next "page" of zones. If
7576
not passed, the API will return the first page of
7677
zones.
7778
78-
:rtype: tuple, (list, str)
79-
:returns: list of :class:`google.cloud.dns.zone.ManagedZone`, plus a
80-
"next page token" string: if the token is not None,
81-
indicates that more zones can be retrieved with another
82-
call (pass that value as ``page_token``).
79+
:rtype: :class:`~google.cloud.iterator.Iterator`
80+
:returns: Iterator of :class:`~google.cloud.dns.zone.ManagedZone`
81+
belonging to this project.
8382
"""
84-
params = {}
85-
86-
if max_results is not None:
87-
params['maxResults'] = max_results
88-
89-
if page_token is not None:
90-
params['pageToken'] = page_token
91-
9283
path = '/projects/%s/managedZones' % (self.project,)
93-
resp = self.connection.api_request(method='GET', path=path,
94-
query_params=params)
95-
zones = [ManagedZone.from_api_repr(resource, self)
96-
for resource in resp['managedZones']]
97-
return zones, resp.get('nextPageToken')
84+
return Iterator(client=self, path=path, items_key='managedZones',
85+
item_to_value=_item_to_zone, page_token=page_token,
86+
max_results=max_results)
9887

9988
def zone(self, name, dns_name=None, description=None):
10089
"""Construct a zone bound to this client.
@@ -115,3 +104,18 @@ def zone(self, name, dns_name=None, description=None):
115104
"""
116105
return ManagedZone(name, dns_name, client=self,
117106
description=description)
107+
108+
109+
def _item_to_zone(iterator, resource):
110+
"""Convert a JSON managed zone to the native object.
111+
112+
:type iterator: :class:`~google.cloud.iterator.Iterator`
113+
:param iterator: The iterator that has retrieved the item.
114+
115+
:type resource: dict
116+
:param resource: An item to be converted to a managed zone.
117+
118+
:rtype: :class:`.ManagedZone`
119+
:returns: The next managed zone in the page.
120+
"""
121+
return ManagedZone.from_api_repr(resource, iterator.client)

dns/google/cloud/dns/zone.py

Lines changed: 51 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
# limitations under the License.
1414

1515
"""Define API ManagedZones."""
16+
1617
import six
1718

1819
from google.cloud._helpers import _rfc3339_to_datetime
1920
from google.cloud.exceptions import NotFound
2021
from google.cloud.dns.changes import Changes
2122
from google.cloud.dns.resource_record_set import ResourceRecordSet
23+
from google.cloud.iterator import Iterator
2224

2325

2426
class ManagedZone(object):
@@ -330,29 +332,19 @@ def list_resource_record_sets(self, max_results=None, page_token=None,
330332
:param client: the client to use. If not passed, falls back to the
331333
``client`` stored on the current zone.
332334
333-
:rtype: tuple, (list, str)
334-
:returns: list of
335-
:class:`~.resource_record_set.ResourceRecordSet`,
336-
plus a "next page token" string: if the token is not None,
337-
indicates that more zones can be retrieved with another
338-
call (pass that value as ``page_token``).
335+
:rtype: :class:`~google.cloud.iterator.Iterator`
336+
:returns: Iterator of :class:`~.resource_record_set.ResourceRecordSet`
337+
belonging to this zone.
339338
"""
340-
params = {}
341-
342-
if max_results is not None:
343-
params['maxResults'] = max_results
344-
345-
if page_token is not None:
346-
params['pageToken'] = page_token
347-
339+
client = self._require_client(client)
348340
path = '/projects/%s/managedZones/%s/rrsets' % (
349341
self.project, self.name)
350-
client = self._require_client(client)
351-
conn = client.connection
352-
resp = conn.api_request(method='GET', path=path, query_params=params)
353-
zones = [ResourceRecordSet.from_api_repr(resource, self)
354-
for resource in resp['rrsets']]
355-
return zones, resp.get('nextPageToken')
342+
iterator = Iterator(
343+
client=client, path=path, items_key='rrsets',
344+
item_to_value=_item_to_resource_record_set,
345+
page_token=page_token, max_results=max_results)
346+
iterator.zone = self
347+
return iterator
356348

357349
def list_changes(self, max_results=None, page_token=None, client=None):
358350
"""List change sets for this zone.
@@ -373,26 +365,46 @@ def list_changes(self, max_results=None, page_token=None, client=None):
373365
:param client: the client to use. If not passed, falls back to the
374366
``client`` stored on the current zone.
375367
376-
:rtype: tuple, (list, str)
377-
:returns: list of
378-
:class:`~.resource_record_set.ResourceRecordSet`,
379-
plus a "next page token" string: if the token is not None,
380-
indicates that more zones can be retrieved with another
381-
call (pass that value as ``page_token``).
368+
:rtype: :class:`~google.cloud.iterator.Iterator`
369+
:returns: Iterator of :class:`~.changes.Changes`
370+
belonging to this zone.
382371
"""
383-
params = {}
372+
client = self._require_client(client)
373+
path = '/projects/%s/managedZones/%s/changes' % (
374+
self.project, self.name)
375+
iterator = Iterator(
376+
client=client, path=path, items_key='changes',
377+
item_to_value=_item_to_changes,
378+
page_token=page_token, max_results=max_results)
379+
iterator.zone = self
380+
return iterator
384381

385-
if max_results is not None:
386-
params['maxResults'] = max_results
387382

388-
if page_token is not None:
389-
params['pageToken'] = page_token
383+
def _item_to_resource_record_set(iterator, resource):
384+
"""Convert a JSON resource record set value to the native object.
390385
391-
path = '/projects/%s/managedZones/%s/changes' % (
392-
self.project, self.name)
393-
client = self._require_client(client)
394-
conn = client.connection
395-
resp = conn.api_request(method='GET', path=path, query_params=params)
396-
zones = [Changes.from_api_repr(resource, self)
397-
for resource in resp['changes']]
398-
return zones, resp.get('nextPageToken')
386+
:type iterator: :class:`~google.cloud.iterator.Iterator`
387+
:param iterator: The iterator that has retrieved the item.
388+
389+
:type resource: dict
390+
:param resource: An item to be converted to a resource record set.
391+
392+
:rtype: :class:`~.resource_record_set.ResourceRecordSet`
393+
:returns: The next resource record set in the page.
394+
"""
395+
return ResourceRecordSet.from_api_repr(resource, iterator.zone)
396+
397+
398+
def _item_to_changes(iterator, resource):
399+
"""Convert a JSON "changes" value to the native object.
400+
401+
:type iterator: :class:`~google.cloud.iterator.Iterator`
402+
:param iterator: The iterator that has retrieved the item.
403+
404+
:type resource: dict
405+
:param resource: An item to be converted to a "changes".
406+
407+
:rtype: :class:`.Changes`
408+
:returns: The next "changes" in the page.
409+
"""
410+
return Changes.from_api_repr(resource, iterator.zone)

dns/unit_tests/test_client.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,10 @@ def test_list_zones_defaults(self):
132132
client = self._makeOne(self.PROJECT, creds)
133133
conn = client.connection = _Connection(DATA)
134134

135-
zones, token = client.list_zones()
135+
iterator = client.list_zones()
136+
iterator.update_page()
137+
zones = list(iterator.page)
138+
token = iterator.next_page_token
136139

137140
self.assertEqual(len(zones), len(DATA['managedZones']))
138141
for found, expected in zip(zones, DATA['managedZones']):
@@ -173,7 +176,10 @@ def test_list_zones_explicit(self):
173176
client = self._makeOne(self.PROJECT, creds)
174177
conn = client.connection = _Connection(DATA)
175178

176-
zones, token = client.list_zones(max_results=3, page_token=TOKEN)
179+
iterator = client.list_zones(max_results=3, page_token=TOKEN)
180+
iterator.update_page()
181+
zones = list(iterator.page)
182+
token = iterator.next_page_token
177183

178184
self.assertEqual(len(zones), len(DATA['managedZones']))
179185
for found, expected in zip(zones, DATA['managedZones']):

0 commit comments

Comments
 (0)