Skip to content
Snippets Groups Projects
Verified Commit 526b634d authored by Daniel Hornung's avatar Daniel Hornung
Browse files

FIX: get_deep: multiple use of properties

parent 987ab1b4
No related branches found
No related tags found
2 merge requests!89ENH: JsonSchemaExporter accepts do_not_create parameter.,!88jsex / yaml parser
Pipeline #44121 passed
......@@ -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.")
......
......@@ -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"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment