pysdmx 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.
Files changed (34) hide show
  1. pysdmx/__init__.py +1 -1
  2. pysdmx/api/fmr/__init__.py +266 -0
  3. pysdmx/api/qb/refmeta.py +1 -1
  4. pysdmx/api/qb/schema.py +4 -10
  5. pysdmx/api/qb/service.py +26 -4
  6. pysdmx/api/qb/structure.py +2 -2
  7. pysdmx/io/json/fusion/messages/__init__.py +14 -0
  8. pysdmx/io/json/fusion/messages/dsd.py +52 -1
  9. pysdmx/io/json/fusion/messages/metadataflow.py +44 -0
  10. pysdmx/io/json/fusion/messages/mpa.py +45 -0
  11. pysdmx/io/json/fusion/messages/msd.py +121 -0
  12. pysdmx/io/json/fusion/messages/org.py +90 -0
  13. pysdmx/io/json/fusion/reader/__init__.py +5 -0
  14. pysdmx/io/json/sdmxjson2/messages/__init__.py +15 -1
  15. pysdmx/io/json/sdmxjson2/messages/dsd.py +9 -6
  16. pysdmx/io/json/sdmxjson2/messages/metadataflow.py +88 -0
  17. pysdmx/io/json/sdmxjson2/messages/mpa.py +88 -0
  18. pysdmx/io/json/sdmxjson2/messages/msd.py +245 -0
  19. pysdmx/io/json/sdmxjson2/messages/provider.py +117 -1
  20. pysdmx/io/json/sdmxjson2/messages/structure.py +25 -1
  21. pysdmx/io/json/sdmxjson2/reader/__init__.py +5 -0
  22. pysdmx/io/serde.py +5 -0
  23. pysdmx/io/writer.py +2 -4
  24. pysdmx/io/xml/__structure_aux_writer.py +9 -9
  25. pysdmx/io/xml/__write_data_aux.py +1 -2
  26. pysdmx/model/__init__.py +12 -1
  27. pysdmx/model/dataflow.py +1 -0
  28. pysdmx/model/map.py +3 -1
  29. pysdmx/model/message.py +29 -2
  30. pysdmx/model/metadata.py +255 -4
  31. {pysdmx-1.7.0.dist-info → pysdmx-1.8.1.dist-info}/METADATA +1 -1
  32. {pysdmx-1.7.0.dist-info → pysdmx-1.8.1.dist-info}/RECORD +34 -28
  33. {pysdmx-1.7.0.dist-info → pysdmx-1.8.1.dist-info}/WHEEL +0 -0
  34. {pysdmx-1.7.0.dist-info → pysdmx-1.8.1.dist-info}/licenses/LICENSE +0 -0
