8
8
from .messages import Messages
9
9
from .number_insight import NumberInsight
10
10
from .number_management import Numbers
11
+ from .proactive_connect import ProactiveConnect
11
12
from .redact import Redact
12
13
from .short_codes import ShortCodes
13
14
from .sms import Sms
@@ -102,6 +103,7 @@ def __init__(
102
103
self ._host = "rest.nexmo.com"
103
104
self ._api_host = "api.nexmo.com"
104
105
self ._meetings_api_host = "api-eu.vonage.com/beta/meetings"
106
+ self ._proactive_connect_host = "api-eu.vonage.com"
105
107
106
108
user_agent = f"vonage-python/{ vonage .__version__ } python/{ python_version ()} "
107
109
@@ -116,6 +118,7 @@ def __init__(
116
118
self .messages = Messages (self )
117
119
self .number_insight = NumberInsight (self )
118
120
self .numbers = Numbers (self )
121
+ self .proactive_connect = ProactiveConnect (self )
119
122
self .short_codes = ShortCodes (self )
120
123
self .sms = Sms (self )
121
124
self .subaccounts = Subaccounts (self )
@@ -152,6 +155,12 @@ def meetings_api_host(self, value=None):
152
155
else :
153
156
self ._meetings_api_host = value
154
157
158
+ def proactive_connect_host (self , value = None ):
159
+ if value is None :
160
+ return self ._proactive_connect_host
161
+ else :
162
+ self ._proactive_connect_host = value
163
+
155
164
def auth (self , params = None , ** kwargs ):
156
165
self ._jwt_claims = params or kwargs
157
166
@@ -198,12 +207,25 @@ def get(self, host, request_uri, params=None, auth_type=None):
198
207
f'Invalid authentication type. Must be one of "jwt", "header" or "params".'
199
208
)
200
209
201
- logger .debug (f"GET to { repr (uri )} with params { repr (params )} , headers { repr (self ._request_headers )} " )
210
+ logger .debug (
211
+ f"GET to { repr (uri )} with params { repr (params )} , headers { repr (self ._request_headers )} "
212
+ )
202
213
return self .parse (
203
- host , self .session .get (uri , params = params , headers = self ._request_headers , timeout = self .timeout )
214
+ host ,
215
+ self .session .get (
216
+ uri , params = params , headers = self ._request_headers , timeout = self .timeout
217
+ ),
204
218
)
205
219
206
- def post (self , host , request_uri , params , auth_type = None , body_is_json = True , supports_signature_auth = False ):
220
+ def post (
221
+ self ,
222
+ host ,
223
+ request_uri ,
224
+ params ,
225
+ auth_type = None ,
226
+ body_is_json = True ,
227
+ supports_signature_auth = False ,
228
+ ):
207
229
"""
208
230
Low-level method to make a post request to an API server.
209
231
This method automatically adds authentication, picking the first applicable authentication method from the following:
@@ -229,14 +251,22 @@ def post(self, host, request_uri, params, auth_type=None, body_is_json=True, sup
229
251
f'Invalid authentication type. Must be one of "jwt", "header" or "params".'
230
252
)
231
253
232
- logger .debug (f"POST to { repr (uri )} with params { repr (params )} , headers { repr (self ._request_headers )} " )
254
+ logger .debug (
255
+ f"POST to { repr (uri )} with params { repr (params )} , headers { repr (self ._request_headers )} "
256
+ )
233
257
if body_is_json :
234
258
return self .parse (
235
- host , self .session .post (uri , json = params , headers = self ._request_headers , timeout = self .timeout )
259
+ host ,
260
+ self .session .post (
261
+ uri , json = params , headers = self ._request_headers , timeout = self .timeout
262
+ ),
236
263
)
237
264
else :
238
265
return self .parse (
239
- host , self .session .post (uri , data = params , headers = self ._request_headers , timeout = self .timeout )
266
+ host ,
267
+ self .session .post (
268
+ uri , data = params , headers = self ._request_headers , timeout = self .timeout
269
+ ),
240
270
)
241
271
242
272
def put (self , host , request_uri , params , auth_type = None ):
@@ -252,9 +282,14 @@ def put(self, host, request_uri, params, auth_type=None):
252
282
f'Invalid authentication type. Must be one of "jwt", "header" or "params".'
253
283
)
254
284
255
- logger .debug (f"PUT to { repr (uri )} with params { repr (params )} , headers { repr (self ._request_headers )} " )
285
+ logger .debug (
286
+ f"PUT to { repr (uri )} with params { repr (params )} , headers { repr (self ._request_headers )} "
287
+ )
256
288
# All APIs that currently use put methods require a json-formatted body so don't need to check this
257
- return self .parse (host , self .session .put (uri , json = params , headers = self ._request_headers , timeout = self .timeout ))
289
+ return self .parse (
290
+ host ,
291
+ self .session .put (uri , json = params , headers = self ._request_headers , timeout = self .timeout ),
292
+ )
258
293
259
294
def patch (self , host , request_uri , params , auth_type = None ):
260
295
uri = f"https://{ host } { request_uri } "
@@ -267,7 +302,9 @@ def patch(self, host, request_uri, params, auth_type=None):
267
302
else :
268
303
raise InvalidAuthenticationTypeError (f"""Invalid authentication type.""" )
269
304
270
- logger .debug (f"PATCH to { repr (uri )} with params { repr (params )} , headers { repr (self ._request_headers )} " )
305
+ logger .debug (
306
+ f"PATCH to { repr (uri )} with params { repr (params )} , headers { repr (self ._request_headers )} "
307
+ )
271
308
# Only newer APIs (that expect json-bodies) currently use this method, so we will always send a json-formatted body
272
309
return self .parse (host , self .session .patch (uri , json = params , headers = self ._request_headers ))
273
310
@@ -288,7 +325,10 @@ def delete(self, host, request_uri, params=None, auth_type=None):
288
325
if params is not None :
289
326
logger .debug (f"DELETE call has params { repr (params )} " )
290
327
return self .parse (
291
- host , self .session .delete (uri , headers = self ._request_headers , timeout = self .timeout , params = params )
328
+ host ,
329
+ self .session .delete (
330
+ uri , headers = self ._request_headers , timeout = self .timeout , params = params
331
+ ),
292
332
)
293
333
294
334
def parse (self , host , response : Response ):
@@ -322,25 +362,33 @@ def parse(self, host, response: Response):
322
362
title = error_data ["title" ]
323
363
detail = error_data ["detail" ]
324
364
type = error_data ["type" ]
325
- message = f"{ title } : { detail } ({ type } )"
365
+ message = f"{ title } : { detail } ({ type } ){ self . _add_individual_errors ( error_data ) } "
326
366
elif 'status' in error_data and 'message' in error_data and 'name' in error_data :
327
- message = f'Status Code { error_data [ "status" ] } : { error_data [ "name" ] } : { error_data [ "message" ] } '
328
- if 'errors' in error_data :
329
- for error in error_data [ 'errors' ]:
330
- message += f', error: { error } '
367
+ message = (
368
+ f'Status Code { error_data [ "status" ] } : { error_data [ "name" ] } : { error_data [ "message" ] } '
369
+ f' { self . _add_individual_errors ( error_data ) } '
370
+ )
331
371
else :
332
372
message = error_data
333
373
except JSONDecodeError :
334
374
pass
335
375
raise ClientError (message )
376
+
336
377
elif 500 <= response .status_code < 600 :
337
378
logger .warning (f"Server error: { response .status_code } { repr (response .content )} " )
338
379
message = f"{ response .status_code } response from { host } "
339
380
raise ServerError (message )
340
381
382
+ def _add_individual_errors (self , error_data ):
383
+ message = ''
384
+ if 'errors' in error_data :
385
+ for error in error_data ["errors" ]:
386
+ message += f"\n Error: { error } "
387
+ return message
388
+
341
389
def _create_jwt_auth_string (self ):
342
390
return b"Bearer " + self ._generate_application_jwt ()
343
-
391
+
344
392
def _generate_application_jwt (self ):
345
393
try :
346
394
return self ._jwt_client .generate_application_jwt (self ._jwt_claims )
0 commit comments