Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions aviary/utils/csv_data_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from aviary.utils.functions import get_path
from aviary.utils.named_values import NamedValues
from aviary.variable_info.enums import Verbosity
from aviary.variable_info.legacy_aliases import resolve_legacy_variable_name


# multiple type annotation uses "typeA | typeB" syntax, but requires Python 3.10+
Expand Down Expand Up @@ -109,6 +110,7 @@ def read_data_file(
item = [item[i].strip(') ') for i in range(len(item))]
# OpenMDAO vars can't have spaces, convert to underscores
name = re.sub('\\s', '_', item[0])
name = resolve_legacy_variable_name(name)
if aliases:
# "reverse" lookup name in alias dict
for key in aliases:
Expand Down
29 changes: 29 additions & 0 deletions aviary/utils/test/test_legacy_variable_aliases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import tempfile
import unittest
from pathlib import Path

from aviary.utils.csv_data_file import read_data_file
from aviary.variable_info.legacy_aliases import resolve_legacy_variable_name
from aviary.variable_info.variable_meta_data import CoreMetaData
from aviary.variable_info.variables import Aircraft


class TestLegacyVariableAliases(unittest.TestCase):
def test_unknown_name_is_unchanged(self):
name = 'aircraft:wing:span'
self.assertEqual(resolve_legacy_variable_name(name), name)

def test_legacy_csv_header_normalizes_to_canonical_name(self):
legacy = 'mission:constraints:max_mach'
with tempfile.TemporaryDirectory() as tmp:
path = Path(tmp) / 'legacy.csv'
path.write_text(f'{legacy}\n0.84\n', encoding='utf-8')
data, _, _ = read_data_file(path, metadata=CoreMetaData)

self.assertIn(Aircraft.Design.MAX_MACH, data)
self.assertNotIn(legacy, data)
self.assertAlmostEqual(float(data.get_val(Aircraft.Design.MAX_MACH)[0]), 0.84)


if __name__ == '__main__':
unittest.main()
15 changes: 15 additions & 0 deletions aviary/variable_info/legacy_aliases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"""Compatibility aliases for renamed Aviary variable keys.

New code and generated data should always use canonical names. This map is
only for reading or accessing values that were written with an older Aviary
variable name.
"""

LEGACY_VARIABLE_NAME_MAP = {
'mission:constraints:max_mach': 'aircraft:design:max_mach',
}


def resolve_legacy_variable_name(name):
"""Return the canonical name for a supported legacy Aviary variable."""
return LEGACY_VARIABLE_NAME_MAP.get(name, name)