pysdmx 1.5.2__py3-none-any.whl → 1.7.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 +8 -3
- pysdmx/api/fmr/maintenance.py +158 -0
- pysdmx/api/qb/structure.py +1 -0
- pysdmx/api/qb/util.py +1 -0
- pysdmx/io/csv/__csv_aux_reader.py +99 -0
- pysdmx/io/csv/__csv_aux_writer.py +118 -0
- pysdmx/io/csv/sdmx10/reader/__init__.py +9 -14
- pysdmx/io/csv/sdmx10/writer/__init__.py +28 -2
- pysdmx/io/csv/sdmx20/__init__.py +0 -9
- pysdmx/io/csv/sdmx20/reader/__init__.py +8 -61
- pysdmx/io/csv/sdmx20/writer/__init__.py +32 -25
- pysdmx/io/csv/sdmx21/__init__.py +1 -0
- pysdmx/io/csv/sdmx21/reader/__init__.py +86 -0
- pysdmx/io/csv/sdmx21/writer/__init__.py +70 -0
- pysdmx/io/format.py +8 -0
- pysdmx/io/input_processor.py +20 -6
- pysdmx/io/json/fusion/messages/code.py +21 -4
- pysdmx/io/json/fusion/messages/concept.py +10 -8
- pysdmx/io/json/fusion/messages/dataflow.py +8 -1
- pysdmx/io/json/fusion/messages/dsd.py +15 -0
- pysdmx/io/json/fusion/messages/schema.py +8 -1
- pysdmx/io/json/sdmxjson2/messages/agency.py +43 -7
- pysdmx/io/json/sdmxjson2/messages/category.py +92 -7
- pysdmx/io/json/sdmxjson2/messages/code.py +265 -22
- pysdmx/io/json/sdmxjson2/messages/concept.py +75 -13
- pysdmx/io/json/sdmxjson2/messages/constraint.py +5 -5
- pysdmx/io/json/sdmxjson2/messages/core.py +121 -14
- pysdmx/io/json/sdmxjson2/messages/dataflow.py +63 -8
- pysdmx/io/json/sdmxjson2/messages/dsd.py +215 -20
- pysdmx/io/json/sdmxjson2/messages/map.py +200 -24
- pysdmx/io/json/sdmxjson2/messages/pa.py +36 -5
- pysdmx/io/json/sdmxjson2/messages/provider.py +35 -7
- pysdmx/io/json/sdmxjson2/messages/report.py +85 -7
- pysdmx/io/json/sdmxjson2/messages/schema.py +11 -12
- pysdmx/io/json/sdmxjson2/messages/structure.py +150 -2
- pysdmx/io/json/sdmxjson2/messages/vtl.py +547 -17
- pysdmx/io/json/sdmxjson2/reader/metadata.py +32 -0
- pysdmx/io/json/sdmxjson2/reader/structure.py +32 -0
- pysdmx/io/json/sdmxjson2/writer/__init__.py +9 -0
- pysdmx/io/json/sdmxjson2/writer/metadata.py +60 -0
- pysdmx/io/json/sdmxjson2/writer/structure.py +61 -0
- pysdmx/io/reader.py +28 -9
- pysdmx/io/serde.py +17 -0
- pysdmx/io/writer.py +45 -9
- pysdmx/io/xml/__ss_aux_reader.py +1 -2
- pysdmx/io/xml/__structure_aux_reader.py +15 -10
- pysdmx/io/xml/__structure_aux_writer.py +15 -13
- pysdmx/io/xml/__write_data_aux.py +6 -57
- pysdmx/io/xml/__write_structure_specific_aux.py +7 -3
- pysdmx/io/xml/doc_validation.py +1 -3
- pysdmx/io/xml/sdmx21/writer/generic.py +6 -4
- pysdmx/model/__init__.py +1 -3
- pysdmx/model/code.py +11 -1
- pysdmx/model/dataflow.py +23 -0
- pysdmx/model/map.py +19 -13
- pysdmx/model/message.py +10 -5
- pysdmx/toolkit/pd/_data_utils.py +99 -0
- pysdmx/toolkit/vtl/_validations.py +2 -3
- {pysdmx-1.5.2.dist-info → pysdmx-1.7.0.dist-info}/METADATA +4 -3
- {pysdmx-1.5.2.dist-info → pysdmx-1.7.0.dist-info}/RECORD +63 -51
- {pysdmx-1.5.2.dist-info → pysdmx-1.7.0.dist-info}/WHEEL +1 -1
- {pysdmx-1.5.2.dist-info → pysdmx-1.7.0.dist-info/licenses}/LICENSE +0 -0
|
@@ -21,11 +21,11 @@ from pysdmx.io.xml.__write_aux import (
|
|
|
21
21
|
from pysdmx.io.xml.__write_data_aux import (
|
|
22
22
|
check_content_dataset,
|
|
23
23
|
check_dimension_at_observation,
|
|
24
|
-
get_codes,
|
|
25
24
|
writing_validation,
|
|
26
25
|
)
|
|
27
26
|
from pysdmx.io.xml.config import CHUNKSIZE
|
|
28
27
|
from pysdmx.model.message import Header
|
|
28
|
+
from pysdmx.toolkit.pd._data_utils import get_codes
|
|
29
29
|
from pysdmx.util import parse_short_urn
|
|
30
30
|
|
|
31
31
|
|
|
@@ -327,10 +327,12 @@ def __group_processing(
|
|
|
327
327
|
.to_dict(orient="records")
|
|
328
328
|
)
|
|
329
329
|
|
|
330
|
-
|
|
331
|
-
|
|
330
|
+
out_list.extend(
|
|
331
|
+
[
|
|
332
332
|
__format_group_str(record, group_id, dimensions, attribute)
|
|
333
|
-
|
|
333
|
+
for record in grouped_data
|
|
334
|
+
]
|
|
335
|
+
)
|
|
334
336
|
|
|
335
337
|
return "".join(out_list)
|
|
336
338
|
|
pysdmx/model/__init__.py
CHANGED
|
@@ -131,9 +131,7 @@ def decoders(type: Type, obj: Any) -> Any: # type: ignore[type-arg]
|
|
|
131
131
|
target types
|
|
132
132
|
"""
|
|
133
133
|
if type is Components:
|
|
134
|
-
comps = []
|
|
135
|
-
for item in obj:
|
|
136
|
-
comps.append(msgspec.convert(item, Component))
|
|
134
|
+
comps = [msgspec.convert(item, Component) for item in obj]
|
|
137
135
|
return Components(comps)
|
|
138
136
|
else:
|
|
139
137
|
raise NotImplementedError(f"Objects of type {type} are not supported")
|
pysdmx/model/code.py
CHANGED
|
@@ -21,7 +21,13 @@ from typing import Iterator, Literal, Optional, Sequence, Union
|
|
|
21
21
|
|
|
22
22
|
from msgspec import Struct
|
|
23
23
|
|
|
24
|
-
from pysdmx.model.__base import
|
|
24
|
+
from pysdmx.model.__base import (
|
|
25
|
+
Agency,
|
|
26
|
+
Annotation,
|
|
27
|
+
Item,
|
|
28
|
+
ItemScheme,
|
|
29
|
+
MaintainableArtefact,
|
|
30
|
+
)
|
|
25
31
|
|
|
26
32
|
|
|
27
33
|
class Code(Item, frozen=True, omit_defaults=True):
|
|
@@ -139,6 +145,8 @@ class HierarchicalCode(
|
|
|
139
145
|
rel_valid_from: Start of the hierarchical relationship validity.
|
|
140
146
|
rel_valid_to: End of the hierarchical relationship validity.
|
|
141
147
|
codes: The child codes.
|
|
148
|
+
annotations: Annotations attached to the code.
|
|
149
|
+
urn: The URN of the code.
|
|
142
150
|
"""
|
|
143
151
|
|
|
144
152
|
id: str
|
|
@@ -149,6 +157,8 @@ class HierarchicalCode(
|
|
|
149
157
|
rel_valid_from: Optional[datetime] = None
|
|
150
158
|
rel_valid_to: Optional[datetime] = None
|
|
151
159
|
codes: Sequence["HierarchicalCode"] = ()
|
|
160
|
+
annotations: Sequence[Annotation] = ()
|
|
161
|
+
urn: Optional[str] = None
|
|
152
162
|
|
|
153
163
|
def __iter__(self) -> Iterator["HierarchicalCode"]:
|
|
154
164
|
"""Return an iterator over the list of codes."""
|
pysdmx/model/dataflow.py
CHANGED
|
@@ -130,6 +130,9 @@ class Component(
|
|
|
130
130
|
commas, for series- and group-level attributes).
|
|
131
131
|
A post_init check makes this attribute mandatory for attributes.
|
|
132
132
|
array_def: Any additional constraints for array types.
|
|
133
|
+
urn: The URN of the component.
|
|
134
|
+
local_enum_ref: The URN of the enumeration (codelist or valuelist) from
|
|
135
|
+
which the local codes are taken.
|
|
133
136
|
"""
|
|
134
137
|
|
|
135
138
|
id: str
|
|
@@ -144,6 +147,7 @@ class Component(
|
|
|
144
147
|
attachment_level: Optional[str] = None
|
|
145
148
|
array_def: Optional[ArrayBoundaries] = None
|
|
146
149
|
urn: Optional[str] = None
|
|
150
|
+
local_enum_ref: Optional[str] = None
|
|
147
151
|
|
|
148
152
|
def __post_init__(self) -> None:
|
|
149
153
|
"""Validate the component."""
|
|
@@ -217,6 +221,20 @@ class Component(
|
|
|
217
221
|
else:
|
|
218
222
|
return None
|
|
219
223
|
|
|
224
|
+
@property
|
|
225
|
+
def enum_ref(self) -> Optional[str]:
|
|
226
|
+
"""Returns the URN of the enumeration from which the codes are taken.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
The URN of the enumeration from which the codes are taken.
|
|
230
|
+
"""
|
|
231
|
+
if self.local_enum_ref:
|
|
232
|
+
return self.local_enum_ref
|
|
233
|
+
elif isinstance(self.concept, Concept) and self.concept.enum_ref:
|
|
234
|
+
return self.concept.enum_ref
|
|
235
|
+
else:
|
|
236
|
+
return None
|
|
237
|
+
|
|
220
238
|
def __str__(self) -> str:
|
|
221
239
|
"""Custom string representation without the class name."""
|
|
222
240
|
processed_output = []
|
|
@@ -393,6 +411,7 @@ class DataflowInfo(
|
|
|
393
411
|
end_period: The oldest period for which data are available.
|
|
394
412
|
last_updated: When the dataflow was last updated.
|
|
395
413
|
dsd_ref: The URN of the data structure used by the dataflow.
|
|
414
|
+
groups: The sequence of groups defined in the data structure.
|
|
396
415
|
"""
|
|
397
416
|
|
|
398
417
|
id: str
|
|
@@ -408,6 +427,7 @@ class DataflowInfo(
|
|
|
408
427
|
end_period: Optional[str] = None
|
|
409
428
|
last_updated: Optional[datetime] = None
|
|
410
429
|
dsd_ref: Optional[str] = None
|
|
430
|
+
groups: Optional[Sequence[Group]] = None
|
|
411
431
|
|
|
412
432
|
def __str__(self) -> str:
|
|
413
433
|
"""Custom string representation without the class name."""
|
|
@@ -472,6 +492,7 @@ class Schema(Struct, frozen=True, omit_defaults=True, repr_omit_defaults=True):
|
|
|
472
492
|
version: str = "1.0"
|
|
473
493
|
artefacts: Sequence[str] = ()
|
|
474
494
|
generated: datetime = datetime.now(timezone.utc)
|
|
495
|
+
name: Optional[str] = None
|
|
475
496
|
groups: Optional[Sequence[Group]] = None
|
|
476
497
|
|
|
477
498
|
def __str__(self) -> str:
|
|
@@ -533,6 +554,7 @@ class DataStructureDefinition(MaintainableArtefact, frozen=True, kw_only=True):
|
|
|
533
554
|
valid_from: The date from which the data structure is valid.
|
|
534
555
|
valid_to: The date until which the data structure is valid.
|
|
535
556
|
version: The version of the data structure.
|
|
557
|
+
components: The list of relevant components for this data structure.
|
|
536
558
|
evolving_structure: Whether new dimensions may be added under a
|
|
537
559
|
minor version update.
|
|
538
560
|
"""
|
|
@@ -572,6 +594,7 @@ class DataStructureDefinition(MaintainableArtefact, frozen=True, kw_only=True):
|
|
|
572
594
|
components=self.components,
|
|
573
595
|
version=self.version,
|
|
574
596
|
artefacts=self.__extract_artefacts(),
|
|
597
|
+
name=self.name,
|
|
575
598
|
)
|
|
576
599
|
|
|
577
600
|
@property
|
pysdmx/model/map.py
CHANGED
|
@@ -6,7 +6,7 @@ from typing import Any, Iterator, Literal, Optional, Sequence, Tuple, Union
|
|
|
6
6
|
|
|
7
7
|
from msgspec import Struct
|
|
8
8
|
|
|
9
|
-
from pysdmx.model.__base import MaintainableArtefact
|
|
9
|
+
from pysdmx.model.__base import Agency, MaintainableArtefact
|
|
10
10
|
from pysdmx.util._date_pattern_map import convert_dpm
|
|
11
11
|
|
|
12
12
|
|
|
@@ -77,7 +77,7 @@ class DatePatternMap(_BaseMap, frozen=True, omit_defaults=True, tag=True):
|
|
|
77
77
|
the target structure (e.g. `FREQ`). In this case, the input date
|
|
78
78
|
can be converted to a different format, depending on the
|
|
79
79
|
frequency of the converted data.
|
|
80
|
-
|
|
80
|
+
resolve_period: The point in time to resolve to when mapping from low
|
|
81
81
|
frequency to higher frequency periods.
|
|
82
82
|
"""
|
|
83
83
|
|
|
@@ -88,7 +88,7 @@ class DatePatternMap(_BaseMap, frozen=True, omit_defaults=True, tag=True):
|
|
|
88
88
|
id: Optional[str] = None
|
|
89
89
|
locale: str = "en"
|
|
90
90
|
pattern_type: Literal["fixed", "variable"] = "fixed"
|
|
91
|
-
|
|
91
|
+
resolve_period: Optional[
|
|
92
92
|
Literal["startOfPeriod", "endOfPeriod", "midPeriod"]
|
|
93
93
|
] = None
|
|
94
94
|
|
|
@@ -264,6 +264,14 @@ class MultiRepresentationMap(
|
|
|
264
264
|
target: Sequence[str] = []
|
|
265
265
|
maps: Sequence[MultiValueMap] = []
|
|
266
266
|
|
|
267
|
+
@property
|
|
268
|
+
def short_urn(self) -> str:
|
|
269
|
+
"""Returns the short URN for the MultiRepresentationMap."""
|
|
270
|
+
agency = (
|
|
271
|
+
self.agency.id if isinstance(self.agency, Agency) else self.agency
|
|
272
|
+
)
|
|
273
|
+
return f"RepresentationMap={agency}:{self.id}({self.version})"
|
|
274
|
+
|
|
267
275
|
def __iter__(
|
|
268
276
|
self,
|
|
269
277
|
) -> Iterator[MultiValueMap]:
|
|
@@ -300,7 +308,7 @@ class MultiComponentMap(_BaseMap, frozen=True, omit_defaults=True, tag=True):
|
|
|
300
308
|
|
|
301
309
|
source: Sequence[str]
|
|
302
310
|
target: Sequence[str]
|
|
303
|
-
values: MultiRepresentationMap
|
|
311
|
+
values: Union[MultiRepresentationMap, str]
|
|
304
312
|
|
|
305
313
|
|
|
306
314
|
class RepresentationMap(MaintainableArtefact, frozen=True, omit_defaults=True):
|
|
@@ -478,9 +486,7 @@ class StructureMap(MaintainableArtefact, frozen=True, omit_defaults=True):
|
|
|
478
486
|
"""Return the number of mapping rules in the structure map."""
|
|
479
487
|
return len(self.maps)
|
|
480
488
|
|
|
481
|
-
def __getitem__(
|
|
482
|
-
self, id_: str
|
|
483
|
-
) -> Optional[
|
|
489
|
+
def __getitem__(self, id_: str) -> Optional[
|
|
484
490
|
Sequence[
|
|
485
491
|
Union[
|
|
486
492
|
ComponentMap,
|
|
@@ -492,12 +498,12 @@ class StructureMap(MaintainableArtefact, frozen=True, omit_defaults=True):
|
|
|
492
498
|
]
|
|
493
499
|
]:
|
|
494
500
|
"""Return the mapping rules for the supplied component."""
|
|
495
|
-
out = [
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
+
out = [
|
|
502
|
+
m
|
|
503
|
+
for m in self.maps
|
|
504
|
+
if (hasattr(m, "source") and (m.source == id_ or id_ in m.source))
|
|
505
|
+
or (isinstance(m, FixedValueMap) and m.target == id_)
|
|
506
|
+
]
|
|
501
507
|
if len(out) == 0:
|
|
502
508
|
return None
|
|
503
509
|
else:
|
pysdmx/model/message.py
CHANGED
|
@@ -168,10 +168,7 @@ class StructureMessage(Struct, repr_omit_defaults=True, frozen=True):
|
|
|
168
168
|
raise NotFound(
|
|
169
169
|
f"No {type_.__name__} found in message.",
|
|
170
170
|
)
|
|
171
|
-
structures = []
|
|
172
|
-
for element in self.structures:
|
|
173
|
-
if isinstance(element, type_):
|
|
174
|
-
structures.append(element)
|
|
171
|
+
structures = [e for e in self.structures if isinstance(e, type_)]
|
|
175
172
|
return structures
|
|
176
173
|
|
|
177
174
|
def __get_enumerations(
|
|
@@ -332,7 +329,7 @@ class MetadataMessage(Struct, frozen=True):
|
|
|
332
329
|
if self.reports:
|
|
333
330
|
return self.reports
|
|
334
331
|
else:
|
|
335
|
-
raise NotFound("No metadata reports
|
|
332
|
+
raise NotFound("No metadata reports were found in the message.")
|
|
336
333
|
|
|
337
334
|
|
|
338
335
|
class Message(StructureMessage, frozen=True):
|
|
@@ -349,6 +346,7 @@ class Message(StructureMessage, frozen=True):
|
|
|
349
346
|
|
|
350
347
|
data: Optional[Sequence[Dataset]] = None
|
|
351
348
|
submission: Optional[Sequence[SubmissionResult]] = None
|
|
349
|
+
reports: Optional[Sequence[MetadataReport]] = None
|
|
352
350
|
|
|
353
351
|
def __post_init__(self) -> None:
|
|
354
352
|
"""Checks if the content is valid."""
|
|
@@ -382,3 +380,10 @@ class Message(StructureMessage, frozen=True):
|
|
|
382
380
|
f"No Dataset with Short URN {short_urn} found in data.",
|
|
383
381
|
"Could not find the requested Dataset.",
|
|
384
382
|
)
|
|
383
|
+
|
|
384
|
+
def get_reports(self) -> Sequence[MetadataReport]:
|
|
385
|
+
"""Returns the metadata reports."""
|
|
386
|
+
if self.reports:
|
|
387
|
+
return self.reports
|
|
388
|
+
else:
|
|
389
|
+
raise NotFound("No metadata reports were found in the message.")
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Literal, Sequence, Tuple
|
|
2
|
+
|
|
3
|
+
import pandas as pd
|
|
4
|
+
|
|
5
|
+
from pysdmx.model.dataflow import Component, Schema
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def format_labels( # noqa: C901
|
|
9
|
+
df: pd.DataFrame,
|
|
10
|
+
labels: Literal["name", "both", "id"],
|
|
11
|
+
components: Sequence[Component],
|
|
12
|
+
) -> None:
|
|
13
|
+
"""Writes the labels to the DataFrame.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
df: The DataFrame to write the labels to.
|
|
17
|
+
labels: The label type to write.
|
|
18
|
+
if "id" the id of the data is written.
|
|
19
|
+
if "name" the name of the data is written.
|
|
20
|
+
if "both" a string id:name is written.
|
|
21
|
+
components: The components of the data structure definition.
|
|
22
|
+
|
|
23
|
+
"""
|
|
24
|
+
if labels == "name":
|
|
25
|
+
for k in df.columns:
|
|
26
|
+
for component in components:
|
|
27
|
+
if component.id == k:
|
|
28
|
+
df.rename(
|
|
29
|
+
columns={k: component.concept.name}, # type: ignore[union-attr]
|
|
30
|
+
inplace=True,
|
|
31
|
+
)
|
|
32
|
+
elif labels == "both":
|
|
33
|
+
for k in df.columns:
|
|
34
|
+
v = df[k]
|
|
35
|
+
for component in components:
|
|
36
|
+
if component.id == k:
|
|
37
|
+
df[f"{k}:{component.concept.name}"] = v.apply( # type: ignore[union-attr]
|
|
38
|
+
lambda x: f"{x}:{x}"
|
|
39
|
+
)
|
|
40
|
+
df.drop(columns=[k], inplace=True)
|
|
41
|
+
|
|
42
|
+
else:
|
|
43
|
+
for k in df.columns:
|
|
44
|
+
for component in components:
|
|
45
|
+
if component.concept.name == k: # type: ignore[union-attr]
|
|
46
|
+
df.rename(
|
|
47
|
+
columns={k: component.concept.id},
|
|
48
|
+
inplace=True,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def get_codes(
|
|
53
|
+
dimension_code: str, structure: Schema, data: pd.DataFrame
|
|
54
|
+
) -> Tuple[List[str], List[str], List[Dict[str, Any]]]:
|
|
55
|
+
"""This function divides the components in Series and Obs."""
|
|
56
|
+
groups = structure.groups
|
|
57
|
+
group_codes = []
|
|
58
|
+
obs_codes = [dimension_code, structure.components.measures[0].id]
|
|
59
|
+
|
|
60
|
+
# Getting the series and obs codes
|
|
61
|
+
series_codes = [
|
|
62
|
+
d.id for d in structure.components.dimensions if d.id != dimension_code
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
# Adding the attributes based on the attachment level
|
|
66
|
+
for att in structure.components.attributes:
|
|
67
|
+
matching_group = next(
|
|
68
|
+
(
|
|
69
|
+
group
|
|
70
|
+
for group in groups or []
|
|
71
|
+
if set(group.dimensions)
|
|
72
|
+
== set(att.attachment_level.split(",")) # type: ignore[union-attr]
|
|
73
|
+
),
|
|
74
|
+
None,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if (
|
|
78
|
+
att.attachment_level != "D"
|
|
79
|
+
and att.id in data.columns
|
|
80
|
+
and groups is not None
|
|
81
|
+
and matching_group
|
|
82
|
+
):
|
|
83
|
+
group_codes.append(
|
|
84
|
+
{
|
|
85
|
+
"group_id": matching_group.id,
|
|
86
|
+
"attribute": att.id,
|
|
87
|
+
"dimensions": matching_group.dimensions,
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
elif att.attachment_level == "O" and att.id in data.columns:
|
|
91
|
+
obs_codes.append(att.id)
|
|
92
|
+
elif (
|
|
93
|
+
att.attachment_level is not None
|
|
94
|
+
and att.attachment_level != "D"
|
|
95
|
+
and att.id in data.columns
|
|
96
|
+
):
|
|
97
|
+
series_codes.append(att.id)
|
|
98
|
+
|
|
99
|
+
return series_codes, obs_codes, group_codes
|
|
@@ -10,7 +10,6 @@ from vtlengine.AST import (
|
|
|
10
10
|
)
|
|
11
11
|
|
|
12
12
|
from pysdmx.errors import Invalid
|
|
13
|
-
from pysdmx.io.xml.__tokens import RULE_SCHEME, UDO_SCHEME
|
|
14
13
|
from pysdmx.model import Reference
|
|
15
14
|
from pysdmx.model.vtl import (
|
|
16
15
|
Ruleset,
|
|
@@ -62,7 +61,7 @@ def _ruleset_scheme_validations(ruleset_scheme: RulesetScheme) -> None:
|
|
|
62
61
|
|
|
63
62
|
def _ruleset_scheme_reference_validations(ruleset_scheme: Reference) -> None:
|
|
64
63
|
"""Additional validation checks for ruleset schemes."""
|
|
65
|
-
if ruleset_scheme.sdmx_type !=
|
|
64
|
+
if ruleset_scheme.sdmx_type != "RulesetScheme":
|
|
66
65
|
raise Invalid(
|
|
67
66
|
"Reference in Ruleset Schemes must point to a Ruleset Scheme, "
|
|
68
67
|
f"got {ruleset_scheme.sdmx_type}"
|
|
@@ -105,7 +104,7 @@ def _user_defined_operator_scheme_validations(
|
|
|
105
104
|
|
|
106
105
|
def _udo_scheme_reference_validations(udo_scheme: Reference) -> None:
|
|
107
106
|
"""Additional validation checks for ruleset schemes."""
|
|
108
|
-
if udo_scheme.sdmx_type !=
|
|
107
|
+
if udo_scheme.sdmx_type != "UserDefinedOperatorScheme":
|
|
109
108
|
raise Invalid(
|
|
110
109
|
"Reference in User Defined Operator Schemes"
|
|
111
110
|
" must point to a Defined Operator Scheme, "
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pysdmx
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.0
|
|
4
4
|
Summary: Your opinionated Python SDMX library
|
|
5
5
|
License: Apache-2.0
|
|
6
|
+
License-File: LICENSE
|
|
6
7
|
Keywords: sdmx,data discovery,data retrieval,metadata,fmr
|
|
7
8
|
Author: Xavier Sosnovsky
|
|
8
9
|
Author-email: <xavier.sosnovsky@bis.org>
|
|
@@ -17,7 +18,7 @@ Provides-Extra: data
|
|
|
17
18
|
Provides-Extra: dc
|
|
18
19
|
Provides-Extra: vtl
|
|
19
20
|
Provides-Extra: xml
|
|
20
|
-
Requires-Dist: httpx (>=0)
|
|
21
|
+
Requires-Dist: httpx[http2] (>=0)
|
|
21
22
|
Requires-Dist: lxml (>=5.2) ; extra == "all"
|
|
22
23
|
Requires-Dist: lxml (>=5.2) ; extra == "xml"
|
|
23
24
|
Requires-Dist: msgspec (>=0)
|
|
@@ -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=wT-iFGPp5NSw97EUGKgaqjmRmRqdND7Pc58tuIjjcro,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,7 +10,8 @@ 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=Ya25AH-os812eOF_laaOBpZqyAfa0um3wWpsKOJTGeA,40965
|
|
14
|
+
pysdmx/api/fmr/maintenance.py,sha256=AnR1beyL6nsoDM5LmDLXnRMW5JvhGHXTADf_INSNgUg,5920
|
|
14
15
|
pysdmx/api/gds/__init__.py,sha256=BBl75wEdcz9zPMfk6kAGHitRW39S774VL9xifMZ_uHs,11560
|
|
15
16
|
pysdmx/api/qb/__init__.py,sha256=vxdMJFFg4J_KWADrnzj_8KcU0UlwpJPdx0yiW3QJo9Y,1498
|
|
16
17
|
pysdmx/api/qb/availability.py,sha256=2yPHnTXu_jACNKNhhtXMkxVkfLK1Ewa5ucGAbRxvC5o,10181
|
|
@@ -20,32 +21,37 @@ pysdmx/api/qb/refmeta.py,sha256=rWhMcUkcQ0zYoiEVAVFOnykLLhMWFFZssFZh8z3kRng,1067
|
|
|
20
21
|
pysdmx/api/qb/registration.py,sha256=IURlmXcXQi8e-w5YXCgRNs07EQJZJ2bOdZb7M_k5iZ8,7132
|
|
21
22
|
pysdmx/api/qb/schema.py,sha256=f0V-fQl9GQ2YWhnZqUF_wogB2L9dRIdY_vT4XvYkqoI,5747
|
|
22
23
|
pysdmx/api/qb/service.py,sha256=ieLgOR27NNRD2P4FGhFmWVkJweGngAx-mWkTDfsVCyI,14001
|
|
23
|
-
pysdmx/api/qb/structure.py,sha256=
|
|
24
|
-
pysdmx/api/qb/util.py,sha256=
|
|
24
|
+
pysdmx/api/qb/structure.py,sha256=OoIlP3twT1-v4pY5wZyNlttmZOXQ5Vk-zc7j-qMtwXw,17814
|
|
25
|
+
pysdmx/api/qb/util.py,sha256=at2Sb2kVltSTDc1gKiqG6HtIFhjSx-Msbe--wCvRbQI,3667
|
|
25
26
|
pysdmx/errors.py,sha256=9bfujYykzfGMa1TuUOmH9QqghnZGOo556fvbKH2jFa8,3295
|
|
26
27
|
pysdmx/io/__init__.py,sha256=96ZCY1PfcWp_q2Nlo2tHJAK31sH_b05v9UkbR0vGdg0,180
|
|
28
|
+
pysdmx/io/csv/__csv_aux_reader.py,sha256=2RGzhga_VDnh2OVX_Bo-rR2hgAQxHXa7zt7-D5MVBu0,3994
|
|
29
|
+
pysdmx/io/csv/__csv_aux_writer.py,sha256=lCPl6hpyp12xhXlyimRlxxOT33RcgXDGTQZb8JguksI,4118
|
|
27
30
|
pysdmx/io/csv/__init__.py,sha256=53f2rPkwILigOqArgRQOOwLk-ha6zVTe4EypIsR7K6I,107
|
|
28
31
|
pysdmx/io/csv/sdmx10/__init__.py,sha256=NAAm_yodK-gzkuzewGQeYpF3f5nZmDA4vWGfT2KGTWc,38
|
|
29
|
-
pysdmx/io/csv/sdmx10/reader/__init__.py,sha256=
|
|
30
|
-
pysdmx/io/csv/sdmx10/writer/__init__.py,sha256=
|
|
31
|
-
pysdmx/io/csv/sdmx20/__init__.py,sha256=
|
|
32
|
-
pysdmx/io/csv/sdmx20/reader/__init__.py,sha256=
|
|
33
|
-
pysdmx/io/csv/sdmx20/writer/__init__.py,sha256=
|
|
34
|
-
pysdmx/io/
|
|
35
|
-
pysdmx/io/
|
|
32
|
+
pysdmx/io/csv/sdmx10/reader/__init__.py,sha256=uGc-sv4YXHteVQZPTdkVUkVZ6iKY7h7Fg56dw7VZ2UU,2735
|
|
33
|
+
pysdmx/io/csv/sdmx10/writer/__init__.py,sha256=d-kLcP711k1nmG_D4whDxqWCzODRT7HTqk95N-jXBK8,2923
|
|
34
|
+
pysdmx/io/csv/sdmx20/__init__.py,sha256=6_YCb4iuUWJRS9y0KSdf4ebNKblSlnTTzNC5c19kNk8,38
|
|
35
|
+
pysdmx/io/csv/sdmx20/reader/__init__.py,sha256=PmVXd8QXvXej6XSDAPsIc8VptLk69NK37-wunHH7Pvc,2846
|
|
36
|
+
pysdmx/io/csv/sdmx20/writer/__init__.py,sha256=puksYRzcog3wv9JGWA--6rvv9aRAn86Vsv1CyA7Em-c,2489
|
|
37
|
+
pysdmx/io/csv/sdmx21/__init__.py,sha256=I3_dwi4A4if62_mwEjqbOa-F7mhoIMf0D6szpDf3W7c,38
|
|
38
|
+
pysdmx/io/csv/sdmx21/reader/__init__.py,sha256=J1cCkZh3klgZZWjdQ_U1zkfzT_DVzQmdreGZhN33SLs,2866
|
|
39
|
+
pysdmx/io/csv/sdmx21/writer/__init__.py,sha256=CH8Nm7hqvXyN6XM_D2nJRmbKj6CJV-X1QzSF0WJrs0E,2484
|
|
40
|
+
pysdmx/io/format.py,sha256=EO-PyYpiU0WswvEGA5UHokladxPezcwBUo1AJTqxp1Q,5250
|
|
41
|
+
pysdmx/io/input_processor.py,sha256=rj2GzDs3xVQRzikzWonPWJGEa4_mxUPgCqHQ50JI5xY,6917
|
|
36
42
|
pysdmx/io/json/fusion/messages/__init__.py,sha256=C0LAG6UfIZcQdlCv5d_D1ZNIcCq04RxZYLAp6tLDqwY,1573
|
|
37
43
|
pysdmx/io/json/fusion/messages/category.py,sha256=E9jrzXenEpqDNUhT1JJLYxty37PSGegRtx45mB3-COg,4589
|
|
38
|
-
pysdmx/io/json/fusion/messages/code.py,sha256=
|
|
39
|
-
pysdmx/io/json/fusion/messages/concept.py,sha256=
|
|
44
|
+
pysdmx/io/json/fusion/messages/code.py,sha256=YayxSKiHa124WTr_lK8HTfXHomh_e0oDZvuydd29XKg,8300
|
|
45
|
+
pysdmx/io/json/fusion/messages/concept.py,sha256=m4lTyncSIriFXWWupE-zLxUVPx3Xrg56qahzKr4HEag,2824
|
|
40
46
|
pysdmx/io/json/fusion/messages/constraint.py,sha256=dPkzhCWN49Y9ReSZPRFTdM6GWc0rU2BZTyFfWsqlX34,615
|
|
41
47
|
pysdmx/io/json/fusion/messages/core.py,sha256=GdzF3TNUGrB0gxuaaSpk9LaYqcdy_M6L2azExZQfM0Q,4843
|
|
42
|
-
pysdmx/io/json/fusion/messages/dataflow.py,sha256=
|
|
43
|
-
pysdmx/io/json/fusion/messages/dsd.py,sha256=
|
|
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
|
|
44
50
|
pysdmx/io/json/fusion/messages/map.py,sha256=TPsCFuUfk5Jhhe7CNvEoHuFNZFpHhvNiYFWeIEUx-sc,7695
|
|
45
51
|
pysdmx/io/json/fusion/messages/org.py,sha256=9gZpHg6o4fPGY9fUIDUCyKQCCLL6NYFHnQJkxdXD8v8,6264
|
|
46
52
|
pysdmx/io/json/fusion/messages/pa.py,sha256=6zN8Qxj5bdf5zo2N9TwYlSLyGxokvsELtk1--1cMbxw,1393
|
|
47
53
|
pysdmx/io/json/fusion/messages/report.py,sha256=ZE62ZmHlCXk3TxRTRWCDCKVMhnN0J5UjMEzrsnD5I3E,1551
|
|
48
|
-
pysdmx/io/json/fusion/messages/schema.py,sha256=
|
|
54
|
+
pysdmx/io/json/fusion/messages/schema.py,sha256=xBbpLyJNapJpzZA4vAvROmWTSNYymcpggqMZ_NjL444,2603
|
|
49
55
|
pysdmx/io/json/fusion/messages/vtl.py,sha256=7VGjDRWzKMO6WT4CnGvGBKinhX06DzrJmDRudnvN4XM,16092
|
|
50
56
|
pysdmx/io/json/fusion/reader/__init__.py,sha256=fpya2W7YJ6lcdupAybBawMtJI7PT0gy48gLkDbuPTWU,1295
|
|
51
57
|
pysdmx/io/json/gds/messages/__init__.py,sha256=5LqGtO3GDi2B6HM2eDGCSJCncLS8C4MQ7vd5YBvCRok,885
|
|
@@ -56,39 +62,44 @@ pysdmx/io/json/gds/messages/services.py,sha256=OUFmYK4XkNMoaw70n4QabyxzdRDh-0XeY
|
|
|
56
62
|
pysdmx/io/json/gds/messages/urn_resolver.py,sha256=w_wRRAwjaBw_yooSda1MXcD_aN63FdpFE7WFvcjHSeQ,1209
|
|
57
63
|
pysdmx/io/json/gds/reader/__init__.py,sha256=cXQvjSzRe4lTsGmru6qMYE_HU2DEccJSYKsQ5ayIpxw,373
|
|
58
64
|
pysdmx/io/json/sdmxjson2/messages/__init__.py,sha256=pqLbzZf-FkuSJWy8DLxtCXIu-Si2Mm-vDTzCqnJDNVA,1984
|
|
59
|
-
pysdmx/io/json/sdmxjson2/messages/agency.py,sha256=
|
|
60
|
-
pysdmx/io/json/sdmxjson2/messages/category.py,sha256=
|
|
61
|
-
pysdmx/io/json/sdmxjson2/messages/code.py,sha256=
|
|
62
|
-
pysdmx/io/json/sdmxjson2/messages/concept.py,sha256=
|
|
63
|
-
pysdmx/io/json/sdmxjson2/messages/constraint.py,sha256=
|
|
64
|
-
pysdmx/io/json/sdmxjson2/messages/core.py,sha256=
|
|
65
|
-
pysdmx/io/json/sdmxjson2/messages/dataflow.py,sha256=
|
|
66
|
-
pysdmx/io/json/sdmxjson2/messages/dsd.py,sha256=
|
|
67
|
-
pysdmx/io/json/sdmxjson2/messages/map.py,sha256
|
|
68
|
-
pysdmx/io/json/sdmxjson2/messages/pa.py,sha256=
|
|
69
|
-
pysdmx/io/json/sdmxjson2/messages/provider.py,sha256=
|
|
70
|
-
pysdmx/io/json/sdmxjson2/messages/report.py,sha256=
|
|
71
|
-
pysdmx/io/json/sdmxjson2/messages/schema.py,sha256=
|
|
72
|
-
pysdmx/io/json/sdmxjson2/messages/structure.py,sha256=
|
|
73
|
-
pysdmx/io/json/sdmxjson2/messages/vtl.py,sha256=
|
|
65
|
+
pysdmx/io/json/sdmxjson2/messages/agency.py,sha256=d9t_2HrcZcqu_Y-EchShWDRF5yJQn86urfcFl5qvWAc,3720
|
|
66
|
+
pysdmx/io/json/sdmxjson2/messages/category.py,sha256=k61oDSLNKl0G_Mov2AmC4ff1efCPsNfyNEbz0iajkpI,7656
|
|
67
|
+
pysdmx/io/json/sdmxjson2/messages/code.py,sha256=t2MMvx2nQzlu4l8MMAPDEq15w5UIjHGgaJI2HoFPdus,17908
|
|
68
|
+
pysdmx/io/json/sdmxjson2/messages/concept.py,sha256=x7BoG6AaziZGNjxeypwy_lsFTmdHs-0MPUpqPsTBQIA,5496
|
|
69
|
+
pysdmx/io/json/sdmxjson2/messages/constraint.py,sha256=6pONMHr7IT8O026Xnv6AjIMVmoS29ivNiOMPr1OWQZQ,1736
|
|
70
|
+
pysdmx/io/json/sdmxjson2/messages/core.py,sha256=Cb6U1J13KCXnGJ2P8xbThTg9GCdzhkIK-cA8EHbY6Js,10077
|
|
71
|
+
pysdmx/io/json/sdmxjson2/messages/dataflow.py,sha256=wjeq9yexTa012AtGdZsZflp3WQ6fP-3kas-gxADTFeQ,6256
|
|
72
|
+
pysdmx/io/json/sdmxjson2/messages/dsd.py,sha256=0J3PYq10aoqyoAw4KyJP4ObW2JHttaxZjR9xvgyA2aU,18941
|
|
73
|
+
pysdmx/io/json/sdmxjson2/messages/map.py,sha256=-hhUyPxIWKoIxij0qbuoFDsZMqmtMfclCMUme4c9SS0,16767
|
|
74
|
+
pysdmx/io/json/sdmxjson2/messages/pa.py,sha256=VoaPBgcWGwWU7h5IaVa5wNWncOoktWihSXjcP4vEb00,2780
|
|
75
|
+
pysdmx/io/json/sdmxjson2/messages/provider.py,sha256=W5FVPd03Q-P4h9ThPoPRTs-MAepsOj3k8m7vtEHt00A,4164
|
|
76
|
+
pysdmx/io/json/sdmxjson2/messages/report.py,sha256=thcZZUuoiJ6OJ9P33EOTN3PIHFKxdQUMapI7HmSoB4A,6571
|
|
77
|
+
pysdmx/io/json/sdmxjson2/messages/schema.py,sha256=Ejs8roep6bSL8Eyu7j18E6IiHXWJ3qSybnnRYNyio-E,2868
|
|
78
|
+
pysdmx/io/json/sdmxjson2/messages/structure.py,sha256=1RBHqgVIigcJXOdFMJ5N7xHJ_aXtwAdma7EFpmFtBqE,10520
|
|
79
|
+
pysdmx/io/json/sdmxjson2/messages/vtl.py,sha256=xCErG_ojn_z1-KrFBInatY2q83lEyWUUB0g-QK-auzk,35168
|
|
74
80
|
pysdmx/io/json/sdmxjson2/reader/__init__.py,sha256=f9vTKscFIAQpAKh3pZ4ZKlZSKyGfj1yaZS9w7S0_hIc,1264
|
|
81
|
+
pysdmx/io/json/sdmxjson2/reader/metadata.py,sha256=fIuJL0y71leopBjqy8NqvzRzf9FeDBBzzh_VnzMGtFo,911
|
|
82
|
+
pysdmx/io/json/sdmxjson2/reader/structure.py,sha256=G2F23BR3BYfc_9thvDbRQHrmpxlK01mnu1myDpOohN0,889
|
|
83
|
+
pysdmx/io/json/sdmxjson2/writer/__init__.py,sha256=DZGkas1ghei4p6SZsIQI1LPToS-d8F1Nx75MC8reT7g,270
|
|
84
|
+
pysdmx/io/json/sdmxjson2/writer/metadata.py,sha256=qse5foElBdTWbxIc9rIH1B4DfOBMeLy7qocp3Y4cV7g,2043
|
|
85
|
+
pysdmx/io/json/sdmxjson2/writer/structure.py,sha256=kqINWWSFjowIKIwsD0Kvb29KYdW5VDT9fg9d1ccjQBY,2102
|
|
75
86
|
pysdmx/io/pd.py,sha256=1C5UnAT25EADOpNsRBooEdWNaJEGdmcwh6_R9O5MOrc,464
|
|
76
|
-
pysdmx/io/reader.py,sha256=
|
|
77
|
-
pysdmx/io/serde.py,sha256=
|
|
78
|
-
pysdmx/io/writer.py,sha256=
|
|
87
|
+
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
|
|
79
90
|
pysdmx/io/xml/__allowed_lxml_errors.py,sha256=PdIK2i6JwwGRh1Ogc5JA0hRySO7QXJKN-DI8EYtdjA0,225
|
|
80
91
|
pysdmx/io/xml/__data_aux.py,sha256=ztivjZANN1PJ63IvoMfx-5TA2AiPQTVPC_0YYHOT9Ns,4069
|
|
81
92
|
pysdmx/io/xml/__init__.py,sha256=tcUsSEiM3nBA7lDbZPwGZ7Vu_K9gQd8oliASUMTGjFE,105
|
|
82
93
|
pysdmx/io/xml/__parse_xml.py,sha256=SITC7Yptq_qY_exetRez90lJCukH1WsKDMqlk7Q1RaY,2899
|
|
83
|
-
pysdmx/io/xml/__ss_aux_reader.py,sha256=
|
|
84
|
-
pysdmx/io/xml/__structure_aux_reader.py,sha256=
|
|
85
|
-
pysdmx/io/xml/__structure_aux_writer.py,sha256=
|
|
94
|
+
pysdmx/io/xml/__ss_aux_reader.py,sha256=6mumQYcDdF_vrX65vSodE4I1b7upKbP6yNNSM2N6pUs,2853
|
|
95
|
+
pysdmx/io/xml/__structure_aux_reader.py,sha256=xqwZZ2qWi8IUW2KMVhuABp1TSx6dSRH4BmvKh5kXxyk,40348
|
|
96
|
+
pysdmx/io/xml/__structure_aux_writer.py,sha256=jOcp7Ywx7mEUrrhgKj6Kz5-6KctQoD7TbOSOoPxj_ZE,43583
|
|
86
97
|
pysdmx/io/xml/__tokens.py,sha256=Y_SlFWYIXolsgjHoFq7pm3TYlEu07CR9TmJKk2jHfQ0,6823
|
|
87
98
|
pysdmx/io/xml/__write_aux.py,sha256=KHZxEhGSjZPRW93OvniZ0kHmiAJtKJu-2aLtMhsKt90,15396
|
|
88
|
-
pysdmx/io/xml/__write_data_aux.py,sha256=
|
|
89
|
-
pysdmx/io/xml/__write_structure_specific_aux.py,sha256=
|
|
99
|
+
pysdmx/io/xml/__write_data_aux.py,sha256=x-RNwVfUgEkBoGG_Sen-rPg7MnqE5_0SV-6PmjDdAxY,3373
|
|
100
|
+
pysdmx/io/xml/__write_structure_specific_aux.py,sha256=reRDVw4Xwag0ODyMzm9uOk9WJ_e1ELxAPYHSMUUDJBQ,8919
|
|
90
101
|
pysdmx/io/xml/config.py,sha256=R24cczVkzkhjVLXpv-qfEm88W3_QTqVt2Qofi8IvJ5Y,93
|
|
91
|
-
pysdmx/io/xml/doc_validation.py,sha256=
|
|
102
|
+
pysdmx/io/xml/doc_validation.py,sha256=WXDhte96VEAeZMMHJ0Y68WW8HEoOhEiOYEnbGP5Zwjw,1795
|
|
92
103
|
pysdmx/io/xml/header.py,sha256=_XiruPAfMtr4wudCpiuhFXDvRgWITGQ9GZVG3lMvWcc,5535
|
|
93
104
|
pysdmx/io/xml/sdmx21/__init__.py,sha256=_rh_dz1d-LmUw4iVbsZQkTXANTJeR8ov8z_4jNRGhtg,38
|
|
94
105
|
pysdmx/io/xml/sdmx21/reader/__init__.py,sha256=2jMsySFbbq-So3ymqzKVi5gOPRwO0qasBBwntD03rTw,34
|
|
@@ -99,7 +110,7 @@ pysdmx/io/xml/sdmx21/reader/structure_specific.py,sha256=S3-gLmaBFjBRIr25qQtlrao
|
|
|
99
110
|
pysdmx/io/xml/sdmx21/reader/submission.py,sha256=8daiBW-sIVGaB6lYwHqJNkLI7IixMSydCK-0ZO8ri4I,1711
|
|
100
111
|
pysdmx/io/xml/sdmx21/writer/__init__.py,sha256=QQGFAss26njCC4eKYxhBcI9LYm5NHuJaAJGKCrIrL80,31
|
|
101
112
|
pysdmx/io/xml/sdmx21/writer/error.py,sha256=0wkX7K_n2oZNkOKg_zpl9Id82qP72Lqof-T-ZLGoZ1M,353
|
|
102
|
-
pysdmx/io/xml/sdmx21/writer/generic.py,sha256=
|
|
113
|
+
pysdmx/io/xml/sdmx21/writer/generic.py,sha256=8_kUMMUiIFVdKMyhpR2LKDyfiinBohO_aL_6GZpOInY,15786
|
|
103
114
|
pysdmx/io/xml/sdmx21/writer/structure.py,sha256=S3qoNgXxrakn2V4NLdL5U5mAA16XisI0PpJDuxqalFE,2084
|
|
104
115
|
pysdmx/io/xml/sdmx21/writer/structure_specific.py,sha256=iXc1J-RzoKyRznvgGgdTSeUfyqZLouI8CtSq2YhGBWI,2877
|
|
105
116
|
pysdmx/io/xml/sdmx30/__init__.py,sha256=8BScJFEgLy8DoUreu2RBUtxjGjKyClkKBI_Qtarbk-Y,38
|
|
@@ -118,15 +129,15 @@ pysdmx/io/xml/sdmx31/writer/structure.py,sha256=hK-BYOsyyuqLTqxe6qC3PxeDJDp3_qyB
|
|
|
118
129
|
pysdmx/io/xml/sdmx31/writer/structure_specific.py,sha256=OtP_uxn-y9tVB9eNRP6ov3zBL1wtr4SRef9llB4A3yk,3236
|
|
119
130
|
pysdmx/io/xml/utils.py,sha256=ljrocQwPTYycg3I68sqYI5pF8qukNccSCMM9Xf_Tag0,583
|
|
120
131
|
pysdmx/model/__base.py,sha256=H5OpCpi6fGxB30vFn-lCstTczSdOB4YJiBynThovQs4,13810
|
|
121
|
-
pysdmx/model/__init__.py,sha256=
|
|
132
|
+
pysdmx/model/__init__.py,sha256=PHfVmxbfBzRNoCJ2kqRl-aSvGN4fLz2E8DYAoDxBTRA,4948
|
|
122
133
|
pysdmx/model/category.py,sha256=WWWysaTdlcU8KZpQyZgbZkrOelNVCGOfVUk_APJxm-w,6031
|
|
123
|
-
pysdmx/model/code.py,sha256=
|
|
134
|
+
pysdmx/model/code.py,sha256=Wu6rEXeZf_XA0aBrDXgN-3yvySAHH7SAjrWliFlmC24,12799
|
|
124
135
|
pysdmx/model/concept.py,sha256=mQfqJdtWc10WdTKX_Mw7Znw65cN3QO-kCar9MWYeWO4,9645
|
|
125
|
-
pysdmx/model/dataflow.py,sha256=
|
|
136
|
+
pysdmx/model/dataflow.py,sha256=RDuL3GMhfMR5Dn1bTb4saWhn5v6igcJSKZ4d7ip7WPw,23887
|
|
126
137
|
pysdmx/model/dataset.py,sha256=Lbr7tYonGHD3NZUD-M9hK2puaEAluOVPG2DbkOohzMM,4861
|
|
127
138
|
pysdmx/model/gds.py,sha256=QrnmI8Hn--C95gGXCeUeWwhn-Ur7DuT08Cg7oPJIEVI,4976
|
|
128
|
-
pysdmx/model/map.py,sha256=
|
|
129
|
-
pysdmx/model/message.py,sha256=
|
|
139
|
+
pysdmx/model/map.py,sha256=BR23koomqDGDYvHLTg2axVwlTkst7aJ0X65-0tw11j4,17492
|
|
140
|
+
pysdmx/model/message.py,sha256=tuUr0sQf6P3QflhNAbmYjQaz4_3ly06psk19c8zlJ2s,14697
|
|
130
141
|
pysdmx/model/metadata.py,sha256=EwElZZ8oewpuaEDDWM9ZV95Xvklcq333qxqPwoUqmXU,7653
|
|
131
142
|
pysdmx/model/organisation.py,sha256=k6ZQ_O4l7174Y8tr-nnMnsUL0q0O8Rw3q4mIWmJUh2A,4706
|
|
132
143
|
pysdmx/model/submission.py,sha256=iMQSvt-BYuDrqPEBcjw_wWNp74Vsx2OnEj3tnkth0Z8,833
|
|
@@ -134,15 +145,16 @@ pysdmx/model/vtl.py,sha256=k7WIb89876xKlf7k0R9sgZ1VVlRrIkbV7FzvMFZn8e0,6985
|
|
|
134
145
|
pysdmx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
135
146
|
pysdmx/toolkit/__init__.py,sha256=yBRw4FXQH_RUJgF6vwZscNwCVBt-FMwslJEfDKa7eXo,26
|
|
136
147
|
pysdmx/toolkit/pd/__init__.py,sha256=3JoCZHamJR4mZfLt9GmaznLlG_YilmY0hAhuW5COQC8,3138
|
|
148
|
+
pysdmx/toolkit/pd/_data_utils.py,sha256=fzXl_a1M8NI7HHI23tRmLlS4PBZ9N4Tgtqh-zxg19qk,3265
|
|
137
149
|
pysdmx/toolkit/vtl/__init__.py,sha256=nVwtISeFiT4tr2gNjb2A-P_IRAdqv6Mn7EOgFkaRleg,216
|
|
138
|
-
pysdmx/toolkit/vtl/_validations.py,sha256=
|
|
150
|
+
pysdmx/toolkit/vtl/_validations.py,sha256=Djc5hHpj79SksvnAA0vL5EnpsDCdQ_BmB6zsr7Ze9Eg,5639
|
|
139
151
|
pysdmx/toolkit/vtl/script_generation.py,sha256=YOP_-MMcIdDIHYa8HIMuVCN9N-S9CQD8bH5xpF1kc2E,3235
|
|
140
152
|
pysdmx/toolkit/vtl/validation.py,sha256=UieJUYwxkw9McHZwixKFQdgYKFsgFwFo5XCLIIDcr7Q,3594
|
|
141
153
|
pysdmx/util/__init__.py,sha256=m_XWRAmVJ7F6ai4Ckrj_YuPbhg3cJZAXeZrEThrL88k,3997
|
|
142
154
|
pysdmx/util/_date_pattern_map.py,sha256=IS1qONwVHbTBNIFCT0Rqbijj2a9mYvs7onXSK6GeQAQ,1620
|
|
143
155
|
pysdmx/util/_model_utils.py,sha256=d0XY8cnxvviQtkJJInVik7LWeuqX-eb4-zikFortL58,2335
|
|
144
156
|
pysdmx/util/_net_utils.py,sha256=nOTz_x3FgFrwKh42_J70IqYXz9duQkMFJWtejZXcLHs,1326
|
|
145
|
-
pysdmx-1.
|
|
146
|
-
pysdmx-1.
|
|
147
|
-
pysdmx-1.
|
|
148
|
-
pysdmx-1.
|
|
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,,
|
|
File without changes
|