Skip to content

Commit df7cb07

Browse files
Merge pull request #155 from gleanwork/refactor/x-glean-header-consts
refactor: extract X-Glean header names into constants
2 parents 86ac051 + 08ff27f commit df7cb07

2 files changed

Lines changed: 53 additions & 39 deletions

File tree

src/glean/api_client/_hooks/x_glean.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
import httpx
66
from glean.api_client._hooks.types import BeforeRequestContext, BeforeRequestHook
77

8+
# Header names
9+
EXCLUDE_DEPRECATED_AFTER_HEADER = "X-Glean-Exclude-Deprecated-After"
10+
INCLUDE_EXPERIMENTAL_HEADER = "X-Glean-Include-Experimental"
11+
12+
# Environment variable names
13+
EXCLUDE_DEPRECATED_AFTER_ENV_VAR = "X_GLEAN_EXCLUDE_DEPRECATED_AFTER"
14+
INCLUDE_EXPERIMENTAL_ENV_VAR = "X_GLEAN_INCLUDE_EXPERIMENTAL"
15+
816

917
def _get_first_value(
1018
env_value: Optional[str],
@@ -48,7 +56,7 @@ def before_request(
4856
"""
4957
# Get deprecated value - env var takes precedence
5058
deprecated_value = _get_first_value(
51-
os.environ.get("X_GLEAN_EXCLUDE_DEPRECATED_AFTER"),
59+
os.environ.get(EXCLUDE_DEPRECATED_AFTER_ENV_VAR),
5260
getattr(hook_ctx.config, "exclude_deprecated_after", None),
5361
)
5462

@@ -57,14 +65,14 @@ def before_request(
5765
"true" if getattr(hook_ctx.config, "include_experimental", None) is True else None
5866
)
5967
experimental_value = _get_first_value(
60-
os.environ.get("X_GLEAN_INCLUDE_EXPERIMENTAL"),
68+
os.environ.get(INCLUDE_EXPERIMENTAL_ENV_VAR),
6169
config_experimental,
6270
)
6371

6472
if deprecated_value:
65-
request.headers["X-Glean-Exclude-Deprecated-After"] = deprecated_value
73+
request.headers[EXCLUDE_DEPRECATED_AFTER_HEADER] = deprecated_value
6674

6775
if experimental_value:
68-
request.headers["X-Glean-Include-Experimental"] = experimental_value
76+
request.headers[INCLUDE_EXPERIMENTAL_HEADER] = experimental_value
6977

7078
return request

tests/test_x_glean_hook.py

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@
66
import httpx
77
import pytest
88

9-
from src.glean.api_client._hooks.x_glean import XGlean
9+
from src.glean.api_client._hooks.x_glean import (
10+
XGlean,
11+
EXCLUDE_DEPRECATED_AFTER_HEADER,
12+
INCLUDE_EXPERIMENTAL_HEADER,
13+
EXCLUDE_DEPRECATED_AFTER_ENV_VAR,
14+
INCLUDE_EXPERIMENTAL_ENV_VAR,
15+
)
1016
from src.glean.api_client._hooks.types import BeforeRequestContext, HookContext
1117
from src.glean.api_client.sdkconfiguration import SDKConfiguration
1218

@@ -43,25 +49,25 @@ class TestXGleanHook:
4349
def clear_env_vars(self):
4450
"""Clear X-Glean environment variables before and after each test."""
4551
# Store original values
46-
original_deprecated = os.environ.get("X_GLEAN_EXCLUDE_DEPRECATED_AFTER")
47-
original_experimental = os.environ.get("X_GLEAN_INCLUDE_EXPERIMENTAL")
52+
original_deprecated = os.environ.get(EXCLUDE_DEPRECATED_AFTER_ENV_VAR)
53+
original_experimental = os.environ.get(INCLUDE_EXPERIMENTAL_ENV_VAR)
4854

4955
# Clear for test
50-
os.environ.pop("X_GLEAN_EXCLUDE_DEPRECATED_AFTER", None)
51-
os.environ.pop("X_GLEAN_INCLUDE_EXPERIMENTAL", None)
56+
os.environ.pop(EXCLUDE_DEPRECATED_AFTER_ENV_VAR, None)
57+
os.environ.pop(INCLUDE_EXPERIMENTAL_ENV_VAR, None)
5258

5359
yield
5460

5561
# Restore original values
5662
if original_deprecated is not None:
57-
os.environ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER"] = original_deprecated
63+
os.environ[EXCLUDE_DEPRECATED_AFTER_ENV_VAR] = original_deprecated
5864
else:
59-
os.environ.pop("X_GLEAN_EXCLUDE_DEPRECATED_AFTER", None)
65+
os.environ.pop(EXCLUDE_DEPRECATED_AFTER_ENV_VAR, None)
6066

6167
if original_experimental is not None:
62-
os.environ["X_GLEAN_INCLUDE_EXPERIMENTAL"] = original_experimental
68+
os.environ[INCLUDE_EXPERIMENTAL_ENV_VAR] = original_experimental
6369
else:
64-
os.environ.pop("X_GLEAN_INCLUDE_EXPERIMENTAL", None)
70+
os.environ.pop(INCLUDE_EXPERIMENTAL_ENV_VAR, None)
6571

6672
def test_no_headers_when_neither_options_nor_env_vars_set(self):
6773
"""Should not set any X-Glean headers when nothing is configured."""
@@ -71,8 +77,8 @@ def test_no_headers_when_neither_options_nor_env_vars_set(self):
7177

7278
result = hook.before_request(context, request)
7379

74-
assert "X-Glean-Exclude-Deprecated-After" not in result.headers
75-
assert "X-Glean-Include-Experimental" not in result.headers
80+
assert EXCLUDE_DEPRECATED_AFTER_HEADER not in result.headers
81+
assert INCLUDE_EXPERIMENTAL_HEADER not in result.headers
7682

7783
def test_sets_deprecated_header_from_sdk_option(self):
7884
"""Should set X-Glean-Exclude-Deprecated-After header from SDK option."""
@@ -82,7 +88,7 @@ def test_sets_deprecated_header_from_sdk_option(self):
8288

8389
result = hook.before_request(context, request)
8490

85-
assert result.headers.get("X-Glean-Exclude-Deprecated-After") == "2026-10-15"
91+
assert result.headers.get(EXCLUDE_DEPRECATED_AFTER_HEADER) == "2026-10-15"
8692

8793
def test_sets_experimental_header_when_include_experimental_is_true(self):
8894
"""Should set X-Glean-Include-Experimental header when includeExperimental is True."""
@@ -92,7 +98,7 @@ def test_sets_experimental_header_when_include_experimental_is_true(self):
9298

9399
result = hook.before_request(context, request)
94100

95-
assert result.headers.get("X-Glean-Include-Experimental") == "true"
101+
assert result.headers.get(INCLUDE_EXPERIMENTAL_HEADER) == "true"
96102

97103
def test_no_experimental_header_when_include_experimental_is_false(self):
98104
"""Should not set X-Glean-Include-Experimental header when includeExperimental is False."""
@@ -102,7 +108,7 @@ def test_no_experimental_header_when_include_experimental_is_false(self):
102108

103109
result = hook.before_request(context, request)
104110

105-
assert "X-Glean-Include-Experimental" not in result.headers
111+
assert INCLUDE_EXPERIMENTAL_HEADER not in result.headers
106112

107113
def test_sets_both_headers_when_both_options_provided(self):
108114
"""Should set both headers when both options are provided."""
@@ -115,75 +121,75 @@ def test_sets_both_headers_when_both_options_provided(self):
115121

116122
result = hook.before_request(context, request)
117123

118-
assert result.headers.get("X-Glean-Exclude-Deprecated-After") == "2026-10-15"
119-
assert result.headers.get("X-Glean-Include-Experimental") == "true"
124+
assert result.headers.get(EXCLUDE_DEPRECATED_AFTER_HEADER) == "2026-10-15"
125+
assert result.headers.get(INCLUDE_EXPERIMENTAL_HEADER) == "true"
120126

121127
def test_sets_deprecated_header_from_env_var(self):
122128
"""Should set X-Glean-Exclude-Deprecated-After header from environment variable."""
123-
os.environ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER"] = "2027-01-01"
129+
os.environ[EXCLUDE_DEPRECATED_AFTER_ENV_VAR] = "2027-01-01"
124130

125131
hook = XGlean()
126132
request = create_mock_request()
127133
context = create_mock_context()
128134

129135
result = hook.before_request(context, request)
130136

131-
assert result.headers.get("X-Glean-Exclude-Deprecated-After") == "2027-01-01"
137+
assert result.headers.get(EXCLUDE_DEPRECATED_AFTER_HEADER) == "2027-01-01"
132138

133139
def test_sets_experimental_header_from_env_var(self):
134140
"""Should set X-Glean-Include-Experimental header from environment variable."""
135-
os.environ["X_GLEAN_INCLUDE_EXPERIMENTAL"] = "true"
141+
os.environ[INCLUDE_EXPERIMENTAL_ENV_VAR] = "true"
136142

137143
hook = XGlean()
138144
request = create_mock_request()
139145
context = create_mock_context()
140146

141147
result = hook.before_request(context, request)
142148

143-
assert result.headers.get("X-Glean-Include-Experimental") == "true"
149+
assert result.headers.get(INCLUDE_EXPERIMENTAL_HEADER) == "true"
144150

145151
def test_sets_both_headers_from_env_vars(self):
146152
"""Should set both headers from environment variables."""
147-
os.environ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER"] = "2027-06-15"
148-
os.environ["X_GLEAN_INCLUDE_EXPERIMENTAL"] = "true"
153+
os.environ[EXCLUDE_DEPRECATED_AFTER_ENV_VAR] = "2027-06-15"
154+
os.environ[INCLUDE_EXPERIMENTAL_ENV_VAR] = "true"
149155

150156
hook = XGlean()
151157
request = create_mock_request()
152158
context = create_mock_context()
153159

154160
result = hook.before_request(context, request)
155161

156-
assert result.headers.get("X-Glean-Exclude-Deprecated-After") == "2027-06-15"
157-
assert result.headers.get("X-Glean-Include-Experimental") == "true"
162+
assert result.headers.get(EXCLUDE_DEPRECATED_AFTER_HEADER) == "2027-06-15"
163+
assert result.headers.get(INCLUDE_EXPERIMENTAL_HEADER) == "true"
158164

159165
def test_env_var_takes_precedence_for_deprecated(self):
160166
"""Environment variable should take precedence over SDK option for deprecated."""
161-
os.environ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER"] = "2027-12-31"
167+
os.environ[EXCLUDE_DEPRECATED_AFTER_ENV_VAR] = "2027-12-31"
162168

163169
hook = XGlean()
164170
request = create_mock_request()
165171
context = create_mock_context(exclude_deprecated_after="2026-01-01")
166172

167173
result = hook.before_request(context, request)
168174

169-
assert result.headers.get("X-Glean-Exclude-Deprecated-After") == "2027-12-31"
175+
assert result.headers.get(EXCLUDE_DEPRECATED_AFTER_HEADER) == "2027-12-31"
170176

171177
def test_env_var_takes_precedence_for_experimental(self):
172178
"""Environment variable should take precedence over SDK option for experimental."""
173-
os.environ["X_GLEAN_INCLUDE_EXPERIMENTAL"] = "true"
179+
os.environ[INCLUDE_EXPERIMENTAL_ENV_VAR] = "true"
174180

175181
hook = XGlean()
176182
request = create_mock_request()
177183
context = create_mock_context(include_experimental=False)
178184

179185
result = hook.before_request(context, request)
180186

181-
assert result.headers.get("X-Glean-Include-Experimental") == "true"
187+
assert result.headers.get(INCLUDE_EXPERIMENTAL_HEADER) == "true"
182188

183189
def test_env_vars_take_precedence_for_both_headers(self):
184190
"""Environment variables should take precedence for both headers when all are set."""
185-
os.environ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER"] = "2028-01-01"
186-
os.environ["X_GLEAN_INCLUDE_EXPERIMENTAL"] = "true"
191+
os.environ[EXCLUDE_DEPRECATED_AFTER_ENV_VAR] = "2028-01-01"
192+
os.environ[INCLUDE_EXPERIMENTAL_ENV_VAR] = "true"
187193

188194
hook = XGlean()
189195
request = create_mock_request()
@@ -194,8 +200,8 @@ def test_env_vars_take_precedence_for_both_headers(self):
194200

195201
result = hook.before_request(context, request)
196202

197-
assert result.headers.get("X-Glean-Exclude-Deprecated-After") == "2028-01-01"
198-
assert result.headers.get("X-Glean-Include-Experimental") == "true"
203+
assert result.headers.get(EXCLUDE_DEPRECATED_AFTER_HEADER) == "2028-01-01"
204+
assert result.headers.get(INCLUDE_EXPERIMENTAL_HEADER) == "true"
199205

200206
def test_preserves_existing_headers(self):
201207
"""Should preserve existing headers when adding X-Glean headers."""
@@ -214,8 +220,8 @@ def test_preserves_existing_headers(self):
214220

215221
assert result.headers.get("Authorization") == "Bearer token"
216222
assert result.headers.get("Content-Type") == "application/json"
217-
assert result.headers.get("X-Glean-Exclude-Deprecated-After") == "2026-10-15"
218-
assert result.headers.get("X-Glean-Include-Experimental") == "true"
223+
assert result.headers.get(EXCLUDE_DEPRECATED_AFTER_HEADER) == "2026-10-15"
224+
assert result.headers.get(INCLUDE_EXPERIMENTAL_HEADER) == "true"
219225

220226
def test_returns_httpx_request_instance(self):
221227
"""Should return an httpx.Request instance."""
@@ -257,7 +263,7 @@ def test_handles_multipart_streaming_request(self):
257263

258264
result = hook.before_request(context, request)
259265

260-
assert result.headers.get("X-Glean-Include-Experimental") == "true"
266+
assert result.headers.get(INCLUDE_EXPERIMENTAL_HEADER) == "true"
261267
assert result.method == "POST"
262268

263269

0 commit comments

Comments
 (0)