Skip to content

Commit f3a3030

Browse files
feat: add context manager support in client (#126)
- [ ] Regenerate this pull request now. chore: fix docstring for first attribute of protos committer: @busunkim96 PiperOrigin-RevId: 401271153 Source-Link: googleapis/googleapis@787f8c9 Source-Link: googleapis/googleapis-gen@81decff Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiODFkZWNmZmU5ZmM3MjM5NmE4MTUzZTc1NmQxZDY3YTZlZWNmZDYyMCJ9
1 parent ebcb056 commit f3a3030

File tree

7 files changed

+98
-4
lines changed

7 files changed

+98
-4
lines changed

packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/async_client.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,12 @@ async def delete_access_approval_settings(
725725
request, retry=retry, timeout=timeout, metadata=metadata,
726726
)
727727

728+
async def __aenter__(self):
729+
return self
730+
731+
async def __aexit__(self, exc_type, exc, tb):
732+
await self.transport.close()
733+
728734

729735
try:
730736
DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(

packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/client.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,7 @@ def __init__(
365365
client_cert_source_for_mtls=client_cert_source_func,
366366
quota_project_id=client_options.quota_project_id,
367367
client_info=client_info,
368-
always_use_jwt_access=(
369-
Transport == type(self).get_transport_class("grpc")
370-
or Transport == type(self).get_transport_class("grpc_asyncio")
371-
),
368+
always_use_jwt_access=True,
372369
)
373370

374371
def list_approval_requests(
@@ -881,6 +878,19 @@ def delete_access_approval_settings(
881878
request, retry=retry, timeout=timeout, metadata=metadata,
882879
)
883880

881+
def __enter__(self):
882+
return self
883+
884+
def __exit__(self, type, value, traceback):
885+
"""Releases underlying transport's resources.
886+
887+
.. warning::
888+
ONLY use as a context manager if the transport is NOT shared
889+
with other clients! Exiting the with block will CLOSE the transport
890+
and may cause errors in other clients!
891+
"""
892+
self.transport.close()
893+
884894

885895
try:
886896
DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(

packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/transports/base.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,15 @@ def _prep_wrapped_messages(self, client_info):
219219
),
220220
}
221221

222+
def close(self):
223+
"""Closes resources associated with the transport.
224+
225+
.. warning::
226+
Only call this method if the transport is NOT shared
227+
with other clients - this may cause errors in other clients!
228+
"""
229+
raise NotImplementedError()
230+
222231
@property
223232
def list_approval_requests(
224233
self,

packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/transports/grpc.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,5 +492,8 @@ def delete_access_approval_settings(
492492
)
493493
return self._stubs["delete_access_approval_settings"]
494494

495+
def close(self):
496+
self.grpc_channel.close()
497+
495498

496499
__all__ = ("AccessApprovalGrpcTransport",)

packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/transports/grpc_asyncio.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,5 +498,8 @@ def delete_access_approval_settings(
498498
)
499499
return self._stubs["delete_access_approval_settings"]
500500

501+
def close(self):
502+
return self.grpc_channel.close()
503+
501504

502505
__all__ = ("AccessApprovalGrpcAsyncIOTransport",)

packages/google-cloud-access-approval/google/cloud/accessapproval_v1/types/accessapproval.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class EnrollmentLevel(proto.Enum):
5353

5454
class AccessLocations(proto.Message):
5555
r"""Home office and physical location of the principal.
56+
5657
Attributes:
5758
principal_office_country (str):
5859
The "home office" location of the principal.
@@ -96,6 +97,7 @@ class AccessLocations(proto.Message):
9697

9798
class AccessReason(proto.Message):
9899
r"""
100+
99101
Attributes:
100102
type_ (google.cloud.accessapproval_v1.types.AccessReason.Type):
101103
Type of access justification.
@@ -134,6 +136,7 @@ class ApproveDecision(proto.Message):
134136

135137
class DismissDecision(proto.Message):
136138
r"""A decision that has been made to dismiss an approval request.
139+
137140
Attributes:
138141
dismiss_time (google.protobuf.timestamp_pb2.Timestamp):
139142
The time at which the approval request was
@@ -147,6 +150,7 @@ class DismissDecision(proto.Message):
147150

148151
class ResourceProperties(proto.Message):
149152
r"""The properties associated with the resource of the request.
153+
150154
Attributes:
151155
excludes_descendants (bool):
152156
Whether an approval will exclude the
@@ -158,6 +162,7 @@ class ResourceProperties(proto.Message):
158162

159163
class ApprovalRequest(proto.Message):
160164
r"""A request for the customer to approve access to a resource.
165+
161166
Attributes:
162167
name (str):
163168
The resource name of the request. Format is
@@ -296,6 +301,7 @@ class AccessApprovalSettings(proto.Message):
296301

297302
class ListApprovalRequestsMessage(proto.Message):
298303
r"""Request to list approval requests.
304+
299305
Attributes:
300306
parent (str):
301307
The parent resource. This may be "projects/{project_id}",
@@ -325,6 +331,7 @@ class ListApprovalRequestsMessage(proto.Message):
325331

326332
class ListApprovalRequestsResponse(proto.Message):
327333
r"""Response to listing of ApprovalRequest objects.
334+
328335
Attributes:
329336
approval_requests (Sequence[google.cloud.accessapproval_v1.types.ApprovalRequest]):
330337
Approval request details.
@@ -345,6 +352,7 @@ def raw_page(self):
345352

346353
class GetApprovalRequestMessage(proto.Message):
347354
r"""Request to get an approval request.
355+
348356
Attributes:
349357
name (str):
350358
Name of the approval request to retrieve.
@@ -355,6 +363,7 @@ class GetApprovalRequestMessage(proto.Message):
355363

356364
class ApproveApprovalRequestMessage(proto.Message):
357365
r"""Request to approve an ApprovalRequest.
366+
358367
Attributes:
359368
name (str):
360369
Name of the approval request to approve.
@@ -368,6 +377,7 @@ class ApproveApprovalRequestMessage(proto.Message):
368377

369378
class DismissApprovalRequestMessage(proto.Message):
370379
r"""Request to dismiss an approval request.
380+
371381
Attributes:
372382
name (str):
373383
Name of the ApprovalRequest to dismiss.
@@ -378,6 +388,7 @@ class DismissApprovalRequestMessage(proto.Message):
378388

379389
class GetAccessApprovalSettingsMessage(proto.Message):
380390
r"""Request to get access approval settings.
391+
381392
Attributes:
382393
name (str):
383394
Name of the AccessApprovalSettings to
@@ -389,6 +400,7 @@ class GetAccessApprovalSettingsMessage(proto.Message):
389400

390401
class UpdateAccessApprovalSettingsMessage(proto.Message):
391402
r"""Request to update access approval settings.
403+
392404
Attributes:
393405
settings (google.cloud.accessapproval_v1.types.AccessApprovalSettings):
394406
The new AccessApprovalSettings.
@@ -414,6 +426,7 @@ class UpdateAccessApprovalSettingsMessage(proto.Message):
414426

415427
class DeleteAccessApprovalSettingsMessage(proto.Message):
416428
r"""Request to delete access approval settings.
429+
417430
Attributes:
418431
name (str):
419432
Name of the AccessApprovalSettings to delete.

packages/google-cloud-access-approval/tests/unit/gapic/accessapproval_v1/test_access_approval.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from google.api_core import gapic_v1
3030
from google.api_core import grpc_helpers
3131
from google.api_core import grpc_helpers_async
32+
from google.api_core import path_template
3233
from google.auth import credentials as ga_credentials
3334
from google.auth.exceptions import MutualTLSChannelError
3435
from google.cloud.accessapproval_v1.services.access_approval import (
@@ -2228,6 +2229,9 @@ def test_access_approval_base_transport():
22282229
with pytest.raises(NotImplementedError):
22292230
getattr(transport, method)(request=object())
22302231

2232+
with pytest.raises(NotImplementedError):
2233+
transport.close()
2234+
22312235

22322236
@requires_google_auth_gte_1_25_0
22332237
def test_access_approval_base_transport_with_credentials_file():
@@ -2686,3 +2690,49 @@ def test_client_withDEFAULT_CLIENT_INFO():
26862690
credentials=ga_credentials.AnonymousCredentials(), client_info=client_info,
26872691
)
26882692
prep.assert_called_once_with(client_info)
2693+
2694+
2695+
@pytest.mark.asyncio
2696+
async def test_transport_close_async():
2697+
client = AccessApprovalAsyncClient(
2698+
credentials=ga_credentials.AnonymousCredentials(), transport="grpc_asyncio",
2699+
)
2700+
with mock.patch.object(
2701+
type(getattr(client.transport, "grpc_channel")), "close"
2702+
) as close:
2703+
async with client:
2704+
close.assert_not_called()
2705+
close.assert_called_once()
2706+
2707+
2708+
def test_transport_close():
2709+
transports = {
2710+
"grpc": "_grpc_channel",
2711+
}
2712+
2713+
for transport, close_name in transports.items():
2714+
client = AccessApprovalClient(
2715+
credentials=ga_credentials.AnonymousCredentials(), transport=transport
2716+
)
2717+
with mock.patch.object(
2718+
type(getattr(client.transport, close_name)), "close"
2719+
) as close:
2720+
with client:
2721+
close.assert_not_called()
2722+
close.assert_called_once()
2723+
2724+
2725+
def test_client_ctx():
2726+
transports = [
2727+
"grpc",
2728+
]
2729+
for transport in transports:
2730+
client = AccessApprovalClient(
2731+
credentials=ga_credentials.AnonymousCredentials(), transport=transport
2732+
)
2733+
# Test client calls underlying transport.
2734+
with mock.patch.object(type(client.transport), "close") as close:
2735+
close.assert_not_called()
2736+
with client:
2737+
pass
2738+
close.assert_called()

0 commit comments

Comments
 (0)