pysdmx/model/metadata.py CHANGED
@@ -9,21 +9,272 @@ example by providing configuration details in a metadata report.
9
9
  """
10
10
 
11
11
  from collections import defaultdict
12
- from typing import Any, Dict, Iterator, List, Optional, Sequence
12
+ from typing import Any, Dict, Iterator, List, Optional, Sequence, Union
13
13
 
14
14
  from msgspec import Struct
15
15
 
16
- from pysdmx.model.__base import Annotation, MaintainableArtefact
17
- from pysdmx.model.concept import Facets
16
+ from pysdmx.model.__base import (
17
+ Annotation,
18
+ IdentifiableArtefact,
19
+ ItemReference,
20
+ MaintainableArtefact,
21
+ Reference,
22
+ )
23
+ from pysdmx.model.code import Codelist, Hierarchy
24
+ from pysdmx.model.concept import Concept, DataType, Facets
25
+ from pysdmx.model.dataflow import ArrayBoundaries
18
26
  from pysdmx.model.dataset import ActionType
19
27
 
20
28
 
29
+ class MetadataComponent(
30
+ IdentifiableArtefact, frozen=True, omit_defaults=True, kw_only=True
31
+ ):
32
+ """A component defines the expected structure of a metadata attribute.
33
+
34
+ The metadata component takes its semantic, and in some cases it
35
+ representation, from its concept identity. A metadata component
36
+ may be coded (via the local representation), uncoded (via the text
37
+ format), or take no value. In addition to this value, the metadata
38
+ component may also specify subordinate metadata components.
39
+
40
+ If a metadata component only serves the purpose of containing
41
+ subordinate metadata components, then the is_presentational attribute
42
+ should be set to True. Otherwise, it is assumed to also take a value.
43
+
44
+ If the metadata component does take a value, and a representation is
45
+ not defined, it will be inherited from the concept it takes its
46
+ semantic from. The optional id on the metadata component uniquely
47
+ identifies it within the metadata structured definition.
48
+
49
+ If this id is not supplied, its value is assumed to be that of the
50
+ concept referenced from the concept identity. Note that a metadata
51
+ component (as identified by the id attribute) definition must be
52
+ unique across the entire metadata structure definition.
53
+
54
+ Attributes:
55
+ id: The identifier of the component.
56
+ is_presentational: Whether the component is for presentation
57
+ purposes only (e.g. a section header), or may contain a
58
+ value.
59
+ concept: The concept giving its identity to the component.
60
+ local_dtype: The component's local data type (string, number, etc.).
61
+ local_facets: Additional local details such as the component's minimum
62
+ length.
63
+ local_codes: The expected local values for the component (e.g. currency
64
+ codes).
65
+ array_def: Any additional constraints for array types.
66
+ local_enum_ref: The URN of the enumeration (codelist or valuelist) from
67
+ which the local codes are taken.
68
+ """
69
+
70
+ is_presentational: bool = False
71
+ concept: Union[Concept, ItemReference]
72
+ local_dtype: Optional[DataType] = None
73
+ local_facets: Optional[Facets] = None
74
+ local_codes: Union[Codelist, Hierarchy, None] = None
75
+ array_def: Optional[ArrayBoundaries] = None
76
+ local_enum_ref: Optional[str] = None
77
+ components: Sequence["MetadataComponent"] = ()
78
+
79
+ @property
80
+ def dtype(self) -> DataType:
81
+ """Returns the component data type.
82
+
83
+ This will return the local data type (if any) or
84
+ the data type of the referenced concept (if any).
85
+ In case neither are set, the data type will default
86
+ to string.
87
+
88
+ Returns:
89
+ The component data type (local, core or default).
90
+ """
91
+ if self.local_dtype:
92
+ return self.local_dtype
93
+ elif isinstance(self.concept, Concept) and self.concept.dtype:
94
+ return self.concept.dtype
95
+ else:
96
+ return DataType.STRING
97
+
98
+ @property
99
+ def facets(self) -> Optional[Facets]:
100
+ """Returns the component facets.
101
+
102
+ This will return the local facets (if any) or
103
+ the facets of the referenced concept (if any), or
104
+ None in case neither are set.
105
+
106
+ Returns:
107
+ The component facets (local or core).
108
+ """
109
+ if self.local_facets:
110
+ return self.local_facets
111
+ elif isinstance(self.concept, Concept) and self.concept.facets:
112
+ return self.concept.facets
113
+ else:
114
+ return None
115
+
116
+ @property
117
+ def enumeration(self) -> Union[Codelist, Hierarchy, None]:
118
+ """Returns the list of valid codes for the component.
119
+
120
+ This will return the local codes (if any) or
121
+ the codes of the referenced concept (if any), or
122
+ None in case neither are set.
123
+
124
+ Returns:
125
+ The component codes (local or core).
126
+ """
127
+ if self.local_codes:
128
+ return self.local_codes
129
+ elif isinstance(self.concept, Concept) and self.concept.codes:
130
+ return self.concept.codes
131
+ else:
132
+ return None
133
+
134
+ @property
135
+ def enum_ref(self) -> Optional[str]:
136
+ """Returns the URN of the enumeration from which the codes are taken.
137
+
138
+ Returns:
139
+ The URN of the enumeration from which the codes are taken.
140
+ """
141
+ if self.local_enum_ref:
142
+ return self.local_enum_ref
143
+ elif isinstance(self.concept, Concept) and self.concept.enum_ref:
144
+ return self.concept.enum_ref
145
+ else:
146
+ return None
147
+
148
+ def __str__(self) -> str:
149
+ """Custom string representation without the class name."""
150
+ processed_output = []
151
+ for attr, value, *_ in self.__rich_repr__(): # type: ignore[misc]
152
+ processed_output.append(f"{attr}: {value}")
153
+ return f"{', '.join(processed_output)}"
154
+
155
+ def __repr__(self) -> str:
156
+ """Custom __repr__ that omits empty sequences."""
157
+ attrs = []
158
+ for attr, value, *_ in self.__rich_repr__(): # type: ignore[misc]
159
+ attrs.append(f"{attr}={repr(value)}")
160
+ return f"{self.__class__.__name__}({', '.join(attrs)})"
161
+
162
+
163
+ class MetadataStructure(
164
+ MaintainableArtefact, frozen=True, omit_defaults=True, kw_only=True
165
+ ):
166
+ """A metadata structure definition, i.e. a collection of metadata concepts.
167
+
168
+ Attributes:
169
+ id: The identifier for the MSD.
170
+ name: The MSD name (e.g. "Frequency codelist").
171
+ agency: The maintainer of the MSD (e.g. SDMX).
172
+ description: Additional descriptive information about the MSD.
173
+ version: The MSD version (e.g. 1.0.1)
174
+ components: The MSD components, i.e. the collection of metadata
175
+ concepts.
176
+ """
177
+
178
+ components: Sequence[MetadataComponent] = ()
179
+
180
+ def __iter__(self) -> Iterator[MetadataComponent]:
181
+ """Return an iterator over the list of components."""
182
+ yield from self.components
183
+
184
+ def __len__(self) -> int:
185
+ """Return the number of components in the MSD."""
186
+ return self.__get_count(self.components)
187
+
188
+ def __getitem__(self, id_: str) -> Optional[MetadataComponent]:
189
+ """Return the component identified by the given ID."""
190
+ return self.__extract_cat(self.components, id_)
191
+
192
+ def __contains__(self, id_: str) -> bool:
193
+ """Whether there is a component with the supplied ID in the MSD."""
194
+ return bool(self.__getitem__(id_))
195
+
196
+ def __get_count(self, comps: Sequence[MetadataComponent]) -> int:
197
+ """Return the number of components at any levels."""
198
+ count = len(comps)
199
+ for comp in comps:
200
+ if comp.components:
201
+ count += self.__get_count(comp.components)
202
+ return count
203
+
204
+ def __extract_cat(
205
+ self, comps: Sequence[MetadataComponent], id_: str
206
+ ) -> Optional[MetadataComponent]:
207
+ if "." in id_:
208
+ ids = id_.split(".")
209
+ out = list(filter(lambda cat: cat.id == ids[0], comps))
210
+ if out:
211
+ pkey = ".".join(ids[1:])
212
+ return self.__extract_cat(out[0].components, pkey)
213
+ else:
214
+ out = list(filter(lambda cat: cat.id == id_, comps))
215
+ if out:
216
+ return out[0]
217
+ return None
218
+
219
+ def __str__(self) -> str:
220
+ """Custom string representation without the class name."""
221
+ processed_output = []
222
+ for attr, value, *_ in self.__rich_repr__(): # type: ignore[misc]
223
+ # str is taken as a Sequence, so we need to check it's not a str
224
+ if isinstance(value, Sequence) and not isinstance(value, str):
225
+ # Handle empty lists
226
+ if not value:
227
+ continue
228
+ class_name = value[0].__class__.__name__
229
+ class_name = (
230
+ class_name.lower() + "s"
231
+ if attr != "components"
232
+ else "components"
233
+ )
234
+ value = f"{len(value)} {class_name}"
235
+
236
+ processed_output.append(f"{attr}: {value}")
237
+ return f"{', '.join(processed_output)}"
238
+
239
+
240
+ class Metadataflow(
241
+ MaintainableArtefact,
242
+ frozen=True,
243
+ omit_defaults=True,
244
+ tag=True,
245
+ kw_only=True,
246
+ ):
247
+ """A flow of reference metadata that metadata providers will provide.
248
+
249
+ Attributes:
250
+ structure: The MSD describing the structure of all reference
251
+ metadata reports for this metadataflow.
252
+ targets: Identifiable structures to which the reference metadata
253
+ reports described by the referenced MSD should be restricted to.
254
+ For example, to indicate that the reports can be related to
255
+ dataflows only, the following can be used:
256
+ urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=*:*(*)
257
+ """
258
+
259
+ structure: Optional[Union[MetadataStructure, str]]
260
+ targets: Union[Sequence[str], Sequence[Reference]]
261
+
262
+
263
+ class MetadataProvisionAgreement(
264
+ MaintainableArtefact, frozen=True, omit_defaults=True, kw_only=True
265
+ ):
266
+ """Link between a metadata provider and metadataflow."""
267
+
268
+ metadataflow: str
269
+ metadata_provider: str
270
+
271
+
21
272
  class MetadataAttribute(
22
273
  Struct, frozen=True, omit_defaults=True, repr_omit_defaults=True
23
274
  ):
24
275
  """An entry in a metadata report.
