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)
RequestSerialized = typing.Tuple[str, str, typing.Dict[str, str], typing.Optional[str], typing.List[str]]
class ApiClient:
 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
ApiClient(configuration=None, header_name=None, header_value=None, cookie=None)
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
PRIMITIVE_TYPES = (<class 'float'>, <class 'bool'>, <class 'bytes'>, <class 'str'>, <class 'int'>)
NATIVE_TYPES_MAPPING = {'int': <class 'int'>, 'long': <class 'int'>, 'float': <class 'float'>, 'str': <class 'str'>, 'bool': <class 'bool'>, 'date': <class 'datetime.date'>, 'datetime': <class 'datetime.datetime'>, 'decimal': <class 'decimal.Decimal'>, 'object': <class 'object'>}
configuration
rest_client
default_headers
cookie
user_agent
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

client_side_validation
def set_default_header(self, header_name, header_value):
112    def set_default_header(self, header_name, header_value):
113        self.default_headers[header_name] = header_value
@classmethod
def get_default(cls):
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.

@classmethod
def set_default(cls, default):
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.
def param_serialize( self, method, resource_path, path_params=None, query_params=None, header_params=None, body=None, post_params=None, files=None, auth_settings=None, collection_formats=None, _host=None, _request_auth=None) -> Tuple[str, str, Dict[str, str], Optional[str], List[str]]:
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)

def call_api( self, method, url, header_params=None, body=None, post_params=None, _request_timeout=None) -> vectorize_client.rest.RESTResponse:
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

def response_deserialize( self, response_data: vectorize_client.rest.RESTResponse, response_types_map: Optional[Dict[str, ~T]] = None) -> vectorize_client.api_response.ApiResponse:
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

def sanitize_for_serialization(self, obj):
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.

def deserialize( self, response_text: str, response_type: str, content_type: Optional[str]):
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.

def parameters_to_tuples(self, params, collection_formats):
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

def parameters_to_url_query(self, params, collection_formats):
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)

def files_parameters( self, files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]]):
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.

def select_header_accept(self, accepts: List[str]) -> Optional[str]:
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).

def select_header_content_type(self, content_types):
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).

def update_params_for_auth( self, headers, queries, auth_settings, resource_path, method, body, request_auth=None) -> None:
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.