Skip to content
Snippets Groups Projects
Commit 798f072b authored by Henrik tom Wörden's avatar Henrik tom Wörden
Browse files

wip

parent 816ade54
Branches
Tags
2 merge requests!178FIX: #96 Better error output for crawl.py script.,!167Sync Graph
...@@ -16,20 +16,18 @@ ...@@ -16,20 +16,18 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
from pytest import fixture, mark, raises
import linkahead as db import linkahead as db
from linkahead.cached import cache_clear
from caosadvancedtools.models.parser import parse_model_from_string from caosadvancedtools.models.parser import parse_model_from_string
from caoscrawler.crawl import Crawler from caoscrawler.crawl import Crawler
from caoscrawler.identifiable import Identifiable from caoscrawler.identifiable import Identifiable
from caoscrawler.identifiable_adapters import CaosDBIdentifiableAdapter from caoscrawler.identifiable_adapters import CaosDBIdentifiableAdapter
from caoscrawler.scanner import (create_converter_registry,
scan_structure_elements)
from caoscrawler.structure_elements import DictElement from caoscrawler.structure_elements import DictElement
from linkahead.cached import cache_clear
from caoscrawler.scanner import create_converter_registry, scan_structure_elements
from linkahead.utils.register_tests import clear_database, set_test_key from linkahead.utils.register_tests import clear_database, set_test_key
from pytest import fixture, mark, raises
set_test_key("10b128cf8a1372f30aa3697466bb55e76974e0c16a599bb44ace88f19c8f61e2") set_test_key("10b128cf8a1372f30aa3697466bb55e76974e0c16a599bb44ace88f19c8f61e2")
...@@ -171,8 +169,9 @@ def test_issue_83(clear_database): ...@@ -171,8 +169,9 @@ def test_issue_83(clear_database):
name=referencing_type.name).add_property(name=referenced_type.name, value=[ref_target1]) name=referencing_type.name).add_property(name=referenced_type.name, value=[ref_target1])
referencing2 = db.Record(name="Referencing2").add_parent( referencing2 = db.Record(name="Referencing2").add_parent(
name=referencing_type.name).add_property(name=referenced_type.name, value=[ref_target2]) name=referencing_type.name).add_property(name=referenced_type.name, value=[ref_target2])
referencing3 = db.Record(name="Referencing3").add_parent(name=referencing_type.name).add_property( referencing3 = db.Record(name="Referencing3").add_parent(
name=referenced_type.name, value=[ref_target1, ref_target2]) name=referencing_type.name).add_property(name=referenced_type.name, value=[ref_target1,
ref_target2])
records = db.Container().extend( records = db.Container().extend(
[ref_target1, ref_target2, referencing1, referencing2, referencing3]) [ref_target1, ref_target2, referencing1, referencing2, referencing3])
......
...@@ -378,7 +378,6 @@ class SyncGraph(): ...@@ -378,7 +378,6 @@ class SyncGraph():
if self.get_equivalent(node) is not None: if self.get_equivalent(node) is not None:
self._merge_into(node, self.get_equivalent(node)) self._merge_into(node, self.get_equivalent(node))
else: else:
print(f'make {self.nodes.index(node)} exis')
self._id_look_up[node.id] = node self._id_look_up[node.id] = node
self._treat_existing(node) self._treat_existing(node)
......
...@@ -26,6 +26,7 @@ from typing import Any, Dict, List, Optional, Union ...@@ -26,6 +26,7 @@ from typing import Any, Dict, List, Optional, Union
from uuid import uuid4 as uuid from uuid import uuid4 as uuid
import linkahead as db import linkahead as db
from linkahead.common.models import _ParentList, _Properties
class SyncNode(): class SyncNode():
...@@ -52,11 +53,11 @@ class SyncNode(): ...@@ -52,11 +53,11 @@ class SyncNode():
None) -> None: None) -> None:
self.id = entity.id self.id = entity.id
self.role = entity.role self.role = entity.role
self.parents = entity.parents self.parents = _ParentList().extend(entity.parents)
self.path = entity.path self.path = entity.path
self.name = entity.name self.name = entity.name
self.description = entity.description self.description = entity.description
self.properties = list(entity.properties) self.properties = _Properties().extend(entity.properties)
self.uuid = uuid() self.uuid = uuid()
self.identifiable = None self.identifiable = None
self.registered_identifiable = registered_identifiable self.registered_identifiable = registered_identifiable
...@@ -72,11 +73,10 @@ class SyncNode(): ...@@ -72,11 +73,10 @@ class SyncNode():
else: else:
assert self.__getattribute__(attr) == other.__getattribute__(attr) assert self.__getattribute__(attr) == other.__getattribute__(attr)
for p in other.parents: for p in other.parents:
if p not in self.parents: if not parent_in_list(p, self.parents):
self.parents.append(p) self.parents.append(p)
for p in other.properties: for p in other.properties:
if p not in self.properties: self.properties.append(p)
self.properties.append(p)
def export_entity(self) -> db.Entity: def export_entity(self) -> db.Entity:
ent = None ent = None
...@@ -96,5 +96,27 @@ class SyncNode(): ...@@ -96,5 +96,27 @@ class SyncNode():
raise db.apiutils.EntityMergeConflictError(f"Differing values were set for Property {p.name}:\n" raise db.apiutils.EntityMergeConflictError(f"Differing values were set for Property {p.name}:\n"
f"{ent.get_property(p).value}\n{p.value}") f"{ent.get_property(p).value}\n{p.value}")
else: else:
ent.add_property(p) ent.add_property(id=p.id, name=p.name, value=p.value)
return ent return ent
def parent_in_list(parent, plist):
missing = False
if parent.name is not None:
if parent.name not in plist._element_by_name:
missing = True
if parent.id is not None:
if str(parent.id) not in plist._element_by_id:
missing = True
return not missing
def property_in_list(prop, plist):
missing = False
if prop.name is not None:
if prop.name not in plist._element_by_name:
missing = True
if prop.id is not None:
if str(prop.id) not in plist._element_by_id:
missing = True
return not missing
...@@ -25,7 +25,8 @@ import linkahead as db ...@@ -25,7 +25,8 @@ import linkahead as db
import pytest import pytest
from caoscrawler.identifiable import Identifiable from caoscrawler.identifiable import Identifiable
from caoscrawler.identifiable_adapters import CaosDBIdentifiableAdapter from caoscrawler.identifiable_adapters import CaosDBIdentifiableAdapter
from caoscrawler.sync_graph import SyncGraph, SyncNode from caoscrawler.sync_graph import SyncGraph
from caoscrawler.sync_node import SyncNode, parent_in_list, property_in_list
from test_crawler import basic_retrieve_by_name_mock_up, mock_get_entity_by from test_crawler import basic_retrieve_by_name_mock_up, mock_get_entity_by
...@@ -568,7 +569,7 @@ def test_sync_node(): ...@@ -568,7 +569,7 @@ def test_sync_node():
assert export.id == rec_b.id assert export.id == rec_b.id
assert export.name == rec_a.name assert export.name == rec_a.name
for p in rec_a.parents + rec_b.parents: for p in rec_a.parents + rec_b.parents:
assert p in export.parents assert parent_in_list(p, export.parents)
# if p.name is not None: # if p.name is not None:
# assert p.name in [el.name for el in export.parents] # assert p.name in [el.name for el in export.parents]
# if p.id is not None: # if p.id is not None:
...@@ -601,9 +602,9 @@ def test_sync_node(): ...@@ -601,9 +602,9 @@ def test_sync_node():
assert sn_a.id == rec_b.id assert sn_a.id == rec_b.id
assert sn_a.name == rec_a.name assert sn_a.name == rec_a.name
for p in rec_a.parents + rec_b.parents: for p in rec_a.parents + rec_b.parents:
assert p in sn_a.parents assert parent_in_list(p, sn_a.parents)
for p in rec_a.properties + rec_b.properties: for p in rec_a.properties + rec_b.properties:
assert p in sn_a.properties assert property_in_list(p, sn_a.properties)
assert sn_a.description == rec_b.description assert sn_a.description == rec_b.description
assert sn_a.role == rec_a.role assert sn_a.role == rec_a.role
...@@ -634,3 +635,24 @@ def test_sync_node(): ...@@ -634,3 +635,24 @@ def test_sync_node():
sn_b = SyncNode(db.File(path='101')) sn_b = SyncNode(db.File(path='101'))
with pytest.raises(AssertionError): with pytest.raises(AssertionError):
sn_a.update(sn_b) sn_a.update(sn_b)
def test_export_node():
rec_a = (db.Record(id=101)
.add_parent("B")
.add_parent(id=103)
.add_property(name="a", value=[SyncNode(db.Record())])
.add_property(name='b', id=103, value='b'))
sn_a = SyncNode(rec_a)
exp = sn_a.export_entity()
assert exp.id == rec_a.id
assert exp.name == rec_a.name
for p in rec_a.parents:
assert len([el for el in exp.parents if p.name == el.name]) == 1
for p in rec_a.properties:
assert p.value == exp.get_property(p.name).value
if isinstance(p.value, list):
assert len(p.value) == len(exp.get_property(p.name).value)
assert len(exp.properties) == len(rec_a.properties)
assert len(exp.parents) == len(rec_a.parents)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment