pysdmx 1.7.0__py3-none-any.whl → 1.8.0__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.
- pysdmx/__init__.py +1 -1
- pysdmx/api/fmr/__init__.py +266 -0
- pysdmx/api/qb/refmeta.py +1 -1
- pysdmx/api/qb/schema.py +4 -10
- pysdmx/api/qb/service.py +26 -4
- pysdmx/api/qb/structure.py +2 -2
- pysdmx/io/json/fusion/messages/__init__.py +14 -0
- pysdmx/io/json/fusion/messages/dsd.py +52 -1
- pysdmx/io/json/fusion/messages/metadataflow.py +44 -0
- pysdmx/io/json/fusion/messages/mpa.py +45 -0
- pysdmx/io/json/fusion/messages/msd.py +121 -0
- pysdmx/io/json/fusion/messages/org.py +90 -0
- pysdmx/io/json/fusion/reader/__init__.py +5 -0
- pysdmx/io/json/sdmxjson2/messages/__init__.py +15 -1
- pysdmx/io/json/sdmxjson2/messages/dsd.py +9 -6
- pysdmx/io/json/sdmxjson2/messages/metadataflow.py +88 -0
- pysdmx/io/json/sdmxjson2/messages/mpa.py +88 -0
- pysdmx/io/json/sdmxjson2/messages/msd.py +241 -0
- pysdmx/io/json/sdmxjson2/messages/provider.py +117 -1
- pysdmx/io/json/sdmxjson2/messages/structure.py +25 -1
- pysdmx/io/json/sdmxjson2/reader/__init__.py +5 -0
- pysdmx/io/serde.py +5 -0
- pysdmx/io/writer.py +2 -4
- pysdmx/io/xml/__structure_aux_writer.py +9 -9
- pysdmx/io/xml/__write_data_aux.py +1 -2
- pysdmx/model/__init__.py +12 -1
- pysdmx/model/dataflow.py +1 -0
- pysdmx/model/map.py +3 -1
- pysdmx/model/message.py +29 -2
- pysdmx/model/metadata.py +255 -4
- {pysdmx-1.7.0.dist-info → pysdmx-1.8.0.dist-info}/METADATA +1 -1
- {pysdmx-1.7.0.dist-info → pysdmx-1.8.0.dist-info}/RECORD +34 -28
- {pysdmx-1.7.0.dist-info → pysdmx-1.8.0.dist-info}/WHEEL +0 -0
- {pysdmx-1.7.0.dist-info → pysdmx-1.8.0.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
|
|
17
|
-
|
|
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
|
|
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,5 +1,5 @@
|
|
|
1
1
|
pysdmx/__extras_check.py,sha256=I39OaM1lAPBnyzHVJ7kA_ZA_tMeDAQLr6ZKqEQ9MK1Q,1659
|
|
2
|
-
pysdmx/__init__.py,sha256=
|
|
2
|
+
pysdmx/__init__.py,sha256=CQTPr7FYkZ-dTuHn6wHcK0kXyvroCQcFTf1wOds91PY,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=
|
|
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
|
|
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=
|
|
23
|
-
pysdmx/api/qb/service.py,sha256=
|
|
24
|
-
pysdmx/api/qb/structure.py,sha256=
|
|
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=
|
|
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=
|
|
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/
|
|
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=kkHMeX2DJN9y_A1Li5JlYvckXmMPsj-6O3imfNTzl-o,3767
|
|
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=
|
|
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=
|
|
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=
|
|
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=wlYzlYGyBiazXStbhmBSpQ1EQkbIuilAvL8oiTMTJjY,7986
|
|
74
80
|
pysdmx/io/json/sdmxjson2/messages/pa.py,sha256=VoaPBgcWGwWU7h5IaVa5wNWncOoktWihSXjcP4vEb00,2780
|
|
75
|
-
pysdmx/io/json/sdmxjson2/messages/provider.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
89
|
-
pysdmx/io/writer.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
140
|
-
pysdmx/model/message.py,sha256=
|
|
141
|
-
pysdmx/model/metadata.py,sha256=
|
|
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.
|
|
158
|
-
pysdmx-1.
|
|
159
|
-
pysdmx-1.
|
|
160
|
-
pysdmx-1.
|
|
163
|
+
pysdmx-1.8.0.dist-info/METADATA,sha256=nrm-tplzh6WUmsoGAy7YPGSkSU2hkD1C2BFKI2rj6T4,4719
|
|
164
|
+
pysdmx-1.8.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
165
|
+
pysdmx-1.8.0.dist-info/licenses/LICENSE,sha256=3XTNDPtv2RxDUNkQzn9MIWit2u7_Ob5daMLEq-4pBJs,649
|
|
166
|
+
pysdmx-1.8.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|