From bc8ac26c8429dc976ddc1ee20cb5a503b598efef Mon Sep 17 00:00:00 2001 From: Paul Natsuo Kishimoto Date: Fri, 26 Jan 2024 12:04:41 +0100 Subject: [PATCH] Add .sdmx.quantity_to_message(), tests --- genno/compat/sdmx.py | 19 +++++++++++-------- genno/tests/compat/test_sdmx.py | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/genno/compat/sdmx.py b/genno/compat/sdmx.py index b74dd5c3..7b663082 100644 --- a/genno/compat/sdmx.py +++ b/genno/compat/sdmx.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Dict, Iterable, List, Mapping, Optional, Union +from typing import Dict, Iterable, List, Mapping, Optional, Union from genno import Quantity @@ -10,9 +10,6 @@ HAS_SDMX = True -if TYPE_CHECKING: - import sdmx.model.common - __all__ = [ "codelist_to_groups", "dataset_to_quantity", @@ -94,10 +91,7 @@ def quantity_to_dataset( ) -> "sdmx.model.v21.Dataset": """Convert :class:`.Quantity to :class:`DataSet `. - Currently: - - - `structure` must be provided. - - The resulting data set is structure-specific and flat (not grouped into Series). + The resulting data set is structure-specific and flat (not grouped into Series). """ try: # URN of DSD stored on `qty` matches `structure` @@ -124,3 +118,12 @@ def as_obs(key, value): ds.obs.extend(as_obs(key, value) for key, value in qty.to_series().items()) return ds + + +def quantity_to_message( + qty: Quantity, structure: "sdmx.model.v21.DataStructureDefinition", **kwargs +) -> "sdmx.message.DataMessage": + """Convert :class:`.Quantity to :class:`DataMessage `.""" + dm = sdmx.message.DataMessage(**kwargs) + dm.data.append(quantity_to_dataset(qty, structure)) + return dm diff --git a/genno/tests/compat/test_sdmx.py b/genno/tests/compat/test_sdmx.py index 2b7383b0..f7f67d8f 100644 --- a/genno/tests/compat/test_sdmx.py +++ b/genno/tests/compat/test_sdmx.py @@ -7,6 +7,7 @@ codelist_to_groups, dataset_to_quantity, quantity_to_dataset, + quantity_to_message, ) from genno.testing import add_test_data @@ -91,3 +92,17 @@ def test_quantity_to_dataset(dsd, dm): # Dataset is associated with its DSD assert dsd is ds.structured_by + + +def test_quantity_to_message(dsd, dm): + ds = dm.data[0] + qty = dataset_to_quantity(ds) + + header = dm.header + + result = quantity_to_message(qty, structure=dsd, header=header) + + # Currently False because `result.observation_dimension` is not set + with pytest.raises(AssertionError): + # Resulting message compares equal to the original ("round trip") + assert dm.compare(result)