Skip to content

Commit 69c5537

Browse files
committed
Return Topic instances from 'pubsub.api.list_topics'.
Make the return value a tuple, '([topic], next_page_token)'.
1 parent c9a27b7 commit 69c5537

2 files changed

Lines changed: 32 additions & 21 deletions

File tree

gcloud/pubsub/api.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from gcloud._helpers import get_default_project
1818
from gcloud.pubsub._implicit_environ import get_default_connection
19+
from gcloud.pubsub.topic import Topic
1920

2021

2122
def list_topics(page_size=None, page_token=None,
@@ -42,9 +43,9 @@ def list_topics(page_size=None, page_token=None,
4243
defaults to the connection inferred from the
4344
environment.
4445
45-
:rtype: dict
46-
:returns: keys include ``topics`` (a list of topic mappings) and
47-
``nextPageToken`` (a string: if non-empty, indicates that
46+
:rtype: tuple, (list, str)
47+
:returns: list of :class:`gcloud.pubsub.topic.Topic`, plus a
48+
"next page token" string: if not None, indicates that
4849
more topics can be retrieved with another call (pass that
4950
value as ``page_token``).
5051
"""
@@ -63,7 +64,12 @@ def list_topics(page_size=None, page_token=None,
6364
params['pageToken'] = page_token
6465

6566
path = '/projects/%s/topics' % project
66-
return connection.api_request(method='GET', path=path, query_params=params)
67+
resp = connection.api_request(method='GET', path=path, query_params=params)
68+
topics = []
69+
for full_name in [topic['name'] for topic in resp['topics']]:
70+
_, t_project, _, name = full_name.split('/')
71+
topics.append(Topic(name, t_project, connection))
72+
return topics, resp.get('nextPageToken')
6773

6874

6975
def list_subscriptions(page_size=None, page_token=None, topic_name=None,

gcloud/pubsub/test_api.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,18 @@ def _callFUT(self, *args, **kw):
2222
return list_topics(*args, **kw)
2323

2424
def test_w_explicit_connection_no_paging(self):
25+
from gcloud.pubsub.topic import Topic
2526
TOPIC_NAME = 'topic_name'
2627
PROJECT = 'PROJECT'
27-
TOKEN = 'TOKEN'
28-
returned = {'topics': [{'name': TOPIC_NAME}],
29-
'nextPageToken': TOKEN}
28+
TOPIC_PATH = 'projects/%s/topics/%s' % (PROJECT, TOPIC_NAME)
29+
returned = {'topics': [{'name': TOPIC_PATH}]}
3030
conn = _Connection(returned)
31-
response = self._callFUT(project=PROJECT, connection=conn)
32-
topics = response['topics']
31+
topics, next_page_token = self._callFUT(project=PROJECT,
32+
connection=conn)
3333
self.assertEqual(len(topics), 1)
34-
self.assertEqual(topics[0], {'name': TOPIC_NAME})
35-
self.assertEqual(response['nextPageToken'], TOKEN)
34+
self.assertTrue(isinstance(topics[0], Topic))
35+
self.assertEqual(topics[0].name, TOPIC_NAME)
36+
self.assertEqual(next_page_token, None)
3637
self.assertEqual(len(conn._requested), 1)
3738
req = conn._requested[0]
3839
self.assertEqual(req['method'], 'GET')
@@ -42,39 +43,43 @@ def test_w_explicit_connection_no_paging(self):
4243
def test_w_implicit_connection_and_project_wo_paging(self):
4344
from gcloud._testing import _monkey_defaults as _monkey_base_defaults
4445
from gcloud.pubsub._testing import _monkey_defaults
46+
from gcloud.pubsub.topic import Topic
4547
TOPIC_NAME = 'topic_name'
4648
PROJECT = 'PROJECT'
49+
TOPIC_PATH = 'projects/%s/topics/%s' % (PROJECT, TOPIC_NAME)
4750
TOKEN = 'TOKEN'
48-
returned = {'topics': [{'name': TOPIC_NAME}],
51+
returned = {'topics': [{'name': TOPIC_PATH}],
4952
'nextPageToken': TOKEN}
5053
conn = _Connection(returned)
5154
with _monkey_base_defaults(project=PROJECT):
5255
with _monkey_defaults(connection=conn):
53-
response = self._callFUT()
54-
topics = response['topics']
56+
topics, next_page_token = self._callFUT()
5557
self.assertEqual(len(topics), 1)
56-
self.assertEqual(topics[0], {'name': TOPIC_NAME})
57-
self.assertEqual(response['nextPageToken'], TOKEN)
58+
self.assertTrue(isinstance(topics[0], Topic))
59+
self.assertEqual(topics[0].name, TOPIC_NAME)
60+
self.assertEqual(next_page_token, TOKEN)
5861
self.assertEqual(len(conn._requested), 1)
5962
req = conn._requested[0]
6063
self.assertEqual(req['method'], 'GET')
6164
self.assertEqual(req['path'], '/projects/%s/topics' % PROJECT)
6265
self.assertEqual(req['query_params'], {})
6366

6467
def test_w_explicit_connection_and_project_w_paging(self):
68+
from gcloud.pubsub.topic import Topic
6569
TOPIC_NAME = 'topic_name'
6670
PROJECT = 'PROJECT'
71+
TOPIC_PATH = 'projects/%s/topics/%s' % (PROJECT, TOPIC_NAME)
6772
TOKEN1 = 'TOKEN1'
6873
TOKEN2 = 'TOKEN2'
6974
SIZE = 1
70-
returned = {'topics': [{'name': TOPIC_NAME}],
75+
returned = {'topics': [{'name': TOPIC_PATH}],
7176
'nextPageToken': TOKEN2}
7277
conn = _Connection(returned)
73-
response = self._callFUT(SIZE, TOKEN1, PROJECT, conn)
74-
topics = response['topics']
78+
topics, next_page_token = self._callFUT(SIZE, TOKEN1, PROJECT, conn)
7579
self.assertEqual(len(topics), 1)
76-
self.assertEqual(topics[0], {'name': TOPIC_NAME})
77-
self.assertEqual(response['nextPageToken'], TOKEN2)
80+
self.assertTrue(isinstance(topics[0], Topic))
81+
self.assertEqual(topics[0].name, TOPIC_NAME)
82+
self.assertEqual(next_page_token, TOKEN2)
7883
self.assertEqual(len(conn._requested), 1)
7984
req = conn._requested[0]
8085
self.assertEqual(req['method'], 'GET')

0 commit comments

Comments
 (0)