Skip to content

Commit ab05218

Browse files
committed
Moving backend specific behavior from Page to Iterator.
This is to lower the burden on implementers. The previous approach (requiring a Page and Iterator subclass) ended up causing lots of copy-pasta docstrings that were just a distraction. Follow up to #2531.
1 parent a1f8e1c commit ab05218

File tree

2 files changed

+38
-58
lines changed

2 files changed

+38
-58
lines changed

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

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
from google.cloud.client import Client as BaseClient
1919
from google.cloud.iterator import Iterator
20-
from google.cloud.iterator import Page
2120
from google.cloud.resource_manager.connection import Connection
2221
from google.cloud.resource_manager.project import Project
2322

@@ -159,30 +158,6 @@ def list_projects(self, filter_params=None, page_size=None):
159158
return _ProjectIterator(self, extra_params=extra_params)
160159

161160

162-
class _ProjectPage(Page):
163-
"""Iterator for a single page of results.
164-
165-
:type parent: :class:`_ProjectIterator`
166-
:param parent: The iterator that owns the current page.
167-
168-
:type response: dict
169-
:param response: The JSON API response for a page of projects.
170-
"""
171-
172-
ITEMS_KEY = 'projects'
173-
174-
def _item_to_value(self, resource):
175-
"""Convert a JSON project to the native object.
176-
177-
:type resource: dict
178-
:param resource: An resource to be converted to a project.
179-
180-
:rtype: :class:`.Project`
181-
:returns: The next project in the page.
182-
"""
183-
return Project.from_api_repr(resource, client=self._parent.client)
184-
185-
186161
class _ProjectIterator(Iterator):
187162
"""An iterator over a list of Project resources.
188163
@@ -204,5 +179,16 @@ class _ProjectIterator(Iterator):
204179
the API call.
205180
"""
206181

207-
PAGE_CLASS = _ProjectPage
208182
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)

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

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,36 @@
1515
import unittest
1616

1717

18-
class Test__ProjectPage(unittest.TestCase):
18+
class Test__ProjectIterator(unittest.TestCase):
1919

2020
def _getTargetClass(self):
21-
from google.cloud.resource_manager.client import _ProjectPage
22-
return _ProjectPage
21+
from google.cloud.resource_manager.client import _ProjectIterator
22+
return _ProjectIterator
2323

2424
def _makeOne(self, *args, **kw):
2525
return self._getTargetClass()(*args, **kw)
2626

27-
def test_empty_response(self):
28-
from google.cloud.resource_manager.client import _ProjectIterator
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
2938

3039
client = object()
31-
iterator = _ProjectIterator(client)
32-
page = self._makeOne(iterator, {})
40+
iterator = self._makeOne(client)
41+
page = Page(iterator, {}, iterator.ITEMS_KEY)
42+
iterator._page = page
3343
self.assertEqual(page.num_items, 0)
3444
self.assertEqual(page.remaining, 0)
3545
self.assertEqual(list(page), [])
3646

37-
def test_non_empty_response(self):
38-
from google.cloud.resource_manager.client import _ProjectIterator
47+
def test_page_non_empty_response(self):
3948
from google.cloud.resource_manager.project import Project
4049

4150
project_id = 'project-id'
@@ -51,13 +60,17 @@ def test_non_empty_response(self):
5160
'lifecycleState': project_lifecycle_state,
5261
}
5362
response = {'projects': [api_resource]}
54-
5563
client = object()
56-
iterator = _ProjectIterator(client)
57-
page = self._makeOne(iterator, response)
5864

65+
def dummy_response():
66+
return response
67+
68+
iterator = self._makeOne(client)
69+
iterator._get_next_page_response = dummy_response
70+
71+
page = iterator.page
5972
self.assertEqual(page.num_items, 1)
60-
project = page.next()
73+
project = iterator.next()
6174
self.assertEqual(page.remaining, 0)
6275
self.assertIsInstance(project, Project)
6376
self.assertEqual(project.project_id, project_id)
@@ -68,25 +81,6 @@ def test_non_empty_response(self):
6881
self.assertEqual(project.status, project_lifecycle_state)
6982

7083

71-
class Test__ProjectIterator(unittest.TestCase):
72-
73-
def _getTargetClass(self):
74-
from google.cloud.resource_manager.client import _ProjectIterator
75-
return _ProjectIterator
76-
77-
def _makeOne(self, *args, **kw):
78-
return self._getTargetClass()(*args, **kw)
79-
80-
def test_constructor(self):
81-
client = object()
82-
iterator = self._makeOne(client)
83-
self.assertEqual(iterator.path, '/projects')
84-
self.assertEqual(iterator.page_number, 0)
85-
self.assertIsNone(iterator.next_page_token)
86-
self.assertIs(iterator.client, client)
87-
self.assertEqual(iterator.extra_params, {})
88-
89-
9084
class TestClient(unittest.TestCase):
9185

9286
def _getTargetClass(self):

0 commit comments

Comments
 (0)