Skip to content

Commit b7eaf23

Browse files
committed
Merge pull request #910 from dhermes/pubsub-client-approach
Attempt at implementing clients for Pub/Sub
2 parents d8f5ce4 + c206638 commit b7eaf23

File tree

16 files changed

+1111
-1098
lines changed

16 files changed

+1111
-1098
lines changed

docs/pubsub-api.rst

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,18 @@
55
Pub/Sub
66
-------
77

8-
:mod:`gcloud.pubsub`
9-
~~~~~~~~~~~~~~~~~~~~~~~
10-
11-
.. automodule:: gcloud.pubsub
12-
:members: get_connection, get_default_connection,
13-
set_default_connection, set_defaults
14-
15-
Connections
8+
Client
169
~~~~~~~~~~~
1710

18-
.. automodule:: gcloud.pubsub.connection
11+
.. automodule:: gcloud.pubsub.client
1912
:members:
2013
:undoc-members:
2114
:show-inheritance:
2215

23-
Interacting with the API
24-
~~~~~~~~~~~~~~~~~~~~~~~~
16+
Connections
17+
~~~~~~~~~~~
2518

26-
.. automodule:: gcloud.pubsub.api
19+
.. automodule:: gcloud.pubsub.connection
2720
:members:
2821
:undoc-members:
2922
:show-inheritance:

docs/pubsub-usage.rst

Lines changed: 96 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,28 @@
11
Using the API
22
=============
33

4-
Connection / Authorization
5-
--------------------------
4+
Authorization / Configuration
5+
-----------------------------
66

7-
- Inferred defaults used to create connection if none configured explicitly:
7+
- Use :class:`Client <gcloud.pubsub.client.Client>` objects to configure
8+
your applications.
89

9-
- credentials (derived from GAE / GCE environ if present).
10+
- :class:`Client <gcloud.pubsub.client.Client>` objects hold both a ``project``
11+
and an authenticated connection to the PubSub service.
1012

11-
- ``project`` (derived from GAE / GCE environ if present).
13+
- The authentication credentials can be implicitly determined from the
14+
environment or directly via
15+
:meth:`from_service_account_json <gcloud.pubsub.client.Client.from_service_account_json>`
16+
and
17+
:meth:`from_service_account_p12 <gcloud.pubsub.client.Client.from_service_account_p12>`.
1218

13-
- ``scopes``
19+
- After setting ``GOOGLE_APPLICATION_CREDENTIALS`` and ``GCLOUD_PROJECT``
20+
environment variables, create a :class:`Client <gcloud.pubsub.client.Client>`
21+
22+
.. doctest::
23+
24+
>>> from gcloud import pubsub
25+
>>> client = pubsub.Client()
1426

1527

1628
Manage topics for a project
@@ -20,51 +32,38 @@ Create a new topic for the default project:
2032

2133
.. doctest::
2234

23-
>>> from gcloud.pubsub import Topic
24-
>>> topic = Topic('topic_name')
25-
>>> topic.create() # API request
26-
27-
Create a new topic for an explicit project:
28-
29-
.. doctest::
30-
31-
>>> from gcloud.pubsub import Topic
32-
>>> topic = Topic('topic_name', project='my.project')
35+
>>> from gcloud import pubsub
36+
>>> client = pubsub.Client()
37+
>>> topic = client.topic('topic_name')
3338
>>> topic.create() # API request
3439

35-
Check for the existance of a topic:
40+
Check for the existence of a topic:
3641

3742
.. doctest::
3843

39-
>>> from gcloud.pubsub import Topic
40-
>>> topic = Topic('topic_name')
44+
>>> from gcloud import pubsub
45+
>>> client = pubsub.Client()
46+
>>> topic = client.topic('topic_name')
4147
>>> topic.exists() # API request
4248
True
4349

4450
List topics for the default project:
4551

4652
.. doctest::
4753

48-
>>> from gcloud.pubsub import list_topics
49-
>>> topics, next_page_token = list_topics() # API request
50-
>>> [topic.name for topic in topics]
51-
['topic_name']
52-
53-
List topics for an explicit project:
54-
55-
.. doctest::
56-
57-
>>> from gcloud.pubsub import list_topics
58-
>>> topics, next_page_token = list_topics(project='my.project') # API request
54+
>>> from gcloud import pubsub
55+
>>> client = pubsub.Client()
56+
>>> topics, next_page_token = client.list_topics() # API request
5957
>>> [topic.name for topic in topics]
6058
['topic_name']
6159

6260
Delete a topic:
6361

6462
.. doctest::
6563

66-
>>> from gcloud.pubsub import Topic
67-
>>> topic = Topic('topic_name')
64+
>>> from gcloud import pubsub
65+
>>> client = pubsub.Client()
66+
>>> topic = client.topic('topic_name')
6867
>>> topic.delete() # API request
6968

