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.
@@ -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, create our payload class from the payload and data types
69
- payload_cls = _create_request_payload_type(
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
- # Next, inject the payload and data into the payload class
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(self, request_envelope: E, request_data: List[P], request_type: Type[P]) -> bytes:
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]): The data to be serialized.
91
- request_type (Type[Payload]): The type of data to be serialized.
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, create our payload class from the payload and data types
96
- payload_cls = _create_request_payload_type(
97
- self._payload_key, type(request_envelope), request_type, True # type: ignore[arg-type]
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
- # Next, inject the payload and data into the payload class
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(self, data: bytes, envelope_type: Type[E], data_type: Type[P]) -> Response[E, P]:
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(self, data: bytes, envelope_type: Type[E], data_type: Type[P]) -> MultiResponse[E, P]:
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(raw, envelope_type)
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(raw, envelope_type, data_type, self._payload_key, False)
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(self, raw: Element, envelope_type: Type[E], data_type: Type[P]) -> MultiResponse[E, P]:
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(raw, envelope_type, data_type, self._payload_key, True)
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(self, raw: Element, envelope_type: Type[E]) -> Tuple[E, ResponseCommon, Element]:
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
- envelope_node = raw.find(envelope_type.__name__)
248
- if envelope_node is None:
249
- raise ValueError(f"Expected envelope type '{envelope_type.__name__}' not found in response")
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
- envelope_type: Type[E],
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
- envelope_type (Type[Envelope]): The type of envelope being constructed.
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, envelope_type.__name__),
344
- envelope_type,
373
+ _find_or_fail(raw, envelope_tag),
374
+ envelope_tag,
345
375
  current_type,
346
- f"{root}.{envelope_type.__name__}",
376
+ f"{root}.{envelope_tag}",
347
377
  multi,
348
378
  False,
349
379
  )
350
380
  )
351
- elif root.endswith(envelope_type.__name__) or wrapped:
381
+ elif root.endswith(envelope_tag) or wrapped:
352
382
  messages.update(
353
383
  self._from_tree_messages_inner(
354
- raw, envelope_type, current_type, root, get_tag(current_type), multi, False
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
- envelope_type,
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
- envelope_type: Type[E],
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
- envelope_type (Type[Envelope]): The type of envelope being constructed.
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, envelope_type, current_type, path_base if wrapped else f"{path_base}[{i}]", True, wrapped
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, envelope_type, current_type, path_base, False, wrapped)
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[Union[P, List[P]]],
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.7.0
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=T6D9vDsNmz68rLAVbzCl9WQAHqYQ7D18JVFi-L_LkSs,27914
16
- mms_client/services/market.py,sha256=hQnMZ52abjcQO3L0d5bPuJz7hmBEAbDq2l12I9YUG7k,9153
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=ryj2WKJoBzRU1r6Svbl2MyGOG0H5aEYAK6HQWL9kYaA,3815
19
- mms_client/services/report.py,sha256=ZXYDaknPCnSYZI857QHbkzst1Pez_PrKFudVF9bQB7Q,642
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=YMRGCBBDMGRlR7YpDBSDVDvhjEJrxA32YhmiHoXXz-Q,9530
23
- mms_client/types/enums.py,sha256=YJ58FbhyQ0TVlf8Z-Dg1UfVu8CurY5b21Cy5-WYkJ0I,1629
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=TQnY3JLHRgQhQrG6ISquw-BQgKSr8TGuqn9ItWxWz_w,65974
30
- mms_client/types/transport.py,sha256=PZ7mDKeH8rGOVONk0ZH5herft71PFF-MUpp3uB57WXo,4395
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=kGPOWqOxHJ4IPyVB2xRiG6cKMqhUBSNBWJ4bF6xbxH8,30293
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.7.0.dist-info/LICENSE,sha256=awOCsWJ58m_2kBQwBUGWejVqZm6wuRtCL2hi9rfa0X4,1211
38
- mms_client-1.7.0.dist-info/METADATA,sha256=HWPxyyd84Fr9HnM7058QKp_yQRsnw0l5sefy8gb2yto,16447
39
- mms_client-1.7.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
40
- mms_client-1.7.0.dist-info/RECORD,,
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,,