diff --git a/src/caosdb/common/models.py b/src/caosdb/common/models.py index 6475bc99ec825e102d5eac1b38d506247c11ebcb..3421f9ce39fc848f774b5d5d38280434354da8de 100644 --- a/src/caosdb/common/models.py +++ b/src/caosdb/common/models.py @@ -125,7 +125,6 @@ class Entity(object): self.id = id self.state = None - def copy(self): """ Return a copy of entity. diff --git a/src/caosdb/utils/plantuml.py b/src/caosdb/utils/plantuml.py index 412d97d443c7561efdcc527b92b842d5416c1bd7..aee515be380eea23ae29b6fc6b8d9f14da868e21 100644 --- a/src/caosdb/utils/plantuml.py +++ b/src/caosdb/utils/plantuml.py @@ -111,6 +111,8 @@ def recordtypes_to_plantuml_string(iterable, - Inheritance of Properties is not rendered nicely at the moment. """ + # TODO: This function needs a review of python type hints. + classes = [el for el in iterable if isinstance(el, db.RecordType)] dependencies = {} @@ -274,7 +276,8 @@ def retrieve_substructure(start_record_types, depth, result_id_set=None, result_ Returns ------- db.Container - A container containing all the retrieved entites or None if cleanup is False. + A container containing all the retrieved entites + or None if cleanup is False. """ # Initialize the id set and result container for level zero recursion depth: if result_id_set is None: @@ -288,10 +291,11 @@ def retrieve_substructure(start_record_types, depth, result_id_set=None, result_ result_container.append(entity) result_id_set.add(entity.id) for prop in entity.properties: - if is_reference(prop.datatype) and prop.datatype != db.FILE and depth > 0: - rt = db.RecordType(name=get_referenced_recordtype(prop.datatype)).retrieve() - retrieve_substructure([rt], depth-1, result_id_set, result_container, False) - + if (is_reference(prop.datatype) and prop.datatype != db.FILE and depth > 0): + rt = db.RecordType( + name=get_referenced_recordtype(prop.datatype)).retrieve() + retrieve_substructure([rt], depth-1, result_id_set, + result_container, False) # TODO: clean up this hack # TODO: make it also work for files if is_reference(prop.datatype) and prop.value is not None: @@ -311,7 +315,8 @@ def retrieve_substructure(start_record_types, depth, result_id_set=None, result_ result_container.append(rt) result_id_set.add(parent.id) if depth > 0: - retrieve_substructure([rt], depth-1, result_id_set, result_container, False) + retrieve_substructure([rt], depth-1, result_id_set, + result_container, False) if cleanup: return result_container @@ -379,6 +384,10 @@ def to_graphics(recordtypes: list[db.Entity], filename: str, print("Executing:", cmd) if os.system(cmd) != 0: # TODO: replace with subprocess.run - raise Exception("An error occured during the execution of plantuml. " - "Is plantuml installed?") - shutil.copy(os.path.join(td, filename + "." + extension), output_dirname) + raise Exception("An error occured during the execution of " + "plantuml when using the format {}. " + "Is plantuml installed? " + "You might want to dry a different format.".format(format)) + # copy only the final product into the target directory + shutil.copy(os.path.join(td, filename + "." + extension), + output_dirname) diff --git a/unittests/test_plantuml.py b/unittests/test_plantuml.py new file mode 100644 index 0000000000000000000000000000000000000000..a507c36b2d3a4246205fc7507cb05119c575084c --- /dev/null +++ b/unittests/test_plantuml.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +# encoding: utf-8 +# +# ** header v3.0 +# This file is a part of the CaosDB Project. +# +# Copyright (C) 2022 Indiscale GmbH <info@indiscale.com> +# Copyright (C) 2022 Henrik tom Wörden <h.tomwoerden@indiscale.com> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# 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/>. +# +# ** end header +# + +""" +test plantuml utility +""" + +import tempfile +import pytest +import caosdb as db +import shutil +from caosdb.utils.plantuml import to_graphics + + +@pytest.fixture +def setup_n_teardown(autouse=True): + + with tempfile.TemporaryDirectory() as td: + global output + output = td + yield + + +@pytest.fixture +def entities(): + return [db.RecordType(name="TestRT1").add_property("testprop"), + db.RecordType(name="TestRT2").add_property("testprop2"), + db.Property("testprop")] + + +@pytest.mark.skipif(shutil.which('plantuml') is None, reason="No plantuml found") +def test_to_graphics1(entities, setup_n_teardown): + to_graphics(entities, "data_model", output_dirname=output) + + +@pytest.mark.skipif(shutil.which('plantuml') is None, reason="No plantuml found") +def test_to_graphics2(entities, setup_n_teardown): + to_graphics(entities, "data_model", output_dirname=output, formats=["tpng", "tsvg"], + add_properties=False, add_legend=False, style="salexan")