hiddenlayer-sdk 0.1.0__py3-none-any.whl

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