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.
Files changed (227) hide show
  1. regula/facesdk/webclient/__init__.py +5 -5
  2. regula/facesdk/webclient/ext/api/group_api.py +2 -27
  3. regula/facesdk/webclient/ext/api/match_api.py +3 -29
  4. regula/facesdk/webclient/ext/api/person_api.py +8 -34
  5. regula/facesdk/webclient/ext/api/sdk.py +5 -3
  6. regula/facesdk/webclient/ext/api/search_api.py +2 -6
  7. regula/facesdk/webclient/ext/models/detect_request.py +6 -5
  8. regula/facesdk/webclient/ext/models/match_image.py +3 -3
  9. regula/facesdk/webclient/ext/models/match_request.py +7 -5
  10. regula/facesdk/webclient/gen/__init__.py +349 -18
  11. regula/facesdk/webclient/gen/api/__init__.py +30 -3
  12. regula/facesdk/webclient/gen/api/group_api.py +1854 -799
  13. regula/facesdk/webclient/gen/api/healthcheck_api.py +475 -215
  14. regula/facesdk/webclient/gen/api/liveness20_api.py +565 -0
  15. regula/facesdk/webclient/gen/api/match_api.py +801 -355
  16. regula/facesdk/webclient/gen/api/person_api.py +2399 -1039
  17. regula/facesdk/webclient/gen/api/search_api.py +286 -130
  18. regula/facesdk/webclient/gen/api_client.py +577 -476
  19. regula/facesdk/webclient/gen/api_response.py +21 -0
  20. regula/facesdk/webclient/gen/configuration.py +231 -105
  21. regula/facesdk/webclient/gen/exceptions.py +82 -33
  22. regula/facesdk/webclient/gen/models/__init__.py +202 -95
  23. regula/facesdk/webclient/gen/models/add_image_to_person_request.py +96 -0
  24. regula/facesdk/webclient/gen/models/add_image_to_person_request_data.py +92 -0
  25. regula/facesdk/webclient/gen/models/add_image_to_person_request_image.py +92 -0
  26. regula/facesdk/webclient/gen/models/add_image_to_person_response.py +92 -0
  27. regula/facesdk/webclient/gen/models/attribute_config.py +83 -0
  28. regula/facesdk/webclient/gen/models/attributes_data.py +82 -0
  29. regula/facesdk/webclient/gen/models/crop.py +88 -0
  30. regula/facesdk/webclient/gen/models/detail_item.py +136 -0
  31. regula/facesdk/webclient/gen/models/detect_attributes_details.py +84 -0
  32. regula/facesdk/webclient/gen/models/detect_details_meta.py +86 -0
  33. regula/facesdk/webclient/gen/models/detect_meta_data.py +84 -0
  34. regula/facesdk/webclient/gen/models/detect_request.py +94 -0
  35. regula/facesdk/webclient/gen/models/detect_request_data.py +90 -0
  36. regula/facesdk/webclient/gen/models/detect_response.py +89 -0
  37. regula/facesdk/webclient/gen/models/detect_response_results.py +86 -0
  38. regula/facesdk/webclient/gen/models/detect_result.py +98 -0
  39. regula/facesdk/webclient/gen/models/detection.py +98 -0
  40. regula/facesdk/webclient/gen/models/detection_attributes.py +92 -0
  41. regula/facesdk/webclient/gen/models/detection_attributes_details_inner.py +132 -0
  42. regula/facesdk/webclient/gen/models/detection_face.py +90 -0
  43. regula/facesdk/webclient/gen/models/detection_quality.py +107 -0
  44. regula/facesdk/webclient/gen/models/device_info.py +111 -0
  45. regula/facesdk/webclient/gen/models/face_attribute.py +40 -0
  46. regula/facesdk/webclient/gen/models/face_image_quality_align_type.py +32 -0
  47. regula/facesdk/webclient/gen/models/face_image_quality_groups.py +35 -0
  48. regula/facesdk/webclient/gen/models/face_image_quality_groups_strings.py +35 -0
  49. regula/facesdk/webclient/gen/models/face_image_quality_status.py +30 -0
  50. regula/facesdk/webclient/gen/models/face_quality_config_name.py +75 -0
  51. regula/facesdk/webclient/gen/models/face_quality_scenarios.py +37 -0
  52. regula/facesdk/webclient/gen/models/face_sdk_result.py +83 -0
  53. regula/facesdk/webclient/gen/models/face_sdk_result_code.py +68 -0
  54. regula/facesdk/webclient/gen/models/faces_response.py +100 -0
  55. regula/facesdk/webclient/gen/models/faces_response_data.py +90 -0
  56. regula/facesdk/webclient/gen/models/filter_op.py +29 -0
  57. regula/facesdk/webclient/gen/models/filter_search_request.py +87 -0
  58. regula/facesdk/webclient/gen/models/group.py +89 -0
  59. regula/facesdk/webclient/gen/models/group_data.py +85 -0
  60. regula/facesdk/webclient/gen/models/group_page.py +94 -0
  61. regula/facesdk/webclient/gen/models/group_page_items.py +90 -0
  62. regula/facesdk/webclient/gen/models/group_response.py +84 -0
  63. regula/facesdk/webclient/gen/models/group_to_create.py +86 -0
  64. regula/facesdk/webclient/gen/models/image.py +96 -0
  65. regula/facesdk/webclient/gen/models/image_fields.py +100 -0
  66. regula/facesdk/webclient/gen/models/image_fields_image.py +92 -0
  67. regula/facesdk/webclient/gen/models/image_page.py +94 -0
  68. regula/facesdk/webclient/gen/models/image_page_items.py +90 -0
  69. regula/facesdk/webclient/gen/models/image_source.py +34 -0
  70. regula/facesdk/webclient/gen/models/liveness_type.py +29 -0
  71. regula/facesdk/webclient/gen/models/match_and_search_request.py +103 -0
  72. regula/facesdk/webclient/gen/models/match_and_search_request_images_item.py +87 -0
  73. regula/facesdk/webclient/gen/models/match_and_search_response.py +107 -0
  74. regula/facesdk/webclient/gen/models/match_and_search_response_data.py +104 -0
  75. regula/facesdk/webclient/gen/models/match_and_search_response_data_detections_item.py +95 -0
  76. regula/facesdk/webclient/gen/models/match_image.py +89 -0
  77. regula/facesdk/webclient/gen/models/match_image_detection.py +95 -0
  78. regula/facesdk/webclient/gen/models/match_image_result.py +97 -0
  79. regula/facesdk/webclient/gen/models/match_request.py +102 -0
  80. regula/facesdk/webclient/gen/models/match_request_data.py +98 -0
  81. regula/facesdk/webclient/gen/models/match_response.py +105 -0
  82. regula/facesdk/webclient/gen/models/match_response_data.py +102 -0
  83. regula/facesdk/webclient/gen/models/operation_log.py +88 -0
  84. regula/facesdk/webclient/gen/models/output_image_params.py +89 -0
  85. regula/facesdk/webclient/gen/models/page.py +84 -0
  86. regula/facesdk/webclient/gen/models/person.py +97 -0
  87. regula/facesdk/webclient/gen/models/person_data.py +87 -0
  88. regula/facesdk/webclient/gen/models/person_fields.py +91 -0
  89. regula/facesdk/webclient/gen/models/person_items.py +90 -0
  90. regula/facesdk/webclient/gen/models/person_to_update_fields.py +89 -0
  91. regula/facesdk/webclient/gen/models/person_with_images.py +107 -0
  92. regula/facesdk/webclient/gen/models/person_with_images_data.py +90 -0
  93. regula/facesdk/webclient/gen/models/persons_page.py +94 -0
  94. regula/facesdk/webclient/gen/models/process_param.py +103 -0
  95. regula/facesdk/webclient/gen/models/process_param_attributes.py +90 -0
  96. regula/facesdk/webclient/gen/models/quality_config.py +86 -0
  97. regula/facesdk/webclient/gen/models/quality_detail.py +94 -0
  98. regula/facesdk/webclient/gen/models/quality_details_groups.py +90 -0
  99. regula/facesdk/webclient/gen/models/quality_request.py +93 -0
  100. regula/facesdk/webclient/gen/models/recognize_image.py +100 -0
  101. regula/facesdk/webclient/gen/models/recognize_image_data.py +84 -0
  102. regula/facesdk/webclient/gen/models/resize_options.py +86 -0
  103. regula/facesdk/webclient/gen/models/search_bad_params.py +86 -0
  104. regula/facesdk/webclient/gen/models/search_detection.py +102 -0
  105. regula/facesdk/webclient/gen/models/search_parameters.py +95 -0
  106. regula/facesdk/webclient/gen/models/search_parameters_create_person.py +86 -0
  107. regula/facesdk/webclient/gen/models/search_person.py +113 -0
  108. regula/facesdk/webclient/gen/models/search_person_data.py +96 -0
  109. regula/facesdk/webclient/gen/models/search_request.py +119 -0
  110. regula/facesdk/webclient/gen/models/search_result.py +92 -0
  111. regula/facesdk/webclient/gen/models/transaction_info.py +99 -0
  112. regula/facesdk/webclient/gen/models/transaction_labels.py +84 -0
  113. regula/facesdk/webclient/gen/models/update_group.py +85 -0
  114. regula/facesdk/webclient/gen/py.typed +0 -0
  115. regula/facesdk/webclient/gen/rest.py +136 -232
  116. {regula_facesdk_webclient-7.2.388.dev0.dist-info → regula_facesdk_webclient-8.1.433.dev0.dist-info}/METADATA +7 -4
  117. regula_facesdk_webclient-8.1.433.dev0.dist-info/RECORD +125 -0
  118. {regula_facesdk_webclient-7.2.388.dev0.dist-info → regula_facesdk_webclient-8.1.433.dev0.dist-info}/WHEEL +1 -1
  119. regula/facesdk/webclient/gen/api/diagnostics_api.py +0 -162
  120. regula/facesdk/webclient/gen/api/liveness_2_0_api.py +0 -306
  121. regula/facesdk/webclient/gen/api/liveness_api.py +0 -424
  122. regula/facesdk/webclient/gen/apis/__init__.py +0 -22
  123. regula/facesdk/webclient/gen/model/__init__.py +0 -5
  124. regula/facesdk/webclient/gen/model/add_image_to_person_request.py +0 -261
  125. regula/facesdk/webclient/gen/model/add_image_to_person_request_image.py +0 -204
  126. regula/facesdk/webclient/gen/model/add_image_to_person_response.py +0 -262
  127. regula/facesdk/webclient/gen/model/attribute_config.py +0 -120
  128. regula/facesdk/webclient/gen/model/attribute_config_list.py +0 -92
  129. regula/facesdk/webclient/gen/model/crop.py +0 -180
  130. regula/facesdk/webclient/gen/model/detect_attributes_details.py +0 -150
  131. regula/facesdk/webclient/gen/model/detect_details_meta.py +0 -178
  132. regula/facesdk/webclient/gen/model/detect_request.py +0 -232
  133. regula/facesdk/webclient/gen/model/detect_request_attributes.py +0 -120
  134. regula/facesdk/webclient/gen/model/detect_response.py +0 -147
  135. regula/facesdk/webclient/gen/model/detect_response_all_of.py +0 -120
  136. regula/facesdk/webclient/gen/model/detect_result.py +0 -235
  137. regula/facesdk/webclient/gen/model/detection.py +0 -230
  138. regula/facesdk/webclient/gen/model/detection_attributes.py +0 -150
  139. regula/facesdk/webclient/gen/model/detection_face.py +0 -232
  140. regula/facesdk/webclient/gen/model/detection_quality.py +0 -234
  141. regula/facesdk/webclient/gen/model/device_info.py +0 -231
  142. regula/facesdk/webclient/gen/model/face_align_type_quality.py +0 -109
  143. regula/facesdk/webclient/gen/model/face_attribute.py +0 -133
  144. regula/facesdk/webclient/gen/model/face_image_quality_align_type.py +0 -109
  145. regula/facesdk/webclient/gen/model/face_image_quality_groups.py +0 -118
  146. regula/facesdk/webclient/gen/model/face_image_quality_groups_strings.py +0 -118
  147. regula/facesdk/webclient/gen/model/face_image_quality_status.py +0 -103
  148. regula/facesdk/webclient/gen/model/face_quality_config_name.py +0 -238
  149. regula/facesdk/webclient/gen/model/face_quality_scenarios.py +0 -124
  150. regula/facesdk/webclient/gen/model/face_quality_status.py +0 -103
  151. regula/facesdk/webclient/gen/model/face_rectangular.py +0 -92
  152. regula/facesdk/webclient/gen/model/face_sdk_result.py +0 -121
  153. regula/facesdk/webclient/gen/model/face_sdk_result_code.py +0 -217
  154. regula/facesdk/webclient/gen/model/faces_response.py +0 -258
  155. regula/facesdk/webclient/gen/model/faces_response_all_of.py +0 -148
  156. regula/facesdk/webclient/gen/model/filter_op.py +0 -100
  157. regula/facesdk/webclient/gen/model/filter_search_request.py +0 -176
  158. regula/facesdk/webclient/gen/model/group.py +0 -206
  159. regula/facesdk/webclient/gen/model/group_all_of.py +0 -150
  160. regula/facesdk/webclient/gen/model/group_page.py +0 -178
  161. regula/facesdk/webclient/gen/model/group_page_all_of.py +0 -122
  162. regula/facesdk/webclient/gen/model/group_response.py +0 -150
  163. regula/facesdk/webclient/gen/model/group_to_create.py +0 -180
  164. regula/facesdk/webclient/gen/model/image.py +0 -318
  165. regula/facesdk/webclient/gen/model/image_fields.py +0 -258
  166. regula/facesdk/webclient/gen/model/image_fields_image.py +0 -204
  167. regula/facesdk/webclient/gen/model/image_page.py +0 -176
  168. regula/facesdk/webclient/gen/model/image_page_all_of.py +0 -120
  169. regula/facesdk/webclient/gen/model/image_source.py +0 -115
  170. regula/facesdk/webclient/gen/model/liveness_transaction.py +0 -334
  171. regula/facesdk/webclient/gen/model/liveness_type.py +0 -100
  172. regula/facesdk/webclient/gen/model/match_and_search_request.py +0 -290
  173. regula/facesdk/webclient/gen/model/match_and_search_request_all_of.py +0 -234
  174. regula/facesdk/webclient/gen/model/match_and_search_request_all_of_images.py +0 -148
  175. regula/facesdk/webclient/gen/model/match_and_search_request_images.py +0 -176
  176. regula/facesdk/webclient/gen/model/match_and_search_response.py +0 -233
  177. regula/facesdk/webclient/gen/model/match_and_search_response_all_of.py +0 -206
  178. regula/facesdk/webclient/gen/model/match_and_search_response_all_of_detections.py +0 -176
  179. regula/facesdk/webclient/gen/model/match_image.py +0 -205
  180. regula/facesdk/webclient/gen/model/match_image_detection.py +0 -178
  181. regula/facesdk/webclient/gen/model/match_image_result.py +0 -316
  182. regula/facesdk/webclient/gen/model/match_request.py +0 -233
  183. regula/facesdk/webclient/gen/model/match_request_output_image_params.py +0 -148
  184. regula/facesdk/webclient/gen/model/match_request_output_image_params_crop.py +0 -212
  185. regula/facesdk/webclient/gen/model/match_response.py +0 -205
  186. regula/facesdk/webclient/gen/model/match_response_all_of.py +0 -178
  187. regula/facesdk/webclient/gen/model/operation_log.py +0 -206
  188. regula/facesdk/webclient/gen/model/output_image_params.py +0 -146
  189. regula/facesdk/webclient/gen/model/page.py +0 -150
  190. regula/facesdk/webclient/gen/model/person.py +0 -319
  191. regula/facesdk/webclient/gen/model/person_all_of.py +0 -206
  192. regula/facesdk/webclient/gen/model/person_created_response.py +0 -178
  193. regula/facesdk/webclient/gen/model/person_fields.py +0 -235
  194. regula/facesdk/webclient/gen/model/person_to_update_fields.py +0 -206
  195. regula/facesdk/webclient/gen/model/person_with_images.py +0 -347
  196. regula/facesdk/webclient/gen/model/person_with_images_all_of.py +0 -122
  197. regula/facesdk/webclient/gen/model/persons_page.py +0 -176
  198. regula/facesdk/webclient/gen/model/persons_page_all_of.py +0 -120
  199. regula/facesdk/webclient/gen/model/persons_request.py +0 -291
  200. regula/facesdk/webclient/gen/model/persons_request_all_of.py +0 -150
  201. regula/facesdk/webclient/gen/model/process_param.py +0 -226
  202. regula/facesdk/webclient/gen/model/process_param_attributes.py +0 -120
  203. regula/facesdk/webclient/gen/model/quality_config.py +0 -154
  204. regula/facesdk/webclient/gen/model/quality_config_list.py +0 -92
  205. regula/facesdk/webclient/gen/model/quality_detail.py +0 -234
  206. regula/facesdk/webclient/gen/model/quality_details_groups.py +0 -202
  207. regula/facesdk/webclient/gen/model/quality_request.py +0 -146
  208. regula/facesdk/webclient/gen/model/recognize_image.py +0 -374
  209. regula/facesdk/webclient/gen/model/recognize_image_all_of.py +0 -150
  210. regula/facesdk/webclient/gen/model/resize_options.py +0 -178
  211. regula/facesdk/webclient/gen/model/rgb.py +0 -92
  212. regula/facesdk/webclient/gen/model/search_bad_params.py +0 -172
  213. regula/facesdk/webclient/gen/model/search_detection.py +0 -398
  214. regula/facesdk/webclient/gen/model/search_parameters.py +0 -174
  215. regula/facesdk/webclient/gen/model/search_parameters_create_person.py +0 -177
  216. regula/facesdk/webclient/gen/model/search_person.py +0 -373
  217. regula/facesdk/webclient/gen/model/search_person_all_of.py +0 -148
  218. regula/facesdk/webclient/gen/model/search_request.py +0 -394
  219. regula/facesdk/webclient/gen/model/search_request_all_of.py +0 -150
  220. regula/facesdk/webclient/gen/model/search_result.py +0 -150
  221. regula/facesdk/webclient/gen/model/search_result_all_of.py +0 -122
  222. regula/facesdk/webclient/gen/model/transaction_config.py +0 -92
  223. regula/facesdk/webclient/gen/model/transaction_info.py +0 -344
  224. regula/facesdk/webclient/gen/model/update_group.py +0 -150
  225. regula/facesdk/webclient/gen/model_utils.py +0 -2037
  226. regula_facesdk_webclient-7.2.388.dev0.dist-info/RECORD +0 -138
  227. {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
- The version of the OpenAPI document: 7.2.0
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
- # python 2 and python 3 compatibility library
24
- import six
25
- from six.moves.urllib.parse import quote
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
- import regula.facesdk.webclient.gen.model
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 ApiValueError, ApiException
31
-
32
-
33
- class ModelSerDe:
34
-
35
- PRIMITIVE_TYPES = (float, bool, bytes, six.text_type) + six.integer_types
36
- NATIVE_TYPES_MAPPING = {
37
- 'int': int,
38
- 'long': int if six.PY3 else long, # noqa: F821
39
- 'float': float,
40
- 'str': str,
41
- 'bool': bool,
42
- 'date': datetime.date,
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__(self, configuration=None, header_name=None, header_value=None,
245
- cookie=None, pool_threads=1):
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.get_default_copy()
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
- self.close()
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
- def __call_api(
319
- self, resource_path, method, path_params=None,
320
- query_params=None, header_params=None, body=None, post_params=None,
321
- files=None, response_type=None, auth_settings=None,
322
- _return_http_data_only=None, collection_formats=None,
323
- _preload_content=True, _request_timeout=None, _host=None,
324
- _request_auth=None):
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(self.parameters_to_tuples(header_params,
336
- collection_formats))
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(path_params,
342
- collection_formats)
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(post_params,
361
- collection_formats)
362
- post_params.extend(self.files_parameters(files))
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, query_params, auth_settings,
367
- request_auth=_request_auth)
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, query_params=query_params, headers=header_params,
384
- post_params=post_params, body=body,
385
- _preload_content=_preload_content,
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
- content_type = response_data.getheader('content-type')
276
+ return response_data
392
277
 
393
- self.last_response = response_data
394
-
395
- return_data = response_data
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
- if not _preload_content:
398
- return return_data
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
- if six.PY3 and response_type not in ["file", "bytes"]:
401
- match = None
402
- if content_type is not None:
403
- match = re.search(r"charset=([a-zA-Z\-\d]+)[\s\;]?", content_type)
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
- if response_type:
409
- return_data = self.deserialize(response_data, response_type)
410
- else:
411
- return_data = None
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
- if _return_http_data_only:
414
- return (return_data)
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
- return (return_data, response_data.status,
417
- response_data.getheaders())
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
- def call_api(self, resource_path, method,
420
- path_params=None, query_params=None, header_params=None,
421
- body=None, post_params=None, files=None,
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
- To make an async_req request, set the async_req parameter.
384
+ return {
385
+ key: self.sanitize_for_serialization(val)
386
+ for key, val in obj_dict.items()
387
+ }
429
388
 
430
- :param resource_path: Path to method endpoint.
431
- :param method: Method to call.
432
- :param path_params: Path parameters in the url.
433
- :param query_params: Query parameters in the url.
434
- :param header_params: Header parameters to be
435
- placed in the request header.
436
- :param body: Request body.
437
- :param post_params dict: Request post form parameters,
438
- for `application/x-www-form-urlencoded`, `multipart/form-data`.
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
- if not async_req:
467
- return self.__call_api(resource_path, method,
468
- path_params, query_params, header_params,
469
- body, post_params, files,
470
- response_type, auth_settings,
471
- _return_http_data_only, collection_formats,
472
- _preload_content, _request_timeout, _host,
473
- _request_auth)
474
-
475
- return self.pool.apply_async(self.__call_api, (resource_path,
476
- method, path_params,
477
- query_params,
478
- header_params, body,
479
- post_params, files,
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 ApiValueError(
543
- "http method must be `GET`, `HEAD`, `OPTIONS`,"
544
- " `POST`, `PATCH`, `PUT` or `DELETE`."
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 six.iteritems(params) if isinstance(params, dict) else params: # noqa: E501
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 files_parameters(self, files=None):
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
- if files:
586
- for k, v in six.iteritems(files):
587
- if not v:
588
- continue
589
- file_names = v if type(v) is list else [v]
590
- for n in file_names:
591
- with open(n, 'rb') as f:
592
- filename = os.path.basename(f.name)
593
- filedata = f.read()
594
- mimetype = (mimetypes.guess_type(filename)[0] or
595
- 'application/octet-stream')
596
- params.append(
597
- tuple([k, tuple([filename, filedata, mimetype])]))
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
- accepts = [x.lower() for x in accepts]
581
+ for accept in accepts:
582
+ if re.search('json', accept, re.IGNORECASE):
583
+ return accept
611
584
 
612
- if 'application/json' in accepts:
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 'application/json'
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
- def update_params_for_auth(self, headers, querys, auth_settings,
634
- request_auth=None):
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 querys: Query parameters tuple list to be updated.
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(headers, querys, request_auth)
648
- return
649
-
650
- for auth in auth_settings:
651
- auth_setting = self.configuration.auth_settings().get(auth)
652
- if auth_setting:
653
- self._apply_auth_params(headers, querys, auth_setting)
654
-
655
- def _apply_auth_params(self, headers, querys, auth_setting):
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 querys: Query parameters tuple list to be updated.
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
- headers[auth_setting['key']] = auth_setting['value']
671
+ if auth_setting['type'] != 'http-signature':
672
+ headers[auth_setting['key']] = auth_setting['value']
666
673
  elif auth_setting['in'] == 'query':
667
- querys.append((auth_setting['key'], auth_setting['value']))
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
- filename = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?',
689
- content_disposition).group(1)
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)