mms-client 1.7.0__py3-none-any.whl → 1.8.1__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.
- mms_client/services/base.py +81 -52
- mms_client/services/market.py +28 -10
- mms_client/services/registration.py +12 -9
- mms_client/services/report.py +144 -1
- mms_client/types/base.py +52 -9
- mms_client/types/enums.py +34 -0
- mms_client/types/report.py +474 -0
- mms_client/types/resource.py +4 -34
- mms_client/types/transport.py +1 -1
- mms_client/utils/serialization.py +111 -42
- {mms_client-1.7.0.dist-info → mms_client-1.8.1.dist-info}/METADATA +6 -1
- {mms_client-1.7.0.dist-info → mms_client-1.8.1.dist-info}/RECORD +14 -13
- {mms_client-1.7.0.dist-info → mms_client-1.8.1.dist-info}/LICENSE +0 -0
- {mms_client-1.7.0.dist-info → mms_client-1.8.1.dist-info}/WHEEL +0 -0
|
@@ -56,24 +56,28 @@ class Serializer:
|
|
|
56
56
|
with open(XSD_DIR / self._xsd.value, "rb") as f:
|
|
57
57
|
self._schema = XMLSchema(parse(f))
|
|
58
58
|
|
|
59
|
-
def serialize(self, request_envelope: E, request_data: P) -> bytes:
|
|
59
|
+
def serialize(self, request_envelope: E, request_data: P, for_report: bool = False) -> bytes:
|
|
60
60
|
"""Serialize the envelope and data to a byte string for sending to the MMS server.
|
|
61
61
|
|
|
62
62
|
Arguments:
|
|
63
63
|
request_envelope (Envelope): The envelope to be serialized.
|
|
64
64
|
request_data (Payload): The data to be serialized.
|
|
65
|
+
for_report (bool): If True, the data will be serialized for a report request.
|
|
65
66
|
|
|
66
67
|
Returns: A byte string containing the XML-formatted data to be sent to the MMS server.
|
|
67
68
|
"""
|
|
68
|
-
# First,
|
|
69
|
-
|
|
69
|
+
# First, choose the correct payload factory based on the request type
|
|
70
|
+
factory = _create_report_payload_type if for_report else _create_request_payload_type
|
|
71
|
+
|
|
72
|
+
# Next, create our payload class from the payload and data types
|
|
73
|
+
payload_cls = factory(
|
|
70
74
|
self._payload_key,
|
|
71
75
|
type(request_envelope),
|
|
72
76
|
type(request_data),
|
|
73
77
|
False, # type: ignore[arg-type]
|
|
74
78
|
)
|
|
75
79
|
|
|
76
|
-
#
|
|
80
|
+
# Now, inject the payload and data into the payload class
|
|
77
81
|
# NOTE: this returns a type that inherits from PayloadBase and the arguments provided to the initializer
|
|
78
82
|
# here are correct, but mypy thinks they are incorrect because it doesn't understand the the inherited type
|
|
79
83
|
payload = payload_cls(request_envelope, request_data, self._xsd.value) # type: ignore[call-arg, misc]
|
|
@@ -82,22 +86,26 @@ class Serializer:
|
|
|
82
86
|
# NOTE: we provided the encoding here so this will return bytes, not a string
|
|
83
87
|
return self._to_canoncialized_xml(payload)
|
|
84
88
|
|
|
85
|
-
def serialize_multi(
|
|
89
|
+
def serialize_multi(
|
|
90
|
+
self, request_envelope: E, request_data: List[P], request_type: Type[P], for_report: bool = False
|
|
91
|
+
) -> bytes:
|
|
86
92
|
"""Serialize the envelope and data to a byte string for sending to the MMS server.
|
|
87
93
|
|
|
88
94
|
Arguments:
|
|
89
95
|
request_envelope (Envelope): The envelope to be serialized.
|
|
90
|
-
request_data (List[Payload]):
|
|
91
|
-
request_type (Type[Payload]):
|
|
96
|
+
request_data (List[Payload]): The data to be serialized.
|
|
97
|
+
request_type (Type[Payload]): The type of data to be serialized.
|
|
98
|
+
for_report (bool): If True, the data will be serialized for a report request.
|
|
92
99
|
|
|
93
100
|
Returns: A byte string containing the XML-formatted data to be sent to the MMS server.
|
|
94
101
|
"""
|
|
95
|
-
# First,
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
102
|
+
# First, choose the correct payload factory based on the request type
|
|
103
|
+
factory = _create_report_payload_type if for_report else _create_request_payload_type
|
|
104
|
+
|
|
105
|
+
# Next, create our payload class from the payload and data types
|
|
106
|
+
payload_cls = factory(self._payload_key, type(request_envelope), request_type, True) # type: ignore[arg-type]
|
|
99
107
|
|
|
100
|
-
#
|
|
108
|
+
# Now, inject the payload and data into the payload class
|
|
101
109
|
# NOTE: this returns a type that inherits from PayloadBase and the arguments provided to the initializer
|
|
102
110
|
# here are correct, but mypy thinks they are incorrect because it doesn't understand the the inherited type
|
|
103
111
|
payload = payload_cls(request_envelope, request_data, self._xsd.value) # type: ignore[call-arg, misc]
|
|
@@ -106,31 +114,37 @@ class Serializer:
|
|
|
106
114
|
# NOTE: we provided the encoding here so this will return bytes, not a string
|
|
107
115
|
return self._to_canoncialized_xml(payload)
|
|
108
116
|
|
|
109
|
-
def deserialize(
|
|
117
|
+
def deserialize(
|
|
118
|
+
self, data: bytes, envelope_type: Type[E], data_type: Type[P], for_report: bool = False
|
|
119
|
+
) -> Response[E, P]:
|
|
110
120
|
"""Deserialize the data to a response object.
|
|
111
121
|
|
|
112
122
|
Arguments:
|
|
113
123
|
data (bytes): The raw data to be deserialized.
|
|
114
124
|
envelope_type (Type[Envelope]): The type of envelope to be constructed.
|
|
115
125
|
data_type (Type[Payload]): The type of data to be constructed.
|
|
126
|
+
for_report (bool): If True, the data will be serialized for a report request.
|
|
116
127
|
|
|
117
128
|
Returns: A response object containing the envelope and data extracted from the raw data.
|
|
118
129
|
"""
|
|
119
130
|
tree = self._from_xml(data)
|
|
120
|
-
return self._from_tree(tree, envelope_type, data_type)
|
|
131
|
+
return self._from_tree(tree, envelope_type, data_type, for_report)
|
|
121
132
|
|
|
122
|
-
def deserialize_multi(
|
|
133
|
+
def deserialize_multi(
|
|
134
|
+
self, data: bytes, envelope_type: Type[E], data_type: Type[P], for_report: bool = False
|
|
135
|
+
) -> MultiResponse[E, P]:
|
|
123
136
|
"""Deserialize the data to a multi-response object.
|
|
124
137
|
|
|
125
138
|
Arguments:
|
|
126
139
|
data (bytes): The raw data to be deserialized.
|
|
127
140
|
envelope_type (Type[Envelope]): The type of envelope to be constructed.
|
|
128
141
|
data_type (Type[Payload]): The type of data to be constructed.
|
|
142
|
+
for_report (bool): If True, the data will be serialized for a report request.
|
|
129
143
|
|
|
130
144
|
Returns: A multi-response object containing the envelope and data extracted from the raw data.
|
|
131
145
|
"""
|
|
132
146
|
tree = self._from_xml(data)
|
|
133
|
-
return self._from_tree_multi(tree, envelope_type, data_type)
|
|
147
|
+
return self._from_tree_multi(tree, envelope_type, data_type, for_report)
|
|
134
148
|
|
|
135
149
|
def _to_canoncialized_xml(self, payload: PayloadBase) -> bytes:
|
|
136
150
|
"""Convert the payload to a canonicalized XML string.
|
|
@@ -156,13 +170,14 @@ class Serializer:
|
|
|
156
170
|
buffer.seek(0)
|
|
157
171
|
return buffer.read()
|
|
158
172
|
|
|
159
|
-
def _from_tree(self, raw: Element, envelope_type: Type[E], data_type: Type[P]) -> Response[E, P]:
|
|
173
|
+
def _from_tree(self, raw: Element, envelope_type: Type[E], data_type: Type[P], for_report: bool) -> Response[E, P]:
|
|
160
174
|
"""Convert the raw data to a response object.
|
|
161
175
|
|
|
162
176
|
Arguments:
|
|
163
177
|
raw (Element): The raw data to be converted.
|
|
164
178
|
envelope_type (Type[Envelope]): The type of envelope to be constructed.
|
|
165
179
|
data_type (Type[Payload]): The type of data to be constructed.
|
|
180
|
+
for_report (bool): If True, the data will be serialized for a report request.
|
|
166
181
|
|
|
167
182
|
Returns: A response object containing the envelope and data extracted from the raw data.
|
|
168
183
|
"""
|
|
@@ -179,7 +194,9 @@ class Serializer:
|
|
|
179
194
|
resp = cls.from_xml_tree(raw) # type: ignore[arg-type]
|
|
180
195
|
|
|
181
196
|
# Next, attempt to extract the envelope and data from within the response
|
|
182
|
-
resp.envelope, resp.envelope_validation, envelope_node = self._from_tree_envelope(
|
|
197
|
+
resp.envelope, resp.envelope_validation, envelope_node = self._from_tree_envelope(
|
|
198
|
+
raw, envelope_type, for_report
|
|
199
|
+
)
|
|
183
200
|
|
|
184
201
|
# Now, verify that the response doesn't contain an unexpected data type and then retrieve the payload data
|
|
185
202
|
# from within the envelope
|
|
@@ -187,18 +204,23 @@ class Serializer:
|
|
|
187
204
|
resp.payload = self._from_tree_data(envelope_node.find(get_tag(data_type)), data_type)
|
|
188
205
|
|
|
189
206
|
# Finally, attempt to extract the messages from within the payload
|
|
190
|
-
resp.messages = self._from_tree_messages(
|
|
207
|
+
resp.messages = self._from_tree_messages(
|
|
208
|
+
raw, get_tag(envelope_type), data_type, self._payload_key, False, for_report=for_report
|
|
209
|
+
)
|
|
191
210
|
|
|
192
211
|
# Return the response
|
|
193
212
|
return resp
|
|
194
213
|
|
|
195
|
-
def _from_tree_multi(
|
|
214
|
+
def _from_tree_multi(
|
|
215
|
+
self, raw: Element, envelope_type: Type[E], data_type: Type[P], for_report: bool
|
|
216
|
+
) -> MultiResponse[E, P]:
|
|
196
217
|
"""Convert the raw data to a multi-response object.
|
|
197
218
|
|
|
198
219
|
Arguments:
|
|
199
220
|
raw (Element): The raw data to be converted.
|
|
200
221
|
envelope_type (Type[Envelope]): The type of envelope to be constructed.
|
|
201
222
|
data_type (Type[Payload]): The type of data to be constructed.
|
|
223
|
+
for_report (bool): If True, the data will be serialized for a report request.
|
|
202
224
|
|
|
203
225
|
Returns: A multi-response object containing the envelope and data extracted from the raw data.
|
|
204
226
|
"""
|
|
@@ -215,7 +237,7 @@ class Serializer:
|
|
|
215
237
|
resp = cls.from_xml_tree(raw) # type: ignore[arg-type]
|
|
216
238
|
|
|
217
239
|
# Next, attempt to extract the envelope from the response
|
|
218
|
-
resp.envelope, resp.envelope_validation, env_node = self._from_tree_envelope(raw, envelope_type)
|
|
240
|
+
resp.envelope, resp.envelope_validation, env_node = self._from_tree_envelope(raw, envelope_type, for_report)
|
|
219
241
|
|
|
220
242
|
# Now, verify that the response doesn't contain an unexpected data type and then retrieve the payload data
|
|
221
243
|
# from within the envelope
|
|
@@ -226,17 +248,22 @@ class Serializer:
|
|
|
226
248
|
]
|
|
227
249
|
|
|
228
250
|
# Finally, attempt to extract the messages from within the payload
|
|
229
|
-
resp.messages = self._from_tree_messages(
|
|
251
|
+
resp.messages = self._from_tree_messages(
|
|
252
|
+
raw, get_tag(envelope_type), data_type, self._payload_key, True, for_report=for_report
|
|
253
|
+
)
|
|
230
254
|
|
|
231
255
|
# Return the response
|
|
232
256
|
return resp
|
|
233
257
|
|
|
234
|
-
def _from_tree_envelope(
|
|
258
|
+
def _from_tree_envelope(
|
|
259
|
+
self, raw: Element, envelope_type: Type[E], for_report: bool
|
|
260
|
+
) -> Tuple[E, ResponseCommon, Element]:
|
|
235
261
|
"""Attempt to extract the envelope from within the response.
|
|
236
262
|
|
|
237
263
|
Arguments:
|
|
238
264
|
raw (Element): The raw data to be converted.
|
|
239
265
|
envelope_type (Type[Envelope]): The type of envelope to be constructed.
|
|
266
|
+
for_report (bool): If True, the data will be serialized for a report request.
|
|
240
267
|
|
|
241
268
|
Returns:
|
|
242
269
|
Envelope: The request payload constructed from the raw data.
|
|
@@ -244,9 +271,10 @@ class Serializer:
|
|
|
244
271
|
"""
|
|
245
272
|
# First, attempt to extract the envelope from within the response; if the key isn't found then we'll raise an
|
|
246
273
|
# exception to indicate that the envelope wasn't found.
|
|
247
|
-
|
|
248
|
-
if
|
|
249
|
-
|
|
274
|
+
envelope_tag = get_tag(envelope_type)
|
|
275
|
+
envelope_node = raw if for_report else raw.find(envelope_tag)
|
|
276
|
+
if envelope_node is None or envelope_node.tag != envelope_tag:
|
|
277
|
+
raise ValueError(f"Expected envelope type '{envelope_tag}' not found in response")
|
|
250
278
|
|
|
251
279
|
# Next, create a new envelope type that contains the envelope type with the appropriate XML tag. We have to do
|
|
252
280
|
# this because the envelope type doesn't include the ResponseCommon fields, and the tag doesn't match
|
|
@@ -271,7 +299,7 @@ class Serializer:
|
|
|
271
299
|
ValueError: If the expected data type is not found in the response.
|
|
272
300
|
"""
|
|
273
301
|
data_tags = set(node.tag for node in raw)
|
|
274
|
-
if not data_tags.issubset([data_type.__name__, data_type.__xml_tag__, "Messages"]):
|
|
302
|
+
if not data_tags.issubset([data_type.__name__, data_type.__xml_tag__, "ProcessingStatistics", "Messages"]):
|
|
275
303
|
raise ValueError(f"Expected data type '{data_type.__name__}' not found in response")
|
|
276
304
|
|
|
277
305
|
def _from_tree_data(self, raw: Optional[Element], data_type: Type[P]) -> Optional[ResponseData[P]]:
|
|
@@ -302,11 +330,12 @@ class Serializer:
|
|
|
302
330
|
def _from_tree_messages(
|
|
303
331
|
self,
|
|
304
332
|
raw: Element,
|
|
305
|
-
|
|
333
|
+
envelope_tag: str,
|
|
306
334
|
current_type: Type[P],
|
|
307
335
|
root: str,
|
|
308
336
|
multi: bool,
|
|
309
337
|
wrapped: bool = False,
|
|
338
|
+
for_report: bool = False,
|
|
310
339
|
) -> Dict[str, Messages]:
|
|
311
340
|
"""Attempt to extract the messages from within the payload.
|
|
312
341
|
|
|
@@ -316,13 +345,14 @@ class Serializer:
|
|
|
316
345
|
|
|
317
346
|
Arguments:
|
|
318
347
|
raw (Element): The raw data to be converted.
|
|
319
|
-
|
|
348
|
+
envelope_tag (str): The tag of the envelope being constructed.
|
|
320
349
|
current_type (Type[Payload]): The type of data being constructed.
|
|
321
350
|
root (str): The root of the dictionary, used to create the key for the messages.
|
|
322
351
|
multi (bool): Whether we're processing a list of nodes or a single node. If called with the
|
|
323
352
|
payload root, this value will determine whether we're processing a multi-
|
|
324
353
|
response or a single response.
|
|
325
354
|
wrapped (bool): Whether or not this type is referenced from a wrapped field.
|
|
355
|
+
for_report (bool): If True, the data will be serialized for a report request.
|
|
326
356
|
"""
|
|
327
357
|
# First, find the Messages node in the raw data
|
|
328
358
|
message_node = raw.find("Messages")
|
|
@@ -337,21 +367,21 @@ class Serializer:
|
|
|
337
367
|
# at the root of the response, we need to call this method for the envelope type. If we are at the envelope
|
|
338
368
|
# type, we need to call this method for the data type. If we are at the data type, we need to call this method
|
|
339
369
|
# for each field in the data type that is a Payload type.
|
|
340
|
-
if root == self._payload_key:
|
|
370
|
+
if root == self._payload_key and not for_report:
|
|
341
371
|
messages.update(
|
|
342
372
|
self._from_tree_messages(
|
|
343
|
-
_find_or_fail(raw,
|
|
344
|
-
|
|
373
|
+
_find_or_fail(raw, envelope_tag),
|
|
374
|
+
envelope_tag,
|
|
345
375
|
current_type,
|
|
346
|
-
f"{root}.{
|
|
376
|
+
f"{root}.{envelope_tag}",
|
|
347
377
|
multi,
|
|
348
378
|
False,
|
|
349
379
|
)
|
|
350
380
|
)
|
|
351
|
-
elif root.endswith(
|
|
381
|
+
elif root.endswith(envelope_tag) or wrapped:
|
|
352
382
|
messages.update(
|
|
353
383
|
self._from_tree_messages_inner(
|
|
354
|
-
raw,
|
|
384
|
+
raw, envelope_tag, current_type, root, get_tag(current_type), multi, False
|
|
355
385
|
)
|
|
356
386
|
)
|
|
357
387
|
else:
|
|
@@ -374,7 +404,7 @@ class Serializer:
|
|
|
374
404
|
messages.update(
|
|
375
405
|
self._from_tree_messages_inner(
|
|
376
406
|
raw,
|
|
377
|
-
|
|
407
|
+
envelope_tag,
|
|
378
408
|
arg,
|
|
379
409
|
root,
|
|
380
410
|
field.path, # type: ignore[attr-defined]
|
|
@@ -389,7 +419,7 @@ class Serializer:
|
|
|
389
419
|
def _from_tree_messages_inner(
|
|
390
420
|
self,
|
|
391
421
|
raw: Element,
|
|
392
|
-
|
|
422
|
+
envelope_tag: str,
|
|
393
423
|
current_type: Type[P],
|
|
394
424
|
root: str,
|
|
395
425
|
tag: str,
|
|
@@ -400,7 +430,7 @@ class Serializer:
|
|
|
400
430
|
|
|
401
431
|
Arguments:
|
|
402
432
|
raw (Element): The raw data to be converted.
|
|
403
|
-
|
|
433
|
+
envelope_tag (str): The tag of the envelope being constructed.
|
|
404
434
|
current_type (Type[Payload]): The type of data being constructed.
|
|
405
435
|
root (str): The root of the dictionary, used to create the key for the messages.
|
|
406
436
|
tag (str): The tag of the current node being processed.
|
|
@@ -426,7 +456,7 @@ class Serializer:
|
|
|
426
456
|
for i, node in enumerate(nodes):
|
|
427
457
|
messages.update(
|
|
428
458
|
self._from_tree_messages(
|
|
429
|
-
node,
|
|
459
|
+
node, envelope_tag, current_type, path_base if wrapped else f"{path_base}[{i}]", True, wrapped
|
|
430
460
|
)
|
|
431
461
|
)
|
|
432
462
|
return messages
|
|
@@ -436,7 +466,7 @@ class Serializer:
|
|
|
436
466
|
return (
|
|
437
467
|
{}
|
|
438
468
|
if child is None
|
|
439
|
-
else self._from_tree_messages(child,
|
|
469
|
+
else self._from_tree_messages(child, envelope_tag, current_type, path_base, False, wrapped)
|
|
440
470
|
)
|
|
441
471
|
|
|
442
472
|
def _from_xml(self, data: bytes) -> Element:
|
|
@@ -521,7 +551,7 @@ def _create_response_common_type(tag_type: Type[Union[E, P]]) -> Type[ResponseCo
|
|
|
521
551
|
def _create_request_payload_type(
|
|
522
552
|
key: str,
|
|
523
553
|
envelope_type: Type[E],
|
|
524
|
-
data_type: Type[
|
|
554
|
+
data_type: Type[P],
|
|
525
555
|
multi: bool,
|
|
526
556
|
) -> Type[PayloadBase]:
|
|
527
557
|
"""Create a new payload type for the given payload and data types.
|
|
@@ -583,6 +613,45 @@ def _create_request_payload_type(
|
|
|
583
613
|
return RQPayload
|
|
584
614
|
|
|
585
615
|
|
|
616
|
+
@lru_cache(maxsize=None)
|
|
617
|
+
def _create_report_payload_type(key: str, envelope_type: Type[E], data_type: Type[P], multi: bool) -> Type[PayloadBase]:
|
|
618
|
+
"""Create a new payload type for the given report data request.
|
|
619
|
+
|
|
620
|
+
Arguments:
|
|
621
|
+
key: str The tag to use for the parent element of the payload.
|
|
622
|
+
envelope_type (Type[Envelope]): The type of payload to be used for the envelope.
|
|
623
|
+
data_type (Type[Payload]): The type of payload to be used for the data.
|
|
624
|
+
multi (bool): If True, the payload will be a list; otherwise, it will be a singleton.
|
|
625
|
+
|
|
626
|
+
Returns: The base payload type that will be used for serialization.
|
|
627
|
+
"""
|
|
628
|
+
# First, create our data type
|
|
629
|
+
payload_type = List[data_type] if multi else data_type # type: ignore[valid-type]
|
|
630
|
+
|
|
631
|
+
# Next, create a wrapper for our data type that will be used to store the data in the payload
|
|
632
|
+
class Envelope(PayloadBase, envelope_type, tag=key): # type: ignore[valid-type, misc]
|
|
633
|
+
"""Wrapper for the data type that will be used to store the data in the payload."""
|
|
634
|
+
|
|
635
|
+
# The data to be stored in the payload
|
|
636
|
+
data: payload_type = element(tag=get_tag(data_type)) # type: ignore[valid-type]
|
|
637
|
+
|
|
638
|
+
def __init__(self, envelope: envelope_type, data: payload_type, schema: str): # type: ignore[valid-type]
|
|
639
|
+
"""Create a new envelope to store payload data.
|
|
640
|
+
|
|
641
|
+
Arguments:
|
|
642
|
+
envelope (Envelope): The payload to be stored in the data.
|
|
643
|
+
data (Payload): The data to be stored in the payload.
|
|
644
|
+
schema (str): The name of the schema file to use for validation.
|
|
645
|
+
"""
|
|
646
|
+
obj = dict(envelope)
|
|
647
|
+
obj["data"] = data
|
|
648
|
+
obj["location"] = schema
|
|
649
|
+
super().__init__(**obj)
|
|
650
|
+
|
|
651
|
+
# Finally, return the payload type so we can instantiate it
|
|
652
|
+
return Envelope
|
|
653
|
+
|
|
654
|
+
|
|
586
655
|
def _find_or_fail(node: Element, tag: str) -> Element:
|
|
587
656
|
"""Find the node with the given tag, or raise an error if it isn't found.
|
|
588
657
|
|
|
@@ -639,7 +708,7 @@ def _get_field_typing(typ: Type) -> Tuple[Type, bool]:
|
|
|
639
708
|
return args[-1][0] if len(args) > 0 else typ, get_origin(origin_type) is list # typing: ignore[return-value]
|
|
640
709
|
|
|
641
710
|
|
|
642
|
-
def get_tag(data_type: Type[P]) -> str:
|
|
711
|
+
def get_tag(data_type: Union[Type[P], Type[E]]) -> str:
|
|
643
712
|
"""Get the tag for the given data type.
|
|
644
713
|
|
|
645
714
|
Arguments:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: mms-client
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.1
|
|
4
4
|
Summary: API client for accessing the MMS
|
|
5
5
|
Home-page: https://github.com/ElectroRoute-Japan/mms-client
|
|
6
6
|
Author: Ryan Wood
|
|
@@ -24,6 +24,7 @@ Requires-Dist: lxml (>=5.1.0,<6.0.0)
|
|
|
24
24
|
Requires-Dist: pendulum (>=3.0.0,<4.0.0)
|
|
25
25
|
Requires-Dist: pycryptodomex (>=3.20.0,<4.0.0)
|
|
26
26
|
Requires-Dist: pydantic (>=2.6.3,<3.0.0)
|
|
27
|
+
Requires-Dist: pydantic-extra-types (>=2.7.0,<3.0.0)
|
|
27
28
|
Requires-Dist: pydantic-xml (>=2.9.0,<3.0.0)
|
|
28
29
|
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
|
29
30
|
Requires-Dist: requests-pkcs12 (>=1.24,<2.0)
|
|
@@ -220,6 +221,10 @@ This client is not complete. Currently, it supports the following endpoints:
|
|
|
220
221
|
- MarketQuery_AwardResultsQuery
|
|
221
222
|
- RegistrationSubmit_Resource
|
|
222
223
|
- RegistrationQuery_Resource
|
|
224
|
+
- ReportCreateRequest
|
|
225
|
+
- ReportListRequest
|
|
226
|
+
- ReportDownloadRequestTrnID
|
|
227
|
+
- BSP_ResourceList
|
|
223
228
|
|
|
224
229
|
We can add support for additional endpoints as time goes on, and independent contribution is, of course, welcome. However, support for attachments is currently limited because none of the endpoints we support currently require them. We have implemented attachment support up to the client level, but we haven't developed an architecture for submitting them through an endpoint yet.
|
|
225
230
|
|
|
@@ -12,29 +12,30 @@ mms_client/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
|
12
12
|
mms_client/security/certs.py,sha256=Gy-CuSsdLPFeoPH_sEYhY67dI5sy6yJ8iTwlysRKT1s,3018
|
|
13
13
|
mms_client/security/crypto.py,sha256=u9Z6nkAW6LbBqUzjIEbZ-CcqdkMJ9fqvdX7IXTTh1EI,2345
|
|
14
14
|
mms_client/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
mms_client/services/base.py,sha256=
|
|
16
|
-
mms_client/services/market.py,sha256=
|
|
15
|
+
mms_client/services/base.py,sha256=4G8Ie5B56JGxDPL-T5t1ytC0c0kpSkQq3PJC5O-hEco,29604
|
|
16
|
+
mms_client/services/market.py,sha256=DUtnzWRLmTrTgZ4jo93B0S5Pq9K7dEtAGWYWbTbe5rA,9524
|
|
17
17
|
mms_client/services/omi.py,sha256=UG1zYkFz0sFsEbhE6P0CLoAOZZOyEshkZ_b7D_e3CjQ,626
|
|
18
|
-
mms_client/services/registration.py,sha256=
|
|
19
|
-
mms_client/services/report.py,sha256=
|
|
18
|
+
mms_client/services/registration.py,sha256=tPJo-cBYURH5KkpxMQqWvZW6IqelzoBm5x6jzkJy-C0,3822
|
|
19
|
+
mms_client/services/report.py,sha256=hgRvjVxy8Hvbj5hQb0GMyDW0-1kMW2XFS5iKfO90YZY,6258
|
|
20
20
|
mms_client/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
21
|
mms_client/types/award.py,sha256=BWE9V_KHXpg_cW1LZsetVrPs2hZDOklvRpNnoZtmR3k,14139
|
|
22
|
-
mms_client/types/base.py,sha256=
|
|
23
|
-
mms_client/types/enums.py,sha256=
|
|
22
|
+
mms_client/types/base.py,sha256=VYXnUkEKcI1ki6Sk0ekklDLKDLkv03xrfbSFzzV_RXk,11240
|
|
23
|
+
mms_client/types/enums.py,sha256=hALMuqRChLUJ1Eglll5R5mkYLpcO-ZIaEBps3MjkTg0,2534
|
|
24
24
|
mms_client/types/fields.py,sha256=pa5qvQVwEr8dh44IGHyYqgJYTYyTIeAjBW6CylXrkP0,14785
|
|
25
25
|
mms_client/types/market.py,sha256=IbXsH4Q5MJI-CEvGvZlzv2S36mX_Ea02U11Ik-NwSxQ,2706
|
|
26
26
|
mms_client/types/offer.py,sha256=KosFiKRMnt7XwlLBUfjHUGHiWzrMJUPPhGQMxgdeepM,6791
|
|
27
27
|
mms_client/types/registration.py,sha256=Nir73S3ffpk0O_fnTD2alFaqV1k67_8dcyyduXvPBI4,1381
|
|
28
|
+
mms_client/types/report.py,sha256=ogfzIMvQeGBR_21JVHqQo1fqBZY7ExuRlpj6nNcKRcU,23044
|
|
28
29
|
mms_client/types/reserve.py,sha256=pLV47w_749EIVhj0tUuJdWdHBBEl0-v10oVioccgxnU,2667
|
|
29
|
-
mms_client/types/resource.py,sha256=
|
|
30
|
-
mms_client/types/transport.py,sha256
|
|
30
|
+
mms_client/types/resource.py,sha256=TNQM51SLxnkjSlyJ2Sh-8Ph1-rNgkz3JKrAgI6qSHEg,65284
|
|
31
|
+
mms_client/types/transport.py,sha256=-hRmhv1VdMiby6zQJjqNRO7TkatRU-ZEqoCdtQMpgdg,4407
|
|
31
32
|
mms_client/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
33
|
mms_client/utils/auditing.py,sha256=JDcvNo4ul66xPtDeeocn568yIe8fhh-jM11MWP-Kfes,2057
|
|
33
34
|
mms_client/utils/errors.py,sha256=6k-NOjGZyTbTUISzN7B4JrmU2P8cwjpFFmFC7kJOQFQ,3005
|
|
34
35
|
mms_client/utils/multipart_transport.py,sha256=O374vPh2j29_CSjkWnIaPJfiabRSGNpQvNQcUODdkDM,8871
|
|
35
|
-
mms_client/utils/serialization.py,sha256=
|
|
36
|
+
mms_client/utils/serialization.py,sha256=weXZQOqAiQ4ga-vAVz8PQ1JR_iX2iN0lyMimqqC3mio,33783
|
|
36
37
|
mms_client/utils/web.py,sha256=7c6Ghs3Y52cm2ge-9svR39uQjr2Pm2LhX9Wz-S1APa4,10816
|
|
37
|
-
mms_client-1.
|
|
38
|
-
mms_client-1.
|
|
39
|
-
mms_client-1.
|
|
40
|
-
mms_client-1.
|
|
38
|
+
mms_client-1.8.1.dist-info/LICENSE,sha256=awOCsWJ58m_2kBQwBUGWejVqZm6wuRtCL2hi9rfa0X4,1211
|
|
39
|
+
mms_client-1.8.1.dist-info/METADATA,sha256=rNCI-Zb1mRiiDcMmxT3YNzrhz7A5-RVEPdBXM8_bfOU,16590
|
|
40
|
+
mms_client-1.8.1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
|
41
|
+
mms_client-1.8.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|