Skip to content

Commit a001cc1

Browse files
authored
Merge pull request #2558 from dhermes/no-more-iterator-subclasses
Removing Iterator and Page subclasses.
2 parents 4442caf + bff17cc commit a001cc1

File tree

2 files changed

+67
-104
lines changed

2 files changed

+67
-104
lines changed

packages/google-cloud-resource-manager/google/cloud/resource_manager/client.py

Lines changed: 15 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,10 @@ def list_projects(self, filter_params=None, page_size=None):
141141
single page. If not passed, defaults to a value set
142142
by the API.
143143
144-
:rtype: :class:`_ProjectIterator`
145-
:returns: A project iterator. The iterator will make multiple API
146-
requests if you continue iterating and there are more
147-
pages of results. Each item returned will be a.
144+
:rtype: :class:`~google.cloud.iterator.Iterator`
145+
:returns: Iterator of all
148146
:class:`~google.cloud.resource_manager.project.Project`.
147+
that the current user has access to.
149148
"""
150149
extra_params = {}
151150

@@ -155,40 +154,21 @@ def list_projects(self, filter_params=None, page_size=None):
155154
if filter_params is not None:
156155
extra_params['filter'] = filter_params
157156

158-
return _ProjectIterator(self, extra_params=extra_params)
157+
return Iterator(
158+
client=self, path='/projects', item_to_value=_item_to_project,
159+
items_key='projects', extra_params=extra_params)
159160

160161

161-
class _ProjectIterator(Iterator):
162-
"""An iterator over a list of Project resources.
162+
def _item_to_project(iterator, resource):
163+
"""Convert a JSON project to the native object.
163164
164-
You shouldn't have to use this directly, but instead should use the
165-
helper methods on :class:`~google.cloud.resource_manager.client.Client`
166-
objects.
165+
:type iterator: :class:`~google.cloud.iterator.Iterator`
166+
:param iterator: The iterator that has retrieved the item.
167167
168-
:type client: :class:`~google.cloud.resource_manager.client.Client`
169-
:param client: The client to use for making connections.
168+
:type resource: dict
169+
:param resource: A resource to be converted to a project.
170170
171-
:type page_token: str
172-
:param page_token: (Optional) A token identifying a page in a result set.
173-
174-
:type max_results: int
175-
:param max_results: (Optional) The maximum number of results to fetch.
176-
177-
:type extra_params: dict
178-
:param extra_params: (Optional) Extra query string parameters for
179-
the API call.
171+
:rtype: :class:`.Project`
172+
:returns: The next project in the page.
180173
"""
181-
182-
PATH = '/projects'
183-
ITEMS_KEY = 'projects'
184-
185-
def _item_to_value(self, resource):
186-
"""Convert a JSON project to the native object.
187-
188-
:type resource: dict
189-
:param resource: An resource to be converted to a project.
190-
191-
:rtype: :class:`.Project`
192-
:returns: The next project in the page.
193-
"""
194-
return Project.from_api_repr(resource, client=self.client)
174+
return Project.from_api_repr(resource, client=iterator.client)

packages/google-cloud-resource-manager/unit_tests/test_client.py

Lines changed: 52 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -15,73 +15,6 @@
1515
import unittest
1616

1717