25
276
 
26
- An attribute is iterable, as it may contain other attributes.
277
+ An component is iterable, as it may contain other attributes.
27
278
 
28
279
  Attributes:
29
280
  id: The identifier of the attribute (e.g. "License").
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pysdmx
3
- Version: 1.7.0
3
+ Version: 1.8.1
4
4
  Summary: Your opinionated Python SDMX library
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -1,5 +1,5 @@
1
1
  pysdmx/__extras_check.py,sha256=I39OaM1lAPBnyzHVJ7kA_ZA_tMeDAQLr6ZKqEQ9MK1Q,1659
2
- pysdmx/__init__.py,sha256=wT-iFGPp5NSw97EUGKgaqjmRmRqdND7Pc58tuIjjcro,67
2
+ pysdmx/__init__.py,sha256=ewDMAm-SxznkiNhpzGsqtt8Up4ZirPcPQ4RDZLupcsE,67
3
3
  pysdmx/api/__init__.py,sha256=8lRaF6kEO51ehl0fmW_pHLvkN_34TtEhqhr3oKo6E6g,26
4
4
  pysdmx/api/dc/__init__.py,sha256=oPU32X8CRZy4T1to9mO5KMqMwxQsVI424dPqai-I8zI,121
5
5
  pysdmx/api/dc/_api.py,sha256=poy1FYFXnF6maBGy5lpOodf32-7QQjH8PCBNDkuOXxQ,7747
@@ -10,18 +10,18 @@ pysdmx/api/dc/query/_parsing_util.py,sha256=pUc5z6sijGmJZsLilAxiPsCSRIO7l2iznzL3
10
10
  pysdmx/api/dc/query/_py_parser.py,sha256=_kVUk6Xu5jZdclng1F6eDSZS2-ok_yncI1y1q5lYpBU,1502
