From fd7c358ae9671a20c338d6868b4420b8a982fe17 Mon Sep 17 00:00:00 2001 From: mmikita95 Date: Mon, 7 Jul 2025 10:46:00 +0300 Subject: [PATCH 1/2] chore: parse environment variables for default headers --- src/writerai/_client.py | 43 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/src/writerai/_client.py b/src/writerai/_client.py index 34fb3484..fb978194 100644 --- a/src/writerai/_client.py +++ b/src/writerai/_client.py @@ -36,6 +36,39 @@ __all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Writer", "AsyncWriter", "Client", "AsyncClient"] +_SDK_NAMESPACE_PREFIX = "WRITER_SDK_" +_SDK_HEADER_PREFIX = _SDK_NAMESPACE_PREFIX + "HEADER_" + + +def _extract_sdk_env_headers() -> dict[str, str]: + """ + Collect headers defined through environment variables of the form + `WRITER_SDK_HEADER_`. + + Example + -------- + >>> os.environ["WRITER_SDK_HEADER_X_FOO_BAR"] = "abc123" + >>> _extract_sdk_env_headers() + {'X-Foo-Bar': 'abc123'} + """ + headers: dict[str, str] = {} + + for key, value in os.environ.items(): + if not key.startswith(_SDK_HEADER_PREFIX): + continue + + # Strip the prefix and convert + raw = key[len(_SDK_HEADER_PREFIX):] + parts = raw.split("_") + canonical = "-".join( + word.capitalize() if len(word) > 1 else word.upper() + for word in parts + ) + headers[canonical] = value + + return headers + + class Writer(SyncAPIClient): applications: applications.ApplicationsResource chat: chat.ChatResource @@ -92,13 +125,16 @@ def __init__( if base_url is None: base_url = f"https://api.writer.com" + env_headers = _extract_sdk_env_headers() + merged_headers = {**env_headers, **(default_headers or {})} + super().__init__( version=__version__, base_url=base_url, max_retries=max_retries, timeout=timeout, http_client=http_client, - custom_headers=default_headers, + custom_headers=merged_headers, custom_query=default_query, _strict_response_validation=_strict_response_validation, ) @@ -278,13 +314,16 @@ def __init__( if base_url is None: base_url = f"https://api.writer.com" + env_headers = _extract_sdk_env_headers() + merged_headers = {**env_headers, **(default_headers or {})} + super().__init__( version=__version__, base_url=base_url, max_retries=max_retries, timeout=timeout, http_client=http_client, - custom_headers=default_headers, + custom_headers=merged_headers, custom_query=default_query, _strict_response_validation=_strict_response_validation, ) From 6b7aeb4335534bcfafc2f9849fa4162f44002075 Mon Sep 17 00:00:00 2001 From: mmikita95 Date: Fri, 11 Jul 2025 13:00:21 +0300 Subject: [PATCH 2/2] fix: merged_headers -> default_headers to avoid conflicts --- src/writerai/_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/writerai/_client.py b/src/writerai/_client.py index fb978194..1f0e5c88 100644 --- a/src/writerai/_client.py +++ b/src/writerai/_client.py @@ -126,7 +126,7 @@ def __init__( base_url = f"https://api.writer.com" env_headers = _extract_sdk_env_headers() - merged_headers = {**env_headers, **(default_headers or {})} + default_headers = {**env_headers, **(default_headers or {})} super().__init__( version=__version__, @@ -134,7 +134,7 @@ def __init__( max_retries=max_retries, timeout=timeout, http_client=http_client, - custom_headers=merged_headers, + custom_headers=default_headers, custom_query=default_query, _strict_response_validation=_strict_response_validation, )