@@ -43,6 +43,102 @@ def sdk_version():
4343}
4444
4545
46+ class DescopeResponse :
47+ def __init__ (self , response ):
48+ self .raw = response
49+ self ._json_data = None
50+
51+ def json (self ):
52+ if self ._json_data is None :
53+ self ._json_data = self .raw .json ()
54+ return self ._json_data
55+
56+ # Make it dict-compatible for backward compatibility
57+ def __getitem__ (self , key ):
58+ return self .json ()[key ]
59+
60+ def __contains__ (self , key ):
61+ return key in self .json ()
62+
63+ def keys (self ):
64+ return self .json ().keys ()
65+
66+ def values (self ):
67+ return self .json ().values ()
68+
69+ def items (self ):
70+ return self .json ().items ()
71+
72+ def get (self , key , default = None ):
73+ return self .json ().get (key , default )
74+
75+ # Make it print like a dict for backward compatibility
76+ def __str__ (self ):
77+ return str (self .json ())
78+
79+ def __repr__ (self ):
80+ return repr (self .json ())
81+
82+ # Make it behave like a dict in boolean context
83+ def __bool__ (self ):
84+ return bool (self .json ())
85+
86+ def __len__ (self ):
87+ return len (self .json ())
88+
89+ # Equality comparison - compare the underlying JSON data
90+ def __eq__ (self , other ):
91+ if isinstance (other , DescopeResponse ):
92+ return self .json () == other .json ()
93+ # Allow comparison with dict/list directly
94+ return self .json () == other
95+
96+ def __ne__ (self , other ):
97+ return not self .__eq__ (other )
98+
99+ # Iteration support for list responses
100+ def __iter__ (self ):
101+ return iter (self .json ())
102+
103+ # Hashing support (for use in sets/dicts)
104+ def __hash__ (self ):
105+ json_data = self .json ()
106+ if isinstance (json_data , dict ):
107+ return hash (tuple (sorted (json_data .items ())))
108+ elif isinstance (json_data , list ):
109+ return hash (tuple (json_data ))
110+ return hash (json_data )
111+
112+ # Delegate properties
113+ @property
114+ def headers (self ):
115+ return self .raw .headers
116+
117+ @property
118+ def status_code (self ):
119+ return self .raw .status_code
120+
121+ @property
122+ def cookies (self ):
123+ return self .raw .cookies
124+
125+ @property
126+ def text (self ):
127+ return self .raw .text
128+
129+ @property
130+ def content (self ):
131+ return self .raw .content
132+
133+ @property
134+ def url (self ):
135+ return self .raw .url
136+
137+ @property
138+ def ok (self ):
139+ return self .raw .ok
140+
141+
46142class HTTPClient :
47143 def __init__ (
48144 self ,
@@ -80,7 +176,7 @@ def get(
80176 params = None ,
81177 allow_redirects : Optional [bool ] = True ,
82178 pswd : Optional [str ] = None ,
83- ) -> requests . Response :
179+ ) -> DescopeResponse :
84180 response = requests .get (
85181 f"{ self .base_url } { uri } " ,
86182 headers = self ._get_default_headers (pswd ),
@@ -90,7 +186,7 @@ def get(
90186 timeout = self .timeout_seconds ,
91187 )
92188 self ._raise_from_response (response )
93- return response
189+ return DescopeResponse ( response )
94190
95191 def post (
96192 self ,
@@ -100,7 +196,7 @@ def post(
100196 params = None ,
101197 pswd : Optional [str ] = None ,
102198 base_url : Optional [str ] = None ,
103- ) -> requests . Response :
199+ ) -> DescopeResponse :
104200 response = requests .post (
105201 f"{ base_url or self .base_url } { uri } " ,
106202 headers = self ._get_default_headers (pswd ),
@@ -111,7 +207,7 @@ def post(
111207 timeout = self .timeout_seconds ,
112208 )
113209 self ._raise_from_response (response )
114- return response
210+ return DescopeResponse ( response )
115211
116212 def patch (
117213 self ,
@@ -120,7 +216,7 @@ def patch(
120216 body : Optional [Union [dict , list [dict ], list [str ]]],
121217 params = None ,
122218 pswd : Optional [str ] = None ,
123- ) -> requests . Response :
219+ ) -> DescopeResponse :
124220 response = requests .patch (
125221 f"{ self .base_url } { uri } " ,
126222 headers = self ._get_default_headers (pswd ),
@@ -131,15 +227,15 @@ def patch(
131227 timeout = self .timeout_seconds ,
132228 )
133229 self ._raise_from_response (response )
134- return response
230+ return DescopeResponse ( response )
135231
136232 def delete (
137233 self ,
138234 uri : str ,
139235 * ,
140236 params = None ,
141237 pswd : Optional [str ] = None ,
142- ) -> requests . Response :
238+ ) -> DescopeResponse :
143239 response = requests .delete (
144240 f"{ self .base_url } { uri } " ,
145241 params = params ,
@@ -149,7 +245,7 @@ def delete(
149245 timeout = self .timeout_seconds ,
150246 )
151247 self ._raise_from_response (response )
152- return response
248+ return DescopeResponse ( response )
153249
154250 def get_default_headers (self , pswd : Optional [str ] = None ) -> dict :
155251 return self ._get_default_headers (pswd )
0 commit comments