vectorize_client.api_client
Vectorize API (Beta)
API for Vectorize services
The version of the OpenAPI document: 0.0.1 Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
1# coding: utf-8 2 3""" 4 Vectorize API (Beta) 5 6 API for Vectorize services 7 8 The version of the OpenAPI document: 0.0.1 9 Generated by OpenAPI Generator (https://openapi-generator.tech) 10 11 Do not edit the class manually. 12""" # noqa: E501 13 14 15import datetime 16from dateutil.parser import parse 17from enum import Enum 18import decimal 19import json 20import mimetypes 21import os 22import re 23import tempfile 24 25from urllib.parse import quote 26from typing import Tuple, Optional, List, Dict, Union 27from pydantic import SecretStr 28 29from vectorize_client.configuration import Configuration 30from vectorize_client.api_response import ApiResponse, T as ApiResponseT 31import vectorize_client.models 32from vectorize_client import rest 33from vectorize_client.exceptions import ( 34 ApiValueError, 35 ApiException, 36 BadRequestException, 37 UnauthorizedException, 38 ForbiddenException, 39 NotFoundException, 40 ServiceException 41) 42 43RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]] 44 45class ApiClient: 46 """Generic API client for OpenAPI client library builds. 47 48 OpenAPI generic API client. This client handles the client- 49 server communication, and is invariant across implementations. Specifics of 50 the methods and models for each application are generated from the OpenAPI 51 templates. 52 53 :param configuration: .Configuration object for this client 54 :param header_name: a header to pass when making calls to the API. 55 :param header_value: a header value to pass when making calls to 56 the API. 57 :param cookie: a cookie to include in the header when making calls 58 to the API 59 """ 60 61 PRIMITIVE_TYPES = (float, bool, bytes, str, int) 62 NATIVE_TYPES_MAPPING = { 63 'int': int, 64 'long': int, # TODO remove as only py3 is supported? 65 'float': float, 66 'str': str, 67 'bool': bool, 68 'date': datetime.date, 69 'datetime': datetime.datetime, 70 'decimal': decimal.Decimal, 71 'object': object, 72 } 73 _pool = None 74 75 def __init__( 76 self, 77 configuration=None, 78 header_name=None, 79 header_value=None, 80 cookie=None 81 ) -> None: 82 # use default configuration if none is provided 83 if configuration is None: 84 configuration = Configuration.get_default() 85 self.configuration = configuration 86 87 self.rest_client = rest.RESTClientObject(configuration) 88 self.default_headers = {} 89 if header_name is not None: 90 self.default_headers[header_name] = header_value 91 self.cookie = cookie 92 # Set default User-Agent. 93 self.user_agent = 'OpenAPI-Generator/1.0.0/python' 94 self.client_side_validation = configuration.client_side_validation 95 96 def __enter__(self): 97 return self 98 99 def __exit__(self, exc_type, exc_value, traceback): 100 pass 101 102 @property 103 def user_agent(self): 104 """User agent for this API client""" 105 return self.default_headers['User-Agent'] 106 107 @user_agent.setter 108 def user_agent(self, value): 109 self.default_headers['User-Agent'] = value 110 111 def set_default_header(self, header_name, header_value): 112 self.default_headers[header_name] = header_value 113 114 115 _default = None 116 117 @classmethod 118 def get_default(cls): 119 """Return new instance of ApiClient. 120 121 This method returns newly created, based on default constructor, 122 object of ApiClient class or returns a copy of default 123 ApiClient. 124 125 :return: The ApiClient object. 126 """ 127 if cls._default is None: 128 cls._default = ApiClient() 129 return cls._default 130 131 @classmethod 132 def set_default(cls, default): 133 """Set default instance of ApiClient. 134 135 It stores default ApiClient. 136 137 :param default: object of ApiClient. 138 """ 139 cls._default = default 140 141 def param_serialize( 142 self, 143 method, 144 resource_path, 145 path_params=None, 146 query_params=None, 147 header_params=None, 148 body=None, 149 post_params=None, 150 files=None, auth_settings=None, 151 collection_formats=None, 152 _host=None, 153 _request_auth=None 154 ) -> RequestSerialized: 155 156 """Builds the HTTP request params needed by the request. 157 :param method: Method to call. 158 :param resource_path: Path to method endpoint. 159 :param path_params: Path parameters in the url. 160 :param query_params: Query parameters in the url. 161 :param header_params: Header parameters to be 162 placed in the request header. 163 :param body: Request body. 164 :param post_params dict: Request post form parameters, 165 for `application/x-www-form-urlencoded`, `multipart/form-data`. 166 :param auth_settings list: Auth Settings names for the request. 167 :param files dict: key -> filename, value -> filepath, 168 for `multipart/form-data`. 169 :param collection_formats: dict of collection formats for path, query, 170 header, and post parameters. 171 :param _request_auth: set to override the auth_settings for an a single 172 request; this effectively ignores the authentication 173 in the spec for a single request. 174 :return: tuple of form (path, http_method, query_params, header_params, 175 body, post_params, files) 176 """ 177 178 config = self.configuration 179 180 # header parameters 181 header_params = header_params or {} 182 header_params.update(self.default_headers) 183 if self.cookie: 184 header_params['Cookie'] = self.cookie 185 if header_params: 186 header_params = self.sanitize_for_serialization(header_params) 187 header_params = dict( 188 self.parameters_to_tuples(header_params,collection_formats) 189 ) 190 191 # path parameters 192 if path_params: 193 path_params = self.sanitize_for_serialization(path_params) 194 path_params = self.parameters_to_tuples( 195 path_params, 196 collection_formats 197 ) 198 for k, v in path_params: 199 # specified safe chars, encode everything 200 resource_path = resource_path.replace( 201 '{%s}' % k, 202 quote(str(v), safe=config.safe_chars_for_path_param) 203 ) 204 205 # post parameters 206 if post_params or files: 207 post_params = post_params if post_params else [] 208 post_params = self.sanitize_for_serialization(post_params) 209 post_params = self.parameters_to_tuples( 210 post_params, 211 collection_formats 212 ) 213 if files: 214 post_params.extend(self.files_parameters(files)) 215 216 # auth setting 217 self.update_params_for_auth( 218 header_params, 219 query_params, 220 auth_settings, 221 resource_path, 222 method, 223 body, 224 request_auth=_request_auth 225 ) 226 227 # body 228 if body: 229 body = self.sanitize_for_serialization(body) 230 231 # request url 232 if _host is None or self.configuration.ignore_operation_servers: 233 url = self.configuration.host + resource_path 234 else: 235 # use server/host defined in path or operation instead 236 url = _host + resource_path 237 238 # query parameters 239 if query_params: 240 query_params = self.sanitize_for_serialization(query_params) 241 url_query = self.parameters_to_url_query( 242 query_params, 243 collection_formats 244 ) 245 url += "?" + url_query 246 247 return method, url, header_params, body, post_params 248 249 250 def call_api( 251 self, 252 method, 253 url, 254 header_params=None, 255 body=None, 256 post_params=None, 257 _request_timeout=None 258 ) -> rest.RESTResponse: 259 """Makes the HTTP request (synchronous) 260 :param method: Method to call. 261 :param url: Path to method endpoint. 262 :param header_params: Header parameters to be 263 placed in the request header. 264 :param body: Request body. 265 :param post_params dict: Request post form parameters, 266 for `application/x-www-form-urlencoded`, `multipart/form-data`. 267 :param _request_timeout: timeout setting for this request. 268 :return: RESTResponse 269 """ 270 271 try: 272 # perform request and return response 273 response_data = self.rest_client.request( 274 method, url, 275 headers=header_params, 276 body=body, post_params=post_params, 277 _request_timeout=_request_timeout 278 ) 279 280 except ApiException as e: 281 raise e 282 283 return response_data 284 285 def response_deserialize( 286 self, 287 response_data: rest.RESTResponse, 288 response_types_map: Optional[Dict[str, ApiResponseT]]=None 289 ) -> ApiResponse[ApiResponseT]: 290 """Deserializes response into an object. 291 :param response_data: RESTResponse object to be deserialized. 292 :param response_types_map: dict of response types. 293 :return: ApiResponse 294 """ 295 296 msg = "RESTResponse.read() must be called before passing it to response_deserialize()" 297 assert response_data.data is not None, msg 298 299 response_type = response_types_map.get(str(response_data.status), None) 300 if not response_type and isinstance(response_data.status, int) and 100 <= response_data.status <= 599: 301 # if not found, look for '1XX', '2XX', etc. 302 response_type = response_types_map.get(str(response_data.status)[0] + "XX", None) 303 304 # deserialize response data 305 response_text = None 306 return_data = None 307 try: 308 if response_type == "bytearray": 309 return_data = response_data.data 310 elif response_type == "file": 311 return_data = self.__deserialize_file(response_data) 312 elif response_type is not None: 313 match = None 314 content_type = response_data.getheader('content-type') 315 if content_type is not None: 316 match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) 317 encoding = match.group(1) if match else "utf-8" 318 response_text = response_data.data.decode(encoding) 319 return_data = self.deserialize(response_text, response_type, content_type) 320 finally: 321 if not 200 <= response_data.status <= 299: 322 raise ApiException.from_response( 323 http_resp=response_data, 324 body=response_text, 325 data=return_data, 326 ) 327 328 return ApiResponse( 329 status_code = response_data.status, 330 data = return_data, 331 headers = response_data.getheaders(), 332 raw_data = response_data.data 333 ) 334 335 def sanitize_for_serialization(self, obj): 336 """Builds a JSON POST object. 337 338 If obj is None, return None. 339 If obj is SecretStr, return obj.get_secret_value() 340 If obj is str, int, long, float, bool, return directly. 341 If obj is datetime.datetime, datetime.date 342 convert to string in iso8601 format. 343 If obj is decimal.Decimal return string representation. 344 If obj is list, sanitize each element in the list. 345 If obj is dict, return the dict. 346 If obj is OpenAPI model, return the properties dict. 347 348 :param obj: The data to serialize. 349 :return: The serialized form of data. 350 """ 351 if obj is None: 352 return None 353 elif isinstance(obj, Enum): 354 return obj.value 355 elif isinstance(obj, SecretStr): 356 return obj.get_secret_value() 357 elif isinstance(obj, self.PRIMITIVE_TYPES): 358 return obj 359 elif isinstance(obj, list): 360 return [ 361 self.sanitize_for_serialization(sub_obj) for sub_obj in obj 362 ] 363 elif isinstance(obj, tuple): 364 return tuple( 365 self.sanitize_for_serialization(sub_obj) for sub_obj in obj 366 ) 367 elif isinstance(obj, (datetime.datetime, datetime.date)): 368 return obj.isoformat() 369 elif isinstance(obj, decimal.Decimal): 370 return str(obj) 371 372 elif isinstance(obj, dict): 373 obj_dict = obj 374 else: 375 # Convert model obj to dict except 376 # attributes `openapi_types`, `attribute_map` 377 # and attributes which value is not None. 378 # Convert attribute name to json key in 379 # model definition for request. 380 if hasattr(obj, 'to_dict') and callable(getattr(obj, 'to_dict')): 381 obj_dict = obj.to_dict() 382 else: 383 obj_dict = obj.__dict__ 384 385 return { 386 key: self.sanitize_for_serialization(val) 387 for key, val in obj_dict.items() 388 } 389 390 def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]): 391 """Deserializes response into an object. 392 393 :param response: RESTResponse object to be deserialized. 394 :param response_type: class literal for 395 deserialized object, or string of class name. 396 :param content_type: content type of response. 397 398 :return: deserialized object. 399 """ 400 401 # fetch data from response object 402 if content_type is None: 403 try: 404 data = json.loads(response_text) 405 except ValueError: 406 data = response_text 407 elif re.match(r'^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE): 408 if response_text == "": 409 data = "" 410 else: 411 data = json.loads(response_text) 412 elif re.match(r'^text\/[a-z.+-]+\s*(;|$)', content_type, re.IGNORECASE): 413 data = response_text 414 else: 415 raise ApiException( 416 status=0, 417 reason="Unsupported content type: {0}".format(content_type) 418 ) 419 420 return self.__deserialize(data, response_type) 421 422 def __deserialize(self, data, klass): 423 """Deserializes dict, list, str into an object. 424 425 :param data: dict, list or str. 426 :param klass: class literal, or string of class name. 427 428 :return: object. 429 """ 430 if data is None: 431 return None 432 433 if isinstance(klass, str): 434 if klass.startswith('List['): 435 m = re.match(r'List\[(.*)]', klass) 436 assert m is not None, "Malformed List type definition" 437 sub_kls = m.group(1) 438 return [self.__deserialize(sub_data, sub_kls) 439 for sub_data in data] 440 441 if klass.startswith('Dict['): 442 m = re.match(r'Dict\[([^,]*), (.*)]', klass) 443 assert m is not None, "Malformed Dict type definition" 444 sub_kls = m.group(2) 445 return {k: self.__deserialize(v, sub_kls) 446 for k, v in data.items()} 447 448 # convert str to class 449 if klass in self.NATIVE_TYPES_MAPPING: 450 klass = self.NATIVE_TYPES_MAPPING[klass] 451 else: 452 klass = getattr(vectorize_client.models, klass) 453 454 if klass in self.PRIMITIVE_TYPES: 455 return self.__deserialize_primitive(data, klass) 456 elif klass == object: 457 return self.__deserialize_object(data) 458 elif klass == datetime.date: 459 return self.__deserialize_date(data) 460 elif klass == datetime.datetime: 461 return self.__deserialize_datetime(data) 462 elif klass == decimal.Decimal: 463 return decimal.Decimal(data) 464 elif issubclass(klass, Enum): 465 return self.__deserialize_enum(data, klass) 466 else: 467 return self.__deserialize_model(data, klass) 468 469 def parameters_to_tuples(self, params, collection_formats): 470 """Get parameters as list of tuples, formatting collections. 471 472 :param params: Parameters as dict or list of two-tuples 473 :param dict collection_formats: Parameter collection formats 474 :return: Parameters as list of tuples, collections formatted 475 """ 476 new_params: List[Tuple[str, str]] = [] 477 if collection_formats is None: 478 collection_formats = {} 479 for k, v in params.items() if isinstance(params, dict) else params: 480 if k in collection_formats: 481 collection_format = collection_formats[k] 482 if collection_format == 'multi': 483 new_params.extend((k, value) for value in v) 484 else: 485 if collection_format == 'ssv': 486 delimiter = ' ' 487 elif collection_format == 'tsv': 488 delimiter = '\t' 489 elif collection_format == 'pipes': 490 delimiter = '|' 491 else: # csv is the default 492 delimiter = ',' 493 new_params.append( 494 (k, delimiter.join(str(value) for value in v))) 495 else: 496 new_params.append((k, v)) 497 return new_params 498 499 def parameters_to_url_query(self, params, collection_formats): 500 """Get parameters as list of tuples, formatting collections. 501 502 :param params: Parameters as dict or list of two-tuples 503 :param dict collection_formats: Parameter collection formats 504 :return: URL query string (e.g. a=Hello%20World&b=123) 505 """ 506 new_params: List[Tuple[str, str]] = [] 507 if collection_formats is None: 508 collection_formats = {} 509 for k, v in params.items() if isinstance(params, dict) else params: 510 if isinstance(v, bool): 511 v = str(v).lower() 512 if isinstance(v, (int, float)): 513 v = str(v) 514 if isinstance(v, dict): 515 v = json.dumps(v) 516 517 if k in collection_formats: 518 collection_format = collection_formats[k] 519 if collection_format == 'multi': 520 new_params.extend((k, quote(str(value))) for value in v) 521 else: 522 if collection_format == 'ssv': 523 delimiter = ' ' 524 elif collection_format == 'tsv': 525 delimiter = '\t' 526 elif collection_format == 'pipes': 527 delimiter = '|' 528 else: # csv is the default 529 delimiter = ',' 530 new_params.append( 531 (k, delimiter.join(quote(str(value)) for value in v)) 532 ) 533 else: 534 new_params.append((k, quote(str(v)))) 535 536 return "&".join(["=".join(map(str, item)) for item in new_params]) 537 538 def files_parameters( 539 self, 540 files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]], 541 ): 542 """Builds form parameters. 543 544 :param files: File parameters. 545 :return: Form parameters with files. 546 """ 547 params = [] 548 for k, v in files.items(): 549 if isinstance(v, str): 550 with open(v, 'rb') as f: 551 filename = os.path.basename(f.name) 552 filedata = f.read() 553 elif isinstance(v, bytes): 554 filename = k 555 filedata = v 556 elif isinstance(v, tuple): 557 filename, filedata = v 558 elif isinstance(v, list): 559 for file_param in v: 560 params.extend(self.files_parameters({k: file_param})) 561 continue 562 else: 563 raise ValueError("Unsupported file value") 564 mimetype = ( 565 mimetypes.guess_type(filename)[0] 566 or 'application/octet-stream' 567 ) 568 params.append( 569 tuple([k, tuple([filename, filedata, mimetype])]) 570 ) 571 return params 572 573 def select_header_accept(self, accepts: List[str]) -> Optional[str]: 574 """Returns `Accept` based on an array of accepts provided. 575 576 :param accepts: List of headers. 577 :return: Accept (e.g. application/json). 578 """ 579 if not accepts: 580 return None 581 582 for accept in accepts: 583 if re.search('json', accept, re.IGNORECASE): 584 return accept 585 586 return accepts[0] 587 588 def select_header_content_type(self, content_types): 589 """Returns `Content-Type` based on an array of content_types provided. 590 591 :param content_types: List of content-types. 592 :return: Content-Type (e.g. application/json). 593 """ 594 if not content_types: 595 return None 596 597 for content_type in content_types: 598 if re.search('json', content_type, re.IGNORECASE): 599 return content_type 600 601 return content_types[0] 602 603 def update_params_for_auth( 604 self, 605 headers, 606 queries, 607 auth_settings, 608 resource_path, 609 method, 610 body, 611 request_auth=None 612 ) -> None: 613 """Updates header and query params based on authentication setting. 614 615 :param headers: Header parameters dict to be updated. 616 :param queries: Query parameters tuple list to be updated. 617 :param auth_settings: Authentication setting identifiers list. 618 :resource_path: A string representation of the HTTP request resource path. 619 :method: A string representation of the HTTP request method. 620 :body: A object representing the body of the HTTP request. 621 The object type is the return value of sanitize_for_serialization(). 622 :param request_auth: if set, the provided settings will 623 override the token in the configuration. 624 """ 625 if not auth_settings: 626 return 627 628 if request_auth: 629 self._apply_auth_params( 630 headers, 631 queries, 632 resource_path, 633 method, 634 body, 635 request_auth 636 ) 637 else: 638 for auth in auth_settings: 639 auth_setting = self.configuration.auth_settings().get(auth) 640 if auth_setting: 641 self._apply_auth_params( 642 headers, 643 queries, 644 resource_path, 645 method, 646 body, 647 auth_setting 648 ) 649 650 def _apply_auth_params( 651 self, 652 headers, 653 queries, 654 resource_path, 655 method, 656 body, 657 auth_setting 658 ) -> None: 659 """Updates the request parameters based on a single auth_setting 660 661 :param headers: Header parameters dict to be updated. 662 :param queries: Query parameters tuple list to be updated. 663 :resource_path: A string representation of the HTTP request resource path. 664 :method: A string representation of the HTTP request method. 665 :body: A object representing the body of the HTTP request. 666 The object type is the return value of sanitize_for_serialization(). 667 :param auth_setting: auth settings for the endpoint 668 """ 669 if auth_setting['in'] == 'cookie': 670 headers['Cookie'] = auth_setting['value'] 671 elif auth_setting['in'] == 'header': 672 if auth_setting['type'] != 'http-signature': 673 headers[auth_setting['key']] = auth_setting['value'] 674 elif auth_setting['in'] == 'query': 675 queries.append((auth_setting['key'], auth_setting['value'])) 676 else: 677 raise ApiValueError( 678 'Authentication token must be in `query` or `header`' 679 ) 680 681 def __deserialize_file(self, response): 682 """Deserializes body to file 683 684 Saves response body into a file in a temporary folder, 685 using the filename from the `Content-Disposition` header if provided. 686 687 handle file downloading 688 save response body into a tmp file and return the instance 689 690 :param response: RESTResponse. 691 :return: file path. 692 """ 693 fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) 694 os.close(fd) 695 os.remove(path) 696 697 content_disposition = response.getheader("Content-Disposition") 698 if content_disposition: 699 m = re.search( 700 r'filename=[\'"]?([^\'"\s]+)[\'"]?', 701 content_disposition 702 ) 703 assert m is not None, "Unexpected 'content-disposition' header value" 704 filename = m.group(1) 705 path = os.path.join(os.path.dirname(path), filename) 706 707 with open(path, "wb") as f: 708 f.write(response.data) 709 710 return path 711 712 def __deserialize_primitive(self, data, klass): 713 """Deserializes string to primitive type. 714 715 :param data: str. 716 :param klass: class literal. 717 718 :return: int, long, float, str, bool. 719 """ 720 try: 721 return klass(data) 722 except UnicodeEncodeError: 723 return str(data) 724 except TypeError: 725 return data 726 727 def __deserialize_object(self, value): 728 """Return an original value. 729 730 :return: object. 731 """ 732 return value 733 734 def __deserialize_date(self, string): 735 """Deserializes string to date. 736 737 :param string: str. 738 :return: date. 739 """ 740 try: 741 return parse(string).date() 742 except ImportError: 743 return string 744 except ValueError: 745 raise rest.ApiException( 746 status=0, 747 reason="Failed to parse `{0}` as date object".format(string) 748 ) 749 750 def __deserialize_datetime(self, string): 751 """Deserializes string to datetime. 752 753 The string should be in iso8601 datetime format. 754 755 :param string: str. 756 :return: datetime. 757 """ 758 try: 759 return parse(string) 760 except ImportError: 761 return string 762 except ValueError: 763 raise rest.ApiException( 764 status=0, 765 reason=( 766 "Failed to parse `{0}` as datetime object" 767 .format(string) 768 ) 769 ) 770 771 def __deserialize_enum(self, data, klass): 772 """Deserializes primitive type to enum. 773 774 :param data: primitive type. 775 :param klass: class literal. 776 :return: enum value. 777 """ 778 try: 779 return klass(data) 780 except ValueError: 781 raise rest.ApiException( 782 status=0, 783 reason=( 784 "Failed to parse `{0}` as `{1}`" 785 .format(data, klass) 786 ) 787 ) 788 789 def __deserialize_model(self, data, klass): 790 """Deserializes list or dict to model. 791 792 :param data: dict, list. 793 :param klass: class literal. 794 :return: model object. 795 """ 796 797 return klass.from_dict(data)
46class ApiClient: 47 """Generic API client for OpenAPI client library builds. 48 49 OpenAPI generic API client. This client handles the client- 50 server communication, and is invariant across implementations. Specifics of 51 the methods and models for each application are generated from the OpenAPI 52 templates. 53 54 :param configuration: .Configuration object for this client 55 :param header_name: a header to pass when making calls to the API. 56 :param header_value: a header value to pass when making calls to 57 the API. 58 :param cookie: a cookie to include in the header when making calls 59 to the API 60 """ 61 62 PRIMITIVE_TYPES = (float, bool, bytes, str, int) 63 NATIVE_TYPES_MAPPING = { 64 'int': int, 65 'long': int, # TODO remove as only py3 is supported? 66 'float': float, 67 'str': str, 68 'bool': bool, 69 'date': datetime.date, 70 'datetime': datetime.datetime, 71 'decimal': decimal.Decimal, 72 'object': object, 73 } 74 _pool = None 75 76 def __init__( 77 self, 78 configuration=None, 79 header_name=None, 80 header_value=None, 81 cookie=None 82 ) -> None: 83 # use default configuration if none is provided 84 if configuration is None: 85 configuration = Configuration.get_default() 86 self.configuration = configuration 87 88 self.rest_client = rest.RESTClientObject(configuration) 89 self.default_headers = {} 90 if header_name is not None: 91 self.default_headers[header_name] = header_value 92 self.cookie = cookie 93 # Set default User-Agent. 94 self.user_agent = 'OpenAPI-Generator/1.0.0/python' 95 self.client_side_validation = configuration.client_side_validation 96 97 def __enter__(self): 98 return self 99 100 def __exit__(self, exc_type, exc_value, traceback): 101 pass 102 103 @property 104 def user_agent(self): 105 """User agent for this API client""" 106 return self.default_headers['User-Agent'] 107 108 @user_agent.setter 109 def user_agent(self, value): 110 self.default_headers['User-Agent'] = value 111 112 def set_default_header(self, header_name, header_value): 113 self.default_headers[header_name] = header_value 114 115 116 _default = None 117 118 @classmethod 119 def get_default(cls): 120 """Return new instance of ApiClient. 121 122 This method returns newly created, based on default constructor, 123 object of ApiClient class or returns a copy of default 124 ApiClient. 125 126 :return: The ApiClient object. 127 """ 128 if cls._default is None: 129 cls._default = ApiClient() 130 return cls._default 131 132 @classmethod 133 def set_default(cls, default): 134 """Set default instance of ApiClient. 135 136 It stores default ApiClient. 137 138 :param default: object of ApiClient. 139 """ 140 cls._default = default 141 142 def param_serialize( 143 self, 144 method, 145 resource_path, 146 path_params=None, 147 query_params=None, 148 header_params=None, 149 body=None, 150 post_params=None, 151 files=None, auth_settings=None, 152 collection_formats=None, 153 _host=None, 154 _request_auth=None 155 ) -> RequestSerialized: 156 157 """Builds the HTTP request params needed by the request. 158 :param method: Method to call. 159 :param resource_path: Path to method endpoint. 160 :param path_params: Path parameters in the url. 161 :param query_params: Query parameters in the url. 162 :param header_params: Header parameters to be 163 placed in the request header. 164 :param body: Request body. 165 :param post_params dict: Request post form parameters, 166 for `application/x-www-form-urlencoded`, `multipart/form-data`. 167 :param auth_settings list: Auth Settings names for the request. 168 :param files dict: key -> filename, value -> filepath, 169 for `multipart/form-data`. 170 :param collection_formats: dict of collection formats for path, query, 171 header, and post parameters. 172 :param _request_auth: set to override the auth_settings for an a single 173 request; this effectively ignores the authentication 174 in the spec for a single request. 175 :return: tuple of form (path, http_method, query_params, header_params, 176 body, post_params, files) 177 """ 178 179 config = self.configuration 180 181 # header parameters 182 header_params = header_params or {} 183 header_params.update(self.default_headers) 184 if self.cookie: 185 header_params['Cookie'] = self.cookie 186 if header_params: 187 header_params = self.sanitize_for_serialization(header_params) 188 header_params = dict( 189 self.parameters_to_tuples(header_params,collection_formats) 190 ) 191 192 # path parameters 193 if path_params: 194 path_params = self.sanitize_for_serialization(path_params) 195 path_params = self.parameters_to_tuples( 196 path_params, 197 collection_formats 198 ) 199 for k, v in path_params: 200 # specified safe chars, encode everything 201 resource_path = resource_path.replace( 202 '{%s}' % k, 203 quote(str(v), safe=config.safe_chars_for_path_param) 204 ) 205 206 # post parameters 207 if post_params or files: 208 post_params = post_params if post_params else [] 209 post_params = self.sanitize_for_serialization(post_params) 210 post_params = self.parameters_to_tuples( 211 post_params, 212 collection_formats 213 ) 214 if files: 215 post_params.extend(self.files_parameters(files)) 216 217 # auth setting 218 self.update_params_for_auth( 219 header_params, 220 query_params, 221 auth_settings, 222 resource_path, 223 method, 224 body, 225 request_auth=_request_auth 226 ) 227 228 # body 229 if body: 230 body = self.sanitize_for_serialization(body) 231 232 # request url 233 if _host is None or self.configuration.ignore_operation_servers: 234 url = self.configuration.host + resource_path 235 else: 236 # use server/host defined in path or operation instead 237 url = _host + resource_path 238 239 # query parameters 240 if query_params: 241 query_params = self.sanitize_for_serialization(query_params) 242 url_query = self.parameters_to_url_query( 243 query_params, 244 collection_formats 245 ) 246 url += "?" + url_query 247 248 return method, url, header_params, body, post_params 249 250 251 def call_api( 252 self, 253 method, 254 url, 255 header_params=None, 256 body=None, 257 post_params=None, 258 _request_timeout=None 259 ) -> rest.RESTResponse: 260 """Makes the HTTP request (synchronous) 261 :param method: Method to call. 262 :param url: Path to method endpoint. 263 :param header_params: Header parameters to be 264 placed in the request header. 265 :param body: Request body. 266 :param post_params dict: Request post form parameters, 267 for `application/x-www-form-urlencoded`, `multipart/form-data`. 268 :param _request_timeout: timeout setting for this request. 269 :return: RESTResponse 270 """ 271 272 try: 273 # perform request and return response 274 response_data = self.rest_client.request( 275 method, url, 276 headers=header_params, 277 body=body, post_params=post_params, 278 _request_timeout=_request_timeout 279 ) 280 281 except ApiException as e: 282 raise e 283 284 return response_data 285 286 def response_deserialize( 287 self, 288 response_data: rest.RESTResponse, 289 response_types_map: Optional[Dict[str, ApiResponseT]]=None 290 ) -> ApiResponse[ApiResponseT]: 291 """Deserializes response into an object. 292 :param response_data: RESTResponse object to be deserialized. 293 :param response_types_map: dict of response types. 294 :return: ApiResponse 295 """ 296 297 msg = "RESTResponse.read() must be called before passing it to response_deserialize()" 298 assert response_data.data is not None, msg 299 300 response_type = response_types_map.get(str(response_data.status), None) 301 if not response_type and isinstance(response_data.status, int) and 100 <= response_data.status <= 599: 302 # if not found, look for '1XX', '2XX', etc. 303 response_type = response_types_map.get(str(response_data.status)[0] + "XX", None) 304 305 # deserialize response data 306 response_text = None 307 return_data = None 308 try: 309 if response_type == "bytearray": 310 return_data = response_data.data 311 elif response_type == "file": 312 return_data = self.__deserialize_file(response_data) 313 elif response_type is not None: 314 match = None 315 content_type = response_data.getheader('content-type') 316 if content_type is not None: 317 match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) 318 encoding = match.group(1) if match else "utf-8" 319 response_text = response_data.data.decode(encoding) 320 return_data = self.deserialize(response_text, response_type, content_type) 321 finally: 322 if not 200 <= response_data.status <= 299: 323 raise ApiException.from_response( 324 http_resp=response_data, 325 body=response_text, 326 data=return_data, 327 ) 328 329 return ApiResponse( 330 status_code = response_data.status, 331 data = return_data, 332 headers = response_data.getheaders(), 333 raw_data = response_data.data 334 ) 335 336 def sanitize_for_serialization(self, obj): 337 """Builds a JSON POST object. 338 339 If obj is None, return None. 340 If obj is SecretStr, return obj.get_secret_value() 341 If obj is str, int, long, float, bool, return directly. 342 If obj is datetime.datetime, datetime.date 343 convert to string in iso8601 format. 344 If obj is decimal.Decimal return string representation. 345 If obj is list, sanitize each element in the list. 346 If obj is dict, return the dict. 347 If obj is OpenAPI model, return the properties dict. 348 349 :param obj: The data to serialize. 350 :return: The serialized form of data. 351 """ 352 if obj is None: 353 return None 354 elif isinstance(obj, Enum): 355 return obj.value 356 elif isinstance(obj, SecretStr): 357 return obj.get_secret_value() 358 elif isinstance(obj, self.PRIMITIVE_TYPES): 359 return obj 360 elif isinstance(obj, list): 361 return [ 362 self.sanitize_for_serialization(sub_obj) for sub_obj in obj 363 ] 364 elif isinstance(obj, tuple): 365 return tuple( 366 self.sanitize_for_serialization(sub_obj) for sub_obj in obj 367 ) 368 elif isinstance(obj, (datetime.datetime, datetime.date)): 369 return obj.isoformat() 370 elif isinstance(obj, decimal.Decimal): 371 return str(obj) 372 373 elif isinstance(obj, dict): 374 obj_dict = obj 375 else: 376 # Convert model obj to dict except 377 # attributes `openapi_types`, `attribute_map` 378 # and attributes which value is not None. 379 # Convert attribute name to json key in 380 # model definition for request. 381 if hasattr(obj, 'to_dict') and callable(getattr(obj, 'to_dict')): 382 obj_dict = obj.to_dict() 383 else: 384 obj_dict = obj.__dict__ 385 386 return { 387 key: self.sanitize_for_serialization(val) 388 for key, val in obj_dict.items() 389 } 390 391 def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]): 392 """Deserializes response into an object. 393 394 :param response: RESTResponse object to be deserialized. 395 :param response_type: class literal for 396 deserialized object, or string of class name. 397 :param content_type: content type of response. 398 399 :return: deserialized object. 400 """ 401 402 # fetch data from response object 403 if content_type is None: 404 try: 405 data = json.loads(response_text) 406 except ValueError: 407 data = response_text 408 elif re.match(r'^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE): 409 if response_text == "": 410 data = "" 411 else: 412 data = json.loads(response_text) 413 elif re.match(r'^text\/[a-z.+-]+\s*(;|$)', content_type, re.IGNORECASE): 414 data = response_text 415 else: 416 raise ApiException( 417 status=0, 418 reason="Unsupported content type: {0}".format(content_type) 419 ) 420 421 return self.__deserialize(data, response_type) 422 423 def __deserialize(self, data, klass): 424 """Deserializes dict, list, str into an object. 425 426 :param data: dict, list or str. 427 :param klass: class literal, or string of class name. 428 429 :return: object. 430 """ 431 if data is None: 432 return None 433 434 if isinstance(klass, str): 435 if klass.startswith('List['): 436 m = re.match(r'List\[(.*)]', klass) 437 assert m is not None, "Malformed List type definition" 438 sub_kls = m.group(1) 439 return [self.__deserialize(sub_data, sub_kls) 440 for sub_data in data] 441 442 if klass.startswith('Dict['): 443 m = re.match(r'Dict\[([^,]*), (.*)]', klass) 444 assert m is not None, "Malformed Dict type definition" 445 sub_kls = m.group(2) 446 return {k: self.__deserialize(v, sub_kls) 447 for k, v in data.items()} 448 449 # convert str to class 450 if klass in self.NATIVE_TYPES_MAPPING: 451 klass = self.NATIVE_TYPES_MAPPING[klass] 452 else: 453 klass = getattr(vectorize_client.models, klass) 454 455 if klass in self.PRIMITIVE_TYPES: 456 return self.__deserialize_primitive(data, klass) 457 elif klass == object: 458 return self.__deserialize_object(data) 459 elif klass == datetime.date: 460 return self.__deserialize_date(data) 461 elif klass == datetime.datetime: 462 return self.__deserialize_datetime(data) 463 elif klass == decimal.Decimal: 464 return decimal.Decimal(data) 465 elif issubclass(klass, Enum): 466 return self.__deserialize_enum(data, klass) 467 else: 468 return self.__deserialize_model(data, klass) 469 470 def parameters_to_tuples(self, params, collection_formats): 471 """Get parameters as list of tuples, formatting collections. 472 473 :param params: Parameters as dict or list of two-tuples 474 :param dict collection_formats: Parameter collection formats 475 :return: Parameters as list of tuples, collections formatted 476 """ 477 new_params: List[Tuple[str, str]] = [] 478 if collection_formats is None: 479 collection_formats = {} 480 for k, v in params.items() if isinstance(params, dict) else params: 481 if k in collection_formats: 482 collection_format = collection_formats[k] 483 if collection_format == 'multi': 484 new_params.extend((k, value) for value in v) 485 else: 486 if collection_format == 'ssv': 487 delimiter = ' ' 488 elif collection_format == 'tsv': 489 delimiter = '\t' 490 elif collection_format == 'pipes': 491 delimiter = '|' 492 else: # csv is the default 493 delimiter = ',' 494 new_params.append( 495 (k, delimiter.join(str(value) for value in v))) 496 else: 497 new_params.append((k, v)) 498 return new_params 499 500 def parameters_to_url_query(self, params, collection_formats): 501 """Get parameters as list of tuples, formatting collections. 502 503 :param params: Parameters as dict or list of two-tuples 504 :param dict collection_formats: Parameter collection formats 505 :return: URL query string (e.g. a=Hello%20World&b=123) 506 """ 507 new_params: List[Tuple[str, str]] = [] 508 if collection_formats is None: 509 collection_formats = {} 510 for k, v in params.items() if isinstance(params, dict) else params: 511 if isinstance(v, bool): 512 v = str(v).lower() 513 if isinstance(v, (int, float)): 514 v = str(v) 515 if isinstance(v, dict): 516 v = json.dumps(v) 517 518 if k in collection_formats: 519 collection_format = collection_formats[k] 520 if collection_format == 'multi': 521 new_params.extend((k, quote(str(value))) for value in v) 522 else: 523 if collection_format == 'ssv': 524 delimiter = ' ' 525 elif collection_format == 'tsv': 526 delimiter = '\t' 527 elif collection_format == 'pipes': 528 delimiter = '|' 529 else: # csv is the default 530 delimiter = ',' 531 new_params.append( 532 (k, delimiter.join(quote(str(value)) for value in v)) 533 ) 534 else: 535 new_params.append((k, quote(str(v)))) 536 537 return "&".join(["=".join(map(str, item)) for item in new_params]) 538 539 def files_parameters( 540 self, 541 files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]], 542 ): 543 """Builds form parameters. 544 545 :param files: File parameters. 546 :return: Form parameters with files. 547 """ 548 params = [] 549 for k, v in files.items(): 550 if isinstance(v, str): 551 with open(v, 'rb') as f: 552 filename = os.path.basename(f.name) 553 filedata = f.read() 554 elif isinstance(v, bytes): 555 filename = k 556 filedata = v 557 elif isinstance(v, tuple): 558 filename, filedata = v 559 elif isinstance(v, list): 560 for file_param in v: 561 params.extend(self.files_parameters({k: file_param})) 562 continue 563 else: 564 raise ValueError("Unsupported file value") 565 mimetype = ( 566 mimetypes.guess_type(filename)[0] 567 or 'application/octet-stream' 568 ) 569 params.append( 570 tuple([k, tuple([filename, filedata, mimetype])]) 571 ) 572 return params 573 574 def select_header_accept(self, accepts: List[str]) -> Optional[str]: 575 """Returns `Accept` based on an array of accepts provided. 576 577 :param accepts: List of headers. 578 :return: Accept (e.g. application/json). 579 """ 580 if not accepts: 581 return None 582 583 for accept in accepts: 584 if re.search('json', accept, re.IGNORECASE): 585 return accept 586 587 return accepts[0] 588 589 def select_header_content_type(self, content_types): 590 """Returns `Content-Type` based on an array of content_types provided. 591 592 :param content_types: List of content-types. 593 :return: Content-Type (e.g. application/json). 594 """ 595 if not content_types: 596 return None 597 598 for content_type in content_types: 599 if re.search('json', content_type, re.IGNORECASE): 600 return content_type 601 602 return content_types[0] 603 604 def update_params_for_auth( 605 self, 606 headers, 607 queries, 608 auth_settings, 609 resource_path, 610 method, 611 body, 612 request_auth=None 613 ) -> None: 614 """Updates header and query params based on authentication setting. 615 616 :param headers: Header parameters dict to be updated. 617 :param queries: Query parameters tuple list to be updated. 618 :param auth_settings: Authentication setting identifiers list. 619 :resource_path: A string representation of the HTTP request resource path. 620 :method: A string representation of the HTTP request method. 621 :body: A object representing the body of the HTTP request. 622 The object type is the return value of sanitize_for_serialization(). 623 :param request_auth: if set, the provided settings will 624 override the token in the configuration. 625 """ 626 if not auth_settings: 627 return 628 629 if request_auth: 630 self._apply_auth_params( 631 headers, 632 queries, 633 resource_path, 634 method, 635 body, 636 request_auth 637 ) 638 else: 639 for auth in auth_settings: 640 auth_setting = self.configuration.auth_settings().get(auth) 641 if auth_setting: 642 self._apply_auth_params( 643 headers, 644 queries, 645 resource_path, 646 method, 647 body, 648 auth_setting 649 ) 650 651 def _apply_auth_params( 652 self, 653 headers, 654 queries, 655 resource_path, 656 method, 657 body, 658 auth_setting 659 ) -> None: 660 """Updates the request parameters based on a single auth_setting 661 662 :param headers: Header parameters dict to be updated. 663 :param queries: Query parameters tuple list to be updated. 664 :resource_path: A string representation of the HTTP request resource path. 665 :method: A string representation of the HTTP request method. 666 :body: A object representing the body of the HTTP request. 667 The object type is the return value of sanitize_for_serialization(). 668 :param auth_setting: auth settings for the endpoint 669 """ 670 if auth_setting['in'] == 'cookie': 671 headers['Cookie'] = auth_setting['value'] 672 elif auth_setting['in'] == 'header': 673 if auth_setting['type'] != 'http-signature': 674 headers[auth_setting['key']] = auth_setting['value'] 675 elif auth_setting['in'] == 'query': 676 queries.append((auth_setting['key'], auth_setting['value'])) 677 else: 678 raise ApiValueError( 679 'Authentication token must be in `query` or `header`' 680 ) 681 682 def __deserialize_file(self, response): 683 """Deserializes body to file 684 685 Saves response body into a file in a temporary folder, 686 using the filename from the `Content-Disposition` header if provided. 687 688 handle file downloading 689 save response body into a tmp file and return the instance 690 691 :param response: RESTResponse. 692 :return: file path. 693 """ 694 fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) 695 os.close(fd) 696 os.remove(path) 697 698 content_disposition = response.getheader("Content-Disposition") 699 if content_disposition: 700 m = re.search( 701 r'filename=[\'"]?([^\'"\s]+)[\'"]?', 702 content_disposition 703 ) 704 assert m is not None, "Unexpected 'content-disposition' header value" 705 filename = m.group(1) 706 path = os.path.join(os.path.dirname(path), filename) 707 708 with open(path, "wb") as f: 709 f.write(response.data) 710 711 return path 712 713 def __deserialize_primitive(self, data, klass): 714 """Deserializes string to primitive type. 715 716 :param data: str. 717 :param klass: class literal. 718 719 :return: int, long, float, str, bool. 720 """ 721 try: 722 return klass(data) 723 except UnicodeEncodeError: 724 return str(data) 725 except TypeError: 726 return data 727 728 def __deserialize_object(self, value): 729 """Return an original value. 730 731 :return: object. 732 """ 733 return value 734 735 def __deserialize_date(self, string): 736 """Deserializes string to date. 737 738 :param string: str. 739 :return: date. 740 """ 741 try: 742 return parse(string).date() 743 except ImportError: 744 return string 745 except ValueError: 746 raise rest.ApiException( 747 status=0, 748 reason="Failed to parse `{0}` as date object".format(string) 749 ) 750 751 def __deserialize_datetime(self, string): 752 """Deserializes string to datetime. 753 754 The string should be in iso8601 datetime format. 755 756 :param string: str. 757 :return: datetime. 758 """ 759 try: 760 return parse(string) 761 except ImportError: 762 return string 763 except ValueError: 764 raise rest.ApiException( 765 status=0, 766 reason=( 767 "Failed to parse `{0}` as datetime object" 768 .format(string) 769 ) 770 ) 771 772 def __deserialize_enum(self, data, klass): 773 """Deserializes primitive type to enum. 774 775 :param data: primitive type. 776 :param klass: class literal. 777 :return: enum value. 778 """ 779 try: 780 return klass(data) 781 except ValueError: 782 raise rest.ApiException( 783 status=0, 784 reason=( 785 "Failed to parse `{0}` as `{1}`" 786 .format(data, klass) 787 ) 788 ) 789 790 def __deserialize_model(self, data, klass): 791 """Deserializes list or dict to model. 792 793 :param data: dict, list. 794 :param klass: class literal. 795 :return: model object. 796 """ 797 798 return klass.from_dict(data)
Generic API client for OpenAPI client library builds.
OpenAPI generic API client. This client handles the client- server communication, and is invariant across implementations. Specifics of the methods and models for each application are generated from the OpenAPI templates.
Parameters
- configuration: .Configuration object for this client
- header_name: a header to pass when making calls to the API.
- header_value: a header value to pass when making calls to the API.
- cookie: a cookie to include in the header when making calls to the API
76 def __init__( 77 self, 78 configuration=None, 79 header_name=None, 80 header_value=None, 81 cookie=None 82 ) -> None: 83 # use default configuration if none is provided 84 if configuration is None: 85 configuration = Configuration.get_default() 86 self.configuration = configuration 87 88 self.rest_client = rest.RESTClientObject(configuration) 89 self.default_headers = {} 90 if header_name is not None: 91 self.default_headers[header_name] = header_value 92 self.cookie = cookie 93 # Set default User-Agent. 94 self.user_agent = 'OpenAPI-Generator/1.0.0/python' 95 self.client_side_validation = configuration.client_side_validation
103 @property 104 def user_agent(self): 105 """User agent for this API client""" 106 return self.default_headers['User-Agent']
User agent for this API client
118 @classmethod 119 def get_default(cls): 120 """Return new instance of ApiClient. 121 122 This method returns newly created, based on default constructor, 123 object of ApiClient class or returns a copy of default 124 ApiClient. 125 126 :return: The ApiClient object. 127 """ 128 if cls._default is None: 129 cls._default = ApiClient() 130 return cls._default
Return new instance of ApiClient.
This method returns newly created, based on default constructor, object of ApiClient class or returns a copy of default ApiClient.
Returns
The ApiClient object.
132 @classmethod 133 def set_default(cls, default): 134 """Set default instance of ApiClient. 135 136 It stores default ApiClient. 137 138 :param default: object of ApiClient. 139 """ 140 cls._default = default
Set default instance of ApiClient.
It stores default ApiClient.
Parameters
- default: object of ApiClient.
142 def param_serialize( 143 self, 144 method, 145 resource_path, 146 path_params=None, 147 query_params=None, 148 header_params=None, 149 body=None, 150 post_params=None, 151 files=None, auth_settings=None, 152 collection_formats=None, 153 _host=None, 154 _request_auth=None 155 ) -> RequestSerialized: 156 157 """Builds the HTTP request params needed by the request. 158 :param method: Method to call. 159 :param resource_path: Path to method endpoint. 160 :param path_params: Path parameters in the url. 161 :param query_params: Query parameters in the url. 162 :param header_params: Header parameters to be 163 placed in the request header. 164 :param body: Request body. 165 :param post_params dict: Request post form parameters, 166 for `application/x-www-form-urlencoded`, `multipart/form-data`. 167 :param auth_settings list: Auth Settings names for the request. 168 :param files dict: key -> filename, value -> filepath, 169 for `multipart/form-data`. 170 :param collection_formats: dict of collection formats for path, query, 171 header, and post parameters. 172 :param _request_auth: set to override the auth_settings for an a single 173 request; this effectively ignores the authentication 174 in the spec for a single request. 175 :return: tuple of form (path, http_method, query_params, header_params, 176 body, post_params, files) 177 """ 178 179 config = self.configuration 180 181 # header parameters 182 header_params = header_params or {} 183 header_params.update(self.default_headers) 184 if self.cookie: 185 header_params['Cookie'] = self.cookie 186 if header_params: 187 header_params = self.sanitize_for_serialization(header_params) 188 header_params = dict( 189 self.parameters_to_tuples(header_params,collection_formats) 190 ) 191 192 # path parameters 193 if path_params: 194 path_params = self.sanitize_for_serialization(path_params) 195 path_params = self.parameters_to_tuples( 196 path_params, 197 collection_formats 198 ) 199 for k, v in path_params: 200 # specified safe chars, encode everything 201 resource_path = resource_path.replace( 202 '{%s}' % k, 203 quote(str(v), safe=config.safe_chars_for_path_param) 204 ) 205 206 # post parameters 207 if post_params or files: 208 post_params = post_params if post_params else [] 209 post_params = self.sanitize_for_serialization(post_params) 210 post_params = self.parameters_to_tuples( 211 post_params, 212 collection_formats 213 ) 214 if files: 215 post_params.extend(self.files_parameters(files)) 216 217 # auth setting 218 self.update_params_for_auth( 219 header_params, 220 query_params, 221 auth_settings, 222 resource_path, 223 method, 224 body, 225 request_auth=_request_auth 226 ) 227 228 # body 229 if body: 230 body = self.sanitize_for_serialization(body) 231 232 # request url 233 if _host is None or self.configuration.ignore_operation_servers: 234 url = self.configuration.host + resource_path 235 else: 236 # use server/host defined in path or operation instead 237 url = _host + resource_path 238 239 # query parameters 240 if query_params: 241 query_params = self.sanitize_for_serialization(query_params) 242 url_query = self.parameters_to_url_query( 243 query_params, 244 collection_formats 245 ) 246 url += "?" + url_query 247 248 return method, url, header_params, body, post_params
Builds the HTTP request params needed by the request.
Parameters
- method: Method to call.
- resource_path: Path to method endpoint.
- path_params: Path parameters in the url.
- query_params: Query parameters in the url.
- header_params: Header parameters to be placed in the request header.
- body: Request body.
- post_params dict: Request post form parameters,
for
application/x-www-form-urlencoded
,multipart/form-data
. - auth_settings list: Auth Settings names for the request.
- files dict: key -> filename, value -> filepath,
for
multipart/form-data
. - collection_formats: dict of collection formats for path, query, header, and post parameters.
- _request_auth: set to override the auth_settings for an a single request; this effectively ignores the authentication in the spec for a single request.
Returns
tuple of form (path, http_method, query_params, header_params, body, post_params, files)
251 def call_api( 252 self, 253 method, 254 url, 255 header_params=None, 256 body=None, 257 post_params=None, 258 _request_timeout=None 259 ) -> rest.RESTResponse: 260 """Makes the HTTP request (synchronous) 261 :param method: Method to call. 262 :param url: Path to method endpoint. 263 :param header_params: Header parameters to be 264 placed in the request header. 265 :param body: Request body. 266 :param post_params dict: Request post form parameters, 267 for `application/x-www-form-urlencoded`, `multipart/form-data`. 268 :param _request_timeout: timeout setting for this request. 269 :return: RESTResponse 270 """ 271 272 try: 273 # perform request and return response 274 response_data = self.rest_client.request( 275 method, url, 276 headers=header_params, 277 body=body, post_params=post_params, 278 _request_timeout=_request_timeout 279 ) 280 281 except ApiException as e: 282 raise e 283 284 return response_data
Makes the HTTP request (synchronous)
Parameters
- method: Method to call.
- url: Path to method endpoint.
- header_params: Header parameters to be placed in the request header.
- body: Request body.
- post_params dict: Request post form parameters,
for
application/x-www-form-urlencoded
,multipart/form-data
. - _request_timeout: timeout setting for this request.
Returns
RESTResponse
286 def response_deserialize( 287 self, 288 response_data: rest.RESTResponse, 289 response_types_map: Optional[Dict[str, ApiResponseT]]=None 290 ) -> ApiResponse[ApiResponseT]: 291 """Deserializes response into an object. 292 :param response_data: RESTResponse object to be deserialized. 293 :param response_types_map: dict of response types. 294 :return: ApiResponse 295 """ 296 297 msg = "RESTResponse.read() must be called before passing it to response_deserialize()" 298 assert response_data.data is not None, msg 299 300 response_type = response_types_map.get(str(response_data.status), None) 301 if not response_type and isinstance(response_data.status, int) and 100 <= response_data.status <= 599: 302 # if not found, look for '1XX', '2XX', etc. 303 response_type = response_types_map.get(str(response_data.status)[0] + "XX", None) 304 305 # deserialize response data 306 response_text = None 307 return_data = None 308 try: 309 if response_type == "bytearray": 310 return_data = response_data.data 311 elif response_type == "file": 312 return_data = self.__deserialize_file(response_data) 313 elif response_type is not None: 314 match = None 315 content_type = response_data.getheader('content-type') 316 if content_type is not None: 317 match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) 318 encoding = match.group(1) if match else "utf-8" 319 response_text = response_data.data.decode(encoding) 320 return_data = self.deserialize(response_text, response_type, content_type) 321 finally: 322 if not 200 <= response_data.status <= 299: 323 raise ApiException.from_response( 324 http_resp=response_data, 325 body=response_text, 326 data=return_data, 327 ) 328 329 return ApiResponse( 330 status_code = response_data.status, 331 data = return_data, 332 headers = response_data.getheaders(), 333 raw_data = response_data.data 334 )
Deserializes response into an object.
Parameters
- response_data: RESTResponse object to be deserialized.
- response_types_map: dict of response types.
Returns
ApiResponse
336 def sanitize_for_serialization(self, obj): 337 """Builds a JSON POST object. 338 339 If obj is None, return None. 340 If obj is SecretStr, return obj.get_secret_value() 341 If obj is str, int, long, float, bool, return directly. 342 If obj is datetime.datetime, datetime.date 343 convert to string in iso8601 format. 344 If obj is decimal.Decimal return string representation. 345 If obj is list, sanitize each element in the list. 346 If obj is dict, return the dict. 347 If obj is OpenAPI model, return the properties dict. 348 349 :param obj: The data to serialize. 350 :return: The serialized form of data. 351 """ 352 if obj is None: 353 return None 354 elif isinstance(obj, Enum): 355 return obj.value 356 elif isinstance(obj, SecretStr): 357 return obj.get_secret_value() 358 elif isinstance(obj, self.PRIMITIVE_TYPES): 359 return obj 360 elif isinstance(obj, list): 361 return [ 362 self.sanitize_for_serialization(sub_obj) for sub_obj in obj 363 ] 364 elif isinstance(obj, tuple): 365 return tuple( 366 self.sanitize_for_serialization(sub_obj) for sub_obj in obj 367 ) 368 elif isinstance(obj, (datetime.datetime, datetime.date)): 369 return obj.isoformat() 370 elif isinstance(obj, decimal.Decimal): 371 return str(obj) 372 373 elif isinstance(obj, dict): 374 obj_dict = obj 375 else: 376 # Convert model obj to dict except 377 # attributes `openapi_types`, `attribute_map` 378 # and attributes which value is not None. 379 # Convert attribute name to json key in 380 # model definition for request. 381 if hasattr(obj, 'to_dict') and callable(getattr(obj, 'to_dict')): 382 obj_dict = obj.to_dict() 383 else: 384 obj_dict = obj.__dict__ 385 386 return { 387 key: self.sanitize_for_serialization(val) 388 for key, val in obj_dict.items() 389 }
Builds a JSON POST object.
If obj is None, return None. If obj is SecretStr, return obj.get_secret_value() If obj is str, int, long, float, bool, return directly. If obj is datetime.datetime, datetime.date convert to string in iso8601 format. If obj is decimal.Decimal return string representation. If obj is list, sanitize each element in the list. If obj is dict, return the dict. If obj is OpenAPI model, return the properties dict.
Parameters
- obj: The data to serialize.
Returns
The serialized form of data.
391 def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]): 392 """Deserializes response into an object. 393 394 :param response: RESTResponse object to be deserialized. 395 :param response_type: class literal for 396 deserialized object, or string of class name. 397 :param content_type: content type of response. 398 399 :return: deserialized object. 400 """ 401 402 # fetch data from response object 403 if content_type is None: 404 try: 405 data = json.loads(response_text) 406 except ValueError: 407 data = response_text 408 elif re.match(r'^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE): 409 if response_text == "": 410 data = "" 411 else: 412 data = json.loads(response_text) 413 elif re.match(r'^text\/[a-z.+-]+\s*(;|$)', content_type, re.IGNORECASE): 414 data = response_text 415 else: 416 raise ApiException( 417 status=0, 418 reason="Unsupported content type: {0}".format(content_type) 419 ) 420 421 return self.__deserialize(data, response_type)
Deserializes response into an object.
Parameters
- response: RESTResponse object to be deserialized.
- response_type: class literal for deserialized object, or string of class name.
- content_type: content type of response.
Returns
deserialized object.
470 def parameters_to_tuples(self, params, collection_formats): 471 """Get parameters as list of tuples, formatting collections. 472 473 :param params: Parameters as dict or list of two-tuples 474 :param dict collection_formats: Parameter collection formats 475 :return: Parameters as list of tuples, collections formatted 476 """ 477 new_params: List[Tuple[str, str]] = [] 478 if collection_formats is None: 479 collection_formats = {} 480 for k, v in params.items() if isinstance(params, dict) else params: 481 if k in collection_formats: 482 collection_format = collection_formats[k] 483 if collection_format == 'multi': 484 new_params.extend((k, value) for value in v) 485 else: 486 if collection_format == 'ssv': 487 delimiter = ' ' 488 elif collection_format == 'tsv': 489 delimiter = '\t' 490 elif collection_format == 'pipes': 491 delimiter = '|' 492 else: # csv is the default 493 delimiter = ',' 494 new_params.append( 495 (k, delimiter.join(str(value) for value in v))) 496 else: 497 new_params.append((k, v)) 498 return new_params
Get parameters as list of tuples, formatting collections.
Parameters
- params: Parameters as dict or list of two-tuples
- dict collection_formats: Parameter collection formats
Returns
Parameters as list of tuples, collections formatted
500 def parameters_to_url_query(self, params, collection_formats): 501 """Get parameters as list of tuples, formatting collections. 502 503 :param params: Parameters as dict or list of two-tuples 504 :param dict collection_formats: Parameter collection formats 505 :return: URL query string (e.g. a=Hello%20World&b=123) 506 """ 507 new_params: List[Tuple[str, str]] = [] 508 if collection_formats is None: 509 collection_formats = {} 510 for k, v in params.items() if isinstance(params, dict) else params: 511 if isinstance(v, bool): 512 v = str(v).lower() 513 if isinstance(v, (int, float)): 514 v = str(v) 515 if isinstance(v, dict): 516 v = json.dumps(v) 517 518 if k in collection_formats: 519 collection_format = collection_formats[k] 520 if collection_format == 'multi': 521 new_params.extend((k, quote(str(value))) for value in v) 522 else: 523 if collection_format == 'ssv': 524 delimiter = ' ' 525 elif collection_format == 'tsv': 526 delimiter = '\t' 527 elif collection_format == 'pipes': 528 delimiter = '|' 529 else: # csv is the default 530 delimiter = ',' 531 new_params.append( 532 (k, delimiter.join(quote(str(value)) for value in v)) 533 ) 534 else: 535 new_params.append((k, quote(str(v)))) 536 537 return "&".join(["=".join(map(str, item)) for item in new_params])
Get parameters as list of tuples, formatting collections.
Parameters
- params: Parameters as dict or list of two-tuples
- dict collection_formats: Parameter collection formats
Returns
URL query string (e.g. a=Hello%20World&b=123)
539 def files_parameters( 540 self, 541 files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]], 542 ): 543 """Builds form parameters. 544 545 :param files: File parameters. 546 :return: Form parameters with files. 547 """ 548 params = [] 549 for k, v in files.items(): 550 if isinstance(v, str): 551 with open(v, 'rb') as f: 552 filename = os.path.basename(f.name) 553 filedata = f.read() 554 elif isinstance(v, bytes): 555 filename = k 556 filedata = v 557 elif isinstance(v, tuple): 558 filename, filedata = v 559 elif isinstance(v, list): 560 for file_param in v: 561 params.extend(self.files_parameters({k: file_param})) 562 continue 563 else: 564 raise ValueError("Unsupported file value") 565 mimetype = ( 566 mimetypes.guess_type(filename)[0] 567 or 'application/octet-stream' 568 ) 569 params.append( 570 tuple([k, tuple([filename, filedata, mimetype])]) 571 ) 572 return params
Builds form parameters.
Parameters
- files: File parameters.
Returns
Form parameters with files.
574 def select_header_accept(self, accepts: List[str]) -> Optional[str]: 575 """Returns `Accept` based on an array of accepts provided. 576 577 :param accepts: List of headers. 578 :return: Accept (e.g. application/json). 579 """ 580 if not accepts: 581 return None 582 583 for accept in accepts: 584 if re.search('json', accept, re.IGNORECASE): 585 return accept 586 587 return accepts[0]
Returns Accept
based on an array of accepts provided.
Parameters
- accepts: List of headers.
Returns
Accept (e.g. application/json).
589 def select_header_content_type(self, content_types): 590 """Returns `Content-Type` based on an array of content_types provided. 591 592 :param content_types: List of content-types. 593 :return: Content-Type (e.g. application/json). 594 """ 595 if not content_types: 596 return None 597 598 for content_type in content_types: 599 if re.search('json', content_type, re.IGNORECASE): 600 return content_type 601 602 return content_types[0]
Returns Content-Type
based on an array of content_types provided.
Parameters
- content_types: List of content-types.
Returns
Content-Type (e.g. application/json).
604 def update_params_for_auth( 605 self, 606 headers, 607 queries, 608 auth_settings, 609 resource_path, 610 method, 611 body, 612 request_auth=None 613 ) -> None: 614 """Updates header and query params based on authentication setting. 615 616 :param headers: Header parameters dict to be updated. 617 :param queries: Query parameters tuple list to be updated. 618 :param auth_settings: Authentication setting identifiers list. 619 :resource_path: A string representation of the HTTP request resource path. 620 :method: A string representation of the HTTP request method. 621 :body: A object representing the body of the HTTP request. 622 The object type is the return value of sanitize_for_serialization(). 623 :param request_auth: if set, the provided settings will 624 override the token in the configuration. 625 """ 626 if not auth_settings: 627 return 628 629 if request_auth: 630 self._apply_auth_params( 631 headers, 632 queries, 633 resource_path, 634 method, 635 body, 636 request_auth 637 ) 638 else: 639 for auth in auth_settings: 640 auth_setting = self.configuration.auth_settings().get(auth) 641 if auth_setting: 642 self._apply_auth_params( 643 headers, 644 queries, 645 resource_path, 646 method, 647 body, 648 auth_setting 649 )
Updates header and query params based on authentication setting.
Parameters
- headers: Header parameters dict to be updated.
- queries: Query parameters tuple list to be updated.
- auth_settings: Authentication setting identifiers list. :resource_path: A string representation of the HTTP request resource path. :method: A string representation of the HTTP request method. :body: A object representing the body of the HTTP request. The object type is the return value of sanitize_for_serialization().
- request_auth: if set, the provided settings will override the token in the configuration.