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 ...@@ -31,7 +31,7 @@ from typing import List
import linkahead as db import linkahead as db
import linkahead.common.models as models 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 = [ CAOSDB_INTERNAL_PROPERTIES = [
...@@ -264,7 +264,7 @@ class DataModel(dict): ...@@ -264,7 +264,7 @@ class DataModel(dict):
return list(all_ents.values()) 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``. """Attempt to resolve references for the given ``name``.
The returned entity has all the properties it inherits from its ancestry and all properties The returned entity has all the properties it inherits from its ancestry and all properties
...@@ -279,7 +279,7 @@ class DataModel(dict): ...@@ -279,7 +279,7 @@ class DataModel(dict):
if not entity: if not entity:
return entity return entity
if not visited_props: if not visited_props:
visited_props = set() visited_props = {}
if not visited_parents: if not visited_parents:
visited_parents = set() visited_parents = set()
...@@ -309,8 +309,14 @@ class DataModel(dict): ...@@ -309,8 +309,14 @@ class DataModel(dict):
for prop in list(entity.get_properties()): # Make a change-resistant list copy. for prop in list(entity.get_properties()): # Make a change-resistant list copy.
if prop.name in visited_props: 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 continue
visited_props.add(prop.name) visited_props[prop.name] = None
if prop.name in self: if prop.name in self:
deep_prop = self.get_deep(prop.name, visited_props=visited_props, deep_prop = self.get_deep(prop.name, visited_props=visited_props,
visited_parents=visited_parents) visited_parents=visited_parents)
...@@ -322,6 +328,7 @@ class DataModel(dict): ...@@ -322,6 +328,7 @@ class DataModel(dict):
linked_prop.datatype = deep_prop linked_prop.datatype = deep_prop
if deep_prop.description: if deep_prop.description:
linked_prop.description = deep_prop.description linked_prop.description = deep_prop.description
visited_props[prop.name] = deep_prop
else: else:
print(f"Referenced property \"{prop.name}\" not found in data model.") print(f"Referenced property \"{prop.name}\" not found in data model.")
......
...@@ -62,3 +62,21 @@ RT1: ...@@ -62,3 +62,21 @@ RT1:
rt1_deep = model_unresolved.get_deep("RT1") rt1_deep = model_unresolved.get_deep("RT1")
assert rt1_deep == rt1_unresolved assert rt1_deep == rt1_unresolved
assert rt1_deep is 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.
Please register or to comment