From 526b634da62d4f00242273c1a9f37dfc6e4a67a8 Mon Sep 17 00:00:00 2001 From: Daniel <d.hornung@indiscale.com> Date: Fri, 24 Nov 2023 11:27:46 +0100 Subject: [PATCH] FIX: get_deep: multiple use of properties --- src/caosadvancedtools/models/data_model.py | 15 +++++++++++---- unittests/test_data_model.py | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py index 27f60b5e..26641489 100644 --- a/src/caosadvancedtools/models/data_model.py +++ b/src/caosadvancedtools/models/data_model.py @@ -31,7 +31,7 @@ from typing import List import linkahead as db import linkahead.common.models as models -from linkahead.apiutils import compare_entities, describe_diff +from linkahead.apiutils import compare_entities, describe_diff, merge_entities CAOSDB_INTERNAL_PROPERTIES = [ @@ -264,7 +264,7 @@ class DataModel(dict): return list(all_ents.values()) - def get_deep(self, name: str, visited_props: set = None, visited_parents: set = None): + def get_deep(self, name: str, visited_props: dict = None, visited_parents: set = None): """Attempt to resolve references for the given ``name``. The returned entity has all the properties it inherits from its ancestry and all properties @@ -279,7 +279,7 @@ class DataModel(dict): if not entity: return entity if not visited_props: - visited_props = set() + visited_props = {} if not visited_parents: visited_parents = set() @@ -309,8 +309,14 @@ class DataModel(dict): for prop in list(entity.get_properties()): # Make a change-resistant list copy. if prop.name in visited_props: + if visited_props[prop.name]: + deep_prop = visited_props[prop.name] + merge_entities(prop, deep_prop) + prop.datatype = deep_prop.datatype + prop.value = deep_prop.value + prop.unit = deep_prop.unit continue - visited_props.add(prop.name) + visited_props[prop.name] = None if prop.name in self: deep_prop = self.get_deep(prop.name, visited_props=visited_props, visited_parents=visited_parents) @@ -322,6 +328,7 @@ class DataModel(dict): linked_prop.datatype = deep_prop if deep_prop.description: linked_prop.description = deep_prop.description + visited_props[prop.name] = deep_prop else: print(f"Referenced property \"{prop.name}\" not found in data model.") diff --git a/unittests/test_data_model.py b/unittests/test_data_model.py index 5aa151b2..cafeb6ca 100644 --- a/unittests/test_data_model.py +++ b/unittests/test_data_model.py @@ -62,3 +62,21 @@ RT1: rt1_deep = model_unresolved.get_deep("RT1") assert rt1_deep == rt1_unresolved assert rt1_deep is rt1_unresolved + + model_double_property = """ +p1: + description: Hello world + datatype: TEXT +RT1: + recommended_properties: + p1: +RT2: + recommended_properties: + RT1: + p1: +""" + model_unresolved = parse_model_from_string(model_double_property) + rt2_deep = model_unresolved.get_deep("RT2") + p1 = rt2_deep.get_property("p1") + assert p1.datatype == "TEXT" + assert p1.description == "Hello world" -- GitLab