44from hyperbrowser .exceptions import HyperbrowserError
55
66T = TypeVar ("T" )
7+ _MAX_OPERATION_NAME_DISPLAY_LENGTH = 120
8+ _TRUNCATED_OPERATION_NAME_SUFFIX = "... (truncated)"
9+
10+
11+ def _normalize_operation_name_for_error (operation_name : str ) -> str :
12+ normalized_name = "" .join (
13+ "?" if ord (character ) < 32 or ord (character ) == 127 else character
14+ for character in operation_name
15+ ).strip ()
16+ if not normalized_name :
17+ return "operation"
18+ if len (normalized_name ) <= _MAX_OPERATION_NAME_DISPLAY_LENGTH :
19+ return normalized_name
20+ available_length = _MAX_OPERATION_NAME_DISPLAY_LENGTH - len (
21+ _TRUNCATED_OPERATION_NAME_SUFFIX
22+ )
23+ if available_length <= 0 :
24+ return _TRUNCATED_OPERATION_NAME_SUFFIX
25+ return f"{ normalized_name [:available_length ]} { _TRUNCATED_OPERATION_NAME_SUFFIX } "
726
827
928def parse_response_model (
@@ -14,23 +33,33 @@ def parse_response_model(
1433) -> T :
1534 if not isinstance (operation_name , str ) or not operation_name .strip ():
1635 raise HyperbrowserError ("operation_name must be a non-empty string" )
36+ normalized_operation_name = _normalize_operation_name_for_error (operation_name )
1737 if not isinstance (response_data , Mapping ):
18- raise HyperbrowserError (f"Expected { operation_name } response to be an object" )
38+ raise HyperbrowserError (
39+ f"Expected { normalized_operation_name } response to be an object"
40+ )
1941 try :
2042 response_payload = dict (response_data )
2143 except HyperbrowserError :
2244 raise
2345 except Exception as exc :
2446 raise HyperbrowserError (
25- f"Failed to read { operation_name } response data" ,
47+ f"Failed to read { normalized_operation_name } response data" ,
2648 original_error = exc ,
2749 ) from exc
50+ for key in response_payload .keys ():
51+ if isinstance (key , str ):
52+ continue
53+ raise HyperbrowserError (
54+ "Expected "
55+ f"{ normalized_operation_name } response object keys to be strings"
56+ )
2857 try :
2958 return model (** response_payload )
3059 except HyperbrowserError :
3160 raise
3261 except Exception as exc :
3362 raise HyperbrowserError (
34- f"Failed to parse { operation_name } response" ,
63+ f"Failed to parse { normalized_operation_name } response" ,
3564 original_error = exc ,
3665 ) from exc
0 commit comments