18-
class Test__ProjectIterator(unittest.TestCase):
19-
20-
def _getTargetClass(self):
21-
from google.cloud.resource_manager.client import _ProjectIterator
22-
return _ProjectIterator
23-
24-
def _makeOne(self, *args, **kw):
25-
return self._getTargetClass()(*args, **kw)
26-
27-
def test_constructor(self):
28-
client = object()
29-
iterator = self._makeOne(client)
30-
self.assertEqual(iterator.path, '/projects')
31-
self.assertEqual(iterator.page_number, 0)
32-
self.assertIsNone(iterator.next_page_token)
33-
self.assertIs(iterator.client, client)
34-
self.assertEqual(iterator.extra_params, {})
35-
36-
def test_page_empty_response(self):
37-
from google.cloud.iterator import Page
38-
39-
client = object()
40-
iterator = self._makeOne(client)
41-
page = Page(iterator, {}, iterator.ITEMS_KEY)
42-
iterator._page = page
43-
self.assertEqual(page.num_items, 0)
44-
self.assertEqual(page.remaining, 0)
45-
self.assertEqual(list(page), [])
46-
47-
def test_page_non_empty_response(self):
48-
from google.cloud.resource_manager.project import Project
49-
50-
project_id = 'project-id'
51-
project_name = 'My Project Name'
52-
project_number = 12345678
53-
project_labels = {'env': 'prod'}
54-
project_lifecycle_state = 'ACTIVE'
55-
api_resource = {
56-
'projectId': project_id,
57-
'name': project_name,
58-
'projectNumber': project_number,
59-
'labels': project_labels,
60-
'lifecycleState': project_lifecycle_state,
61-
}
62-
response = {'projects': [api_resource]}
63-
client = object()
64-
65-
def dummy_response():
66-
return response
67-
68-
iterator = self._makeOne(client)
69-
iterator._get_next_page_response = dummy_response
70-
71-
iterator.update_page()
72-
page = iterator.page
73-
self.assertEqual(page.num_items, 1)
74-
project = iterator.next()
75-
self.assertEqual(page.remaining, 0)
76-
self.assertIsInstance(project, Project)
77-
self.assertEqual(project.project_id, project_id)
78-
self.assertEqual(project._client, client)
79-
self.assertEqual(project.name, project_name)
80-
self.assertEqual(project.number, project_number)
81-
self.assertEqual(project.labels, project_labels)
82-
self.assertEqual(project.status, project_lifecycle_state)
83-
84-
8518
class TestClient(unittest.TestCase):
8619

8720
def _getTargetClass(self):
@@ -145,15 +78,15 @@ def test_fetch_project(self):
14578
self.assertEqual(project.labels, labels)
14679

14780
def test_list_projects_return_type(self):
148-
from google.cloud.resource_manager.client import _ProjectIterator
81+
from google.cloud.iterator import Iterator
14982

15083
credentials = _Credentials()
15184
client = self._makeOne(credentials=credentials)
15285
# Patch the connection with one we can easily control.
15386
client.connection = _Connection({})
15487

15588
results = client.list_projects()
156-
self.assertIsInstance(results, _ProjectIterator)
89+
self.assertIsInstance(results, Iterator)
15790

15891
def test_list_projects_no_paging(self):
15992
credentials = _Credentials()
@@ -283,6 +216,56 @@ def test_list_projects_with_filter(self):
283216
},
284217
})
285218

219+
def test_page_empty_response(self):
220+
from google.cloud.iterator import Page
221+
222+
credentials = _Credentials()
223+
client = self._makeOne(credentials=credentials)
224+
iterator = client.list_projects()
225+
page = Page(iterator, {}, iterator._items_key, None)
226+
iterator._page = page
227+
self.assertEqual(page.num_items, 0)
228+
self.assertEqual(page.remaining, 0)
229+
self.assertEqual(list(page), [])
230+
231+
def test_page_non_empty_response(self):
232+
from google.cloud.resource_manager.project import Project
233+
234+
project_id = 'project-id'
235+
project_name = 'My Project Name'
236+
project_number = 12345678
237+
project_labels = {'env': 'prod'}
238+
project_lifecycle_state = 'ACTIVE'
239+
api_resource = {
240+
'projectId': project_id,
241+
'name': project_name,
242+
'projectNumber': project_number,
243+
'labels': project_labels,
244+
'lifecycleState': project_lifecycle_state,
245+
}
246+
response = {'projects': [api_resource]}
247+
credentials = _Credentials()
248+
client = self._makeOne(credentials=credentials)
249+
250+
def dummy_response():
251+
return response
252+
253+
iterator = client.list_projects()
254+
iterator._get_next_page_response = dummy_response
255+
256+
iterator.update_page()
257+
page = iterator.page
258+
self.assertEqual(page.num_items, 1)
259+
project = iterator.next()
260+
self.assertEqual(page.remaining, 0)
261+
self.assertIsInstance(project, Project)
262+
self.assertEqual(project.project_id, project_id)
263+
self.assertEqual(project._client, client)
264+
self.assertEqual(project.name, project_name)
265+
self.assertEqual(project.number, project_number)
266+
self.assertEqual(project.labels, project_labels)
267+
self.assertEqual(project.status, project_lifecycle_state)
268+
286269

287270
class _Credentials(object):
288271

0 commit comments

Comments
 (0)