From 3c4078b932792c0befd14aba6f3e17441bdfd371 Mon Sep 17 00:00:00 2001 From: omri Date: Sun, 22 Feb 2026 11:41:24 +0200 Subject: [PATCH 1/2] feat: user agent header --- src/bria_client/__init__.py | 11 ++--------- src/bria_client/_version.py | 6 ++++++ src/bria_client/engines/api_engine.py | 7 ++++++- tests/integration/clients/test_sync_client.py | 18 ++++++++++++++++++ 4 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 src/bria_client/_version.py diff --git a/src/bria_client/__init__.py b/src/bria_client/__init__.py index a810aaf..0d34fa2 100644 --- a/src/bria_client/__init__.py +++ b/src/bria_client/__init__.py @@ -1,11 +1,4 @@ -import importlib.metadata - +from bria_client._version import __version__ from bria_client.clients import BriaAsyncClient, BriaSyncClient -try: - __version__ = importlib.metadata.version(__name__) -except importlib.metadata.PackageNotFoundError: - __version__ = "0.1.1" - - -__all__ = ["BriaSyncClient", "BriaAsyncClient"] +__all__ = ["BriaSyncClient", "BriaAsyncClient", "__version__"] diff --git a/src/bria_client/_version.py b/src/bria_client/_version.py new file mode 100644 index 0000000..e87954b --- /dev/null +++ b/src/bria_client/_version.py @@ -0,0 +1,6 @@ +import importlib.metadata + +try: + __version__ = importlib.metadata.version("bria-client") +except importlib.metadata.PackageNotFoundError: + __version__ = "0.1.1" diff --git a/src/bria_client/engines/api_engine.py b/src/bria_client/engines/api_engine.py index e4d2d70..2c92602 100644 --- a/src/bria_client/engines/api_engine.py +++ b/src/bria_client/engines/api_engine.py @@ -2,6 +2,7 @@ from collections.abc import Callable from typing import Literal +from bria_client._version import __version__ from bria_client.engines.base.async_http_request import AsyncHTTPRequest from bria_client.engines.base.base_http_request import BaseHTTPRequest from bria_client.engines.base.sync_http_request import SyncHTTPRequest @@ -20,6 +21,10 @@ def __init__(self, base_url: str | None, default_headers: AdditionalHeaders | No def default_headers(self) -> dict[str, str]: return {name: get_header() if callable(get_header) else get_header for name, get_header in self._default_headers.items()} + @property + def user_agent_headers(self) -> dict[str, str]: + return {"User-Agent": f"Bria-SDK/{__version__} (python)"} + @property @abstractmethod def auth_headers(self) -> dict[str, str]: @@ -88,7 +93,7 @@ async def async_request( def _prepare_headers(self, headers: dict | None = None, auth_override: dict[str, str] | None = None) -> dict: additional_headers = headers or {} auth = auth_override if auth_override is not None else self.auth_headers - return {**self.default_headers, **additional_headers, **auth} + return {**self.user_agent_headers, **self.default_headers, **additional_headers, **auth} def _prepare_endpoint(self, endpoint: str) -> str: return f"{self.base_url}/v2/{endpoint.lstrip('/')}" diff --git a/tests/integration/clients/test_sync_client.py b/tests/integration/clients/test_sync_client.py index 40a15e7..100fd0f 100644 --- a/tests/integration/clients/test_sync_client.py +++ b/tests/integration/clients/test_sync_client.py @@ -70,6 +70,24 @@ def test_run_without_api_token_kwarg_uses_default_token(self, mocker): headers = call_args.kwargs["headers"] assert headers["api_token"] == default_token + def test_request_includes_user_agent_header(self, mocker): + """Verify that every request includes the User-Agent header with SDK version""" + # Arrange + client = BriaSyncClient(base_url="https://test.example.com", api_token="default_token") + mock_response = BriaResponse(status=Status.COMPLETED, request_id="test_123", result=BriaResult()) + mock_post = mocker.patch.object(client.engine.client, "request", return_value=mock_response) + + # Act + client.run(endpoint="/test/endpoint", payload={"test": "data"}) + + # Assert + mock_post.assert_called_once() + call_args = mock_post.call_args + headers = call_args.kwargs["headers"] + assert "User-Agent" in headers + assert headers["User-Agent"].startswith("Bria-SDK/") + assert headers["User-Agent"].endswith("(python)") + def test_concurrent_threads_use_correct_api_tokens(self, mocker): # Arrange client = BriaSyncClient(base_url="https://test.example.com", api_token="default_token") From 21497fd9fc2b462e29490adb6bae37f10ffa80d2 Mon Sep 17 00:00:00 2001 From: omri Date: Sun, 22 Feb 2026 14:28:20 +0200 Subject: [PATCH 2/2] feat: user agent header --- src/bria_client/engines/api_engine.py | 2 +- tests/integration/clients/test_sync_client.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bria_client/engines/api_engine.py b/src/bria_client/engines/api_engine.py index 2c92602..c4e3f61 100644 --- a/src/bria_client/engines/api_engine.py +++ b/src/bria_client/engines/api_engine.py @@ -23,7 +23,7 @@ def default_headers(self) -> dict[str, str]: @property def user_agent_headers(self) -> dict[str, str]: - return {"User-Agent": f"Bria-SDK/{__version__} (python)"} + return {"User-Agent": f"BriaSDK/{__version__} (python)"} @property @abstractmethod diff --git a/tests/integration/clients/test_sync_client.py b/tests/integration/clients/test_sync_client.py index 100fd0f..11c0322 100644 --- a/tests/integration/clients/test_sync_client.py +++ b/tests/integration/clients/test_sync_client.py @@ -85,7 +85,7 @@ def test_request_includes_user_agent_header(self, mocker): call_args = mock_post.call_args headers = call_args.kwargs["headers"] assert "User-Agent" in headers - assert headers["User-Agent"].startswith("Bria-SDK/") + assert headers["User-Agent"].startswith("BriaSDK/") assert headers["User-Agent"].endswith("(python)") def test_concurrent_threads_use_correct_api_tokens(self, mocker):