diff --git a/packages/google-cloud-resource-manager/google/cloud/resource_manager/client.py b/packages/google-cloud-resource-manager/google/cloud/resource_manager/client.py index 5d9e50c07efe..ac389104e855 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resource_manager/client.py +++ b/packages/google-cloud-resource-manager/google/cloud/resource_manager/client.py @@ -141,11 +141,10 @@ def list_projects(self, filter_params=None, page_size=None): single page. If not passed, defaults to a value set by the API. - :rtype: :class:`_ProjectIterator` - :returns: A project iterator. The iterator will make multiple API - requests if you continue iterating and there are more - pages of results. Each item returned will be a. + :rtype: :class:`~google.cloud.iterator.Iterator` + :returns: Iterator of all :class:`~google.cloud.resource_manager.project.Project`. + that the current user has access to. """ extra_params = {} @@ -155,40 +154,21 @@ def list_projects(self, filter_params=None, page_size=None): if filter_params is not None: extra_params['filter'] = filter_params - return _ProjectIterator(self, extra_params=extra_params) + return Iterator( + client=self, path='/projects', item_to_value=_item_to_project, + items_key='projects', extra_params=extra_params) -class _ProjectIterator(Iterator): - """An iterator over a list of Project resources. +def _item_to_project(iterator, resource): + """Convert a JSON project to the native object. - You shouldn't have to use this directly, but instead should use the - helper methods on :class:`~google.cloud.resource_manager.client.Client` - objects. + :type iterator: :class:`~google.cloud.iterator.Iterator` + :param iterator: The iterator that has retrieved the item. - :type client: :class:`~google.cloud.resource_manager.client.Client` - :param client: The client to use for making connections. + :type resource: dict + :param resource: A resource to be converted to a project. - :type page_token: str - :param page_token: (Optional) A token identifying a page in a result set. - - :type max_results: int - :param max_results: (Optional) The maximum number of results to fetch. - - :type extra_params: dict - :param extra_params: (Optional) Extra query string parameters for - the API call. + :rtype: :class:`.Project` + :returns: The next project in the page. """ - - PATH = '/projects' - ITEMS_KEY = 'projects' - - def _item_to_value(self, resource): - """Convert a JSON project to the native object. - - :type resource: dict - :param resource: An resource to be converted to a project. - - :rtype: :class:`.Project` - :returns: The next project in the page. - """ - return Project.from_api_repr(resource, client=self.client) + return Project.from_api_repr(resource, client=iterator.client) diff --git a/packages/google-cloud-resource-manager/unit_tests/test_client.py b/packages/google-cloud-resource-manager/unit_tests/test_client.py index a8c50b815e8d..724b48e26e44 100644 --- a/packages/google-cloud-resource-manager/unit_tests/test_client.py +++ b/packages/google-cloud-resource-manager/unit_tests/test_client.py @@ -15,73 +15,6 @@ import unittest -class Test__ProjectIterator(unittest.TestCase): - - def _getTargetClass(self): - from google.cloud.resource_manager.client import _ProjectIterator - return _ProjectIterator - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_constructor(self): - client = object() - iterator = self._makeOne(client) - self.assertEqual(iterator.path, '/projects') - self.assertEqual(iterator.page_number, 0) - self.assertIsNone(iterator.next_page_token) - self.assertIs(iterator.client, client) - self.assertEqual(iterator.extra_params, {}) - - def test_page_empty_response(self): - from google.cloud.iterator import Page - - client = object() - iterator = self._makeOne(client) - page = Page(iterator, {}, iterator.ITEMS_KEY) - iterator._page = page - self.assertEqual(page.num_items, 0) - self.assertEqual(page.remaining, 0) - self.assertEqual(list(page), []) - - def test_page_non_empty_response(self): - from google.cloud.resource_manager.project import Project - - project_id = 'project-id' - project_name = 'My Project Name' - project_number = 12345678 - project_labels = {'env': 'prod'} - project_lifecycle_state = 'ACTIVE' - api_resource = { - 'projectId': project_id, - 'name': project_name, - 'projectNumber': project_number, - 'labels': project_labels, - 'lifecycleState': project_lifecycle_state, - } - response = {'projects': [api_resource]} - client = object() - - def dummy_response(): - return response - - iterator = self._makeOne(client) - iterator._get_next_page_response = dummy_response - - iterator.update_page() - page = iterator.page - self.assertEqual(page.num_items, 1) - project = iterator.next() - self.assertEqual(page.remaining, 0) - self.assertIsInstance(project, Project) - self.assertEqual(project.project_id, project_id) - self.assertEqual(project._client, client) - self.assertEqual(project.name, project_name) - self.assertEqual(project.number, project_number) - self.assertEqual(project.labels, project_labels) - self.assertEqual(project.status, project_lifecycle_state) - - class TestClient(unittest.TestCase): def _getTargetClass(self): @@ -145,7 +78,7 @@ def test_fetch_project(self): self.assertEqual(project.labels, labels) def test_list_projects_return_type(self): - from google.cloud.resource_manager.client import _ProjectIterator + from google.cloud.iterator import Iterator credentials = _Credentials() client = self._makeOne(credentials=credentials) @@ -153,7 +86,7 @@ def test_list_projects_return_type(self): client.connection = _Connection({}) results = client.list_projects() - self.assertIsInstance(results, _ProjectIterator) + self.assertIsInstance(results, Iterator) def test_list_projects_no_paging(self): credentials = _Credentials() @@ -283,6 +216,56 @@ def test_list_projects_with_filter(self): }, }) + def test_page_empty_response(self): + from google.cloud.iterator import Page + + credentials = _Credentials() + client = self._makeOne(credentials=credentials) + iterator = client.list_projects() + page = Page(iterator, {}, iterator._items_key, None) + iterator._page = page + self.assertEqual(page.num_items, 0) + self.assertEqual(page.remaining, 0) + self.assertEqual(list(page), []) + + def test_page_non_empty_response(self): + from google.cloud.resource_manager.project import Project + + project_id = 'project-id' + project_name = 'My Project Name' + project_number = 12345678 + project_labels = {'env': 'prod'} + project_lifecycle_state = 'ACTIVE' + api_resource = { + 'projectId': project_id, + 'name': project_name, + 'projectNumber': project_number, + 'labels': project_labels, + 'lifecycleState': project_lifecycle_state, + } + response = {'projects': [api_resource]} + credentials = _Credentials() + client = self._makeOne(credentials=credentials) + + def dummy_response(): + return response + + iterator = client.list_projects() + iterator._get_next_page_response = dummy_response + + iterator.update_page() + page = iterator.page + self.assertEqual(page.num_items, 1) + project = iterator.next() + self.assertEqual(page.remaining, 0) + self.assertIsInstance(project, Project) + self.assertEqual(project.project_id, project_id) + self.assertEqual(project._client, client) + self.assertEqual(project.name, project_name) + self.assertEqual(project.number, project_number) + self.assertEqual(project.labels, project_labels) + self.assertEqual(project.status, project_lifecycle_state) + class _Credentials(object):