Skip to content

Commit 1ab2169

Browse files
authored
Merge pull request #1816 from tseaver/pubsub-optional_grpc_publisher_api_impl
Select API helper based on presence of grpcio + optional environment marker
2 parents 6fa89d8 + 82c1ec5 commit 1ab2169

File tree

2 files changed

+106
-8
lines changed

2 files changed

+106
-8
lines changed

gcloud/pubsub/client.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,33 @@
1414

1515
"""Client for interacting with the Google Cloud Pub/Sub API."""
1616

17+
import os
1718

1819
from gcloud.client import JSONClient
1920
from gcloud.pubsub.connection import Connection
20-
from gcloud.pubsub.connection import _PublisherAPI
21-
from gcloud.pubsub.connection import _SubscriberAPI
21+
from gcloud.pubsub.connection import _PublisherAPI as JSONPublisherAPI
22+
from gcloud.pubsub.connection import _SubscriberAPI as JSONSubscriberAPI
2223
from gcloud.pubsub.connection import _IAMPolicyAPI
2324
from gcloud.pubsub.subscription import Subscription
2425
from gcloud.pubsub.topic import Topic
2526

27+
try:
28+
from google.pubsub.v1.publisher_api import (
29+
PublisherApi as GeneratedPublisherAPI)
30+
from google.pubsub.v1.subscriber_api import (
31+
SubscriberApi as GeneratedSubscriberAPI)
32+
from gcloud.pubsub._gax import _PublisherAPI as GAXPublisherAPI
33+
from gcloud.pubsub._gax import _SubscriberAPI as GAXSubscriberAPI
34+
except ImportError: # pragma: NO COVER
35+
_HAVE_GAX = False
36+
GeneratedPublisherAPI = GAXPublisherAPI = None
37+
GeneratedSubscriberAPI = GAXSubscriberAPI = None
38+
else:
39+
_HAVE_GAX = True
40+
41+
42+
_USE_GAX = _HAVE_GAX and os.environ.get('GCLOUD_DISABLE_GAX') is None
43+
2644

2745
class Client(JSONClient):
2846
"""Client to bundle configuration needed for API requests.
@@ -52,14 +70,22 @@ class Client(JSONClient):
5270
def publisher_api(self):
5371
"""Helper for publisher-related API calls."""
5472
if self._publisher_api is None:
55-
self._publisher_api = _PublisherAPI(self.connection)
73+
if _USE_GAX:
74+
generated = GeneratedPublisherAPI()
75+
self._publisher_api = GAXPublisherAPI(generated)
76+
else:
77+
self._publisher_api = JSONPublisherAPI(self.connection)
5678
return self._publisher_api
5779

5880
@property
5981
def subscriber_api(self):
6082
"""Helper for subscriber-related API calls."""
6183
if self._subscriber_api is None:
62-
self._subscriber_api = _SubscriberAPI(self.connection)
84+
if _USE_GAX:
85+
generated = GeneratedSubscriberAPI()
86+
self._subscriber_api = GAXSubscriberAPI(generated)
87+
else:
88+
self._subscriber_api = JSONSubscriberAPI(self.connection)
6389
return self._subscriber_api
6490

6591
@property

gcloud/pubsub/test_client.py

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,30 +29,102 @@ def _getTargetClass(self):
2929
def _makeOne(self, *args, **kw):
3030
return self._getTargetClass()(*args, **kw)
3131

32-
def test_publisher_api(self):
32+
def test_publisher_api_wo_gax(self):
3333
from gcloud.pubsub.connection import _PublisherAPI
34+
from gcloud.pubsub import client as MUT
35+
from gcloud._testing import _Monkey
3436
creds = _Credentials()
3537
client = self._makeOne(project=self.PROJECT, credentials=creds)
3638
conn = client.connection = object()
37-
api = client.publisher_api
39+
40+
with _Monkey(MUT, _USE_GAX=False):
41+
api = client.publisher_api
42+
3843
self.assertIsInstance(api, _PublisherAPI)
3944
self.assertTrue(api._connection is conn)
4045
# API instance is cached
4146
again = client.publisher_api
4247
self.assertTrue(again is api)
4348

44-
def test_subscriber_api(self):
49+
def test_publisher_api_w_gax(self):
50+
from gcloud.pubsub import client as MUT
51+
from gcloud._testing import _Monkey
52+
53+
wrapped = object()
54+
_called_with = []
55+
56+
def _generated_api(*args, **kw):
57+
_called_with.append((args, kw))
58+
return wrapped
59+
60+
class _GaxPublisherAPI(object):
61+
62+
def __init__(self, _wrapped):
63+
self._wrapped = _wrapped
64+
65+
creds = _Credentials()
66+
client = self._makeOne(project=self.PROJECT, credentials=creds)
67+
68+
with _Monkey(MUT,
69+
_USE_GAX=True,
70+
GeneratedPublisherAPI=_generated_api,
71+
GAXPublisherAPI=_GaxPublisherAPI):
72+
api = client.publisher_api
73+
74+
self.assertIsInstance(api, _GaxPublisherAPI)
75+
self.assertTrue(api._wrapped is wrapped)
76+
# API instance is cached
77+
again = client.publisher_api
78+
self.assertTrue(again is api)
79+
80+
def test_subscriber_api_wo_gax(self):
4581
from gcloud.pubsub.connection import _SubscriberAPI
82+
from gcloud.pubsub import client as MUT
83+
from gcloud._testing import _Monkey
4684
creds = _Credentials()
4785
client = self._makeOne(project=self.PROJECT, credentials=creds)
4886
conn = client.connection = object()
49-
api = client.subscriber_api
87+
88+
with _Monkey(MUT, _USE_GAX=False):
89+
api = client.subscriber_api
90+
5091
self.assertIsInstance(api, _SubscriberAPI)
5192
self.assertTrue(api._connection is conn)
5293
# API instance is cached
5394
again = client.subscriber_api
5495
self.assertTrue(again is api)
5596

97+
def test_subscriber_api_w_gax(self):
98+
from gcloud.pubsub import client as MUT
99+
from gcloud._testing import _Monkey
100+
101+
wrapped = object()
102+
_called_with = []
103+
104+
def _generated_api(*args, **kw):
105+
_called_with.append((args, kw))
106+
return wrapped
107+
108+
class _GaxSubscriberAPI(object):
109+
110+
def __init__(self, _wrapped):
111+
self._wrapped = _wrapped
112+
113+
creds = _Credentials()
114+
client = self._makeOne(project=self.PROJECT, credentials=creds)
115+
116+
with _Monkey(MUT,
117+
_USE_GAX=True,
118+
GeneratedSubscriberAPI=_generated_api,
119+
GAXSubscriberAPI=_GaxSubscriberAPI):
120+
api = client.subscriber_api
121+
122+
self.assertIsInstance(api, _GaxSubscriberAPI)
123+
self.assertTrue(api._wrapped is wrapped)
124+
# API instance is cached
125+
again = client.subscriber_api
126+
self.assertTrue(again is api)
127+
56128
def test_iam_policy_api(self):
57129
from gcloud.pubsub.connection import _IAMPolicyAPI
58130
creds = _Credentials()

0 commit comments

Comments
 (0)