From 25202e98d3330836735e8c67324c451704405afe Mon Sep 17 00:00:00 2001 From: Chandra Sirimala Date: Wed, 29 Oct 2025 19:16:48 +0000 Subject: [PATCH 1/3] feat: provide option to update user_agent fixes #1327 --- google/cloud/storage/client.py | 12 ++++++++++++ tests/unit/test_client.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 2f56d8719..74b6061c0 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -297,6 +297,18 @@ def universe_domain(self): def api_endpoint(self): return self._connection.API_BASE_URL + def update_user_agent(self, user_agent): + """Update the user-agent string for this client. + + :type user_agent: str + :param user_agent: The string to add to the user-agent. + """ + existing_user_agent = self._connection._client_info.user_agent + if existing_user_agent is None: + self._connection.user_agent = user_agent + else: + self._connection.user_agent = f"{user_agent} {existing_user_agent}" + @property def _connection(self): """Get connection or batch on the client. diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 99de31961..dc71baa40 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1528,6 +1528,35 @@ def test_create_bucket_w_conflict_w_user_project(self): _target_object=mock.ANY, ) + def test_update_user_agent_when_empty_clientInfo_provided(self): + from google.cloud._http import ClientInfo + + client_info = ClientInfo() + + client = self._make_one(project=None, client_info=client_info) + self.assertGreater(len(client._connection.user_agent), 0) + + client.update_user_agent("my-test-agent/1.0") + self.assertIn("my-test-agent/1.0", client._connection.user_agent) + + def test_update_user_agent_when_none_clientinfo_provided(self): + + client = self._make_one(project=None) + client.update_user_agent("my-test-agent/1.0") + + self.assertIn("my-test-agent/1.0", client._connection.user_agent) + + def test_update_user_agent_with_existing_user_agent(self): + from google.cloud._http import ClientInfo + + client_info = ClientInfo() + client_info.user_agent = "existing-agent/2.0" + client = self._make_one(project=None, client_info=client_info) + client.update_user_agent("my-test-agent/1.0") + + self.assertIn("existing-agent/2.0", client._connection.user_agent) + self.assertIn("my-test-agent/1.0", client._connection.user_agent) + @mock.patch("warnings.warn") def test_create_bucket_w_requester_pays_deprecated(self, mock_warn): from google.cloud.storage.bucket import Bucket From 017b1ba8dd82120ae61884a75b0f6ffe18e8eee7 Mon Sep 17 00:00:00 2001 From: Chandra Sirimala Date: Thu, 30 Oct 2025 18:00:45 +0000 Subject: [PATCH 2/3] make tests more readable and intuitive --- tests/unit/test_client.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index dc71baa40..a4bdcb4ca 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1528,7 +1528,7 @@ def test_create_bucket_w_conflict_w_user_project(self): _target_object=mock.ANY, ) - def test_update_user_agent_when_empty_clientInfo_provided(self): + def test_update_user_agent_when_default_clientinfo_provided(self): from google.cloud._http import ClientInfo client_info = ClientInfo() @@ -1549,13 +1549,13 @@ def test_update_user_agent_when_none_clientinfo_provided(self): def test_update_user_agent_with_existing_user_agent(self): from google.cloud._http import ClientInfo - client_info = ClientInfo() - client_info.user_agent = "existing-agent/2.0" + client_info = ClientInfo(user_agent="existing-agent/2.0") client = self._make_one(project=None, client_info=client_info) client.update_user_agent("my-test-agent/1.0") - self.assertIn("existing-agent/2.0", client._connection.user_agent) - self.assertIn("my-test-agent/1.0", client._connection.user_agent) + self.assertIn( + "my-test-agent/1.0 existing-agent/2.0", client._connection.user_agent + ) @mock.patch("warnings.warn") def test_create_bucket_w_requester_pays_deprecated(self, mock_warn): From 9c218cbd4d9ddcf9fdb640aa134a1b76c5aa9043 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Thu, 30 Oct 2025 18:03:49 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20po?= =?UTF-8?q?st-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- tests/unit/test_client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index a4bdcb4ca..d5723740e 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1540,7 +1540,6 @@ def test_update_user_agent_when_default_clientinfo_provided(self): self.assertIn("my-test-agent/1.0", client._connection.user_agent) def test_update_user_agent_when_none_clientinfo_provided(self): - client = self._make_one(project=None) client.update_user_agent("my-test-agent/1.0")