diracx-client 0.0.1a11__py3-none-any.whl → 0.0.1a13__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.
- diracx/client/__init__.py +1 -1
- diracx/client/_client.py +29 -5
- diracx/client/_configuration.py +4 -5
- diracx/client/_serialization.py +67 -71
- diracx/client/_vendor.py +37 -15
- diracx/client/aio/__init__.py +1 -1
- diracx/client/aio/_client.py +27 -5
- diracx/client/aio/_configuration.py +6 -7
- diracx/client/aio/_vendor.py +39 -1
- diracx/client/aio/operations/__init__.py +1 -1
- diracx/client/aio/operations/_operations.py +702 -316
- diracx/client/aio/operations/_patch.py +1 -2
- diracx/client/models/__init__.py +5 -3
- diracx/client/models/_enums.py +24 -17
- diracx/client/models/_models.py +20 -62
- diracx/client/operations/__init__.py +1 -1
- diracx/client/operations/_operations.py +849 -350
- diracx/client/operations/_patch.py +0 -2
- {diracx_client-0.0.1a11.dist-info → diracx_client-0.0.1a13.dist-info}/METADATA +1 -1
- diracx_client-0.0.1a13.dist-info/RECORD +26 -0
- {diracx_client-0.0.1a11.dist-info → diracx_client-0.0.1a13.dist-info}/WHEEL +1 -1
- diracx_client-0.0.1a11.dist-info/RECORD +0 -26
- {diracx_client-0.0.1a11.dist-info → diracx_client-0.0.1a13.dist-info}/top_level.txt +0 -0
diracx/client/__init__.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding=utf-8
|
2
2
|
# --------------------------------------------------------------------------
|
3
|
-
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.
|
3
|
+
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.9)
|
4
4
|
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
5
5
|
# --------------------------------------------------------------------------
|
6
6
|
|
diracx/client/_client.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding=utf-8
|
2
2
|
# --------------------------------------------------------------------------
|
3
|
-
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.
|
3
|
+
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.9)
|
4
4
|
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
5
5
|
# --------------------------------------------------------------------------
|
6
6
|
|
@@ -8,6 +8,7 @@ from copy import deepcopy
|
|
8
8
|
from typing import Any
|
9
9
|
|
10
10
|
from azure.core import PipelineClient
|
11
|
+
from azure.core.pipeline import policies
|
11
12
|
from azure.core.rest import HttpRequest, HttpResponse
|
12
13
|
|
13
14
|
from . import models as _models
|
@@ -40,8 +41,29 @@ class Dirac: # pylint: disable=client-accepts-api-version-keyword
|
|
40
41
|
self, *, endpoint: str = "", **kwargs: Any
|
41
42
|
) -> None:
|
42
43
|
self._config = DiracConfiguration(**kwargs)
|
44
|
+
_policies = kwargs.pop("policies", None)
|
45
|
+
if _policies is None:
|
46
|
+
_policies = [
|
47
|
+
policies.RequestIdPolicy(**kwargs),
|
48
|
+
self._config.headers_policy,
|
49
|
+
self._config.user_agent_policy,
|
50
|
+
self._config.proxy_policy,
|
51
|
+
policies.ContentDecodePolicy(**kwargs),
|
52
|
+
self._config.redirect_policy,
|
53
|
+
self._config.retry_policy,
|
54
|
+
self._config.authentication_policy,
|
55
|
+
self._config.custom_hook_policy,
|
56
|
+
self._config.logging_policy,
|
57
|
+
policies.DistributedTracingPolicy(**kwargs),
|
58
|
+
(
|
59
|
+
policies.SensitiveHeaderCleanupPolicy(**kwargs)
|
60
|
+
if self._config.redirect_policy
|
61
|
+
else None
|
62
|
+
),
|
63
|
+
self._config.http_logging_policy,
|
64
|
+
]
|
43
65
|
self._client: PipelineClient = PipelineClient(
|
44
|
-
base_url=endpoint,
|
66
|
+
base_url=endpoint, policies=_policies, **kwargs
|
45
67
|
)
|
46
68
|
|
47
69
|
client_models = {
|
@@ -53,7 +75,7 @@ class Dirac: # pylint: disable=client-accepts-api-version-keyword
|
|
53
75
|
self.well_known = WellKnownOperations(
|
54
76
|
self._client, self._config, self._serialize, self._deserialize
|
55
77
|
)
|
56
|
-
self.auth = AuthOperations(
|
78
|
+
self.auth = AuthOperations(
|
57
79
|
self._client, self._config, self._serialize, self._deserialize
|
58
80
|
)
|
59
81
|
self.config = ConfigOperations(
|
@@ -63,7 +85,9 @@ class Dirac: # pylint: disable=client-accepts-api-version-keyword
|
|
63
85
|
self._client, self._config, self._serialize, self._deserialize
|
64
86
|
)
|
65
87
|
|
66
|
-
def send_request(
|
88
|
+
def send_request(
|
89
|
+
self, request: HttpRequest, *, stream: bool = False, **kwargs: Any
|
90
|
+
) -> HttpResponse:
|
67
91
|
"""Runs the network request through the client's chained policies.
|
68
92
|
|
69
93
|
>>> from azure.core.rest import HttpRequest
|
@@ -83,7 +107,7 @@ class Dirac: # pylint: disable=client-accepts-api-version-keyword
|
|
83
107
|
|
84
108
|
request_copy = deepcopy(request)
|
85
109
|
request_copy.url = self._client.format_url(request_copy.url)
|
86
|
-
return self._client.send_request(request_copy, **kwargs)
|
110
|
+
return self._client.send_request(request_copy, stream=stream, **kwargs) # type: ignore
|
87
111
|
|
88
112
|
def close(self) -> None:
|
89
113
|
self._client.close()
|
diracx/client/_configuration.py
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
# coding=utf-8
|
2
2
|
# --------------------------------------------------------------------------
|
3
|
-
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.
|
3
|
+
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.9)
|
4
4
|
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
5
5
|
# --------------------------------------------------------------------------
|
6
6
|
|
7
7
|
from typing import Any
|
8
8
|
|
9
|
-
from azure.core.configuration import Configuration
|
10
9
|
from azure.core.pipeline import policies
|
11
10
|
|
12
11
|
VERSION = "unknown"
|
13
12
|
|
14
13
|
|
15
|
-
class DiracConfiguration
|
14
|
+
class DiracConfiguration: # pylint: disable=too-many-instance-attributes
|
16
15
|
"""Configuration for Dirac.
|
17
16
|
|
18
17
|
Note that all parameters used to create this instance are saved as instance
|
@@ -20,9 +19,9 @@ class DiracConfiguration(Configuration): # pylint: disable=too-many-instance-at
|
|
20
19
|
"""
|
21
20
|
|
22
21
|
def __init__(self, **kwargs: Any) -> None:
|
23
|
-
super(DiracConfiguration, self).__init__(**kwargs)
|
24
22
|
|
25
23
|
kwargs.setdefault("sdk_moniker", "dirac/{}".format(VERSION))
|
24
|
+
self.polling_interval = kwargs.get("polling_interval", 30)
|
26
25
|
self._configure(**kwargs)
|
27
26
|
|
28
27
|
def _configure(self, **kwargs: Any) -> None:
|
@@ -39,11 +38,11 @@ class DiracConfiguration(Configuration): # pylint: disable=too-many-instance-at
|
|
39
38
|
self.http_logging_policy = kwargs.get(
|
40
39
|
"http_logging_policy"
|
41
40
|
) or policies.HttpLoggingPolicy(**kwargs)
|
42
|
-
self.retry_policy = kwargs.get("retry_policy") or policies.RetryPolicy(**kwargs)
|
43
41
|
self.custom_hook_policy = kwargs.get(
|
44
42
|
"custom_hook_policy"
|
45
43
|
) or policies.CustomHookPolicy(**kwargs)
|
46
44
|
self.redirect_policy = kwargs.get("redirect_policy") or policies.RedirectPolicy(
|
47
45
|
**kwargs
|
48
46
|
)
|
47
|
+
self.retry_policy = kwargs.get("retry_policy") or policies.RetryPolicy(**kwargs)
|
49
48
|
self.authentication_policy = kwargs.get("authentication_policy")
|
diracx/client/_serialization.py
CHANGED
@@ -63,12 +63,8 @@ import xml.etree.ElementTree as ET
|
|
63
63
|
|
64
64
|
import isodate # type: ignore
|
65
65
|
|
66
|
-
from azure.core.exceptions import
|
67
|
-
|
68
|
-
SerializationError,
|
69
|
-
raise_with_traceback,
|
70
|
-
)
|
71
|
-
from azure.core.serialization import NULL as AzureCoreNull
|
66
|
+
from azure.core.exceptions import DeserializationError, SerializationError
|
67
|
+
from azure.core.serialization import NULL as CoreNull
|
72
68
|
|
73
69
|
_BOM = codecs.BOM_UTF8.decode(encoding="utf-8")
|
74
70
|
|
@@ -77,6 +73,7 @@ JSON = MutableMapping[str, Any]
|
|
77
73
|
|
78
74
|
|
79
75
|
class RawDeserializer:
|
76
|
+
|
80
77
|
# Accept "text" because we're open minded people...
|
81
78
|
JSON_REGEXP = re.compile(r"^(application|text)/([a-z+.]+\+)?json$")
|
82
79
|
|
@@ -120,6 +117,7 @@ class RawDeserializer:
|
|
120
117
|
raise DeserializationError("JSON is invalid: {}".format(err), err)
|
121
118
|
elif "xml" in (content_type or []):
|
122
119
|
try:
|
120
|
+
|
123
121
|
try:
|
124
122
|
if isinstance(data, unicode): # type: ignore
|
125
123
|
# If I'm Python 2.7 and unicode XML will scream if I try a "fromstring" on unicode string
|
@@ -128,7 +126,7 @@ class RawDeserializer:
|
|
128
126
|
pass
|
129
127
|
|
130
128
|
return ET.fromstring(data_as_str) # nosec
|
131
|
-
except ET.ParseError:
|
129
|
+
except ET.ParseError as err:
|
132
130
|
# It might be because the server has an issue, and returned JSON with
|
133
131
|
# content-type XML....
|
134
132
|
# So let's try a JSON load, and if it's still broken
|
@@ -147,7 +145,7 @@ class RawDeserializer:
|
|
147
145
|
# The function hack is because Py2.7 messes up with exception
|
148
146
|
# context otherwise.
|
149
147
|
_LOGGER.critical("Wasn't XML not JSON, failing")
|
150
|
-
|
148
|
+
raise DeserializationError("XML is invalid") from err
|
151
149
|
raise DeserializationError(
|
152
150
|
"Cannot deserialize content-type: {}".format(content_type)
|
153
151
|
)
|
@@ -178,13 +176,6 @@ class RawDeserializer:
|
|
178
176
|
return None
|
179
177
|
|
180
178
|
|
181
|
-
try:
|
182
|
-
basestring # type: ignore
|
183
|
-
unicode_str = unicode # type: ignore
|
184
|
-
except NameError:
|
185
|
-
basestring = str
|
186
|
-
unicode_str = str
|
187
|
-
|
188
179
|
_LOGGER = logging.getLogger(__name__)
|
189
180
|
|
190
181
|
try:
|
@@ -303,7 +294,7 @@ class Model(object):
|
|
303
294
|
_validation: Dict[str, Dict[str, Any]] = {}
|
304
295
|
|
305
296
|
def __init__(self, **kwargs: Any) -> None:
|
306
|
-
self.additional_properties: Dict[str, Any] = {}
|
297
|
+
self.additional_properties: Optional[Dict[str, Any]] = {}
|
307
298
|
for k in kwargs:
|
308
299
|
if k not in self._attribute_map:
|
309
300
|
_LOGGER.warning(
|
@@ -360,7 +351,7 @@ class Model(object):
|
|
360
351
|
)
|
361
352
|
|
362
353
|
def serialize(self, keep_readonly: bool = False, **kwargs: Any) -> JSON:
|
363
|
-
"""Return the JSON that would be sent to
|
354
|
+
"""Return the JSON that would be sent to server from this model.
|
364
355
|
|
365
356
|
This is an alias to `as_dict(full_restapi_key_transformer, keep_readonly=False)`.
|
366
357
|
|
@@ -371,7 +362,7 @@ class Model(object):
|
|
371
362
|
:rtype: dict
|
372
363
|
"""
|
373
364
|
serializer = Serializer(self._infer_class_models())
|
374
|
-
return serializer._serialize(self, keep_readonly=keep_readonly, **kwargs)
|
365
|
+
return serializer._serialize(self, keep_readonly=keep_readonly, **kwargs) # type: ignore
|
375
366
|
|
376
367
|
def as_dict(
|
377
368
|
self,
|
@@ -412,9 +403,7 @@ class Model(object):
|
|
412
403
|
:rtype: dict
|
413
404
|
"""
|
414
405
|
serializer = Serializer(self._infer_class_models())
|
415
|
-
return serializer._serialize(
|
416
|
-
self, key_transformer=key_transformer, keep_readonly=keep_readonly, **kwargs
|
417
|
-
)
|
406
|
+
return serializer._serialize(self, key_transformer=key_transformer, keep_readonly=keep_readonly, **kwargs) # type: ignore
|
418
407
|
|
419
408
|
@classmethod
|
420
409
|
def _infer_class_models(cls):
|
@@ -443,7 +432,7 @@ class Model(object):
|
|
443
432
|
:raises: DeserializationError if something went wrong
|
444
433
|
"""
|
445
434
|
deserializer = Deserializer(cls._infer_class_models())
|
446
|
-
return deserializer(cls.__name__, data, content_type=content_type)
|
435
|
+
return deserializer(cls.__name__, data, content_type=content_type) # type: ignore
|
447
436
|
|
448
437
|
@classmethod
|
449
438
|
def from_dict(
|
@@ -473,7 +462,7 @@ class Model(object):
|
|
473
462
|
if key_extractors is None
|
474
463
|
else key_extractors
|
475
464
|
)
|
476
|
-
return deserializer(cls.__name__, data, content_type=content_type)
|
465
|
+
return deserializer(cls.__name__, data, content_type=content_type) # type: ignore
|
477
466
|
|
478
467
|
@classmethod
|
479
468
|
def _flatten_subtype(cls, key, objects):
|
@@ -581,7 +570,7 @@ class Serializer(object):
|
|
581
570
|
"multiple": lambda x, y: x % y != 0,
|
582
571
|
}
|
583
572
|
|
584
|
-
def __init__(self, classes: Optional[Mapping[str,
|
573
|
+
def __init__(self, classes: Optional[Mapping[str, type]] = None):
|
585
574
|
self.serialize_type = {
|
586
575
|
"iso-8601": Serializer.serialize_iso,
|
587
576
|
"rfc-1123": Serializer.serialize_rfc,
|
@@ -597,7 +586,7 @@ class Serializer(object):
|
|
597
586
|
"[]": self.serialize_iter,
|
598
587
|
"{}": self.serialize_dict,
|
599
588
|
}
|
600
|
-
self.dependencies: Dict[str,
|
589
|
+
self.dependencies: Dict[str, type] = dict(classes) if classes else {}
|
601
590
|
self.key_transformer = full_restapi_key_transformer
|
602
591
|
self.client_side_validation = True
|
603
592
|
|
@@ -650,6 +639,7 @@ class Serializer(object):
|
|
650
639
|
serialized.update(target_obj.additional_properties)
|
651
640
|
continue
|
652
641
|
try:
|
642
|
+
|
653
643
|
orig_attr = getattr(target_obj, attr)
|
654
644
|
if is_xml_model_serialization:
|
655
645
|
pass # Don't provide "transformer" for XML for now. Keep "orig_attr"
|
@@ -692,7 +682,7 @@ class Serializer(object):
|
|
692
682
|
else: # That's a basic type
|
693
683
|
# Integrate namespace if necessary
|
694
684
|
local_node = _create_xml_node(xml_name, xml_prefix, xml_ns)
|
695
|
-
local_node.text =
|
685
|
+
local_node.text = str(new_attr)
|
696
686
|
serialized.append(local_node) # type: ignore
|
697
687
|
else: # JSON
|
698
688
|
for k in reversed(keys): # type: ignore
|
@@ -705,14 +695,15 @@ class Serializer(object):
|
|
705
695
|
_serialized.update(_new_attr) # type: ignore
|
706
696
|
_new_attr = _new_attr[k] # type: ignore
|
707
697
|
_serialized = _serialized[k]
|
708
|
-
except ValueError:
|
709
|
-
|
698
|
+
except ValueError as err:
|
699
|
+
if isinstance(err, SerializationError):
|
700
|
+
raise
|
710
701
|
|
711
702
|
except (AttributeError, KeyError, TypeError) as err:
|
712
703
|
msg = "Attribute {} in object {} cannot be serialized.\n{}".format(
|
713
704
|
attr_name, class_name, str(target_obj)
|
714
705
|
)
|
715
|
-
|
706
|
+
raise SerializationError(msg) from err
|
716
707
|
else:
|
717
708
|
return serialized
|
718
709
|
|
@@ -756,9 +747,9 @@ class Serializer(object):
|
|
756
747
|
]
|
757
748
|
data = deserializer._deserialize(data_type, data)
|
758
749
|
except DeserializationError as err:
|
759
|
-
|
760
|
-
|
761
|
-
)
|
750
|
+
raise SerializationError(
|
751
|
+
"Unable to build a model: " + str(err)
|
752
|
+
) from err
|
762
753
|
|
763
754
|
return self._serialize(data, data_type, **kwargs)
|
764
755
|
|
@@ -778,6 +769,7 @@ class Serializer(object):
|
|
778
769
|
|
779
770
|
if kwargs.get("skip_quote") is True:
|
780
771
|
output = str(output)
|
772
|
+
output = output.replace("{", quote("{")).replace("}", quote("}"))
|
781
773
|
else:
|
782
774
|
output = quote(str(output), safe="")
|
783
775
|
except SerializationError:
|
@@ -790,7 +782,9 @@ class Serializer(object):
|
|
790
782
|
|
791
783
|
:param data: The data to be serialized.
|
792
784
|
:param str data_type: The type to be serialized from.
|
793
|
-
:
|
785
|
+
:keyword bool skip_quote: Whether to skip quote the serialized result.
|
786
|
+
Defaults to False.
|
787
|
+
:rtype: str, list
|
794
788
|
:raises: TypeError if serialization fails.
|
795
789
|
:raises: ValueError if data is None
|
796
790
|
"""
|
@@ -798,17 +792,10 @@ class Serializer(object):
|
|
798
792
|
# Treat the list aside, since we don't want to encode the div separator
|
799
793
|
if data_type.startswith("["):
|
800
794
|
internal_data_type = data_type[1:-1]
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
else ""
|
806
|
-
)
|
807
|
-
for d in data
|
808
|
-
]
|
809
|
-
if not kwargs.get("skip_quote", False):
|
810
|
-
data = [quote(str(d), safe="") for d in data]
|
811
|
-
return str(self.serialize_iter(data, internal_data_type, **kwargs))
|
795
|
+
do_quote = not kwargs.get("skip_quote", False)
|
796
|
+
return self.serialize_iter(
|
797
|
+
data, internal_data_type, do_quote=do_quote, **kwargs
|
798
|
+
)
|
812
799
|
|
813
800
|
# Not a list, regular serialization
|
814
801
|
output = self.serialize_data(data, data_type, **kwargs)
|
@@ -859,7 +846,7 @@ class Serializer(object):
|
|
859
846
|
raise ValueError("No value for given attribute")
|
860
847
|
|
861
848
|
try:
|
862
|
-
if data is
|
849
|
+
if data is CoreNull:
|
863
850
|
return None
|
864
851
|
if data_type in self.basic_types.values():
|
865
852
|
return self.serialize_basic(data, data_type, **kwargs)
|
@@ -879,7 +866,7 @@ class Serializer(object):
|
|
879
866
|
|
880
867
|
except (ValueError, TypeError) as err:
|
881
868
|
msg = "Unable to serialize value: {!r} as type: {!r}."
|
882
|
-
|
869
|
+
raise SerializationError(msg.format(data, data_type)) from err
|
883
870
|
else:
|
884
871
|
return self._serialize(data, **kwargs)
|
885
872
|
|
@@ -947,6 +934,8 @@ class Serializer(object):
|
|
947
934
|
not be None or empty.
|
948
935
|
:param str div: If set, this str will be used to combine the elements
|
949
936
|
in the iterable into a combined string. Default is 'None'.
|
937
|
+
:keyword bool do_quote: Whether to quote the serialized result of each iterable element.
|
938
|
+
Defaults to False.
|
950
939
|
:rtype: list, str
|
951
940
|
"""
|
952
941
|
if isinstance(data, str):
|
@@ -959,9 +948,16 @@ class Serializer(object):
|
|
959
948
|
for d in data:
|
960
949
|
try:
|
961
950
|
serialized.append(self.serialize_data(d, iter_type, **kwargs))
|
962
|
-
except ValueError:
|
951
|
+
except ValueError as err:
|
952
|
+
if isinstance(err, SerializationError):
|
953
|
+
raise
|
963
954
|
serialized.append(None)
|
964
955
|
|
956
|
+
if kwargs.get("do_quote", False):
|
957
|
+
serialized = [
|
958
|
+
"" if s is None else quote(str(s), safe="") for s in serialized
|
959
|
+
]
|
960
|
+
|
965
961
|
if div:
|
966
962
|
serialized = ["" if s is None else str(s) for s in serialized]
|
967
963
|
serialized = div.join(serialized)
|
@@ -1014,7 +1010,9 @@ class Serializer(object):
|
|
1014
1010
|
serialized[self.serialize_unicode(key)] = self.serialize_data(
|
1015
1011
|
value, dict_type, **kwargs
|
1016
1012
|
)
|
1017
|
-
except ValueError:
|
1013
|
+
except ValueError as err:
|
1014
|
+
if isinstance(err, SerializationError):
|
1015
|
+
raise
|
1018
1016
|
serialized[self.serialize_unicode(key)] = None
|
1019
1017
|
|
1020
1018
|
if "xml" in serialization_ctxt:
|
@@ -1049,7 +1047,7 @@ class Serializer(object):
|
|
1049
1047
|
return self.serialize_basic(attr, self.basic_types[obj_type], **kwargs)
|
1050
1048
|
if obj_type is _long_type:
|
1051
1049
|
return self.serialize_long(attr)
|
1052
|
-
if obj_type is
|
1050
|
+
if obj_type is str:
|
1053
1051
|
return self.serialize_unicode(attr)
|
1054
1052
|
if obj_type is datetime.datetime:
|
1055
1053
|
return self.serialize_iso(attr)
|
@@ -1233,10 +1231,10 @@ class Serializer(object):
|
|
1233
1231
|
return date + microseconds + "Z"
|
1234
1232
|
except (ValueError, OverflowError) as err:
|
1235
1233
|
msg = "Unable to serialize datetime object."
|
1236
|
-
|
1234
|
+
raise SerializationError(msg) from err
|
1237
1235
|
except AttributeError as err:
|
1238
1236
|
msg = "ISO-8601 object must be valid Datetime object."
|
1239
|
-
|
1237
|
+
raise TypeError(msg) from err
|
1240
1238
|
|
1241
1239
|
@staticmethod
|
1242
1240
|
def serialize_unix(attr, **kwargs):
|
@@ -1272,7 +1270,6 @@ def rest_key_extractor(attr, attr_desc, data):
|
|
1272
1270
|
if working_data is None:
|
1273
1271
|
# If at any point while following flatten JSON path see None, it means
|
1274
1272
|
# that all properties under are None as well
|
1275
|
-
# https://github.com/Azure/msrest-for-python/issues/197
|
1276
1273
|
return None
|
1277
1274
|
key = ".".join(dict_keys[1:])
|
1278
1275
|
|
@@ -1295,7 +1292,6 @@ def rest_key_case_insensitive_extractor(attr, attr_desc, data):
|
|
1295
1292
|
if working_data is None:
|
1296
1293
|
# If at any point while following flatten JSON path see None, it means
|
1297
1294
|
# that all properties under are None as well
|
1298
|
-
# https://github.com/Azure/msrest-for-python/issues/197
|
1299
1295
|
return None
|
1300
1296
|
key = ".".join(dict_keys[1:])
|
1301
1297
|
|
@@ -1445,7 +1441,7 @@ class Deserializer(object):
|
|
1445
1441
|
r"\d{4}[-]\d{2}[-]\d{2}T\d{2}:\d{2}:\d{2}" r"\.?\d*Z?[-+]?[\d{2}]?:?[\d{2}]?"
|
1446
1442
|
)
|
1447
1443
|
|
1448
|
-
def __init__(self, classes: Optional[Mapping[str,
|
1444
|
+
def __init__(self, classes: Optional[Mapping[str, type]] = None):
|
1449
1445
|
self.deserialize_type = {
|
1450
1446
|
"iso-8601": Deserializer.deserialize_iso,
|
1451
1447
|
"rfc-1123": Deserializer.deserialize_rfc,
|
@@ -1465,7 +1461,7 @@ class Deserializer(object):
|
|
1465
1461
|
"duration": (isodate.Duration, datetime.timedelta),
|
1466
1462
|
"iso-8601": (datetime.datetime),
|
1467
1463
|
}
|
1468
|
-
self.dependencies: Dict[str,
|
1464
|
+
self.dependencies: Dict[str, type] = dict(classes) if classes else {}
|
1469
1465
|
self.key_extractors = [rest_key_extractor, xml_key_extractor]
|
1470
1466
|
# Additional properties only works if the "rest_key_extractor" is used to
|
1471
1467
|
# extract the keys. Making it to work whatever the key extractor is too much
|
@@ -1524,7 +1520,7 @@ class Deserializer(object):
|
|
1524
1520
|
|
1525
1521
|
response, class_name = self._classify_target(target_obj, data)
|
1526
1522
|
|
1527
|
-
if isinstance(response,
|
1523
|
+
if isinstance(response, str):
|
1528
1524
|
return self.deserialize_data(data, response)
|
1529
1525
|
elif isinstance(response, type) and issubclass(response, Enum):
|
1530
1526
|
return self.deserialize_enum(data, response)
|
@@ -1561,7 +1557,7 @@ class Deserializer(object):
|
|
1561
1557
|
d_attrs[attr] = value
|
1562
1558
|
except (AttributeError, TypeError, KeyError) as err:
|
1563
1559
|
msg = "Unable to deserialize to object: " + class_name # type: ignore
|
1564
|
-
|
1560
|
+
raise DeserializationError(msg) from err
|
1565
1561
|
else:
|
1566
1562
|
additional_properties = self._build_additional_properties(attributes, data)
|
1567
1563
|
return self._instantiate_model(response, d_attrs, additional_properties)
|
@@ -1598,14 +1594,14 @@ class Deserializer(object):
|
|
1598
1594
|
if target is None:
|
1599
1595
|
return None, None
|
1600
1596
|
|
1601
|
-
if isinstance(target,
|
1597
|
+
if isinstance(target, str):
|
1602
1598
|
try:
|
1603
1599
|
target = self.dependencies[target]
|
1604
1600
|
except KeyError:
|
1605
1601
|
return target, target
|
1606
1602
|
|
1607
1603
|
try:
|
1608
|
-
target = target._classify(data, self.dependencies)
|
1604
|
+
target = target._classify(data, self.dependencies) # type: ignore
|
1609
1605
|
except AttributeError:
|
1610
1606
|
pass # Target is not a Model, no classify
|
1611
1607
|
return target, target.__class__.__name__ # type: ignore
|
@@ -1668,7 +1664,7 @@ class Deserializer(object):
|
|
1668
1664
|
raw_data.text, raw_data.headers
|
1669
1665
|
)
|
1670
1666
|
|
1671
|
-
if isinstance(raw_data, (
|
1667
|
+
if isinstance(raw_data, (str, bytes)) or hasattr(raw_data, "read"):
|
1672
1668
|
return RawDeserializer.deserialize_from_text(raw_data, content_type) # type: ignore
|
1673
1669
|
return raw_data
|
1674
1670
|
|
@@ -1756,7 +1752,7 @@ class Deserializer(object):
|
|
1756
1752
|
except (ValueError, TypeError, AttributeError) as err:
|
1757
1753
|
msg = "Unable to deserialize response data."
|
1758
1754
|
msg += " Data: {}, {}".format(data, data_type)
|
1759
|
-
|
1755
|
+
raise DeserializationError(msg) from err
|
1760
1756
|
else:
|
1761
1757
|
return self._deserialize(obj_type, data)
|
1762
1758
|
|
@@ -1812,7 +1808,7 @@ class Deserializer(object):
|
|
1812
1808
|
if isinstance(attr, ET.Element):
|
1813
1809
|
# Do no recurse on XML, just return the tree as-is
|
1814
1810
|
return attr
|
1815
|
-
if isinstance(attr,
|
1811
|
+
if isinstance(attr, str):
|
1816
1812
|
return self.deserialize_basic(attr, "str")
|
1817
1813
|
obj_type = type(attr)
|
1818
1814
|
if obj_type in self.basic_types:
|
@@ -1869,7 +1865,7 @@ class Deserializer(object):
|
|
1869
1865
|
if data_type == "bool":
|
1870
1866
|
if attr in [True, False, 1, 0]:
|
1871
1867
|
return bool(attr)
|
1872
|
-
elif isinstance(attr,
|
1868
|
+
elif isinstance(attr, str):
|
1873
1869
|
if attr.lower() in ["true", "1"]:
|
1874
1870
|
return True
|
1875
1871
|
elif attr.lower() in ["false", "0"]:
|
@@ -1920,7 +1916,6 @@ class Deserializer(object):
|
|
1920
1916
|
data = data.value
|
1921
1917
|
if isinstance(data, int):
|
1922
1918
|
# Workaround. We might consider remove it in the future.
|
1923
|
-
# https://github.com/Azure/azure-rest-api-specs/issues/141
|
1924
1919
|
try:
|
1925
1920
|
return list(enum_obj.__members__.values())[data]
|
1926
1921
|
except IndexError:
|
@@ -1978,10 +1973,10 @@ class Deserializer(object):
|
|
1978
1973
|
if isinstance(attr, ET.Element):
|
1979
1974
|
attr = attr.text
|
1980
1975
|
try:
|
1981
|
-
return decimal.Decimal(attr) # type: ignore
|
1976
|
+
return decimal.Decimal(str(attr)) # type: ignore
|
1982
1977
|
except decimal.DecimalException as err:
|
1983
1978
|
msg = "Invalid decimal {}".format(attr)
|
1984
|
-
|
1979
|
+
raise DeserializationError(msg) from err
|
1985
1980
|
|
1986
1981
|
@staticmethod
|
1987
1982
|
def deserialize_long(attr):
|
@@ -2009,7 +2004,7 @@ class Deserializer(object):
|
|
2009
2004
|
duration = isodate.parse_duration(attr)
|
2010
2005
|
except (ValueError, OverflowError, AttributeError) as err:
|
2011
2006
|
msg = "Cannot deserialize duration object."
|
2012
|
-
|
2007
|
+
raise DeserializationError(msg) from err
|
2013
2008
|
else:
|
2014
2009
|
return duration
|
2015
2010
|
|
@@ -2028,7 +2023,7 @@ class Deserializer(object):
|
|
2028
2023
|
"Date must have only digits and -. Received: %s" % attr
|
2029
2024
|
)
|
2030
2025
|
# This must NOT use defaultmonth/defaultday. Using None ensure this raises an exception.
|
2031
|
-
return isodate.parse_date(attr, defaultmonth=
|
2026
|
+
return isodate.parse_date(attr, defaultmonth=0, defaultday=0)
|
2032
2027
|
|
2033
2028
|
@staticmethod
|
2034
2029
|
def deserialize_time(attr):
|
@@ -2068,7 +2063,7 @@ class Deserializer(object):
|
|
2068
2063
|
date_obj = date_obj.astimezone(tz=TZ_UTC)
|
2069
2064
|
except ValueError as err:
|
2070
2065
|
msg = "Cannot deserialize to rfc datetime object."
|
2071
|
-
|
2066
|
+
raise DeserializationError(msg) from err
|
2072
2067
|
else:
|
2073
2068
|
return date_obj
|
2074
2069
|
|
@@ -2105,7 +2100,7 @@ class Deserializer(object):
|
|
2105
2100
|
raise OverflowError("Hit max or min date")
|
2106
2101
|
except (ValueError, OverflowError, AttributeError) as err:
|
2107
2102
|
msg = "Cannot deserialize datetime object."
|
2108
|
-
|
2103
|
+
raise DeserializationError(msg) from err
|
2109
2104
|
else:
|
2110
2105
|
return date_obj
|
2111
2106
|
|
@@ -2121,9 +2116,10 @@ class Deserializer(object):
|
|
2121
2116
|
if isinstance(attr, ET.Element):
|
2122
2117
|
attr = int(attr.text) # type: ignore
|
2123
2118
|
try:
|
2119
|
+
attr = int(attr)
|
2124
2120
|
date_obj = datetime.datetime.fromtimestamp(attr, TZ_UTC)
|
2125
2121
|
except ValueError as err:
|
2126
2122
|
msg = "Cannot deserialize to unix datetime object."
|
2127
|
-
|
2123
|
+
raise DeserializationError(msg) from err
|
2128
2124
|
else:
|
2129
2125
|
return date_obj
|
diracx/client/_vendor.py
CHANGED
@@ -1,23 +1,11 @@
|
|
1
1
|
# --------------------------------------------------------------------------
|
2
|
-
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.
|
2
|
+
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.9)
|
3
3
|
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
4
4
|
# --------------------------------------------------------------------------
|
5
5
|
|
6
|
-
from typing import
|
6
|
+
from typing import Optional
|
7
7
|
|
8
|
-
|
9
|
-
def _format_url_section(template, **kwargs):
|
10
|
-
components = template.split("/")
|
11
|
-
while components:
|
12
|
-
try:
|
13
|
-
return template.format(**kwargs)
|
14
|
-
except KeyError as key:
|
15
|
-
# Need the cast, as for some reasons "split" is typed as list[str | Any]
|
16
|
-
formatted_components = cast(List[str], template.split("/"))
|
17
|
-
components = [
|
18
|
-
c for c in formatted_components if "{}".format(key.args[0]) not in c
|
19
|
-
]
|
20
|
-
template = "/".join(components)
|
8
|
+
from azure.core import MatchConditions
|
21
9
|
|
22
10
|
|
23
11
|
def raise_if_not_implemented(cls, abstract_methods):
|
@@ -31,3 +19,37 @@ def raise_if_not_implemented(cls, abstract_methods):
|
|
31
19
|
cls.__name__, "', '".join(not_implemented)
|
32
20
|
)
|
33
21
|
)
|
22
|
+
|
23
|
+
|
24
|
+
def quote_etag(etag: Optional[str]) -> Optional[str]:
|
25
|
+
if not etag or etag == "*":
|
26
|
+
return etag
|
27
|
+
if etag.startswith("W/"):
|
28
|
+
return etag
|
29
|
+
if etag.startswith('"') and etag.endswith('"'):
|
30
|
+
return etag
|
31
|
+
if etag.startswith("'") and etag.endswith("'"):
|
32
|
+
return etag
|
33
|
+
return '"' + etag + '"'
|
34
|
+
|
35
|
+
|
36
|
+
def prep_if_match(
|
37
|
+
etag: Optional[str], match_condition: Optional[MatchConditions]
|
38
|
+
) -> Optional[str]:
|
39
|
+
if match_condition == MatchConditions.IfNotModified:
|
40
|
+
if_match = quote_etag(etag) if etag else None
|
41
|
+
return if_match
|
42
|
+
if match_condition == MatchConditions.IfPresent:
|
43
|
+
return "*"
|
44
|
+
return None
|
45
|
+
|
46
|
+
|
47
|
+
def prep_if_none_match(
|
48
|
+
etag: Optional[str], match_condition: Optional[MatchConditions]
|
49
|
+
) -> Optional[str]:
|
50
|
+
if match_condition == MatchConditions.IfModified:
|
51
|
+
if_none_match = quote_etag(etag) if etag else None
|
52
|
+
return if_none_match
|
53
|
+
if match_condition == MatchConditions.IfMissing:
|
54
|
+
return "*"
|
55
|
+
return None
|
diracx/client/aio/__init__.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding=utf-8
|
2
2
|
# --------------------------------------------------------------------------
|
3
|
-
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.
|
3
|
+
# Code generated by Microsoft (R) AutoRest Code Generator (autorest: 3.10.2, generator: @autorest/python@6.13.9)
|
4
4
|
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
5
5
|
# --------------------------------------------------------------------------
|
6
6
|
|