From 2597fb388957cdcce4d8d61a35d5304e65b6d6f2 Mon Sep 17 00:00:00 2001 From: Alexander Schlemmer <alexander@mail-schlemmer.de> Date: Mon, 7 Mar 2022 10:09:20 +0100 Subject: [PATCH] ENH: initial implementaiton of deserialization done --- src/caosdb/high_level_api.py | 46 +++++++++++++++++++++++++++++++- unittests/test_high_level_api.py | 33 +++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/caosdb/high_level_api.py b/src/caosdb/high_level_api.py index 884234bd..8d25df15 100644 --- a/src/caosdb/high_level_api.py +++ b/src/caosdb/high_level_api.py @@ -605,7 +605,51 @@ class CaosDBPythonEntity(object): """ Deserialize a yaml representation of an entity in high level API form. """ - pass + + entity = high_level_type_for_role(serialization["role"])() + + for parent in serialization["parents"]: + if "unresolved" in parent: + entity.add_parent(CaosDBPythonUnresolvedParent( + id=parent["id"], name=parent["name"])) + else: + raise NotImplementedError() + + for baseprop in ("name", "id", "description", "version"): + if baseprop in serialization: + entity.__setattr__(baseprop, serialization[baseprop]) + + if type(entity) == CaosDBPythonFile: + entity.file = serialization["file"] + entity.path = serialization["path"] + + for p in serialization["properties"]: + # The property needs to be set first: + + prop = serialization["properties"][p] + if isinstance(prop, dict): + if "unresolved" in prop: + entity.__setattr__(p, CaosDBPythonUnresolvedReference( + id=prop["id"])) + else: + entity.__setattr__(p, + entity.deserialize(prop)) + else: + entity.__setattr__(p, prop) + + + # if there is no metadata in the yaml file just initialize an empty metadata object + if "metadata" in serialization and p in serialization["metadata"]: + metadata = serialization["metadata"][p] + propmeta = entity.get_property_metadata(p) + + for f in fields(propmeta): + if f.name in metadata: + propmeta.__setattr__(f.name, metadata[f.name]) + else: + raise NotImplementedError() + + return entity def serialize(self, without_metadata: bool = False): diff --git a/unittests/test_high_level_api.py b/unittests/test_high_level_api.py index 34cb62f3..43629ee8 100644 --- a/unittests/test_high_level_api.py +++ b/unittests/test_high_level_api.py @@ -534,3 +534,36 @@ def test_type_conversion(): with pytest.raises(RuntimeError, match="Incompatible type."): high_level_type_for_standard_type("ajsdkfjasfkj") + + +def test_deserialization(): + r = db.Record(id=17, name="test") + r.add_parent("bla") + r.add_property(name="a", value=42) + r.add_property(name="b", value="test") + + obj = convert_to_python_object(r) + + serial = obj.serialize() + obj_des = CaosDBPythonEntity.deserialize(serial) + + assert obj_des.name == "test" + assert obj_des.id == 17 + assert obj_des.has_parent(CaosDBPythonUnresolvedParent(name="bla")) + print(obj) + print(obj_des) + assert obj.serialize() == obj_des.serialize() + + + + f = db.File() + f.file = "bla.test" + f.path = "/test/n/bla.test" + + obj = convert_to_python_object(f) + + serial = obj.serialize() + obj_des = CaosDBPythonEntity.deserialize(serial) + assert obj_des.file == "bla.test" + assert obj_des.path == "/test/n/bla.test" + -- GitLab