Skip to content

Commit d5a65d4

Browse files
committed
clean up
1 parent 9a68c48 commit d5a65d4

11 files changed

Lines changed: 93 additions & 140 deletions

File tree

‎packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_shared_macros.j2‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -307,21 +307,17 @@ session_kwargs: Dict[str, Any] = (
307307
if isinstance(timeout, (int, float))
308308
else {}
309309
)
310-
session = {{ client_output_ident }}(
310+
return {{ client_output_ident }}(
311311
upload_url=upload_url,
312312
config=config,
313313
transport=self._session,
314314
response_type={{ method.output.ident }},
315315
start_retry=retry if isinstance(retry, {{ retry_class }}) else None,
316+
{% if body_spec %}
317+
request_body=body,
318+
{% endif %}
316319
**session_kwargs,
317320
)
318-
{% if body_spec %}
319-
session.upload = functools.partial(session.upload, request_body=body or "") # type: ignore[method-assign]
320-
{% if not is_async %}
321-
session.iter_upload = functools.partial(session.iter_upload, request_body=body or "") # type: ignore[method-assign]
322-
{% endif %}
323-
{% endif %}
324-
return session
325321
{%- endmacro %}
326322

327323

‎packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc_asyncio.py.j2‎

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -387,19 +387,6 @@ class {{ service.grpc_asyncio_transport_name }}({{ service.name }}Transport):
387387
return _error()
388388
self._stubs['{{ method.transport_safe_name|snake_case }}'] = _ErrorStub()
389389
elif HAS_ASYNC_REST:
390-
# TODO(https://github.com/googleapis/google-cloud-python/issues/16268):
391-
# Resolve the credential type mismatch between {{ service.grpc_asyncio_transport_name }}
392-
# (where grpc_helpers_async.create_channel and the base transport's
393-
# google.auth.default() path use synchronous google.auth.credentials.Credentials)
394-
# and Async{{ service.name }}RestTransport (where AsyncAuthorizedSession
395-
# requires asynchronous google.auth.aio.credentials.Credentials).
396-
# Defer instantiating Async{{ service.name }}RestTransport until the
397-
# resumable upload RPC is called so that initializing
398-
# {{ service.grpc_asyncio_transport_name }} with synchronous
399-
# google.auth.credentials.Credentials (e.g. via ADC or service
400-
# account helpers) for standard gRPC calls does not fail in
401-
# __init__ (_prep_wrapped_messages) when AsyncAuthorizedSession
402-
# validates for async credentials.
403390
transport = self
404391
class _AsyncRestStub:
405392
def __call__(self, *args, **kwargs):

‎packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/rest.py.j2‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ from google.api_core import rest_helpers
1414
from google.api_core import rest_streaming
1515
from google.api_core import gapic_v1
1616
{% if service.has_resumable_upload_methods %}
17-
import functools
1817
import urllib.parse
1918
from google.api_core import resumable_transfer
2019
{% endif %}

‎packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/rest_asyncio.py.j2‎

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ from google.auth.aio import credentials as ga_credentials_async # type: ignore
2222
from google.api_core import exceptions as core_exceptions
2323
from google.api_core import gapic_v1
2424
{% if service.has_resumable_upload_methods %}
25-
import contextlib
26-
import functools
2725
import urllib.parse
2826
from google.api_core import resumable_transfer
2927
{% endif %}
@@ -93,46 +91,9 @@ DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
9391

9492
{{ shared_macros.create_interceptor_class(api, service, method, is_async=True) }}
9593

96-
{% if service.has_resumable_upload_methods %}
97-
@dataclasses.dataclass
98-
class _AsyncResumableUploadSessionAdapter:
99-
"""Adapts AsyncAuthorizedSession to the aiohttp-like request context manager interface expected by AsyncResumableUploadSession."""
100-
101-
_session: AsyncAuthorizedSession
102-
103-
@contextlib.asynccontextmanager
104-
async def request(
105-
self,
106-
method: str,
107-
url: str,
108-
*,
109-
data: Optional[bytes] = None,
110-
headers: Optional[Dict[str, str]] = None,
111-
timeout: Any = None,
112-
**kwargs,
113-
):
114-
response = await self._session.request(
115-
method,
116-
url,
117-
data=data,
118-
headers=headers,
119-
timeout=getattr(timeout, "total", timeout),
120-
**kwargs,
121-
)
122-
response.status = response.status_code # type: ignore[attr-defined]
123-
try:
124-
yield response
125-
finally:
126-
await response.close()
127-
{% endif %}
128-
12994
@dataclasses.dataclass
13095
class Async{{service.name}}RestStub:
131-
{% if service.has_resumable_upload_methods %}
132-
_session: Union[AsyncAuthorizedSession, _AsyncResumableUploadSessionAdapter]
133-
{% else %}
13496
_session: AsyncAuthorizedSession
135-
{% endif %}
13697
_host: str
13798
_interceptor: Async{{service.name}}RestInterceptor
13899

@@ -380,8 +341,12 @@ class Async{{service.name}}RestTransport(_Base{{ service.name }}RestTransport):
380341
@property
381342
def {{method.transport_safe_name|snake_case}}(self) -> Callable[
382343
[{{method.input.ident}}],
383-
{% if method.is_resumable_upload %}{{method.client_output_async.ident}}{% else %}{{method.output.ident}}{% endif %}]:
384-
return self._{{method.name}}({% if method.is_resumable_upload %}_AsyncResumableUploadSessionAdapter(self._session){% else %}self._session{% endif %}, self._host, self._interceptor) # type: ignore
344+
{% if method.is_resumable_upload %}
345+
{{method.client_output_async.ident}}]:
346+
{% else %}
347+
{{method.output.ident}}]:
348+
{% endif %}
349+
return self._{{method.name}}(self._session, self._host, self._interceptor) # type: ignore
385350

386351
{% endfor %}
387352
{% if rest_async_io_enabled %}

‎packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2‎

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,7 +1587,7 @@ async def test_{{ service.name|snake_case }}_{{ method.name|snake_case }}_grpc_a
15871587
mock_rest_transport_cls.return_value = mock_rest_transport
15881588

15891589
transport = transports.{{ service.name }}GrpcAsyncIOTransport(
1590-
credentials=async_anonymous_credentials(),
1590+
credentials=ga_credentials.AnonymousCredentials(),
15911591
)
15921592
mock_rest_transport_cls.assert_not_called()
15931593

@@ -1607,11 +1607,40 @@ async def test_{{ service.name|snake_case }}_{{ method.name|snake_case }}_grpc_a
16071607
mock_rest_transport.close.assert_called_once()
16081608

16091609

1610+
{% if rest_async_io_enabled %}
1611+
@pytest.mark.asyncio
1612+
async def test_{{ service.name|snake_case }}_{{ method.name|snake_case }}_grpc_asyncio_rest_stub_sync_credentials():
1613+
if not HAS_ASYNC_REST_EXTRA:
1614+
pytest.skip()
1615+
transport = transports.{{ service.name }}GrpcAsyncIOTransport(
1616+
credentials=ga_credentials.AnonymousCredentials(),
1617+
)
1618+
assert transport._rest_transport is None
1619+
stub = transport.{{ method.transport_safe_name|snake_case }}
1620+
assert transport._rest_transport is None
1621+
1622+
result1 = await stub({{ method.input.ident }}())
1623+
rest_transport = transport._rest_transport
1624+
assert rest_transport is not None
1625+
assert isinstance(result1, {{ method.client_output_async.ident }})
1626+
1627+
result2 = await stub({{ method.input.ident }}())
1628+
assert isinstance(result2, {{ method.client_output_async.ident }})
1629+
assert transport._rest_transport is rest_transport
1630+
1631+
with mock.patch.object(
1632+
rest_transport, "close", wraps=rest_transport.close
1633+
) as mock_rest_close:
1634+
await transport.close()
1635+
mock_rest_close.assert_called_once()
1636+
{% endif %}
1637+
1638+
16101639
@pytest.mark.asyncio
16111640
async def test_{{ service.name|snake_case }}_{{ method.name|snake_case }}_grpc_asyncio_without_async_rest_error():
16121641
with mock.patch.object(transports.grpc_asyncio, "HAS_ASYNC_REST", False):
16131642
transport = transports.{{ service.name }}GrpcAsyncIOTransport(
1614-
credentials=async_anonymous_credentials(),
1643+
credentials=ga_credentials.AnonymousCredentials(),
16151644
)
16161645
with pytest.raises(NotImplementedError) as exc_info:
16171646
await transport.{{ method.transport_safe_name|snake_case }}({{ method.input.ident }}())

‎packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/rest_asyncio.py‎

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2426,67 +2426,67 @@ def operations_client(self) -> AsyncOperationsRestClient:
24262426
@property
24272427
def create_instance(self) -> Callable[
24282428
[cloud_redis.CreateInstanceRequest],
2429-
operations_pb2.Operation]:
2429+
operations_pb2.Operation]:
24302430
return self._CreateInstance(self._session, self._host, self._interceptor) # type: ignore
24312431

24322432
@property
24332433
def delete_instance(self) -> Callable[
24342434
[cloud_redis.DeleteInstanceRequest],
2435-
operations_pb2.Operation]:
2435+
operations_pb2.Operation]:
24362436
return self._DeleteInstance(self._session, self._host, self._interceptor) # type: ignore
24372437

24382438
@property
24392439
def export_instance(self) -> Callable[
24402440
[cloud_redis.ExportInstanceRequest],
2441-
operations_pb2.Operation]:
2441+
operations_pb2.Operation]:
24422442
return self._ExportInstance(self._session, self._host, self._interceptor) # type: ignore
24432443

24442444
@property
24452445
def failover_instance(self) -> Callable[
24462446
[cloud_redis.FailoverInstanceRequest],
2447-
operations_pb2.Operation]:
2447+
operations_pb2.Operation]:
24482448
return self._FailoverInstance(self._session, self._host, self._interceptor) # type: ignore
24492449

24502450
@property
24512451
def get_instance(self) -> Callable[
24522452
[cloud_redis.GetInstanceRequest],
2453-
cloud_redis.Instance]:
2453+
cloud_redis.Instance]:
24542454
return self._GetInstance(self._session, self._host, self._interceptor) # type: ignore
24552455

24562456
@property
24572457
def get_instance_auth_string(self) -> Callable[
24582458
[cloud_redis.GetInstanceAuthStringRequest],
2459-
cloud_redis.InstanceAuthString]:
2459+
cloud_redis.InstanceAuthString]:
24602460
return self._GetInstanceAuthString(self._session, self._host, self._interceptor) # type: ignore
24612461

24622462
@property
24632463
def import_instance(self) -> Callable[
24642464
[cloud_redis.ImportInstanceRequest],
2465-
operations_pb2.Operation]:
2465+
operations_pb2.Operation]:
24662466
return self._ImportInstance(self._session, self._host, self._interceptor) # type: ignore
24672467

24682468
@property
24692469
def list_instances(self) -> Callable[
24702470
[cloud_redis.ListInstancesRequest],
2471-
cloud_redis.ListInstancesResponse]:
2471+
cloud_redis.ListInstancesResponse]:
24722472
return self._ListInstances(self._session, self._host, self._interceptor) # type: ignore
24732473

24742474
@property
24752475
def reschedule_maintenance(self) -> Callable[
24762476
[cloud_redis.RescheduleMaintenanceRequest],
2477-
operations_pb2.Operation]:
2477+
operations_pb2.Operation]:
24782478
return self._RescheduleMaintenance(self._session, self._host, self._interceptor) # type: ignore
24792479

24802480
@property
24812481
def update_instance(self) -> Callable[
24822482
[cloud_redis.UpdateInstanceRequest],
2483-
operations_pb2.Operation]:
2483+
operations_pb2.Operation]:
24842484
return self._UpdateInstance(self._session, self._host, self._interceptor) # type: ignore
24852485

24862486
@property
24872487
def upgrade_instance(self) -> Callable[
24882488
[cloud_redis.UpgradeInstanceRequest],
2489-
operations_pb2.Operation]:
2489+
operations_pb2.Operation]:
24902490
return self._UpgradeInstance(self._session, self._host, self._interceptor) # type: ignore
24912491

24922492
@property

