From e044af12375c9cdf73a958da0afcbc5e812d723a Mon Sep 17 00:00:00 2001 From: rettigl Date: Fri, 9 May 2025 21:58:10 +0200 Subject: [PATCH 1/2] convert int-like values silently into float-like for NX_FLOAT --- src/pynxtools/dataconverter/helpers.py | 26 ++++++++++++++++++++++++++ tests/dataconverter/test_validation.py | 26 ++++++++++++++++++++------ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/pynxtools/dataconverter/helpers.py b/src/pynxtools/dataconverter/helpers.py index d9664a967..6df90a88e 100644 --- a/src/pynxtools/dataconverter/helpers.py +++ b/src/pynxtools/dataconverter/helpers.py @@ -658,6 +658,26 @@ def convert_str_to_bool_safe(value: str) -> Optional[bool]: raise ValueError(f"Could not interpret string '{value}' as boolean.") +def convert_int_to_float(value): + """ + Converts int-like values to float, including values in arrays, and lists + + Args: + value: The input value, which can be a single value, list, or numpy array. + + Returns: + The input value with all int-like values converted to float. + """ + if isinstance(value, int): + return float(value) + elif isinstance(value, list): + return [convert_int_to_float(v) for v in value] + elif isinstance(value, np.ndarray) and np.issubdtype(value.dtype, np.integer): + return value.astype(float) + else: + return value + + def is_valid_data_field( value: Any, nxdl_type: str, nxdl_enum: list, nxdl_enum_open: bool, path: str ) -> Any: @@ -683,6 +703,12 @@ def is_valid_data_field( collector.collect_and_log( path, ValidationProblem.InvalidType, accepted_types, nxdl_type ) + elif accepted_types[0] is float: + value = convert_int_to_float(value) + if not is_valid_data_type(value, accepted_types): + collector.collect_and_log( + path, ValidationProblem.InvalidType, accepted_types, nxdl_type + ) else: collector.collect_and_log( path, ValidationProblem.InvalidType, accepted_types, nxdl_type diff --git a/tests/dataconverter/test_validation.py b/tests/dataconverter/test_validation.py index 67eaa4ef2..d0a8dce3d 100644 --- a/tests/dataconverter/test_validation.py +++ b/tests/dataconverter/test_validation.py @@ -362,10 +362,19 @@ def listify_template(data_dict: Template): "/ENTRY[my_entry]/NXODD_name[nxodd_name]/float_value", 0, ), + [], + id="int-instead-of-float", + ), + pytest.param( + alter_dict( + TEMPLATE, + "/ENTRY[my_entry]/NXODD_name[nxodd_name]/float_value", + np.complex128(0), + ), [ "The value at /ENTRY[my_entry]/NXODD_name[nxodd_name]/float_value should be one of the following Python types: (, ), as defined in the NXDL as NX_FLOAT." ], - id="int-instead-of-float", + id="complex-instead-of-float", ), pytest.param( alter_dict( @@ -534,13 +543,18 @@ def listify_template(data_dict: Template): "/ENTRY[my_entry]/NXODD_name[nxodd_name]/float_value", [2], # pylint: disable=E1126 ), - [ - "The value at /ENTRY[my_entry]/NXODD_name[nxodd_name]/float_value should be " - "one of the following Python types: (, ), as defined in the NXDL " - "as NX_FLOAT." - ], + [], id="list-of-int-instead-of-float", ), + pytest.param( + alter_dict( + TEMPLATE, + "/ENTRY[my_entry]/NXODD_name[nxodd_name]/float_value", + np.array([2]), # pylint: disable=E1126 + ), + [], + id="array-of-int-instead-of-float", + ), pytest.param( set_to_none_in_dict( TEMPLATE, From 215779d426b3caffc46c69a7ce8a910822fa714b Mon Sep 17 00:00:00 2001 From: Laurenz Rettig <53396064+rettigl@users.noreply.github.com> Date: Tue, 13 May 2025 08:59:21 +0200 Subject: [PATCH 2/2] Review suggestion Co-authored-by: Lukas Pielsticker <50139597+lukaspie@users.noreply.github.com> --- src/pynxtools/dataconverter/helpers.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/pynxtools/dataconverter/helpers.py b/src/pynxtools/dataconverter/helpers.py index 6df90a88e..334c6166e 100644 --- a/src/pynxtools/dataconverter/helpers.py +++ b/src/pynxtools/dataconverter/helpers.py @@ -672,6 +672,10 @@ def convert_int_to_float(value): return float(value) elif isinstance(value, list): return [convert_int_to_float(v) for v in value] + elif isinstance(value, tuple): + return tuple(convert_int_to_float(v) for v in value) + elif isinstance(value, set): + return {convert_int_to_float(v) for v in value} elif isinstance(value, np.ndarray) and np.issubdtype(value.dtype, np.integer): return value.astype(float) else: