From 3d4f7b22b343914dc453e166349f65ba67d435b2 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 28 Oct 2020 09:39:14 -0400 Subject: [PATCH 1/3] Galaxy schema rendering script. Uses sqlite_schemadisp to generate images like the one at https://galaxyproject.org/admin/internals/data-model/ --- scripts/galaxy_schemadisp.py | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 scripts/galaxy_schemadisp.py diff --git a/scripts/galaxy_schemadisp.py b/scripts/galaxy_schemadisp.py new file mode 100644 index 00000000000..d60702e40b6 --- /dev/null +++ b/scripts/galaxy_schemadisp.py @@ -0,0 +1,44 @@ +import os +import sys +from db_shell import * # noqa + +gxy_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) +sys.path.insert(1, os.path.abspath(os.path.join(gxy_root, 'lib'))) + +from galaxy import model +from sqlalchemy import MetaData +from sqlalchemy.orm import class_mapper +from sqlalchemy_schemadisplay import create_schema_graph, create_uml_graph + +if __name__ == "__main__": + gxy_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) + sqlitedb = os.path.join(gxy_root, 'database/universe.sqlite') + # Try to build a representation of what's in the sqlite database + if os.path.exists(sqlitedb): + graph = create_schema_graph(metadata=MetaData('sqlite:///' + sqlitedb), + show_datatypes=False, + show_indexes=False, + rankdir='LR', + concentrate=False) + print(f"Writing galaxy_universe.png, built from {sqlitedb}") + graph.write_png('galaxy_universe.png') + else: + print(f"No sqlitedb available at {sqlitedb}, skipping rendering") + + # Build UML graph from loaded mapper + mappers = [] + for attr in dir(model): + if attr[0] == '_': + continue + try: + cls = getattr(model, attr) + mappers.append(class_mapper(cls)) + except Exception: + pass + + graph = create_uml_graph( + mappers, + show_operations=False, + ) + print("Writing galaxy_uml.png") + graph.write_png('galaxy_uml.png') # write out the file From dbc47ac083a779ebf1d69c1a28baacc24c0af50d Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Tue, 12 Jan 2021 06:59:33 -0500 Subject: [PATCH 2/3] Import order fixes for schemadisp script --- scripts/galaxy_schemadisp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/galaxy_schemadisp.py b/scripts/galaxy_schemadisp.py index d60702e40b6..f755232c1b0 100644 --- a/scripts/galaxy_schemadisp.py +++ b/scripts/galaxy_schemadisp.py @@ -1,15 +1,17 @@ import os import sys + from db_shell import * # noqa gxy_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) sys.path.insert(1, os.path.abspath(os.path.join(gxy_root, 'lib'))) -from galaxy import model from sqlalchemy import MetaData from sqlalchemy.orm import class_mapper from sqlalchemy_schemadisplay import create_schema_graph, create_uml_graph +from galaxy import model + if __name__ == "__main__": gxy_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) sqlitedb = os.path.join(gxy_root, 'database/universe.sqlite') From e93627a4355c48b5b83522e5d3e2c7faf359d8ff Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Tue, 12 Jan 2021 13:48:17 +0100 Subject: [PATCH 3/3] Lint fixes, prompt for sqlalchemy_schemadisplay install --- scripts/galaxy_schemadisp.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/galaxy_schemadisp.py b/scripts/galaxy_schemadisp.py index f755232c1b0..5410a92f8e6 100644 --- a/scripts/galaxy_schemadisp.py +++ b/scripts/galaxy_schemadisp.py @@ -2,14 +2,18 @@ import os import sys from db_shell import * # noqa +from sqlalchemy import MetaData +from sqlalchemy.orm import class_mapper +try: + from sqlalchemy_schemadisplay import create_schema_graph, create_uml_graph +except ImportError: + print("please install sqlalchemy_schemadisplay to use this script (pip install sqlalchemy_schemadisplay)") + raise + gxy_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) sys.path.insert(1, os.path.abspath(os.path.join(gxy_root, 'lib'))) -from sqlalchemy import MetaData -from sqlalchemy.orm import class_mapper -from sqlalchemy_schemadisplay import create_schema_graph, create_uml_graph - from galaxy import model if __name__ == "__main__":