From 6834db7efcd7569ffeec1ae7cc5264830f05d9d8 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Fri, 11 Jun 2021 16:42:46 -0400 Subject: [PATCH] feat: add 'Client.close' FBO use with 'contextlib.closing'. Closes #64. --- google/cloud/client.py | 14 ++++++++++++++ tests/unit/test_client.py | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/google/cloud/client.py b/google/cloud/client.py index 0cfffdb..eb22e5d 100644 --- a/google/cloud/client.py +++ b/google/cloud/client.py @@ -208,6 +208,20 @@ def _http(self): self._http_internal.configure_mtls_channel(self._client_cert_source) return self._http_internal + def close(self): + """Clean up transport, if set. + + Suggested use: + + .. code-block:: python + import contextlib + + with contextlib.closing(client): # closes on exit + do_something_with(client) + """ + if self._http_internal is not None: + self._http_internal.close() + class _ClientProjectMixin(object): """Mixin to allow setting the project on the client. diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 0e31348..a4c04df 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -191,6 +191,20 @@ def test_from_service_account_json(self): file_open.assert_called_once_with(mock.sentinel.filename, "r", encoding="utf-8") constructor.assert_called_once_with(info) + def test_close_w__http_internal_none(self): + credentials = _make_credentials() + client_obj = self._make_one(credentials=credentials, _http=None) + + client_obj.close() # noraise + + def test_close_w__http_internal_set(self): + credentials = _make_credentials() + http = mock.Mock(spec=["close"]) + client_obj = self._make_one(credentials=credentials, _http=http) + + client_obj.close() + + http.close.assert_called_once_with() class Test_ClientProjectMixin(unittest.TestCase): @staticmethod