10000 Implementing `topic.subscription` factory. · googleapis/google-cloud-python@e001902 · GitHub
[go: up one dir, main page]

Skip to content

Commit e001902

Browse files
committed
Implementing topic.subscription factory.
Also using `topic.subscription` factory in docs and regression tests instead of instantiating a `Subscription`. Fixes #929.
1 parent b7eaf23 commit e001902

File tree

5 files changed

+53
-18
lines changed

5 files changed

+53
-18
lines changed

docs/pubsub-usage.rst

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ Create a new pull subscription for a topic:
121121
>>> from gcloud import pubsub
122122
>>> client = pubsub.Client()
123123
>>> topic = client.topic('topic_name')
124-
>>> subscription = pubsub.Subscription('subscription_name', topic)
124+
>>> subscription = topic.subscription('subscription_name')
125125
>>> subscription.create() # API request
126126

127127
Create a new pull subscription for a topic with a non-default ACK deadline:
@@ -131,8 +131,7 @@ Create a new pull subscription for a topic with a non-default ACK deadline:
131131
>>> from gcloud import pubsub
132132
>>> client = pubsub.Client()
133133
>>> topic = client.topic('topic_name')
134-
>>> subscription = pubsub.Subscription('subscription_name', topic,
135-
... ack_deadline=90)
134+
>>> subscription = topic.subscription('subscription_name', ack_deadline=90)
136135
>>> subscription.create() # API request
137136

138137
Create a new push subscription for a topic:
@@ -143,8 +142,8 @@ Create a new push subscription for a topic:
143142
>>> ENDPOINT = 'https://example.com/hook'
144143
>>> client = pubsub.Client()
145144
>>> topic = client.topic('topic_name')
146-
>>> subscription = pubsub.Subscription('subscription_name', topic,
147-
... push_endpoint=ENDPOINT)
145+
>>> subscription = topic.subscription('subscription_name',
146+
... push_endpoint=ENDPOINT)
148147
>>> subscription.create() # API request
149148

150149
Check for the existence of a subscription:
@@ -154,7 +153,7 @@ Check for the existence of a subscription:
154153
>>> from gcloud import pubsub
155154
>>> client = pubsub.Client()
156155
>>> topic = client.topic('topic_name')
157-
>>> subscription = pubsub.Subscription('subscription_name', topic)
156+
>>> subscription = topic.subscription('subscription_name')
158157
>>> subscription.exists() # API request
159158
True
160159

@@ -166,7 +165,7 @@ Convert a pull subscription to push:
166165
>>> ENDPOINT = 'https://example.com/hook'
167166
>>> client = pubsub.Client()
168167
>>> topic = client.topic('topic_name')
169-
>>> subscription = pubsub.Subscription('subscription_name', topic)
168+
>>> subscription = topic.subscription('subscription_name')
170169
>>> subscription.modify_push_configuration(push_endpoint=ENDPOINT) # API request
171170

172171
Convert a push subscription to pull:
@@ -177,8 +176,8 @@ Convert a push subscription to pull:
177176
>>> ENDPOINT = 'https://example.com/hook'
178177
>>> client = pubsub.Client()
179178
>>> topic = client.topic('topic_name')
180-
>>> subscription = pubusb.Subscription('subscription_name', topic,
181-
... push_endpoint=ENDPOINT)
179+
>>> subscription = topic.subscription('subscription_name',
180+
... push_endpoint=ENDPOINT)
182181
>>> subscription.modify_push_configuration(push_endpoint=None) # API request
183182

184183
List subscriptions for a topic:
@@ -209,7 +208,7 @@ Delete a subscription:
209208
>>> from gcloud import pubsub
210209
>>> client = pubsub.Client()
211210
>>> topic = client.topic('topic_name')
212-
>>> subscription = pubsub.Subscription('subscription_name', topic)
211+
>>> subscription = topic.subscription('subscription_name')
213212
>>> subscription.delete() # API request
214213

215214

