Skip to content

Commit 7c21cee

Browse files
committed
Merge pull request #790 from tseaver/744-pubsub-return_topic_inst_from_list_topics
#744: return Topic instances from `pubsub.api.list_topics()`
2 parents 925ddb2 + 9f77268 commit 7c21cee

File tree

4 files changed

+55
-21
lines changed

4 files changed

+55
-21
lines changed

gcloud/pubsub/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from gcloud.connection import get_scoped_connection
3030
from gcloud.pubsub import _implicit_environ
3131
from gcloud.pubsub._implicit_environ import get_default_connection
32+
from gcloud.pubsub.api import list_topics
3233
from gcloud.pubsub.connection import Connection
3334

3435

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')

regression/pubsub.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import time
16+
1517
import unittest2
1618

1719
from gcloud import _helpers
@@ -40,3 +42,23 @@ def test_create_topic(self):
4042
self.to_delete.append(topic)
4143
self.assertTrue(topic.exists())
4244
self.assertEqual(topic.name, new_topic_name)
45+
46+
def test_list_topics(self):
47+
topics_to_create = [
48+
'new%d' % (1000 * time.time(),),
49+
'newer%d' % (1000 * time.time(),),
50+
'newest%d' % (1000 * time.time(),),
51+
]
52+
created_topics = []
53+
for topic_name in topics_to_create:
54+
topic = Topic(topic_name)
55+
topic.create()
56+
self.to_delete.append(topic)
57+
58+
# Retrieve the topics.
59+
all_topics, _ = pubsub.list_topics()
60+
project_id = pubsub.get_default_project()
61+
created_topics = [topic for topic in all_topics
62+
if topic.name in topics_to_create and
63+
topic.project == project_id]
64+
self.assertEqual(len(created_topics), len(topics_to_create))

0 commit comments

Comments
 (0)