Skip to content

Commit 80f5180

Browse files
Harden extension key diagnostics for unprintable keys
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 8088c5b commit 80f5180

2 files changed

Lines changed: 25 additions & 1 deletion

File tree

hyperbrowser/client/managers/extension_utils.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,22 @@ def _get_type_name(value: Any) -> str:
99
return type(value).__name__
1010

1111

12+
def _safe_stringify_key(value: object) -> str:
13+
try:
14+
return str(value)
15+
except Exception:
16+
return f"<unprintable {_get_type_name(value)}>"
17+
18+
1219
def parse_extension_list_response_data(response_data: Any) -> List[ExtensionResponse]:
1320
if not isinstance(response_data, Mapping):
1421
raise HyperbrowserError(
1522
f"Expected mapping response but got {_get_type_name(response_data)}"
1623
)
1724
if "extensions" not in response_data:
18-
available_keys = ", ".join(sorted(str(key) for key in response_data.keys()))
25+
available_keys = ", ".join(
26+
sorted(_safe_stringify_key(key) for key in response_data.keys())
27+
)
1928
if available_keys:
2029
available_keys = f"[{available_keys}]"
2130
else:

tests/test_extension_utils.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,18 @@ def test_parse_extension_list_response_data_missing_key_lists_available_keys():
115115
"updatedAt": "2026-01-01T00:00:00Z",
116116
}
117117
)
118+
119+
120+
def test_parse_extension_list_response_data_missing_key_handles_unprintable_keys():
121+
class _BrokenStringKey:
122+
def __str__(self) -> str:
123+
raise RuntimeError("bad key stringification")
124+
125+
with pytest.raises(
126+
HyperbrowserError,
127+
match=(
128+
"Expected 'extensions' key in response but got "
129+
"\\[<unprintable _BrokenStringKey>\\] keys"
130+
),
131+
):
132+
parse_extension_list_response_data({_BrokenStringKey(): "value"})

0 commit comments

Comments
 (0)