@@ -223,7 +222,7 @@ Fetch pending messages for a pull subscription:
223222
>>> from gcloud import pubsub
224223
>>> client = pubsub.Client()
225224
>>> topic = client.topic('topic_name')
226-
>>> subscription = pubsub.Subscription('subscription_name', topic)
225+
>>> subscription = topic.subscription('subscription_name')
227226
>>> with topic.batch() as batch:
228227
... batch.publish('this is the first message_payload')
229228
... batch.publish('this is the second message_payload',
@@ -252,7 +251,7 @@ Fetch a limited number of pending messages for a pull subscription:
252251
>>> from gcloud import pubsub
253252
>>> client = pubsub.Client()
254253
>>> topic = client.topic('topic_name')
255-
>>> subscription = pubsub.Subscription('subscription_name', topic)
254+
>>> subscription = topic.subscription('subscription_name')
256255
>>> with topic.batch() as batch:
257256
... batch.publish('this is the first message_payload')
258257
... batch.publish('this is the second message_payload',
@@ -268,7 +267,7 @@ Fetch messages for a pull subscription without blocking (none pending):
268267
>>> from gcloud import pubsub
269268
>>> client = pubsub.Client()
270269
>>> topic = client.topic('topic_name')
271-
>>> subscription = pubsub.Subscription('subscription_name', topic)
270+
>>> subscription = topic.subscription('subscription_name')
272271
>>> received = subscription.pull(max_messages=1) # API request
273272
>>> messages = [recv[1] for recv in received]
274273
>>> [message.id for message in messages]

gcloud/pubsub/subscription.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
from gcloud.exceptions import NotFound
1818
from gcloud.pubsub.message import Message
19-
from gcloud.pubsub.topic import Topic
2019

2120

2221
class Subscription(object):
@@ -63,6 +62,9 @@ def from_api_repr(cls, resource, client, topics=None):
6362
:rtype: :class:`gcloud.pubsub.subscription.Subscription`
6463
:returns: Subscription parsed from ``resource``.
6564
"""
65+
# pylint: disable=cyclic-import
66+
from gcloud.pubsub.topic import Topic
67+
# pylint: enable=cyclic-import
6668
if topics is None:
6769
topics = {}
6870
t_name = resource['topic']

gcloud/pubsub/test_topic.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,20 @@ def test_delete_w_alternate_client(self):
331331
self.assertEqual(req['method'], 'DELETE')
332332
self.assertEqual(req['path'], '/%s' % PATH)
333333

334+
def test_subscription(self):
335+
from gcloud.pubsub.subscription import Subscription
336+
TOPIC_NAME = 'topic_name'
337+
PROJECT = 'PROJECT'
338+
CLIENT = _Client(project=PROJECT)
339+
topic = self._makeOne(TOPIC_NAME,
340+
client=CLIENT)
341+
342+
SUBSCRIPTION_NAME = 'subscription_name'
343+
subscription = topic.subscription(SUBSCRIPTION_NAME)
344+
self.assertTrue(isinstance(subscription, Subscription))
345+
self.assertEqual(subscription.name, SUBSCRIPTION_NAME)
346+
self.assertTrue(subscription.topic is topic)
347+
334348

335349
class TestBatch(unittest2.TestCase):
336350

gcloud/pubsub/topic.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,27 @@ def __init__(self, name, client, timestamp_messages=False):
4848
self._client = client
4949
self.timestamp_messages = timestamp_messages
5050

51+
def subscription(self, name, ack_deadline=None, push_endpoint=None):
52+
"""Creates a subscription bound to the current topic.
53+
54+
:type name: string
55+
:param name: the name of the subscription
56+
57+
:type ack_deadline: int
58+
:param ack_deadline: the deadline (in seconds) by which messages pulled
59+
from the back-end must be acknowledged.
60+
61+
:type push_endpoint: string
62+
:param push_endpoint: URL to which messages will be pushed by the
63+
back-end. If not set, the application must pull
64+
messages.
65+
"""
66+
# pylint: disable=cyclic-import
67+
from gcloud.pubsub.subscription import Subscription
68+
# pylint: enable=cyclic-import
69+
return Subscription(name, self, ack_deadline=ack_deadline,
70+
push_endpoint=push_endpoint)
71+
5172
@classmethod
5273
def from_api_repr(cls, resource, client):
5374
"""Factory: construct a topic given its API representation

regression/pubsub.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
from gcloud import _helpers
2020
from gcloud import pubsub
21-
from gcloud.pubsub.subscription import Subscription
2221

2322

2423
_helpers._PROJECT_ENV_VAR_NAME = 'GCLOUD_TESTS_PROJECT_ID'
@@ -68,7 +67,7 @@ def test_create_subscription(self):
6867
topic.create()
6968
self.to_delete.append(topic)
7069
SUBSCRIPTION_NAME = 'subscribing-now'
71-
subscription = Subscription(SUBSCRIPTION_NAME, topic)
70+
subscription = topic.subscription(SUBSCRIPTION_NAME)
7271
self.assertFalse(subscription.exists())
7372
subscription.create()
7473
self.to_delete.append(subscription)
@@ -88,7 +87,7 @@ def test_list_subscriptions(self):
8887
'newest%d' % (1000 * time.time(),),
8988
]
9089
for subscription_name in subscriptions_to_create:
91-
subscription = Subscription(subscription_name, topic)
90+
subscription = topic.subscription(subscription_name)
9291
subscription.create()
9392
self.to_delete.append(subscription)
9493

@@ -106,7 +105,7 @@ def test_message_pull_mode_e2e(self):
106105
topic.create()
107106
self.to_delete.append(topic)
108107
SUBSCRIPTION_NAME = 'subscribing-now'
109-
subscription = Subscription(SUBSCRIPTION_NAME, topic)
108+
subscription = topic.subscription(SUBSCRIPTION_NAME)
110109
self.assertFalse(subscription.exists())
111110
subscription.create()
112111
self.to_delete.append(subscription)

0 commit comments

Comments
 (0)
0