11
11
  pysdmx/api/dc/query/_sql_parser.py,sha256=vQjhSyt6qA4jAHchkq4XXVhNPtKjKSVLzhoPkUyhJKk,1561
12
12
  pysdmx/api/dc/query/util.py,sha256=9HALmvlgVCckaMTVG7sEFbAw_mBwfbL4K-Pac2KPSYw,915
13
- pysdmx/api/fmr/__init__.py,sha256=Ya25AH-os812eOF_laaOBpZqyAfa0um3wWpsKOJTGeA,40965
13
+ pysdmx/api/fmr/__init__.py,sha256=kLvtCWh5HXNg4uvVFVHtrJ-HJ6c2iM4fVNDDtydSSBI,50432
14
14
  pysdmx/api/fmr/maintenance.py,sha256=AnR1beyL6nsoDM5LmDLXnRMW5JvhGHXTADf_INSNgUg,5920
15
15
  pysdmx/api/gds/__init__.py,sha256=BBl75wEdcz9zPMfk6kAGHitRW39S774VL9xifMZ_uHs,11560
16
16
  pysdmx/api/qb/__init__.py,sha256=vxdMJFFg4J_KWADrnzj_8KcU0UlwpJPdx0yiW3QJo9Y,1498
17
17
  pysdmx/api/qb/availability.py,sha256=2yPHnTXu_jACNKNhhtXMkxVkfLK1Ewa5ucGAbRxvC5o,10181
18
18
  pysdmx/api/qb/data.py,sha256=RUcSQBZYkqlrD2ehrGxUWUEAyjbfl5CSgjQ6BwN3hus,22049
19
19
  pysdmx/api/qb/gds.py,sha256=Z2KhP6m09_oWI2CbYRhlTsx8VLC-_UZaQEOEqX94SOw,4975
20
- pysdmx/api/qb/refmeta.py,sha256=rWhMcUkcQ0zYoiEVAVFOnykLLhMWFFZssFZh8z3kRng,10677
20
+ pysdmx/api/qb/refmeta.py,sha256=--h0QOvaLGILT_6GBAZ2Ld5aqAELEW-PTsHNcj7YoG8,10677
21
21
  pysdmx/api/qb/registration.py,sha256=IURlmXcXQi8e-w5YXCgRNs07EQJZJ2bOdZb7M_k5iZ8,7132
22
- pysdmx/api/qb/schema.py,sha256=f0V-fQl9GQ2YWhnZqUF_wogB2L9dRIdY_vT4XvYkqoI,5747
23
- pysdmx/api/qb/service.py,sha256=ieLgOR27NNRD2P4FGhFmWVkJweGngAx-mWkTDfsVCyI,14001
24
- pysdmx/api/qb/structure.py,sha256=OoIlP3twT1-v4pY5wZyNlttmZOXQ5Vk-zc7j-qMtwXw,17814
22
+ pysdmx/api/qb/schema.py,sha256=Ik2BE5_T93ZIQX2KADGi2J-xXZxUVYd6DfphtI06Ueo,5667
23
+ pysdmx/api/qb/service.py,sha256=1_zgfNxQ9-hWZthEAQzFzjseMj3jeC2Gr3kyMuIXSCg,14532
24
+ pysdmx/api/qb/structure.py,sha256=0m_Fmp410Rfjdv0ehLS8ivwccwn-xfBkcIdYayu8pgg,17814
25
25
  pysdmx/api/qb/util.py,sha256=at2Sb2kVltSTDc1gKiqG6HtIFhjSx-Msbe--wCvRbQI,3667
26
26
  pysdmx/errors.py,sha256=9bfujYykzfGMa1TuUOmH9QqghnZGOo556fvbKH2jFa8,3295
27
27
  pysdmx/io/__init__.py,sha256=96ZCY1PfcWp_q2Nlo2tHJAK31sH_b05v9UkbR0vGdg0,180
@@ -39,21 +39,24 @@ pysdmx/io/csv/sdmx21/reader/__init__.py,sha256=J1cCkZh3klgZZWjdQ_U1zkfzT_DVzQmdr
39
39
  pysdmx/io/csv/sdmx21/writer/__init__.py,sha256=CH8Nm7hqvXyN6XM_D2nJRmbKj6CJV-X1QzSF0WJrs0E,2484
40
40
  pysdmx/io/format.py,sha256=EO-PyYpiU0WswvEGA5UHokladxPezcwBUo1AJTqxp1Q,5250
41
41
  pysdmx/io/input_processor.py,sha256=rj2GzDs3xVQRzikzWonPWJGEa4_mxUPgCqHQ50JI5xY,6917
42
- pysdmx/io/json/fusion/messages/__init__.py,sha256=C0LAG6UfIZcQdlCv5d_D1ZNIcCq04RxZYLAp6tLDqwY,1573
42
+ pysdmx/io/json/fusion/messages/__init__.py,sha256=ac2jWfjGGBcfoSutiKy68LzqwNp_clt2RzmJOaYCxL0,2142
43
43
  pysdmx/io/json/fusion/messages/category.py,sha256=E9jrzXenEpqDNUhT1JJLYxty37PSGegRtx45mB3-COg,4589
44
44
  pysdmx/io/json/fusion/messages/code.py,sha256=YayxSKiHa124WTr_lK8HTfXHomh_e0oDZvuydd29XKg,8300
45
45
  pysdmx/io/json/fusion/messages/concept.py,sha256=m4lTyncSIriFXWWupE-zLxUVPx3Xrg56qahzKr4HEag,2824
46
46
  pysdmx/io/json/fusion/messages/constraint.py,sha256=dPkzhCWN49Y9ReSZPRFTdM6GWc0rU2BZTyFfWsqlX34,615
47
47
  pysdmx/io/json/fusion/messages/core.py,sha256=GdzF3TNUGrB0gxuaaSpk9LaYqcdy_M6L2azExZQfM0Q,4843
48
48
  pysdmx/io/json/fusion/messages/dataflow.py,sha256=lsaMPjmA-KiM51I78wrONfNHyvfBSeAll5Sp0jmTezc,2972
49
- pysdmx/io/json/fusion/messages/dsd.py,sha256=5n6AdhoJZ41A-BocFrqmTlprZX4WGOA2bAr_S57CrCw,8433
49
+ pysdmx/io/json/fusion/messages/dsd.py,sha256=9QO0IzDSa3sHRTt6tvRAE1tAieugxB55tJ0KmeHf230,10136
50
50
  pysdmx/io/json/fusion/messages/map.py,sha256=TPsCFuUfk5Jhhe7CNvEoHuFNZFpHhvNiYFWeIEUx-sc,7695
51
- pysdmx/io/json/fusion/messages/org.py,sha256=9gZpHg6o4fPGY9fUIDUCyKQCCLL6NYFHnQJkxdXD8v8,6264
51
+ pysdmx/io/json/fusion/messages/metadataflow.py,sha256=Js4j8lUF9ZwqL7lJUrfrjk9tmBmRQPt8qxdrfnZ6R5E,1374
52
+ pysdmx/io/json/fusion/messages/mpa.py,sha256=WvcHn7Pa_UBHxkZbfSzIxc8qeeMfTWThxgCRHuioXFY,1494
53
+ pysdmx/io/json/fusion/messages/msd.py,sha256=S7PR8DbY1Vob5UUCTHbSmfpz5kMMyGJvtE0zcF1RqbE,3781
54
+ pysdmx/io/json/fusion/messages/org.py,sha256=gWIvmvVrj5wXCrwbsJL0B13YM3WjlfIQxrRUc_WAoYs,9538
52
55
  pysdmx/io/json/fusion/messages/pa.py,sha256=6zN8Qxj5bdf5zo2N9TwYlSLyGxokvsELtk1--1cMbxw,1393
53
56
  pysdmx/io/json/fusion/messages/report.py,sha256=ZE62ZmHlCXk3TxRTRWCDCKVMhnN0J5UjMEzrsnD5I3E,1551
54
57
  pysdmx/io/json/fusion/messages/schema.py,sha256=xBbpLyJNapJpzZA4vAvROmWTSNYymcpggqMZ_NjL444,2603
55
58
  pysdmx/io/json/fusion/messages/vtl.py,sha256=7VGjDRWzKMO6WT4CnGvGBKinhX06DzrJmDRudnvN4XM,16092
56
- pysdmx/io/json/fusion/reader/__init__.py,sha256=fpya2W7YJ6lcdupAybBawMtJI7PT0gy48gLkDbuPTWU,1295
59
+ pysdmx/io/json/fusion/reader/__init__.py,sha256=4lFrsX0Flhvlopv5FAYZBeQMPtmnMm5HgC-q7Pey0dw,1710
57
60
  pysdmx/io/json/gds/messages/__init__.py,sha256=5LqGtO3GDi2B6HM2eDGCSJCncLS8C4MQ7vd5YBvCRok,885
58
61
  pysdmx/io/json/gds/messages/agencies.py,sha256=C_2viUTW5FTLxMV0dtqPUQEs9tgjjsFxE44mHJ6aXp0,986
59
62
  pysdmx/io/json/gds/messages/catalog.py,sha256=-Y7j8rFA0PcS3AVT6X9_8VAw_eHCPLDtZxUqy1TLx4U,2280
@@ -61,7 +64,7 @@ pysdmx/io/json/gds/messages/sdmx_api.py,sha256=RIjNQr6ZZXCFGRBpGPKoLaxD9UilVDNyH
61
64
  pysdmx/io/json/gds/messages/services.py,sha256=OUFmYK4XkNMoaw70n4QabyxzdRDh-0XeYxBJtVezxMs,1259
62
65
  pysdmx/io/json/gds/messages/urn_resolver.py,sha256=w_wRRAwjaBw_yooSda1MXcD_aN63FdpFE7WFvcjHSeQ,1209
63
66
  pysdmx/io/json/gds/reader/__init__.py,sha256=cXQvjSzRe4lTsGmru6qMYE_HU2DEccJSYKsQ5ayIpxw,373