7069

@@ -75,17 +74,19 @@ Publish a single message to a topic, without attributes:
7574

7675
.. doctest::
7776

78-
>>> from gcloud.pubsub import Topic
79-
>>> topic = Topic('topic_name')
77+
>>> from gcloud import pubsub
78+
>>> client = pubsub.Client()
79+
>>> topic = client.topic('topic_name')
8080
>>> topic.publish('this is the message_payload') # API request
8181
<message_id>
8282

8383
Publish a single message to a topic, with attributes:
8484

8585
.. doctest::
8686

87-
>>> from gcloud.pubsub import Topic
88-
>>> topic = Topic('topic_name')
87+
>>> from gcloud import pubsub
88+
>>> client = pubsub.Client()
89+
>>> topic = client.topic('topic_name')
8990
>>> topic.publish('this is another message_payload',
9091
... attr1='value1', attr2='value2') # API request
9192
<message_id>
@@ -94,8 +95,9 @@ Publish a set of messages to a topic (as a single request):
9495

9596
.. doctest::
9697

97-
>>> from gcloud.pubsub import Topic
98-
>>> topic = Topic('topic_name')
98+
>>> from gcloud import pubsub
99+
>>> client = pubsub.Client()
100+
>>> topic = client.topic('topic_name')
99101
>>> with topic.batch() as batch:
100102
... batch.publish('this is the first message_payload')
101103
... batch.publish('this is the second message_payload',
@@ -116,93 +118,98 @@ Create a new pull subscription for a topic:
116118

117119
.. doctest::
118120

119-
>>> from gcloud.pubsub import Topic
120-
>>> from gcloud.pubsub import Subscription
121-
>>> topic = Topic('topic_name')
122-
>>> subscription = Subscription('subscription_name', topic)
121+
>>> from gcloud import pubsub
122+
>>> client = pubsub.Client()
123+
>>> topic = client.topic('topic_name')
124+
>>> subscription = pubsub.Subscription('subscription_name', topic)
123125
>>> subscription.create() # API request
124126

125127
Create a new pull subscription for a topic with a non-default ACK deadline:
126128

127129
.. doctest::
128130

129-
>>> from gcloud.pubsub import Topic
130-
>>> from gcloud.pubsub import Subscription
131-
>>> topic = Topic('topic_name')
132-
>>> subscription = Subscription('subscription_name', ack_deadline=90)
131+
>>> from gcloud import pubsub
132+
>>> client = pubsub.Client()
133+
>>> topic = client.topic('topic_name')
134+
>>> subscription = pubsub.Subscription('subscription_name', topic,
135+
... ack_deadline=90)
133136
>>> subscription.create() # API request
134137

135138
Create a new push subscription for a topic:
136139

137140
.. doctest::
138141

142+
>>> from gcloud import pubsub
139143
>>> ENDPOINT = 'https://example.com/hook'
140-
>>> from gcloud.pubsub import Topic
141-
>>> from gcloud.pubsub import Subscription
142-
>>> topic = Topic('topic_name')
143-
>>> subscription = Subscription('subscription_name', push_endpoint=ENDPOINT)
144+
>>> client = pubsub.Client()
145+
>>> topic = client.topic('topic_name')
146+
>>> subscription = pubsub.Subscription('subscription_name', topic,
147+
... push_endpoint=ENDPOINT)
144148
>>> subscription.create() # API request
145149

146150
Check for the existence of a subscription:
147151

148152
.. doctest::
149153

150-
>>> from gcloud.pubsub import Topic
151-
>>> from gcloud.pubsub import Subscription
152-
>>> topic = Topic('topic_name')
153-
>>> subscription = Subscription('subscription_name', topic)
154+
>>> from gcloud import pubsub
155+
>>> client = pubsub.Client()
156+
>>> topic = client.topic('topic_name')
157+
>>> subscription = pubsub.Subscription('subscription_name', topic)
154158
>>> subscription.exists() # API request
155159
True
156160

157161
Convert a pull subscription to push:
158162

159163
.. doctest::
160164

165+
>>> from gcloud import pubsub
161166
>>> ENDPOINT = 'https://example.com/hook'
162-
>>> from gcloud.pubsub import Topic
163-
>>> from gcloud.pubsub import Subscription
164-
>>> topic = Topic('topic_name')
165-
>>> subscription = Subscription('subscription_name', topic)
167+
>>> client = pubsub.Client()
168+
>>> topic = client.topic('topic_name')
169+
>>> subscription = pubsub.Subscription('subscription_name', topic)
166170
>>> subscription.modify_push_configuration(push_endpoint=ENDPOINT) # API request
167171

168172
Convert a push subscription to pull:
169173

170174
.. doctest::
171175

176+
>>> from gcloud import pubsub
172177
>>> ENDPOINT = 'https://example.com/hook'
173-
>>> from gcloud.pubsub import Topic
174-
>>> topic = Topic('topic_name')
175-
>>> subscription = Subscription('subscription_name', topic,
176-
... push_endpoint=ENDPOINT)
178+
>>> client = pubsub.Client()
179+
>>> topic = client.topic('topic_name')
180+
>>> subscription = pubusb.Subscription('subscription_name', topic,
181+
... push_endpoint=ENDPOINT)
177182
>>> subscription.modify_push_configuration(push_endpoint=None) # API request
178183

179184
List subscriptions for a topic:
180185

181186
.. doctest::
182187

183-
>>> from gcloud.pubsub import Topic
184-
>>> topic = Topic('topic_name')
185-
>>> subscriptions, next_page_token = topic.list_subscriptions() # API request
188+
>>> from gcloud import pubsub
189+
>>> client = pubsub.Client()
190+
>>> subscriptions, next_page_token = client.list_subscriptions(
191+
... topic_name='topic_name') # API request
186192
>>> [subscription.name for subscription in subscriptions]
187193
['subscription_name']
188194

189195
List all subscriptions for the default project:
190196

191197
.. doctest::
192198

193-
>>> from gcloud.pubsub import list_subscriptions
194-
>>> subscription, next_page_tokens = list_subscriptions() # API request
199+
>>> from gcloud import pubsub
200+
>>> client = pubsub.Client()
201+
>>> subscription, next_page_tokens = client.list_subscriptions() # API request
195202
>>> [subscription.name for subscription in subscriptions]
196203
['subscription_name']
197204

198205
Delete a subscription:
199206

200207
.. doctest::
201208

202-
>>> from gcloud.pubsub import Topic
203-
>>> from gcloud.pubsub import Subscription
204-
>>> topic = Topic('topic_name')
205-
>>> subscription = Subscription('subscription_name', topic)
209+
>>> from gcloud import pubsub
210+
>>> client = pubsub.Client()
211+
>>> topic = client.topic('topic_name')
212+
>>> subscription = pubsub.Subscription('subscription_name', topic)
206213
>>> subscription.delete() # API request
207214

208215

@@ -213,13 +220,13 @@ Fetch pending messages for a pull subscription:
213220

214221
.. doctest::
215222

216-
>>> from gcloud.pubsub import Topic
217-
>>> from gcloud.pubsub import Subscription
218-
>>> topic = Topic('topic_name')
219-
>>> subscription = Subscription('subscription_name', topic)
220-
>>> with topic:
221-
... topic.publish('this is the first message_payload')
222-
... topic.publish('this is the second message_payload',
223+
>>> from gcloud import pubsub
224+
>>> client = pubsub.Client()
225+
>>> topic = client.topic('topic_name')
226+
>>> subscription = pubsub.Subscription('subscription_name', topic)
227+
>>> with topic.batch() as batch:
228+
... batch.publish('this is the first message_payload')
229+
... batch.publish('this is the second message_payload',
223230
... attr1='value1', attr2='value2')
224231
>>> received = subscription.pull() # API request
225232
>>> messages = [recv[1] for recv in received]
@@ -242,13 +249,13 @@ Fetch a limited number of pending messages for a pull subscription:
242249

243250
.. doctest::
244251

245-
>>> from gcloud.pubsub import Topic
246-
>>> from gcloud.pubsub import Subscription
247-
>>> topic = Topic('topic_name')
248-
>>> subscription = Subscription('subscription_name', topic)
249-
>>> with topic:
250-
... topic.publish('this is the first message_payload')
251-
... topic.publish('this is the second message_payload',
252+
>>> from gcloud import pubsub
253+
>>> client = pubsub.Client()
254+
>>> topic = client.topic('topic_name')
255+
>>> subscription = pubsub.Subscription('subscription_name', topic)
256+
>>> with topic.batch() as batch:
257+
... batch.publish('this is the first message_payload')
258+
... batch.publish('this is the second message_payload',
252259
... attr1='value1', attr2='value2')
253260
>>> received = subscription.pull(max_messages=1) # API request
254261
>>> messages = [recv[1] for recv in received]
@@ -258,10 +265,10 @@ Fetch messages for a pull subscription without blocking (none pending):
258265

259266
.. doctest::
260267

261-
>>> from gcloud.pubsub import Topic
262-
>>> from gcloud.pubsub import Subscription
263-
>>> topic = Topic('topic_name')
264-
>>> subscription = Subscription('subscription_name', topic)
268+
>>> from gcloud import pubsub
269+
>>> client = pubsub.Client()
270+
>>> topic = client.topic('topic_name')
271+
>>> subscription = pubsub.Subscription('subscription_name', topic)
265272
>>> received = subscription.pull(max_messages=1) # API request
266273
>>> messages = [recv[1] for recv in received]
267274
>>> [message.id for message in messages]

0 commit comments

Comments
 (0)