‎packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/rest_asyncio.py‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,31 +1338,31 @@ def operations_client(self) -> AsyncOperationsRestClient:
13381338
@property
13391339
def create_instance(self) -> Callable[
13401340
[cloud_redis.CreateInstanceRequest],
1341-
operations_pb2.Operation]:
1341+
operations_pb2.Operation]:
13421342
return self._CreateInstance(self._session, self._host, self._interceptor) # type: ignore
13431343

13441344
@property
13451345
def delete_instance(self) -> Callable[
13461346
[cloud_redis.DeleteInstanceRequest],
1347-
operations_pb2.Operation]:
1347+
operations_pb2.Operation]:
13481348
return self._DeleteInstance(self._session, self._host, self._interceptor) # type: ignore
13491349

13501350
@property
13511351
def get_instance(self) -> Callable[
13521352
[cloud_redis.GetInstanceRequest],
1353-
cloud_redis.Instance]:
1353+
cloud_redis.Instance]:
13541354
return self._GetInstance(self._session, self._host, self._interceptor) # type: ignore
13551355

13561356
@property
13571357
def list_instances(self) -> Callable[
13581358
[cloud_redis.ListInstancesRequest],
1359-
cloud_redis.ListInstancesResponse]:
1359+
cloud_redis.ListInstancesResponse]:
13601360
return self._ListInstances(self._session, self._host, self._interceptor) # type: ignore
13611361

13621362
@property
13631363
def update_instance(self) -> Callable[
13641364
[cloud_redis.UpdateInstanceRequest],
1365-
operations_pb2.Operation]:
1365+
operations_pb2.Operation]:
13661366
return self._UpdateInstance(self._session, self._host, self._interceptor) # type: ignore
13671367

13681368
@property

‎packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc_asyncio.py‎

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -365,19 +365,6 @@ async def _error():
365365
return _error()
366366
self._stubs['upload_media'] = _ErrorStub()
367367
elif HAS_ASYNC_REST:
368-
# TODO(https://github.com/googleapis/google-cloud-python/issues/16268):
369-
# Resolve the credential type mismatch between ResumableUploadServiceGrpcAsyncIOTransport
370-
# (where grpc_helpers_async.create_channel and the base transport's
371-
# google.auth.default() path use synchronous google.auth.credentials.Credentials)
372-
# and AsyncResumableUploadServiceRestTransport (where AsyncAuthorizedSession
373-
# requires asynchronous google.auth.aio.credentials.Credentials).
374-
# Defer instantiating AsyncResumableUploadServiceRestTransport until the
375-
# resumable upload RPC is called so that initializing
376-
# ResumableUploadServiceGrpcAsyncIOTransport with synchronous
377-
# google.auth.credentials.Credentials (e.g. via ADC or service
378-
# account helpers) for standard gRPC calls does not fail in
379-
# __init__ (_prep_wrapped_messages) when AsyncAuthorizedSession
380-
# validates for async credentials.
381368
transport = self
382369
class _AsyncRestStub:
383370
def __call__(self, *args, **kwargs):

‎packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/rest.py‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from google.api_core import rest_helpers
2424
from google.api_core import rest_streaming
2525
from google.api_core import gapic_v1
26-
import functools
2726
import urllib.parse
2827
from google.api_core import resumable_transfer
2928
from google.showcase_v1beta1._compat import transcode_request
@@ -443,17 +442,15 @@ def __call__(self,
443442
if isinstance(timeout, (int, float))
444443
else {}
445444
)
446-
session = resumable_transfer.ResumableUploadSession(
445+
return resumable_transfer.ResumableUploadSession(
447446
upload_url=upload_url,
448447
config=config,
449448
transport=self._session,
450449
response_type=resumable_upload.UploadMediaResponse,
451450
start_retry=retry if isinstance(retry, retries.Retry) else None,
451+
request_body=body,
452452
**session_kwargs,
453453
)
454-
session.upload = functools.partial(session.upload, request_body=body or "") # type: ignore[method-assign]
455-
session.iter_upload = functools.partial(session.iter_upload, request_body=body or "") # type: ignore[method-assign]
456-
return session
457454

458455
@property
459456
def upload_media(self) -> Callable[

0 commit comments

Comments
 (0)