64
- pysdmx/io/json/sdmxjson2/messages/__init__.py,sha256=pqLbzZf-FkuSJWy8DLxtCXIu-Si2Mm-vDTzCqnJDNVA,1984
67
+ pysdmx/io/json/sdmxjson2/messages/__init__.py,sha256=qdvbmT8majCYQw_CPjP-Mqb4BgllFv-qf1T_VtzlCPg,2435
65
68
  pysdmx/io/json/sdmxjson2/messages/agency.py,sha256=d9t_2HrcZcqu_Y-EchShWDRF5yJQn86urfcFl5qvWAc,3720
66
69
  pysdmx/io/json/sdmxjson2/messages/category.py,sha256=k61oDSLNKl0G_Mov2AmC4ff1efCPsNfyNEbz0iajkpI,7656
67
70
  pysdmx/io/json/sdmxjson2/messages/code.py,sha256=t2MMvx2nQzlu4l8MMAPDEq15w5UIjHGgaJI2HoFPdus,17908
@@ -69,15 +72,18 @@ pysdmx/io/json/sdmxjson2/messages/concept.py,sha256=x7BoG6AaziZGNjxeypwy_lsFTmdH
69
72
  pysdmx/io/json/sdmxjson2/messages/constraint.py,sha256=6pONMHr7IT8O026Xnv6AjIMVmoS29ivNiOMPr1OWQZQ,1736
70
73
  pysdmx/io/json/sdmxjson2/messages/core.py,sha256=Cb6U1J13KCXnGJ2P8xbThTg9GCdzhkIK-cA8EHbY6Js,10077
71
74
  pysdmx/io/json/sdmxjson2/messages/dataflow.py,sha256=wjeq9yexTa012AtGdZsZflp3WQ6fP-3kas-gxADTFeQ,6256
72
- pysdmx/io/json/sdmxjson2/messages/dsd.py,sha256=0J3PYq10aoqyoAw4KyJP4ObW2JHttaxZjR9xvgyA2aU,18941
75
+ pysdmx/io/json/sdmxjson2/messages/dsd.py,sha256=8-Q5ADEk0cSKEtXECBqOkzW4yN9dhRmmiVFf8zdAOUE,19025
73
76
  pysdmx/io/json/sdmxjson2/messages/map.py,sha256=-hhUyPxIWKoIxij0qbuoFDsZMqmtMfclCMUme4c9SS0,16767
77
+ pysdmx/io/json/sdmxjson2/messages/metadataflow.py,sha256=37VsdrDpXWKkRczPjxozygrmZAiWxyZbBwDUeg03DDk,2936
78
+ pysdmx/io/json/sdmxjson2/messages/mpa.py,sha256=ryoQCvOvd2j6gPdGOEML4bc-NXUSetuKNOfmd9Ogn2s,3050
79
+ pysdmx/io/json/sdmxjson2/messages/msd.py,sha256=R2onHmPfG0q1NAOLqc36cbKihIaB1ntGysN40df28VY,8225
74
80
  pysdmx/io/json/sdmxjson2/messages/pa.py,sha256=VoaPBgcWGwWU7h5IaVa5wNWncOoktWihSXjcP4vEb00,2780
75
- pysdmx/io/json/sdmxjson2/messages/provider.py,sha256=W5FVPd03Q-P4h9ThPoPRTs-MAepsOj3k8m7vtEHt00A,4164
81
+ pysdmx/io/json/sdmxjson2/messages/provider.py,sha256=htAwdDzVR3qeyExhmjpvg8W0X4lWqRh2Bvd5H8wsOTY,8197
76
82
  pysdmx/io/json/sdmxjson2/messages/report.py,sha256=thcZZUuoiJ6OJ9P33EOTN3PIHFKxdQUMapI7HmSoB4A,6571
77
83
  pysdmx/io/json/sdmxjson2/messages/schema.py,sha256=Ejs8roep6bSL8Eyu7j18E6IiHXWJ3qSybnnRYNyio-E,2868
78
- pysdmx/io/json/sdmxjson2/messages/structure.py,sha256=1RBHqgVIigcJXOdFMJ5N7xHJ_aXtwAdma7EFpmFtBqE,10520
84
+ pysdmx/io/json/sdmxjson2/messages/structure.py,sha256=puqKLHX37MFhlB0ZxUhaRCUhEXfYPsVVMvHBjxhP4WA,11536
79
85
  pysdmx/io/json/sdmxjson2/messages/vtl.py,sha256=xCErG_ojn_z1-KrFBInatY2q83lEyWUUB0g-QK-auzk,35168
80
- pysdmx/io/json/sdmxjson2/reader/__init__.py,sha256=f9vTKscFIAQpAKh3pZ4ZKlZSKyGfj1yaZS9w7S0_hIc,1264
86
+ pysdmx/io/json/sdmxjson2/reader/__init__.py,sha256=RbNnZSrGQa4OE0HBWJau9tPFSQbDklcKZaBWOzxEw4I,1629
81
87
  pysdmx/io/json/sdmxjson2/reader/metadata.py,sha256=fIuJL0y71leopBjqy8NqvzRzf9FeDBBzzh_VnzMGtFo,911
