Skip to content

Commit

Permalink
Merge pull request #2558 from dhermes/no-more-iterator-subclasses
Browse files Browse the repository at this point in the history
Removing Iterator and Page subclasses.
  • Loading branch information
dhermes committed Oct 18, 2016
2 parents 4442caf + bff17cc commit a001cc1
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {}

Expand All @@ -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)
121 changes: 52 additions & 69 deletions packages/google-cloud-resource-manager/unit_tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -145,15 +78,15 @@ 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)
# Patch the connection with one we can easily control.
client.connection = _Connection({})

results = client.list_projects()
self.assertIsInstance(results, _ProjectIterator)
self.assertIsInstance(results, Iterator)

def test_list_projects_no_paging(self):
credentials = _Credentials()
Expand Down Expand Up @@ -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):

Expand Down

0 comments on commit a001cc1

Please sign in to comment.