Skip to content

Commit 3930606

Browse files
authored
Fix conversion 3to4 of name/identifier when identifier is empty (#115)
1 parent fad72c4 commit 3930606

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

imas/ids_convert.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,8 @@ def _apply_3to4_conversion(self, old: Element, new: Element) -> None:
456456
# Map DD3 name -> DD4 description
457457
if name_path not in self.old_to_new.path:
458458
self._add_rename(name_path, desc_path)
459+
# GH#114: Also preserve name in DD4 name when identifier is empty
460+
self.old_to_new.type_change[name_path] = _name_identifier_3to4
459461

460462
# Map DD3 identifier -> DD4 name
461463
if id_path in self.old_to_new.path:
@@ -1154,6 +1156,19 @@ def _circuit_connections_4to3(node: IDSPrimitive) -> None:
11541156
node.value = new_value
11551157

11561158

1159+
def _name_identifier_3to4(source_name: IDSBase, target_description: IDSBase) -> None:
1160+
"""Preserve name when identifier is empty, see GH#114."""
1161+
# Always copy DD3 name -> DD4 description
1162+
target_description.value = source_name.value
1163+
1164+
# When DD3 identifier is empty, also preserve name in DD4 name
1165+
source_parent = source_name._parent
1166+
source_identifier = getattr(source_parent, "identifier", None)
1167+
if source_identifier is None or not source_identifier.value:
1168+
target_parent = target_description._parent
1169+
target_parent.name = source_name.value
1170+
1171+
11571172
def _ids_properties_source(source: IDSString0D, provenance: IDSStructure) -> None:
11581173
"""Handle DD3to4 migration of ids_properties/source to ids_properties/provenance."""
11591174
if len(provenance.node) > 0:

imas/test/test_ids_convert.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,29 @@ def test_4to3_name_identifier_mapping_magnetics():
575575
assert dst.b_field_pol_probe[0].identifier == "TEST_NAME"
576576

577577

578+
def test_3to4_name_identifier_empty_identifier():
579+
"""GH#114: name must be preserved when identifier is empty."""
580+
factory = IDSFactory("3.40.1")
581+
582+
src = factory.pf_active()
583+
src.ids_properties.homogeneous_time = IDS_TIME_MODE_HOMOGENEOUS
584+
src.coil.resize(2)
585+
# Case 1: name populated, identifier empty
586+
src.coil[0].name = "TEST_NAME"
587+
src.coil[0].identifier = ""
588+
# Case 2: name populated, identifier not set at all
589+
src.coil[1].name = "TEST_NAME2"
590+
591+
dst = convert_ids(src, "4.0.0")
592+
593+
# name must be preserved in DD4 name (not overwritten by empty identifier)
594+
assert dst.coil[0].name == "TEST_NAME"
595+
assert dst.coil[0].description == "TEST_NAME"
596+
597+
assert dst.coil[1].name == "TEST_NAME2"
598+
assert dst.coil[1].description == "TEST_NAME2"
599+
600+
578601
def test_3to4_cocos_hardcoded_paths():
579602
# Check for existence in 3.42.0
580603
factory = IDSFactory("3.42.0")

0 commit comments

Comments
 (0)