82
88
  pysdmx/io/json/sdmxjson2/reader/structure.py,sha256=G2F23BR3BYfc_9thvDbRQHrmpxlK01mnu1myDpOohN0,889
83
89
  pysdmx/io/json/sdmxjson2/writer/__init__.py,sha256=DZGkas1ghei4p6SZsIQI1LPToS-d8F1Nx75MC8reT7g,270
@@ -85,18 +91,18 @@ pysdmx/io/json/sdmxjson2/writer/metadata.py,sha256=qse5foElBdTWbxIc9rIH1B4DfOBMe
85
91
  pysdmx/io/json/sdmxjson2/writer/structure.py,sha256=kqINWWSFjowIKIwsD0Kvb29KYdW5VDT9fg9d1ccjQBY,2102
86
92
  pysdmx/io/pd.py,sha256=1C5UnAT25EADOpNsRBooEdWNaJEGdmcwh6_R9O5MOrc,464
87
93
  pysdmx/io/reader.py,sha256=RJJ55TMYUX5B06ELwKPtfKR3rJIkfyg_q8UskfnM76Y,10470
88
- pysdmx/io/serde.py,sha256=I6Cpq0gLacko7x-GrT_YQP0UZhC3xrnjVbKCrY9xIYk,1421
89
- pysdmx/io/writer.py,sha256=EiKGKujhfzr-Max3_nUNMvZOm8QPWmkXeZi50QLjT6A,5847
94
+ pysdmx/io/serde.py,sha256=xTd22JEaefhCpVcUqVthf4gtDQT1KeiDZ-9w52o2zQk,1594
95
+ pysdmx/io/writer.py,sha256=1UVJvZm3eD2wQxZ-PruQdhQMu3l2egju-cxOvZBrH-o,5833
90
96
  pysdmx/io/xml/__allowed_lxml_errors.py,sha256=PdIK2i6JwwGRh1Ogc5JA0hRySO7QXJKN-DI8EYtdjA0,225
91
97
  pysdmx/io/xml/__data_aux.py,sha256=ztivjZANN1PJ63IvoMfx-5TA2AiPQTVPC_0YYHOT9Ns,4069
92
98
  pysdmx/io/xml/__init__.py,sha256=tcUsSEiM3nBA7lDbZPwGZ7Vu_K9gQd8oliASUMTGjFE,105
93
99
  pysdmx/io/xml/__parse_xml.py,sha256=SITC7Yptq_qY_exetRez90lJCukH1WsKDMqlk7Q1RaY,2899
94
100
  pysdmx/io/xml/__ss_aux_reader.py,sha256=6mumQYcDdF_vrX65vSodE4I1b7upKbP6yNNSM2N6pUs,2853
95
101
  pysdmx/io/xml/__structure_aux_reader.py,sha256=xqwZZ2qWi8IUW2KMVhuABp1TSx6dSRH4BmvKh5kXxyk,40348
96
- pysdmx/io/xml/__structure_aux_writer.py,sha256=jOcp7Ywx7mEUrrhgKj6Kz5-6KctQoD7TbOSOoPxj_ZE,43583
102
+ pysdmx/io/xml/__structure_aux_writer.py,sha256=5eaTJ4rWMSMtM4MsaupTIMmhaPOJbXQtQbvYO-aDSHU,43589
97
103
  pysdmx/io/xml/__tokens.py,sha256=Y_SlFWYIXolsgjHoFq7pm3TYlEu07CR9TmJKk2jHfQ0,6823
98
104
  pysdmx/io/xml/__write_aux.py,sha256=KHZxEhGSjZPRW93OvniZ0kHmiAJtKJu-2aLtMhsKt90,15396
99
- pysdmx/io/xml/__write_data_aux.py,sha256=x-RNwVfUgEkBoGG_Sen-rPg7MnqE5_0SV-6PmjDdAxY,3373
105
+ pysdmx/io/xml/__write_data_aux.py,sha256=Kfwxi8XHXj4W94D41cTdPig6GYw_3wTUzfDucNWDVx0,3353
100
106
  pysdmx/io/xml/__write_structure_specific_aux.py,sha256=reRDVw4Xwag0ODyMzm9uOk9WJ_e1ELxAPYHSMUUDJBQ,8919
101
107
  pysdmx/io/xml/config.py,sha256=R24cczVkzkhjVLXpv-qfEm88W3_QTqVt2Qofi8IvJ5Y,93
102
108
  pysdmx/io/xml/doc_validation.py,sha256=WXDhte96VEAeZMMHJ0Y68WW8HEoOhEiOYEnbGP5Zwjw,1795
@@ -129,16 +135,16 @@ pysdmx/io/xml/sdmx31/writer/structure.py,sha256=hK-BYOsyyuqLTqxe6qC3PxeDJDp3_qyB
129
135
  pysdmx/io/xml/sdmx31/writer/structure_specific.py,sha256=OtP_uxn-y9tVB9eNRP6ov3zBL1wtr4SRef9llB4A3yk,3236
130
136
  pysdmx/io/xml/utils.py,sha256=ljrocQwPTYycg3I68sqYI5pF8qukNccSCMM9Xf_Tag0,583
131
137
  pysdmx/model/__base.py,sha256=H5OpCpi6fGxB30vFn-lCstTczSdOB4YJiBynThovQs4,13810
132
- pysdmx/model/__init__.py,sha256=PHfVmxbfBzRNoCJ2kqRl-aSvGN4fLz2E8DYAoDxBTRA,4948
138
+ pysdmx/model/__init__.py,sha256=uuR3JYtgLqa6BpY3EnylR_TEdIgF46dqsV63uHcHmQ0,5161
133
139
  pysdmx/model/category.py,sha256=WWWysaTdlcU8KZpQyZgbZkrOelNVCGOfVUk_APJxm-w,6031
134
140
  pysdmx/model/code.py,sha256=Wu6rEXeZf_XA0aBrDXgN-3yvySAHH7SAjrWliFlmC24,12799
135
141
  pysdmx/model/concept.py,sha256=mQfqJdtWc10WdTKX_Mw7Znw65cN3QO-kCar9MWYeWO4,9645
136
- pysdmx/model/dataflow.py,sha256=RDuL3GMhfMR5Dn1bTb4saWhn5v6igcJSKZ4d7ip7WPw,23887
142
+ pysdmx/model/dataflow.py,sha256=9EzGn-EDm1OQa52N5ep8VApZoj7lHWfIs-W5tnBP9FY,23954
137
143
  pysdmx/model/dataset.py,sha256=Lbr7tYonGHD3NZUD-M9hK2puaEAluOVPG2DbkOohzMM,4861
138
144
  pysdmx/model/gds.py,sha256=QrnmI8Hn--C95gGXCeUeWwhn-Ur7DuT08Cg7oPJIEVI,4976
139
- pysdmx/model/map.py,sha256=BR23koomqDGDYvHLTg2axVwlTkst7aJ0X65-0tw11j4,17492
140
- pysdmx/model/message.py,sha256=tuUr0sQf6P3QflhNAbmYjQaz4_3ly06psk19c8zlJ2s,14697
141
- pysdmx/model/metadata.py,sha256=EwElZZ8oewpuaEDDWM9ZV95Xvklcq333qxqPwoUqmXU,7653
145
+ pysdmx/model/map.py,sha256=9a3hl6efq_5kAYuJWkepoQOkao8Eqk17N69JGyRfxsk,17506
146
+ pysdmx/model/message.py,sha256=yZ7b_bEmkCDj6oxS5_Dk7DlngLCYjlbhj4kvd_aS5ho,15554
147
+ pysdmx/model/metadata.py,sha256=qxUcb6AMmTJhRHyVHKbpfJ9TV-UYTdPXTxGVNip0UyA,16992
142
148
  pysdmx/model/organisation.py,sha256=k6ZQ_O4l7174Y8tr-nnMnsUL0q0O8Rw3q4mIWmJUh2A,4706
143
149
  pysdmx/model/submission.py,sha256=iMQSvt-BYuDrqPEBcjw_wWNp74Vsx2OnEj3tnkth0Z8,833
144
150
  pysdmx/model/vtl.py,sha256=k7WIb89876xKlf7k0R9sgZ1VVlRrIkbV7FzvMFZn8e0,6985
@@ -154,7 +160,7 @@ pysdmx/util/__init__.py,sha256=m_XWRAmVJ7F6ai4Ckrj_YuPbhg3cJZAXeZrEThrL88k,3997
154
160
  pysdmx/util/_date_pattern_map.py,sha256=IS1qONwVHbTBNIFCT0Rqbijj2a9mYvs7onXSK6GeQAQ,1620
155
161
  pysdmx/util/_model_utils.py,sha256=d0XY8cnxvviQtkJJInVik7LWeuqX-eb4-zikFortL58,2335
156
162
  pysdmx/util/_net_utils.py,sha256=nOTz_x3FgFrwKh42_J70IqYXz9duQkMFJWtejZXcLHs,1326
157
- pysdmx-1.7.0.dist-info/METADATA,sha256=3zJX2O0JkzICIK-VuqsZ84oRhJCn5D_B70P2LTx3QxM,4719
158
- pysdmx-1.7.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
159
- pysdmx-1.7.0.dist-info/licenses/LICENSE,sha256=3XTNDPtv2RxDUNkQzn9MIWit2u7_Ob5daMLEq-4pBJs,649
160
- pysdmx-1.7.0.dist-info/RECORD,,
163
+ pysdmx-1.8.1.dist-info/METADATA,sha256=iz3Tj7Ygmub585wRzXNuWbqrLs7S-3PrKH4dq65EIP8,4719
164
+ pysdmx-1.8.1.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
165
+ pysdmx-1.8.1.dist-info/licenses/LICENSE,sha256=3XTNDPtv2RxDUNkQzn9MIWit2u7_Ob5daMLEq-4pBJs,649
166
+ pysdmx-1.8.1.dist-info/RECORD,,
File without changes