regula-facesdk-webclient 7.2.388.dev0__py3-none-any.whl → 8.1.433.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- regula/facesdk/webclient/__init__.py +5 -5
- regula/facesdk/webclient/ext/api/group_api.py +2 -27
- regula/facesdk/webclient/ext/api/match_api.py +3 -29
- regula/facesdk/webclient/ext/api/person_api.py +8 -34
- regula/facesdk/webclient/ext/api/sdk.py +5 -3
- regula/facesdk/webclient/ext/api/search_api.py +2 -6
- regula/facesdk/webclient/ext/models/detect_request.py +6 -5
- regula/facesdk/webclient/ext/models/match_image.py +3 -3
- regula/facesdk/webclient/ext/models/match_request.py +7 -5
- regula/facesdk/webclient/gen/__init__.py +349 -18
- regula/facesdk/webclient/gen/api/__init__.py +30 -3
- regula/facesdk/webclient/gen/api/group_api.py +1854 -799
- regula/facesdk/webclient/gen/api/healthcheck_api.py +475 -215
- regula/facesdk/webclient/gen/api/liveness20_api.py +565 -0
- regula/facesdk/webclient/gen/api/match_api.py +801 -355
- regula/facesdk/webclient/gen/api/person_api.py +2399 -1039
- regula/facesdk/webclient/gen/api/search_api.py +286 -130
- regula/facesdk/webclient/gen/api_client.py +577 -476
- regula/facesdk/webclient/gen/api_response.py +21 -0
- regula/facesdk/webclient/gen/configuration.py +231 -105
- regula/facesdk/webclient/gen/exceptions.py +82 -33
- regula/facesdk/webclient/gen/models/__init__.py +202 -95
- regula/facesdk/webclient/gen/models/add_image_to_person_request.py +96 -0
- regula/facesdk/webclient/gen/models/add_image_to_person_request_data.py +92 -0
- regula/facesdk/webclient/gen/models/add_image_to_person_request_image.py +92 -0
- regula/facesdk/webclient/gen/models/add_image_to_person_response.py +92 -0
- regula/facesdk/webclient/gen/models/attribute_config.py +83 -0
- regula/facesdk/webclient/gen/models/attributes_data.py +82 -0
- regula/facesdk/webclient/gen/models/crop.py +88 -0
- regula/facesdk/webclient/gen/models/detail_item.py +136 -0
- regula/facesdk/webclient/gen/models/detect_attributes_details.py +84 -0
- regula/facesdk/webclient/gen/models/detect_details_meta.py +86 -0
- regula/facesdk/webclient/gen/models/detect_meta_data.py +84 -0
- regula/facesdk/webclient/gen/models/detect_request.py +94 -0
- regula/facesdk/webclient/gen/models/detect_request_data.py +90 -0
- regula/facesdk/webclient/gen/models/detect_response.py +89 -0
- regula/facesdk/webclient/gen/models/detect_response_results.py +86 -0
- regula/facesdk/webclient/gen/models/detect_result.py +98 -0
- regula/facesdk/webclient/gen/models/detection.py +98 -0
- regula/facesdk/webclient/gen/models/detection_attributes.py +92 -0
- regula/facesdk/webclient/gen/models/detection_attributes_details_inner.py +132 -0
- regula/facesdk/webclient/gen/models/detection_face.py +90 -0
- regula/facesdk/webclient/gen/models/detection_quality.py +107 -0
- regula/facesdk/webclient/gen/models/device_info.py +111 -0
- regula/facesdk/webclient/gen/models/face_attribute.py +40 -0
- regula/facesdk/webclient/gen/models/face_image_quality_align_type.py +32 -0
- regula/facesdk/webclient/gen/models/face_image_quality_groups.py +35 -0
- regula/facesdk/webclient/gen/models/face_image_quality_groups_strings.py +35 -0
- regula/facesdk/webclient/gen/models/face_image_quality_status.py +30 -0
- regula/facesdk/webclient/gen/models/face_quality_config_name.py +75 -0
- regula/facesdk/webclient/gen/models/face_quality_scenarios.py +37 -0
- regula/facesdk/webclient/gen/models/face_sdk_result.py +83 -0
- regula/facesdk/webclient/gen/models/face_sdk_result_code.py +68 -0
- regula/facesdk/webclient/gen/models/faces_response.py +100 -0
- regula/facesdk/webclient/gen/models/faces_response_data.py +90 -0
- regula/facesdk/webclient/gen/models/filter_op.py +29 -0
- regula/facesdk/webclient/gen/models/filter_search_request.py +87 -0
- regula/facesdk/webclient/gen/models/group.py +89 -0
- regula/facesdk/webclient/gen/models/group_data.py +85 -0
- regula/facesdk/webclient/gen/models/group_page.py +94 -0
- regula/facesdk/webclient/gen/models/group_page_items.py +90 -0
- regula/facesdk/webclient/gen/models/group_response.py +84 -0
- regula/facesdk/webclient/gen/models/group_to_create.py +86 -0
- regula/facesdk/webclient/gen/models/image.py +96 -0
- regula/facesdk/webclient/gen/models/image_fields.py +100 -0
- regula/facesdk/webclient/gen/models/image_fields_image.py +92 -0
- regula/facesdk/webclient/gen/models/image_page.py +94 -0
- regula/facesdk/webclient/gen/models/image_page_items.py +90 -0
- regula/facesdk/webclient/gen/models/image_source.py +34 -0
- regula/facesdk/webclient/gen/models/liveness_type.py +29 -0
- regula/facesdk/webclient/gen/models/match_and_search_request.py +103 -0
- regula/facesdk/webclient/gen/models/match_and_search_request_images_item.py +87 -0
- regula/facesdk/webclient/gen/models/match_and_search_response.py +107 -0
- regula/facesdk/webclient/gen/models/match_and_search_response_data.py +104 -0
- regula/facesdk/webclient/gen/models/match_and_search_response_data_detections_item.py +95 -0
- regula/facesdk/webclient/gen/models/match_image.py +89 -0
- regula/facesdk/webclient/gen/models/match_image_detection.py +95 -0
- regula/facesdk/webclient/gen/models/match_image_result.py +97 -0
- regula/facesdk/webclient/gen/models/match_request.py +102 -0
- regula/facesdk/webclient/gen/models/match_request_data.py +98 -0
- regula/facesdk/webclient/gen/models/match_response.py +105 -0
- regula/facesdk/webclient/gen/models/match_response_data.py +102 -0
- regula/facesdk/webclient/gen/models/operation_log.py +88 -0
- regula/facesdk/webclient/gen/models/output_image_params.py +89 -0
- regula/facesdk/webclient/gen/models/page.py +84 -0
- regula/facesdk/webclient/gen/models/person.py +97 -0
- regula/facesdk/webclient/gen/models/person_data.py +87 -0
- regula/facesdk/webclient/gen/models/person_fields.py +91 -0
- regula/facesdk/webclient/gen/models/person_items.py +90 -0
- regula/facesdk/webclient/gen/models/person_to_update_fields.py +89 -0
- regula/facesdk/webclient/gen/models/person_with_images.py +107 -0
- regula/facesdk/webclient/gen/models/person_with_images_data.py +90 -0
- regula/facesdk/webclient/gen/models/persons_page.py +94 -0
- regula/facesdk/webclient/gen/models/process_param.py +103 -0
- regula/facesdk/webclient/gen/models/process_param_attributes.py +90 -0
- regula/facesdk/webclient/gen/models/quality_config.py +86 -0
- regula/facesdk/webclient/gen/models/quality_detail.py +94 -0
- regula/facesdk/webclient/gen/models/quality_details_groups.py +90 -0
- regula/facesdk/webclient/gen/models/quality_request.py +93 -0
- regula/facesdk/webclient/gen/models/recognize_image.py +100 -0
- regula/facesdk/webclient/gen/models/recognize_image_data.py +84 -0
- regula/facesdk/webclient/gen/models/resize_options.py +86 -0
- regula/facesdk/webclient/gen/models/search_bad_params.py +86 -0
- regula/facesdk/webclient/gen/models/search_detection.py +102 -0
- regula/facesdk/webclient/gen/models/search_parameters.py +95 -0
- regula/facesdk/webclient/gen/models/search_parameters_create_person.py +86 -0
- regula/facesdk/webclient/gen/models/search_person.py +113 -0
- regula/facesdk/webclient/gen/models/search_person_data.py +96 -0
- regula/facesdk/webclient/gen/models/search_request.py +119 -0
- regula/facesdk/webclient/gen/models/search_result.py +92 -0
- regula/facesdk/webclient/gen/models/transaction_info.py +99 -0
- regula/facesdk/webclient/gen/models/transaction_labels.py +84 -0
- regula/facesdk/webclient/gen/models/update_group.py +85 -0
- regula/facesdk/webclient/gen/py.typed +0 -0
- regula/facesdk/webclient/gen/rest.py +136 -232
- {regula_facesdk_webclient-7.2.388.dev0.dist-info → regula_facesdk_webclient-8.1.433.dev0.dist-info}/METADATA +7 -4
- regula_facesdk_webclient-8.1.433.dev0.dist-info/RECORD +125 -0
- {regula_facesdk_webclient-7.2.388.dev0.dist-info → regula_facesdk_webclient-8.1.433.dev0.dist-info}/WHEEL +1 -1
- regula/facesdk/webclient/gen/api/diagnostics_api.py +0 -162
- regula/facesdk/webclient/gen/api/liveness_2_0_api.py +0 -306
- regula/facesdk/webclient/gen/api/liveness_api.py +0 -424
- regula/facesdk/webclient/gen/apis/__init__.py +0 -22
- regula/facesdk/webclient/gen/model/__init__.py +0 -5
- regula/facesdk/webclient/gen/model/add_image_to_person_request.py +0 -261
- regula/facesdk/webclient/gen/model/add_image_to_person_request_image.py +0 -204
- regula/facesdk/webclient/gen/model/add_image_to_person_response.py +0 -262
- regula/facesdk/webclient/gen/model/attribute_config.py +0 -120
- regula/facesdk/webclient/gen/model/attribute_config_list.py +0 -92
- regula/facesdk/webclient/gen/model/crop.py +0 -180
- regula/facesdk/webclient/gen/model/detect_attributes_details.py +0 -150
- regula/facesdk/webclient/gen/model/detect_details_meta.py +0 -178
- regula/facesdk/webclient/gen/model/detect_request.py +0 -232
- regula/facesdk/webclient/gen/model/detect_request_attributes.py +0 -120
- regula/facesdk/webclient/gen/model/detect_response.py +0 -147
- regula/facesdk/webclient/gen/model/detect_response_all_of.py +0 -120
- regula/facesdk/webclient/gen/model/detect_result.py +0 -235
- regula/facesdk/webclient/gen/model/detection.py +0 -230
- regula/facesdk/webclient/gen/model/detection_attributes.py +0 -150
- regula/facesdk/webclient/gen/model/detection_face.py +0 -232
- regula/facesdk/webclient/gen/model/detection_quality.py +0 -234
- regula/facesdk/webclient/gen/model/device_info.py +0 -231
- regula/facesdk/webclient/gen/model/face_align_type_quality.py +0 -109
- regula/facesdk/webclient/gen/model/face_attribute.py +0 -133
- regula/facesdk/webclient/gen/model/face_image_quality_align_type.py +0 -109
- regula/facesdk/webclient/gen/model/face_image_quality_groups.py +0 -118
- regula/facesdk/webclient/gen/model/face_image_quality_groups_strings.py +0 -118
- regula/facesdk/webclient/gen/model/face_image_quality_status.py +0 -103
- regula/facesdk/webclient/gen/model/face_quality_config_name.py +0 -238
- regula/facesdk/webclient/gen/model/face_quality_scenarios.py +0 -124
- regula/facesdk/webclient/gen/model/face_quality_status.py +0 -103
- regula/facesdk/webclient/gen/model/face_rectangular.py +0 -92
- regula/facesdk/webclient/gen/model/face_sdk_result.py +0 -121
- regula/facesdk/webclient/gen/model/face_sdk_result_code.py +0 -217
- regula/facesdk/webclient/gen/model/faces_response.py +0 -258
- regula/facesdk/webclient/gen/model/faces_response_all_of.py +0 -148
- regula/facesdk/webclient/gen/model/filter_op.py +0 -100
- regula/facesdk/webclient/gen/model/filter_search_request.py +0 -176
- regula/facesdk/webclient/gen/model/group.py +0 -206
- regula/facesdk/webclient/gen/model/group_all_of.py +0 -150
- regula/facesdk/webclient/gen/model/group_page.py +0 -178
- regula/facesdk/webclient/gen/model/group_page_all_of.py +0 -122
- regula/facesdk/webclient/gen/model/group_response.py +0 -150
- regula/facesdk/webclient/gen/model/group_to_create.py +0 -180
- regula/facesdk/webclient/gen/model/image.py +0 -318
- regula/facesdk/webclient/gen/model/image_fields.py +0 -258
- regula/facesdk/webclient/gen/model/image_fields_image.py +0 -204
- regula/facesdk/webclient/gen/model/image_page.py +0 -176
- regula/facesdk/webclient/gen/model/image_page_all_of.py +0 -120
- regula/facesdk/webclient/gen/model/image_source.py +0 -115
- regula/facesdk/webclient/gen/model/liveness_transaction.py +0 -334
- regula/facesdk/webclient/gen/model/liveness_type.py +0 -100
- regula/facesdk/webclient/gen/model/match_and_search_request.py +0 -290
- regula/facesdk/webclient/gen/model/match_and_search_request_all_of.py +0 -234
- regula/facesdk/webclient/gen/model/match_and_search_request_all_of_images.py +0 -148
- regula/facesdk/webclient/gen/model/match_and_search_request_images.py +0 -176
- regula/facesdk/webclient/gen/model/match_and_search_response.py +0 -233
- regula/facesdk/webclient/gen/model/match_and_search_response_all_of.py +0 -206
- regula/facesdk/webclient/gen/model/match_and_search_response_all_of_detections.py +0 -176
- regula/facesdk/webclient/gen/model/match_image.py +0 -205
- regula/facesdk/webclient/gen/model/match_image_detection.py +0 -178
- regula/facesdk/webclient/gen/model/match_image_result.py +0 -316
- regula/facesdk/webclient/gen/model/match_request.py +0 -233
- regula/facesdk/webclient/gen/model/match_request_output_image_params.py +0 -148
- regula/facesdk/webclient/gen/model/match_request_output_image_params_crop.py +0 -212
- regula/facesdk/webclient/gen/model/match_response.py +0 -205
- regula/facesdk/webclient/gen/model/match_response_all_of.py +0 -178
- regula/facesdk/webclient/gen/model/operation_log.py +0 -206
- regula/facesdk/webclient/gen/model/output_image_params.py +0 -146
- regula/facesdk/webclient/gen/model/page.py +0 -150
- regula/facesdk/webclient/gen/model/person.py +0 -319
- regula/facesdk/webclient/gen/model/person_all_of.py +0 -206
- regula/facesdk/webclient/gen/model/person_created_response.py +0 -178
- regula/facesdk/webclient/gen/model/person_fields.py +0 -235
- regula/facesdk/webclient/gen/model/person_to_update_fields.py +0 -206
- regula/facesdk/webclient/gen/model/person_with_images.py +0 -347
- regula/facesdk/webclient/gen/model/person_with_images_all_of.py +0 -122
- regula/facesdk/webclient/gen/model/persons_page.py +0 -176
- regula/facesdk/webclient/gen/model/persons_page_all_of.py +0 -120
- regula/facesdk/webclient/gen/model/persons_request.py +0 -291
- regula/facesdk/webclient/gen/model/persons_request_all_of.py +0 -150
- regula/facesdk/webclient/gen/model/process_param.py +0 -226
- regula/facesdk/webclient/gen/model/process_param_attributes.py +0 -120
- regula/facesdk/webclient/gen/model/quality_config.py +0 -154
- regula/facesdk/webclient/gen/model/quality_config_list.py +0 -92
- regula/facesdk/webclient/gen/model/quality_detail.py +0 -234
- regula/facesdk/webclient/gen/model/quality_details_groups.py +0 -202
- regula/facesdk/webclient/gen/model/quality_request.py +0 -146
- regula/facesdk/webclient/gen/model/recognize_image.py +0 -374
- regula/facesdk/webclient/gen/model/recognize_image_all_of.py +0 -150
- regula/facesdk/webclient/gen/model/resize_options.py +0 -178
- regula/facesdk/webclient/gen/model/rgb.py +0 -92
- regula/facesdk/webclient/gen/model/search_bad_params.py +0 -172
- regula/facesdk/webclient/gen/model/search_detection.py +0 -398
- regula/facesdk/webclient/gen/model/search_parameters.py +0 -174
- regula/facesdk/webclient/gen/model/search_parameters_create_person.py +0 -177
- regula/facesdk/webclient/gen/model/search_person.py +0 -373
- regula/facesdk/webclient/gen/model/search_person_all_of.py +0 -148
- regula/facesdk/webclient/gen/model/search_request.py +0 -394
- regula/facesdk/webclient/gen/model/search_request_all_of.py +0 -150
- regula/facesdk/webclient/gen/model/search_result.py +0 -150
- regula/facesdk/webclient/gen/model/search_result_all_of.py +0 -122
- regula/facesdk/webclient/gen/model/transaction_config.py +0 -92
- regula/facesdk/webclient/gen/model/transaction_info.py +0 -344
- regula/facesdk/webclient/gen/model/update_group.py +0 -150
- regula/facesdk/webclient/gen/model_utils.py +0 -2037
- regula_facesdk_webclient-7.2.388.dev0.dist-info/RECORD +0 -138
- {regula_facesdk_webclient-7.2.388.dev0.dist-info → regula_facesdk_webclient-8.1.433.dev0.dist-info}/top_level.txt +0 -0
|
@@ -1,223 +1,41 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
|
-
"""
|
|
3
|
-
Regula Face SDK Web API
|
|
4
|
-
|
|
5
|
-
<a href=\"https://regulaforensics.com/products/face-recognition-sdk/ \" target=\"_blank\">Regula Face SDK</a> is a cross-platform biometric verification solution for a digital identity verification process and image quality assurance. The SDK enables convenient and reliable face capture on the client side (mobile, web, and desktop) and further processing on the client or server side. The Face SDK includes the following features: * <a href=\"https://docs.regulaforensics.com/develop/face-sdk/overview/introduction/#face-detection\" target=\"_blank\">Face detection and image quality assessment</a> * <a href=\"https://docs.regulaforensics.com/develop/face-sdk/overview/introduction/#face-comparison-11\" target=\"_blank\">Face match (1:1)</a> * <a href=\"https://docs.regulaforensics.com/develop/face-sdk/overview/introduction/#face-identification-1n\" target=\"_blank\">Face search (1:N)</a> * <a href=\"https://docs.regulaforensics.com/develop/face-sdk/overview/introduction/#liveness-assessment\" target=\"_blank\">Liveness detection</a> Here is the <a href=\"https://github.com/regulaforensics/FaceSDK-web-openapi \" target=\"_blank\">OpenAPI specification on GitHub</a>. ### Clients * [JavaScript](https://github.com/regulaforensics/FaceSDK-web-js-client) client for the browser and node.js based on axios * [Java](https://github.com/regulaforensics/FaceSDK-web-java-client) client compatible with jvm and android * [Python](https://github.com/regulaforensics/FaceSDK-web-python-client) 3.5+ client * [C#](https://github.com/regulaforensics/FaceSDK-web-csharp-client) client for .NET & .NET Core # noqa: E501
|
|
6
2
|
|
|
7
|
-
|
|
3
|
+
"""
|
|
8
4
|
Generated by: https://openapi-generator.tech
|
|
9
5
|
"""
|
|
10
6
|
|
|
11
|
-
from __future__ import absolute_import
|
|
12
|
-
|
|
13
|
-
import atexit
|
|
14
7
|
import datetime
|
|
15
8
|
from dateutil.parser import parse
|
|
9
|
+
from enum import Enum
|
|
10
|
+
import decimal
|
|
16
11
|
import json
|
|
17
12
|
import mimetypes
|
|
18
|
-
from multiprocessing.pool import ThreadPool
|
|
19
13
|
import os
|
|
20
14
|
import re
|
|
21
15
|
import tempfile
|
|
16
|
+
import uuid
|
|
22
17
|
|
|
23
|
-
|
|
24
|
-
import
|
|
25
|
-
from
|
|
18
|
+
from urllib.parse import quote
|
|
19
|
+
from typing import Tuple, Optional, List, Dict, Union
|
|
20
|
+
from pydantic import SecretStr
|
|
26
21
|
|
|
27
22
|
from regula.facesdk.webclient.gen.configuration import Configuration
|
|
28
|
-
|
|
23
|
+
from regula.facesdk.webclient.gen.api_response import ApiResponse, T as ApiResponseT
|
|
24
|
+
import regula.facesdk.webclient.gen.models
|
|
29
25
|
from regula.facesdk.webclient.gen import rest
|
|
30
|
-
from regula.facesdk.webclient.gen.exceptions import
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
'datetime': datetime.datetime,
|
|
44
|
-
'object': object,
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
def sanitize_for_serialization(self, obj):
|
|
48
|
-
"""Builds a JSON POST object.
|
|
49
|
-
|
|
50
|
-
If obj is None, return None.
|
|
51
|
-
If obj is str, int, long, float, bool, return directly.
|
|
52
|
-
If obj is datetime.datetime, datetime.date
|
|
53
|
-
convert to string in iso8601 format.
|
|
54
|
-
If obj is list, sanitize each element in the list.
|
|
55
|
-
If obj is dict, return the dict.
|
|
56
|
-
If obj is OpenAPI model, return the properties dict.
|
|
57
|
-
|
|
58
|
-
:param obj: The data to serialize.
|
|
59
|
-
:return: The serialized form of data.
|
|
60
|
-
"""
|
|
61
|
-
if obj is None:
|
|
62
|
-
return None
|
|
63
|
-
elif isinstance(obj, self.PRIMITIVE_TYPES):
|
|
64
|
-
return obj
|
|
65
|
-
elif isinstance(obj, list):
|
|
66
|
-
return [self.sanitize_for_serialization(sub_obj)
|
|
67
|
-
for sub_obj in obj]
|
|
68
|
-
elif isinstance(obj, tuple):
|
|
69
|
-
return tuple(self.sanitize_for_serialization(sub_obj)
|
|
70
|
-
for sub_obj in obj)
|
|
71
|
-
elif isinstance(obj, (datetime.datetime, datetime.date)):
|
|
72
|
-
return obj.isoformat()
|
|
73
|
-
|
|
74
|
-
if isinstance(obj, dict):
|
|
75
|
-
obj_dict = obj
|
|
76
|
-
else:
|
|
77
|
-
# Convert model obj to dict except
|
|
78
|
-
# attributes `openapi_types`, `attribute_map`
|
|
79
|
-
# and attributes which value is not None.
|
|
80
|
-
# Convert attribute name to json key in
|
|
81
|
-
# model definition for request.
|
|
82
|
-
obj_dict = {obj.attribute_map[attr]: getattr(obj, attr)
|
|
83
|
-
for attr, _ in six.iteritems(obj.openapi_types)
|
|
84
|
-
if getattr(obj, attr) is not None}
|
|
85
|
-
|
|
86
|
-
return {key: self.sanitize_for_serialization(val)
|
|
87
|
-
for key, val in six.iteritems(obj_dict)}
|
|
88
|
-
|
|
89
|
-
def deserialize_raw(self, data, klass):
|
|
90
|
-
"""Deserializes dict, list, str into an object.
|
|
91
|
-
|
|
92
|
-
:param data: dict, list or str.
|
|
93
|
-
:param klass: class literal, or string of class name.
|
|
94
|
-
|
|
95
|
-
:return: object.
|
|
96
|
-
"""
|
|
97
|
-
if data is None:
|
|
98
|
-
return None
|
|
99
|
-
|
|
100
|
-
if type(klass) == str:
|
|
101
|
-
if klass.startswith('['):
|
|
102
|
-
sub_kls = re.match(r'\[(.*)\]', klass).group(1)
|
|
103
|
-
return [self.deserialize_raw(sub_data, sub_kls)
|
|
104
|
-
for sub_data in data]
|
|
105
|
-
|
|
106
|
-
if klass == '{str: (bool, date, datetime, dict, float, int, list, str, none_type)}':
|
|
107
|
-
return data
|
|
108
|
-
|
|
109
|
-
# convert str to class
|
|
110
|
-
if klass in self.NATIVE_TYPES_MAPPING:
|
|
111
|
-
klass = self.NATIVE_TYPES_MAPPING[klass]
|
|
112
|
-
else:
|
|
113
|
-
klass = getattr(regula.facesdk.webclient.gen.models, klass)
|
|
114
|
-
|
|
115
|
-
if klass in self.PRIMITIVE_TYPES:
|
|
116
|
-
return self.__deserialize_primitive(data, klass)
|
|
117
|
-
elif klass == object:
|
|
118
|
-
return self.__deserialize_object(data)
|
|
119
|
-
elif klass == datetime.date:
|
|
120
|
-
return self.__deserialize_date(data)
|
|
121
|
-
elif klass == datetime.datetime:
|
|
122
|
-
return self.__deserialize_datetime(data)
|
|
123
|
-
else:
|
|
124
|
-
return self.__deserialize_model(data, klass)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def __deserialize_primitive(self, data, klass):
|
|
128
|
-
"""Deserializes string to primitive type.
|
|
129
|
-
|
|
130
|
-
:param data: str.
|
|
131
|
-
:param klass: class literal.
|
|
132
|
-
|
|
133
|
-
:return: int, long, float, str, bool.
|
|
134
|
-
"""
|
|
135
|
-
try:
|
|
136
|
-
return klass(data)
|
|
137
|
-
except UnicodeEncodeError:
|
|
138
|
-
return six.text_type(data)
|
|
139
|
-
except TypeError:
|
|
140
|
-
return data
|
|
141
|
-
|
|
142
|
-
def __deserialize_object(self, value):
|
|
143
|
-
"""Return an original value.
|
|
144
|
-
|
|
145
|
-
:return: object.
|
|
146
|
-
"""
|
|
147
|
-
return value
|
|
148
|
-
|
|
149
|
-
def __deserialize_date(self, string):
|
|
150
|
-
"""Deserializes string to date.
|
|
151
|
-
|
|
152
|
-
:param string: str.
|
|
153
|
-
:return: date.
|
|
154
|
-
"""
|
|
155
|
-
try:
|
|
156
|
-
return parse(string).date()
|
|
157
|
-
except ImportError:
|
|
158
|
-
return string
|
|
159
|
-
except ValueError:
|
|
160
|
-
raise rest.ApiException(
|
|
161
|
-
status=0,
|
|
162
|
-
reason="Failed to parse `{0}` as date object".format(string)
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
def __deserialize_datetime(self, string):
|
|
166
|
-
"""Deserializes string to datetime.
|
|
167
|
-
|
|
168
|
-
The string should be in iso8601 datetime format.
|
|
169
|
-
|
|
170
|
-
:param string: str.
|
|
171
|
-
:return: datetime.
|
|
172
|
-
"""
|
|
173
|
-
try:
|
|
174
|
-
return parse(string)
|
|
175
|
-
except ImportError:
|
|
176
|
-
return string
|
|
177
|
-
except ValueError:
|
|
178
|
-
raise rest.ApiException(
|
|
179
|
-
status=0,
|
|
180
|
-
reason=(
|
|
181
|
-
"Failed to parse `{0}` as datetime object"
|
|
182
|
-
.format(string)
|
|
183
|
-
)
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
def __deserialize_model(self, data, klass):
|
|
187
|
-
"""Deserializes list or dict to model.
|
|
188
|
-
|
|
189
|
-
:param data: dict, list.
|
|
190
|
-
:param klass: class literal.
|
|
191
|
-
:return: model object.
|
|
192
|
-
"""
|
|
193
|
-
has_discriminator = False
|
|
194
|
-
if (hasattr(klass, 'get_real_child_model')
|
|
195
|
-
and klass.discriminator_value_class_map):
|
|
196
|
-
has_discriminator = True
|
|
197
|
-
|
|
198
|
-
if not klass.openapi_types and has_discriminator is False:
|
|
199
|
-
return data
|
|
200
|
-
|
|
201
|
-
kwargs = {}
|
|
202
|
-
if (data is not None and
|
|
203
|
-
klass.openapi_types is not None and
|
|
204
|
-
isinstance(data, (list, dict))):
|
|
205
|
-
for attr, attr_type in six.iteritems(klass.openapi_types):
|
|
206
|
-
if klass.attribute_map[attr] in data:
|
|
207
|
-
value = data[klass.attribute_map[attr]]
|
|
208
|
-
kwargs[attr] = self.deserialize_raw(value, attr_type)
|
|
209
|
-
|
|
210
|
-
instance = klass(**kwargs)
|
|
211
|
-
|
|
212
|
-
if has_discriminator:
|
|
213
|
-
klass_name = instance.get_real_child_model(data)
|
|
214
|
-
if klass_name:
|
|
215
|
-
instance = self.deserialize_raw(data, klass_name)
|
|
216
|
-
return instance
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
class ApiClient(ModelSerDe, object):
|
|
26
|
+
from regula.facesdk.webclient.gen.exceptions import (
|
|
27
|
+
ApiValueError,
|
|
28
|
+
ApiException,
|
|
29
|
+
BadRequestException,
|
|
30
|
+
UnauthorizedException,
|
|
31
|
+
ForbiddenException,
|
|
32
|
+
NotFoundException,
|
|
33
|
+
ServiceException
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]]
|
|
37
|
+
|
|
38
|
+
class ApiClient:
|
|
221
39
|
"""Generic API client for OpenAPI client library builds.
|
|
222
40
|
|
|
223
41
|
OpenAPI generic API client. This client handles the client-
|
|
@@ -225,28 +43,39 @@ class ApiClient(ModelSerDe, object):
|
|
|
225
43
|
the methods and models for each application are generated from the OpenAPI
|
|
226
44
|
templates.
|
|
227
45
|
|
|
228
|
-
NOTE: This class is auto generated by OpenAPI Generator.
|
|
229
|
-
Ref: https://openapi-generator.tech
|
|
230
|
-
Do not edit the class manually.
|
|
231
|
-
|
|
232
46
|
:param configuration: .Configuration object for this client
|
|
233
47
|
:param header_name: a header to pass when making calls to the API.
|
|
234
48
|
:param header_value: a header value to pass when making calls to
|
|
235
49
|
the API.
|
|
236
50
|
:param cookie: a cookie to include in the header when making calls
|
|
237
51
|
to the API
|
|
238
|
-
:param pool_threads: The number of threads to use for async requests
|
|
239
|
-
to the API. More threads means more concurrent API requests.
|
|
240
52
|
"""
|
|
241
53
|
|
|
54
|
+
PRIMITIVE_TYPES = (float, bool, bytes, str, int)
|
|
55
|
+
NATIVE_TYPES_MAPPING = {
|
|
56
|
+
'int': int,
|
|
57
|
+
'long': int, # TODO remove as only py3 is supported?
|
|
58
|
+
'float': float,
|
|
59
|
+
'str': str,
|
|
60
|
+
'bool': bool,
|
|
61
|
+
'date': datetime.date,
|
|
62
|
+
'datetime': datetime.datetime,
|
|
63
|
+
'decimal': decimal.Decimal,
|
|
64
|
+
'object': object,
|
|
65
|
+
}
|
|
242
66
|
_pool = None
|
|
243
67
|
|
|
244
|
-
def __init__(
|
|
245
|
-
|
|
68
|
+
def __init__(
|
|
69
|
+
self,
|
|
70
|
+
configuration=None,
|
|
71
|
+
header_name=None,
|
|
72
|
+
header_value=None,
|
|
73
|
+
cookie=None
|
|
74
|
+
) -> None:
|
|
75
|
+
# use default configuration if none is provided
|
|
246
76
|
if configuration is None:
|
|
247
|
-
configuration = Configuration.
|
|
77
|
+
configuration = Configuration.get_default()
|
|
248
78
|
self.configuration = configuration
|
|
249
|
-
self.pool_threads = pool_threads
|
|
250
79
|
|
|
251
80
|
self.rest_client = rest.RESTClientObject(configuration)
|
|
252
81
|
self.default_headers = {}
|
|
@@ -257,51 +86,11 @@ class ApiClient(ModelSerDe, object):
|
|
|
257
86
|
self.user_agent = 'OpenAPI-Generator/1.0.0/python'
|
|
258
87
|
self.client_side_validation = configuration.client_side_validation
|
|
259
88
|
|
|
260
|
-
def deserialize(self, response, response_type):
|
|
261
|
-
"""Deserializes response into an object.
|
|
262
|
-
|
|
263
|
-
:param response: RESTResponse object to be deserialized.
|
|
264
|
-
:param response_type: class literal for
|
|
265
|
-
deserialized object, or string of class name.
|
|
266
|
-
|
|
267
|
-
:return: deserialized object.
|
|
268
|
-
"""
|
|
269
|
-
# handle file downloading
|
|
270
|
-
# save response body into a tmp file and return the instance
|
|
271
|
-
if response_type == "file":
|
|
272
|
-
return self.__deserialize_file(response)
|
|
273
|
-
|
|
274
|
-
# fetch data from response object
|
|
275
|
-
try:
|
|
276
|
-
data = json.loads(response.data)
|
|
277
|
-
except ValueError:
|
|
278
|
-
data = response.data
|
|
279
|
-
|
|
280
|
-
return self.deserialize_raw(data, response_type)
|
|
281
|
-
|
|
282
89
|
def __enter__(self):
|
|
283
90
|
return self
|
|
284
91
|
|
|
285
92
|
def __exit__(self, exc_type, exc_value, traceback):
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
def close(self):
|
|
289
|
-
if self._pool:
|
|
290
|
-
self._pool.close()
|
|
291
|
-
self._pool.join()
|
|
292
|
-
self._pool = None
|
|
293
|
-
if hasattr(atexit, 'unregister'):
|
|
294
|
-
atexit.unregister(self.close)
|
|
295
|
-
|
|
296
|
-
@property
|
|
297
|
-
def pool(self):
|
|
298
|
-
"""Create thread pool on first request
|
|
299
|
-
avoids instantiating unused threadpool for blocking clients.
|
|
300
|
-
"""
|
|
301
|
-
if self._pool is None:
|
|
302
|
-
atexit.register(self.close)
|
|
303
|
-
self._pool = ThreadPool(self.pool_threads)
|
|
304
|
-
return self._pool
|
|
93
|
+
pass
|
|
305
94
|
|
|
306
95
|
@property
|
|
307
96
|
def user_agent(self):
|
|
@@ -315,13 +104,69 @@ class ApiClient(ModelSerDe, object):
|
|
|
315
104
|
def set_default_header(self, header_name, header_value):
|
|
316
105
|
self.default_headers[header_name] = header_value
|
|
317
106
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
107
|
+
|
|
108
|
+
_default = None
|
|
109
|
+
|
|
110
|
+
@classmethod
|
|
111
|
+
def get_default(cls):
|
|
112
|
+
"""Return new instance of ApiClient.
|
|
113
|
+
|
|
114
|
+
This method returns newly created, based on default constructor,
|
|
115
|
+
object of ApiClient class or returns a copy of default
|
|
116
|
+
ApiClient.
|
|
117
|
+
|
|
118
|
+
:return: The ApiClient object.
|
|
119
|
+
"""
|
|
120
|
+
if cls._default is None:
|
|
121
|
+
cls._default = ApiClient()
|
|
122
|
+
return cls._default
|
|
123
|
+
|
|
124
|
+
@classmethod
|
|
125
|
+
def set_default(cls, default):
|
|
126
|
+
"""Set default instance of ApiClient.
|
|
127
|
+
|
|
128
|
+
It stores default ApiClient.
|
|
129
|
+
|
|
130
|
+
:param default: object of ApiClient.
|
|
131
|
+
"""
|
|
132
|
+
cls._default = default
|
|
133
|
+
|
|
134
|
+
def param_serialize(
|
|
135
|
+
self,
|
|
136
|
+
method,
|
|
137
|
+
resource_path,
|
|
138
|
+
path_params=None,
|
|
139
|
+
query_params=None,
|
|
140
|
+
header_params=None,
|
|
141
|
+
body=None,
|
|
142
|
+
post_params=None,
|
|
143
|
+
files=None, auth_settings=None,
|
|
144
|
+
collection_formats=None,
|
|
145
|
+
_host=None,
|
|
146
|
+
_request_auth=None
|
|
147
|
+
) -> RequestSerialized:
|
|
148
|
+
|
|
149
|
+
"""Builds the HTTP request params needed by the request.
|
|
150
|
+
:param method: Method to call.
|
|
151
|
+
:param resource_path: Path to method endpoint.
|
|
152
|
+
:param path_params: Path parameters in the url.
|
|
153
|
+
:param query_params: Query parameters in the url.
|
|
154
|
+
:param header_params: Header parameters to be
|
|
155
|
+
placed in the request header.
|
|
156
|
+
:param body: Request body.
|
|
157
|
+
:param post_params dict: Request post form parameters,
|
|
158
|
+
for `application/x-www-form-urlencoded`, `multipart/form-data`.
|
|
159
|
+
:param auth_settings list: Auth Settings names for the request.
|
|
160
|
+
:param files dict: key -> filename, value -> filepath,
|
|
161
|
+
for `multipart/form-data`.
|
|
162
|
+
:param collection_formats: dict of collection formats for path, query,
|
|
163
|
+
header, and post parameters.
|
|
164
|
+
:param _request_auth: set to override the auth_settings for an a single
|
|
165
|
+
request; this effectively ignores the authentication
|
|
166
|
+
in the spec for a single request.
|
|
167
|
+
:return: tuple of form (path, http_method, query_params, header_params,
|
|
168
|
+
body, post_params, files)
|
|
169
|
+
"""
|
|
325
170
|
|
|
326
171
|
config = self.configuration
|
|
327
172
|
|
|
@@ -332,14 +177,17 @@ class ApiClient(ModelSerDe, object):
|
|
|
332
177
|
header_params['Cookie'] = self.cookie
|
|
333
178
|
if header_params:
|
|
334
179
|
header_params = self.sanitize_for_serialization(header_params)
|
|
335
|
-
header_params = dict(
|
|
336
|
-
|
|
180
|
+
header_params = dict(
|
|
181
|
+
self.parameters_to_tuples(header_params,collection_formats)
|
|
182
|
+
)
|
|
337
183
|
|
|
338
184
|
# path parameters
|
|
339
185
|
if path_params:
|
|
340
186
|
path_params = self.sanitize_for_serialization(path_params)
|
|
341
|
-
path_params = self.parameters_to_tuples(
|
|
342
|
-
|
|
187
|
+
path_params = self.parameters_to_tuples(
|
|
188
|
+
path_params,
|
|
189
|
+
collection_formats
|
|
190
|
+
)
|
|
343
191
|
for k, v in path_params:
|
|
344
192
|
# specified safe chars, encode everything
|
|
345
193
|
resource_path = resource_path.replace(
|
|
@@ -347,203 +195,276 @@ class ApiClient(ModelSerDe, object):
|
|
|
347
195
|
quote(str(v), safe=config.safe_chars_for_path_param)
|
|
348
196
|
)
|
|
349
197
|
|
|
350
|
-
# query parameters
|
|
351
|
-
if query_params:
|
|
352
|
-
query_params = self.sanitize_for_serialization(query_params)
|
|
353
|
-
query_params = self.parameters_to_tuples(query_params,
|
|
354
|
-
collection_formats)
|
|
355
|
-
|
|
356
198
|
# post parameters
|
|
357
199
|
if post_params or files:
|
|
358
200
|
post_params = post_params if post_params else []
|
|
359
201
|
post_params = self.sanitize_for_serialization(post_params)
|
|
360
|
-
post_params = self.parameters_to_tuples(
|
|
361
|
-
|
|
362
|
-
|
|
202
|
+
post_params = self.parameters_to_tuples(
|
|
203
|
+
post_params,
|
|
204
|
+
collection_formats
|
|
205
|
+
)
|
|
206
|
+
if files:
|
|
207
|
+
post_params.extend(self.files_parameters(files))
|
|
363
208
|
|
|
364
209
|
# auth setting
|
|
365
210
|
self.update_params_for_auth(
|
|
366
|
-
header_params,
|
|
367
|
-
|
|
211
|
+
header_params,
|
|
212
|
+
query_params,
|
|
213
|
+
auth_settings,
|
|
214
|
+
resource_path,
|
|
215
|
+
method,
|
|
216
|
+
body,
|
|
217
|
+
request_auth=_request_auth
|
|
218
|
+
)
|
|
368
219
|
|
|
369
220
|
# body
|
|
370
221
|
if body:
|
|
371
222
|
body = self.sanitize_for_serialization(body)
|
|
372
223
|
|
|
373
224
|
# request url
|
|
374
|
-
if _host is None:
|
|
225
|
+
if _host is None or self.configuration.ignore_operation_servers:
|
|
375
226
|
url = self.configuration.host + resource_path
|
|
376
227
|
else:
|
|
377
228
|
# use server/host defined in path or operation instead
|
|
378
229
|
url = _host + resource_path
|
|
379
230
|
|
|
231
|
+
# query parameters
|
|
232
|
+
if query_params:
|
|
233
|
+
query_params = self.sanitize_for_serialization(query_params)
|
|
234
|
+
url_query = self.parameters_to_url_query(
|
|
235
|
+
query_params,
|
|
236
|
+
collection_formats
|
|
237
|
+
)
|
|
238
|
+
url += "?" + url_query
|
|
239
|
+
|
|
240
|
+
return method, url, header_params, body, post_params
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def call_api(
|
|
244
|
+
self,
|
|
245
|
+
method,
|
|
246
|
+
url,
|
|
247
|
+
header_params=None,
|
|
248
|
+
body=None,
|
|
249
|
+
post_params=None,
|
|
250
|
+
_request_timeout=None
|
|
251
|
+
) -> rest.RESTResponse:
|
|
252
|
+
"""Makes the HTTP request (synchronous)
|
|
253
|
+
:param method: Method to call.
|
|
254
|
+
:param url: Path to method endpoint.
|
|
255
|
+
:param header_params: Header parameters to be
|
|
256
|
+
placed in the request header.
|
|
257
|
+
:param body: Request body.
|
|
258
|
+
:param post_params dict: Request post form parameters,
|
|
259
|
+
for `application/x-www-form-urlencoded`, `multipart/form-data`.
|
|
260
|
+
:param _request_timeout: timeout setting for this request.
|
|
261
|
+
:return: RESTResponse
|
|
262
|
+
"""
|
|
263
|
+
|
|
380
264
|
try:
|
|
381
265
|
# perform request and return response
|
|
382
|
-
response_data = self.request(
|
|
383
|
-
method, url,
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
_request_timeout=_request_timeout
|
|
266
|
+
response_data = self.rest_client.request(
|
|
267
|
+
method, url,
|
|
268
|
+
headers=header_params,
|
|
269
|
+
body=body, post_params=post_params,
|
|
270
|
+
_request_timeout=_request_timeout
|
|
271
|
+
)
|
|
272
|
+
|
|
387
273
|
except ApiException as e:
|
|
388
|
-
e.body = e.body.decode('utf-8') if six.PY3 else e.body
|
|
389
274
|
raise e
|
|
390
275
|
|
|
391
|
-
|
|
276
|
+
return response_data
|
|
392
277
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
278
|
+
def response_deserialize(
|
|
279
|
+
self,
|
|
280
|
+
response_data: rest.RESTResponse,
|
|
281
|
+
response_types_map: Optional[Dict[str, ApiResponseT]]=None
|
|
282
|
+
) -> ApiResponse[ApiResponseT]:
|
|
283
|
+
"""Deserializes response into an object.
|
|
284
|
+
:param response_data: RESTResponse object to be deserialized.
|
|
285
|
+
:param response_types_map: dict of response types.
|
|
286
|
+
:return: ApiResponse
|
|
287
|
+
"""
|
|
396
288
|
|
|
397
|
-
|
|
398
|
-
|
|
289
|
+
msg = "RESTResponse.read() must be called before passing it to response_deserialize()"
|
|
290
|
+
assert response_data.data is not None, msg
|
|
399
291
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
if
|
|
403
|
-
|
|
404
|
-
encoding = match.group(1) if match else "utf-8"
|
|
405
|
-
response_data.data = response_data.data.decode(encoding)
|
|
292
|
+
response_type = response_types_map.get(str(response_data.status), None)
|
|
293
|
+
if not response_type and isinstance(response_data.status, int) and 100 <= response_data.status <= 599:
|
|
294
|
+
# if not found, look for '1XX', '2XX', etc.
|
|
295
|
+
response_type = response_types_map.get(str(response_data.status)[0] + "XX", None)
|
|
406
296
|
|
|
407
297
|
# deserialize response data
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
298
|
+
response_text = None
|
|
299
|
+
return_data = None
|
|
300
|
+
try:
|
|
301
|
+
if response_type == "bytearray":
|
|
302
|
+
return_data = response_data.data
|
|
303
|
+
elif response_type == "file":
|
|
304
|
+
return_data = self.__deserialize_file(response_data)
|
|
305
|
+
elif response_type is not None:
|
|
306
|
+
match = None
|
|
307
|
+
content_type = response_data.getheader('content-type')
|
|
308
|
+
if content_type is not None:
|
|
309
|
+
match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type)
|
|
310
|
+
encoding = match.group(1) if match else "utf-8"
|
|
311
|
+
response_text = response_data.data.decode(encoding)
|
|
312
|
+
return_data = self.deserialize(response_text, response_type, content_type)
|
|
313
|
+
finally:
|
|
314
|
+
if not 200 <= response_data.status <= 299:
|
|
315
|
+
raise ApiException.from_response(
|
|
316
|
+
http_resp=response_data,
|
|
317
|
+
body=response_text,
|
|
318
|
+
data=return_data,
|
|
319
|
+
)
|
|
412
320
|
|
|
413
|
-
|
|
414
|
-
|
|
321
|
+
return ApiResponse(
|
|
322
|
+
status_code = response_data.status,
|
|
323
|
+
data = return_data,
|
|
324
|
+
headers = response_data.getheaders(),
|
|
325
|
+
raw_data = response_data.data
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
def sanitize_for_serialization(self, obj):
|
|
329
|
+
"""Builds a JSON POST object.
|
|
330
|
+
|
|
331
|
+
If obj is None, return None.
|
|
332
|
+
If obj is SecretStr, return obj.get_secret_value()
|
|
333
|
+
If obj is str, int, long, float, bool, return directly.
|
|
334
|
+
If obj is datetime.datetime, datetime.date
|
|
335
|
+
convert to string in iso8601 format.
|
|
336
|
+
If obj is decimal.Decimal return string representation.
|
|
337
|
+
If obj is list, sanitize each element in the list.
|
|
338
|
+
If obj is dict, return the dict.
|
|
339
|
+
If obj is OpenAPI model, return the properties dict.
|
|
340
|
+
|
|
341
|
+
:param obj: The data to serialize.
|
|
342
|
+
:return: The serialized form of data.
|
|
343
|
+
"""
|
|
344
|
+
if obj is None:
|
|
345
|
+
return None
|
|
346
|
+
elif isinstance(obj, Enum):
|
|
347
|
+
return obj.value
|
|
348
|
+
elif isinstance(obj, SecretStr):
|
|
349
|
+
return obj.get_secret_value()
|
|
350
|
+
elif isinstance(obj, self.PRIMITIVE_TYPES):
|
|
351
|
+
return obj
|
|
352
|
+
elif isinstance(obj, uuid.UUID):
|
|
353
|
+
return str(obj)
|
|
354
|
+
elif isinstance(obj, list):
|
|
355
|
+
return [
|
|
356
|
+
self.sanitize_for_serialization(sub_obj) for sub_obj in obj
|
|
357
|
+
]
|
|
358
|
+
elif isinstance(obj, tuple):
|
|
359
|
+
return tuple(
|
|
360
|
+
self.sanitize_for_serialization(sub_obj) for sub_obj in obj
|
|
361
|
+
)
|
|
362
|
+
elif isinstance(obj, (datetime.datetime, datetime.date)):
|
|
363
|
+
return obj.isoformat()
|
|
364
|
+
elif isinstance(obj, decimal.Decimal):
|
|
365
|
+
return str(obj)
|
|
366
|
+
|
|
367
|
+
elif isinstance(obj, dict):
|
|
368
|
+
obj_dict = obj
|
|
415
369
|
else:
|
|
416
|
-
|
|
417
|
-
|
|
370
|
+
# Convert model obj to dict except
|
|
371
|
+
# attributes `openapi_types`, `attribute_map`
|
|
372
|
+
# and attributes which value is not None.
|
|
373
|
+
# Convert attribute name to json key in
|
|
374
|
+
# model definition for request.
|
|
375
|
+
if hasattr(obj, 'to_dict') and callable(getattr(obj, 'to_dict')):
|
|
376
|
+
obj_dict = obj.to_dict()
|
|
377
|
+
else:
|
|
378
|
+
obj_dict = obj.__dict__
|
|
418
379
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
response_type=None, auth_settings=None, async_req=None,
|
|
423
|
-
_return_http_data_only=None, collection_formats=None,
|
|
424
|
-
_preload_content=True, _request_timeout=None, _host=None,
|
|
425
|
-
_request_auth=None):
|
|
426
|
-
"""Makes the HTTP request (synchronous) and returns deserialized data.
|
|
380
|
+
if isinstance(obj_dict, list):
|
|
381
|
+
# here we handle instances that can either be a list or something else, and only became a real list by calling to_dict()
|
|
382
|
+
return self.sanitize_for_serialization(obj_dict)
|
|
427
383
|
|
|
428
|
-
|
|
384
|
+
return {
|
|
385
|
+
key: self.sanitize_for_serialization(val)
|
|
386
|
+
for key, val in obj_dict.items()
|
|
387
|
+
}
|
|
429
388
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
:param
|
|
434
|
-
:param
|
|
435
|
-
|
|
436
|
-
:param
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
:param auth_settings list: Auth Settings names for the request.
|
|
440
|
-
:param response: Response data type.
|
|
441
|
-
:param files dict: key -> filename, value -> filepath,
|
|
442
|
-
for `multipart/form-data`.
|
|
443
|
-
:param async_req bool: execute request asynchronously
|
|
444
|
-
:param _return_http_data_only: response data without head status code
|
|
445
|
-
and headers
|
|
446
|
-
:param collection_formats: dict of collection formats for path, query,
|
|
447
|
-
header, and post parameters.
|
|
448
|
-
:param _preload_content: if False, the urllib3.HTTPResponse object will
|
|
449
|
-
be returned without reading/decoding response
|
|
450
|
-
data. Default is True.
|
|
451
|
-
:param _request_timeout: timeout setting for this request. If one
|
|
452
|
-
number provided, it will be total request
|
|
453
|
-
timeout. It can also be a pair (tuple) of
|
|
454
|
-
(connection, read) timeouts.
|
|
455
|
-
:param _request_auth: set to override the auth_settings for an a single
|
|
456
|
-
request; this effectively ignores the authentication
|
|
457
|
-
in the spec for a single request.
|
|
458
|
-
:type _request_token: dict, optional
|
|
459
|
-
:return:
|
|
460
|
-
If async_req parameter is True,
|
|
461
|
-
the request will be called asynchronously.
|
|
462
|
-
The method will return the request thread.
|
|
463
|
-
If parameter async_req is False or missing,
|
|
464
|
-
then the method will return the response directly.
|
|
389
|
+
def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]):
|
|
390
|
+
"""Deserializes response into an object.
|
|
391
|
+
|
|
392
|
+
:param response: RESTResponse object to be deserialized.
|
|
393
|
+
:param response_type: class literal for
|
|
394
|
+
deserialized object, or string of class name.
|
|
395
|
+
:param content_type: content type of response.
|
|
396
|
+
|
|
397
|
+
:return: deserialized object.
|
|
465
398
|
"""
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
response_type,
|
|
481
|
-
auth_settings,
|
|
482
|
-
_return_http_data_only,
|
|
483
|
-
collection_formats,
|
|
484
|
-
_preload_content,
|
|
485
|
-
_request_timeout,
|
|
486
|
-
_host, _request_auth))
|
|
487
|
-
|
|
488
|
-
def request(self, method, url, query_params=None, headers=None,
|
|
489
|
-
post_params=None, body=None, _preload_content=True,
|
|
490
|
-
_request_timeout=None):
|
|
491
|
-
"""Makes the HTTP request using RESTClient."""
|
|
492
|
-
if method == "GET":
|
|
493
|
-
return self.rest_client.GET(url,
|
|
494
|
-
query_params=query_params,
|
|
495
|
-
_preload_content=_preload_content,
|
|
496
|
-
_request_timeout=_request_timeout,
|
|
497
|
-
headers=headers)
|
|
498
|
-
elif method == "HEAD":
|
|
499
|
-
return self.rest_client.HEAD(url,
|
|
500
|
-
query_params=query_params,
|
|
501
|
-
_preload_content=_preload_content,
|
|
502
|
-
_request_timeout=_request_timeout,
|
|
503
|
-
headers=headers)
|
|
504
|
-
elif method == "OPTIONS":
|
|
505
|
-
return self.rest_client.OPTIONS(url,
|
|
506
|
-
query_params=query_params,
|
|
507
|
-
headers=headers,
|
|
508
|
-
_preload_content=_preload_content,
|
|
509
|
-
_request_timeout=_request_timeout)
|
|
510
|
-
elif method == "POST":
|
|
511
|
-
return self.rest_client.POST(url,
|
|
512
|
-
query_params=query_params,
|
|
513
|
-
headers=headers,
|
|
514
|
-
post_params=post_params,
|
|
515
|
-
_preload_content=_preload_content,
|
|
516
|
-
_request_timeout=_request_timeout,
|
|
517
|
-
body=body)
|
|
518
|
-
elif method == "PUT":
|
|
519
|
-
return self.rest_client.PUT(url,
|
|
520
|
-
query_params=query_params,
|
|
521
|
-
headers=headers,
|
|
522
|
-
post_params=post_params,
|
|
523
|
-
_preload_content=_preload_content,
|
|
524
|
-
_request_timeout=_request_timeout,
|
|
525
|
-
body=body)
|
|
526
|
-
elif method == "PATCH":
|
|
527
|
-
return self.rest_client.PATCH(url,
|
|
528
|
-
query_params=query_params,
|
|
529
|
-
headers=headers,
|
|
530
|
-
post_params=post_params,
|
|
531
|
-
_preload_content=_preload_content,
|
|
532
|
-
_request_timeout=_request_timeout,
|
|
533
|
-
body=body)
|
|
534
|
-
elif method == "DELETE":
|
|
535
|
-
return self.rest_client.DELETE(url,
|
|
536
|
-
query_params=query_params,
|
|
537
|
-
headers=headers,
|
|
538
|
-
_preload_content=_preload_content,
|
|
539
|
-
_request_timeout=_request_timeout,
|
|
540
|
-
body=body)
|
|
399
|
+
|
|
400
|
+
# fetch data from response object
|
|
401
|
+
if content_type is None:
|
|
402
|
+
try:
|
|
403
|
+
data = json.loads(response_text)
|
|
404
|
+
except ValueError:
|
|
405
|
+
data = response_text
|
|
406
|
+
elif re.match(r'^application/(json|[\w!#$&.+\-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE):
|
|
407
|
+
if response_text == "":
|
|
408
|
+
data = ""
|
|
409
|
+
else:
|
|
410
|
+
data = json.loads(response_text)
|
|
411
|
+
elif re.match(r'^text\/[a-z.+-]+\s*(;|$)', content_type, re.IGNORECASE):
|
|
412
|
+
data = response_text
|
|
541
413
|
else:
|
|
542
|
-
raise
|
|
543
|
-
|
|
544
|
-
"
|
|
414
|
+
raise ApiException(
|
|
415
|
+
status=0,
|
|
416
|
+
reason="Unsupported content type: {0}".format(content_type)
|
|
545
417
|
)
|
|
546
418
|
|
|
419
|
+
return self.__deserialize(data, response_type)
|
|
420
|
+
|
|
421
|
+
def __deserialize(self, data, klass):
|
|
422
|
+
"""Deserializes dict, list, str into an object.
|
|
423
|
+
|
|
424
|
+
:param data: dict, list or str.
|
|
425
|
+
:param klass: class literal, or string of class name.
|
|
426
|
+
|
|
427
|
+
:return: object.
|
|
428
|
+
"""
|
|
429
|
+
if data is None:
|
|
430
|
+
return None
|
|
431
|
+
|
|
432
|
+
if isinstance(klass, str):
|
|
433
|
+
if klass.startswith('List['):
|
|
434
|
+
m = re.match(r'List\[(.*)]', klass)
|
|
435
|
+
assert m is not None, "Malformed List type definition"
|
|
436
|
+
sub_kls = m.group(1)
|
|
437
|
+
return [self.__deserialize(sub_data, sub_kls)
|
|
438
|
+
for sub_data in data]
|
|
439
|
+
|
|
440
|
+
if klass.startswith('Dict['):
|
|
441
|
+
m = re.match(r'Dict\[([^,]*), (.*)]', klass)
|
|
442
|
+
assert m is not None, "Malformed Dict type definition"
|
|
443
|
+
sub_kls = m.group(2)
|
|
444
|
+
return {k: self.__deserialize(v, sub_kls)
|
|
445
|
+
for k, v in data.items()}
|
|
446
|
+
|
|
447
|
+
# convert str to class
|
|
448
|
+
if klass in self.NATIVE_TYPES_MAPPING:
|
|
449
|
+
klass = self.NATIVE_TYPES_MAPPING[klass]
|
|
450
|
+
else:
|
|
451
|
+
klass = getattr(regula.facesdk.webclient.gen.models, klass)
|
|
452
|
+
|
|
453
|
+
if klass in self.PRIMITIVE_TYPES:
|
|
454
|
+
return self.__deserialize_primitive(data, klass)
|
|
455
|
+
elif klass == object:
|
|
456
|
+
return self.__deserialize_object(data)
|
|
457
|
+
elif klass == datetime.date:
|
|
458
|
+
return self.__deserialize_date(data)
|
|
459
|
+
elif klass == datetime.datetime:
|
|
460
|
+
return self.__deserialize_datetime(data)
|
|
461
|
+
elif klass == decimal.Decimal:
|
|
462
|
+
return decimal.Decimal(data)
|
|
463
|
+
elif issubclass(klass, Enum):
|
|
464
|
+
return self.__deserialize_enum(data, klass)
|
|
465
|
+
else:
|
|
466
|
+
return self.__deserialize_model(data, klass)
|
|
467
|
+
|
|
547
468
|
def parameters_to_tuples(self, params, collection_formats):
|
|
548
469
|
"""Get parameters as list of tuples, formatting collections.
|
|
549
470
|
|
|
@@ -551,10 +472,10 @@ class ApiClient(ModelSerDe, object):
|
|
|
551
472
|
:param dict collection_formats: Parameter collection formats
|
|
552
473
|
:return: Parameters as list of tuples, collections formatted
|
|
553
474
|
"""
|
|
554
|
-
new_params = []
|
|
475
|
+
new_params: List[Tuple[str, str]] = []
|
|
555
476
|
if collection_formats is None:
|
|
556
477
|
collection_formats = {}
|
|
557
|
-
for k, v in
|
|
478
|
+
for k, v in params.items() if isinstance(params, dict) else params:
|
|
558
479
|
if k in collection_formats:
|
|
559
480
|
collection_format = collection_formats[k]
|
|
560
481
|
if collection_format == 'multi':
|
|
@@ -574,45 +495,94 @@ class ApiClient(ModelSerDe, object):
|
|
|
574
495
|
new_params.append((k, v))
|
|
575
496
|
return new_params
|
|
576
497
|
|
|
577
|
-
def
|
|
498
|
+
def parameters_to_url_query(self, params, collection_formats):
|
|
499
|
+
"""Get parameters as list of tuples, formatting collections.
|
|
500
|
+
|
|
501
|
+
:param params: Parameters as dict or list of two-tuples
|
|
502
|
+
:param dict collection_formats: Parameter collection formats
|
|
503
|
+
:return: URL query string (e.g. a=Hello%20World&b=123)
|
|
504
|
+
"""
|
|
505
|
+
new_params: List[Tuple[str, str]] = []
|
|
506
|
+
if collection_formats is None:
|
|
507
|
+
collection_formats = {}
|
|
508
|
+
for k, v in params.items() if isinstance(params, dict) else params:
|
|
509
|
+
if isinstance(v, bool):
|
|
510
|
+
v = str(v).lower()
|
|
511
|
+
if isinstance(v, (int, float)):
|
|
512
|
+
v = str(v)
|
|
513
|
+
if isinstance(v, dict):
|
|
514
|
+
v = json.dumps(v)
|
|
515
|
+
|
|
516
|
+
if k in collection_formats:
|
|
517
|
+
collection_format = collection_formats[k]
|
|
518
|
+
if collection_format == 'multi':
|
|
519
|
+
new_params.extend((k, quote(str(value))) for value in v)
|
|
520
|
+
else:
|
|
521
|
+
if collection_format == 'ssv':
|
|
522
|
+
delimiter = ' '
|
|
523
|
+
elif collection_format == 'tsv':
|
|
524
|
+
delimiter = '\t'
|
|
525
|
+
elif collection_format == 'pipes':
|
|
526
|
+
delimiter = '|'
|
|
527
|
+
else: # csv is the default
|
|
528
|
+
delimiter = ','
|
|
529
|
+
new_params.append(
|
|
530
|
+
(k, delimiter.join(quote(str(value)) for value in v))
|
|
531
|
+
)
|
|
532
|
+
else:
|
|
533
|
+
new_params.append((k, quote(str(v))))
|
|
534
|
+
|
|
535
|
+
return "&".join(["=".join(map(str, item)) for item in new_params])
|
|
536
|
+
|
|
537
|
+
def files_parameters(
|
|
538
|
+
self,
|
|
539
|
+
files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]],
|
|
540
|
+
):
|
|
578
541
|
"""Builds form parameters.
|
|
579
542
|
|
|
580
543
|
:param files: File parameters.
|
|
581
544
|
:return: Form parameters with files.
|
|
582
545
|
"""
|
|
583
546
|
params = []
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
547
|
+
for k, v in files.items():
|
|
548
|
+
if isinstance(v, str):
|
|
549
|
+
with open(v, 'rb') as f:
|
|
550
|
+
filename = os.path.basename(f.name)
|
|
551
|
+
filedata = f.read()
|
|
552
|
+
elif isinstance(v, bytes):
|
|
553
|
+
filename = k
|
|
554
|
+
filedata = v
|
|
555
|
+
elif isinstance(v, tuple):
|
|
556
|
+
filename, filedata = v
|
|
557
|
+
elif isinstance(v, list):
|
|
558
|
+
for file_param in v:
|
|
559
|
+
params.extend(self.files_parameters({k: file_param}))
|
|
560
|
+
continue
|
|
561
|
+
else:
|
|
562
|
+
raise ValueError("Unsupported file value")
|
|
563
|
+
mimetype = (
|
|
564
|
+
mimetypes.guess_type(filename)[0]
|
|
565
|
+
or 'application/octet-stream'
|
|
566
|
+
)
|
|
567
|
+
params.append(
|
|
568
|
+
tuple([k, tuple([filename, filedata, mimetype])])
|
|
569
|
+
)
|
|
599
570
|
return params
|
|
600
571
|
|
|
601
|
-
def select_header_accept(self, accepts):
|
|
572
|
+
def select_header_accept(self, accepts: List[str]) -> Optional[str]:
|
|
602
573
|
"""Returns `Accept` based on an array of accepts provided.
|
|
603
574
|
|
|
604
575
|
:param accepts: List of headers.
|
|
605
576
|
:return: Accept (e.g. application/json).
|
|
606
577
|
"""
|
|
607
578
|
if not accepts:
|
|
608
|
-
return
|
|
579
|
+
return None
|
|
609
580
|
|
|
610
|
-
|
|
581
|
+
for accept in accepts:
|
|
582
|
+
if re.search('json', accept, re.IGNORECASE):
|
|
583
|
+
return accept
|
|
611
584
|
|
|
612
|
-
|
|
613
|
-
return 'application/json'
|
|
614
|
-
else:
|
|
615
|
-
return ', '.join(accepts)
|
|
585
|
+
return accepts[0]
|
|
616
586
|
|
|
617
587
|
def select_header_content_type(self, content_types):
|
|
618
588
|
"""Returns `Content-Type` based on an array of content_types provided.
|
|
@@ -621,22 +591,33 @@ class ApiClient(ModelSerDe, object):
|
|
|
621
591
|
:return: Content-Type (e.g. application/json).
|
|
622
592
|
"""
|
|
623
593
|
if not content_types:
|
|
624
|
-
return
|
|
625
|
-
|
|
626
|
-
content_types = [x.lower() for x in content_types]
|
|
627
|
-
|
|
628
|
-
if 'application/json' in content_types or '*/*' in content_types:
|
|
629
|
-
return 'application/json'
|
|
630
|
-
else:
|
|
631
|
-
return content_types[0]
|
|
594
|
+
return None
|
|
632
595
|
|
|
633
|
-
|
|
634
|
-
|
|
596
|
+
for content_type in content_types:
|
|
597
|
+
if re.search('json', content_type, re.IGNORECASE):
|
|
598
|
+
return content_type
|
|
599
|
+
|
|
600
|
+
return content_types[0]
|
|
601
|
+
|
|
602
|
+
def update_params_for_auth(
|
|
603
|
+
self,
|
|
604
|
+
headers,
|
|
605
|
+
queries,
|
|
606
|
+
auth_settings,
|
|
607
|
+
resource_path,
|
|
608
|
+
method,
|
|
609
|
+
body,
|
|
610
|
+
request_auth=None
|
|
611
|
+
) -> None:
|
|
635
612
|
"""Updates header and query params based on authentication setting.
|
|
636
613
|
|
|
637
614
|
:param headers: Header parameters dict to be updated.
|
|
638
|
-
:param
|
|
615
|
+
:param queries: Query parameters tuple list to be updated.
|
|
639
616
|
:param auth_settings: Authentication setting identifiers list.
|
|
617
|
+
:resource_path: A string representation of the HTTP request resource path.
|
|
618
|
+
:method: A string representation of the HTTP request method.
|
|
619
|
+
:body: A object representing the body of the HTTP request.
|
|
620
|
+
The object type is the return value of sanitize_for_serialization().
|
|
640
621
|
:param request_auth: if set, the provided settings will
|
|
641
622
|
override the token in the configuration.
|
|
642
623
|
"""
|
|
@@ -644,27 +625,53 @@ class ApiClient(ModelSerDe, object):
|
|
|
644
625
|
return
|
|
645
626
|
|
|
646
627
|
if request_auth:
|
|
647
|
-
self._apply_auth_params(
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
628
|
+
self._apply_auth_params(
|
|
629
|
+
headers,
|
|
630
|
+
queries,
|
|
631
|
+
resource_path,
|
|
632
|
+
method,
|
|
633
|
+
body,
|
|
634
|
+
request_auth
|
|
635
|
+
)
|
|
636
|
+
else:
|
|
637
|
+
for auth in auth_settings:
|
|
638
|
+
auth_setting = self.configuration.auth_settings().get(auth)
|
|
639
|
+
if auth_setting:
|
|
640
|
+
self._apply_auth_params(
|
|
641
|
+
headers,
|
|
642
|
+
queries,
|
|
643
|
+
resource_path,
|
|
644
|
+
method,
|
|
645
|
+
body,
|
|
646
|
+
auth_setting
|
|
647
|
+
)
|
|
648
|
+
|
|
649
|
+
def _apply_auth_params(
|
|
650
|
+
self,
|
|
651
|
+
headers,
|
|
652
|
+
queries,
|
|
653
|
+
resource_path,
|
|
654
|
+
method,
|
|
655
|
+
body,
|
|
656
|
+
auth_setting
|
|
657
|
+
) -> None:
|
|
656
658
|
"""Updates the request parameters based on a single auth_setting
|
|
657
659
|
|
|
658
660
|
:param headers: Header parameters dict to be updated.
|
|
659
|
-
:param
|
|
661
|
+
:param queries: Query parameters tuple list to be updated.
|
|
662
|
+
:resource_path: A string representation of the HTTP request resource path.
|
|
663
|
+
:method: A string representation of the HTTP request method.
|
|
664
|
+
:body: A object representing the body of the HTTP request.
|
|
665
|
+
The object type is the return value of sanitize_for_serialization().
|
|
660
666
|
:param auth_setting: auth settings for the endpoint
|
|
661
667
|
"""
|
|
662
668
|
if auth_setting['in'] == 'cookie':
|
|
663
669
|
headers['Cookie'] = auth_setting['value']
|
|
664
670
|
elif auth_setting['in'] == 'header':
|
|
665
|
-
|
|
671
|
+
if auth_setting['type'] != 'http-signature':
|
|
672
|
+
headers[auth_setting['key']] = auth_setting['value']
|
|
666
673
|
elif auth_setting['in'] == 'query':
|
|
667
|
-
|
|
674
|
+
queries.append((auth_setting['key'], auth_setting['value']))
|
|
668
675
|
else:
|
|
669
676
|
raise ApiValueError(
|
|
670
677
|
'Authentication token must be in `query` or `header`'
|
|
@@ -676,6 +683,9 @@ class ApiClient(ModelSerDe, object):
|
|
|
676
683
|
Saves response body into a file in a temporary folder,
|
|
677
684
|
using the filename from the `Content-Disposition` header if provided.
|
|
678
685
|
|
|
686
|
+
handle file downloading
|
|
687
|
+
save response body into a tmp file and return the instance
|
|
688
|
+
|
|
679
689
|
:param response: RESTResponse.
|
|
680
690
|
:return: file path.
|
|
681
691
|
"""
|
|
@@ -685,11 +695,102 @@ class ApiClient(ModelSerDe, object):
|
|
|
685
695
|
|
|
686
696
|
content_disposition = response.getheader("Content-Disposition")
|
|
687
697
|
if content_disposition:
|
|
688
|
-
|
|
689
|
-
|
|
698
|
+
m = re.search(
|
|
699
|
+
r'filename=[\'"]?([^\'"\s]+)[\'"]?',
|
|
700
|
+
content_disposition
|
|
701
|
+
)
|
|
702
|
+
assert m is not None, "Unexpected 'content-disposition' header value"
|
|
703
|
+
filename = m.group(1)
|
|
690
704
|
path = os.path.join(os.path.dirname(path), filename)
|
|
691
705
|
|
|
692
706
|
with open(path, "wb") as f:
|
|
693
707
|
f.write(response.data)
|
|
694
708
|
|
|
695
709
|
return path
|
|
710
|
+
|
|
711
|
+
def __deserialize_primitive(self, data, klass):
|
|
712
|
+
"""Deserializes string to primitive type.
|
|
713
|
+
|
|
714
|
+
:param data: str.
|
|
715
|
+
:param klass: class literal.
|
|
716
|
+
|
|
717
|
+
:return: int, long, float, str, bool.
|
|
718
|
+
"""
|
|
719
|
+
try:
|
|
720
|
+
return klass(data)
|
|
721
|
+
except UnicodeEncodeError:
|
|
722
|
+
return str(data)
|
|
723
|
+
except TypeError:
|
|
724
|
+
return data
|
|
725
|
+
|
|
726
|
+
def __deserialize_object(self, value):
|
|
727
|
+
"""Return an original value.
|
|
728
|
+
|
|
729
|
+
:return: object.
|
|
730
|
+
"""
|
|
731
|
+
return value
|
|
732
|
+
|
|
733
|
+
def __deserialize_date(self, string):
|
|
734
|
+
"""Deserializes string to date.
|
|
735
|
+
|
|
736
|
+
:param string: str.
|
|
737
|
+
:return: date.
|
|
738
|
+
"""
|
|
739
|
+
try:
|
|
740
|
+
return parse(string).date()
|
|
741
|
+
except ImportError:
|
|
742
|
+
return string
|
|
743
|
+
except ValueError:
|
|
744
|
+
raise rest.ApiException(
|
|
745
|
+
status=0,
|
|
746
|
+
reason="Failed to parse `{0}` as date object".format(string)
|
|
747
|
+
)
|
|
748
|
+
|
|
749
|
+
def __deserialize_datetime(self, string):
|
|
750
|
+
"""Deserializes string to datetime.
|
|
751
|
+
|
|
752
|
+
The string should be in iso8601 datetime format.
|
|
753
|
+
|
|
754
|
+
:param string: str.
|
|
755
|
+
:return: datetime.
|
|
756
|
+
"""
|
|
757
|
+
try:
|
|
758
|
+
return parse(string)
|
|
759
|
+
except ImportError:
|
|
760
|
+
return string
|
|
761
|
+
except ValueError:
|
|
762
|
+
raise rest.ApiException(
|
|
763
|
+
status=0,
|
|
764
|
+
reason=(
|
|
765
|
+
"Failed to parse `{0}` as datetime object"
|
|
766
|
+
.format(string)
|
|
767
|
+
)
|
|
768
|
+
)
|
|
769
|
+
|
|
770
|
+
def __deserialize_enum(self, data, klass):
|
|
771
|
+
"""Deserializes primitive type to enum.
|
|
772
|
+
|
|
773
|
+
:param data: primitive type.
|
|
774
|
+
:param klass: class literal.
|
|
775
|
+
:return: enum value.
|
|
776
|
+
"""
|
|
777
|
+
try:
|
|
778
|
+
return klass(data)
|
|
779
|
+
except ValueError:
|
|
780
|
+
raise rest.ApiException(
|
|
781
|
+
status=0,
|
|
782
|
+
reason=(
|
|
783
|
+
"Failed to parse `{0}` as `{1}`"
|
|
784
|
+
.format(data, klass)
|
|
785
|
+
)
|
|
786
|
+
)
|
|
787
|
+
|
|
788
|
+
def __deserialize_model(self, data, klass):
|
|
789
|
+
"""Deserializes list or dict to model.
|
|
790
|
+
|
|
791
|
+
:param data: dict, list.
|
|
792
|
+
:param klass: class literal.
|
|
793
|
+
:return: model object.
|
|
794
|
+
"""
|
|
795
|
+
|
|
796
|
+
return klass.from_dict(data)
|