Source code for lodstorage.uml

"""
Created on 2020-09-04

@author: wf
"""
from lodstorage.schema import Schema


[docs] class UML(object): """ UML diagrams via plantuml """ skinparams = """ ' BITPlan Corporate identity skin params ' Copyright (c) 2015-2020 BITPlan GmbH ' see http://wiki.bitplan.com/PlantUmlSkinParams#BITPlanCI ' skinparams generated by com.bitplan.restmodelmanager skinparam note { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } skinparam component { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } skinparam package { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } skinparam usecase { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } skinparam activity { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } skinparam classAttribute { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } skinparam interface { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } skinparam class { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } skinparam object { BackGroundColor #FFFFFF FontSize 12 ArrowColor #FF8000 BorderColor #FF8000 FontColor black FontName Technical } hide Circle ' end of skinparams ' """ def __init__(self, debug=False): """ Constructor Args: debug(boolean): True if debug information should be shown """ self.debug = debug
[docs] def tableListToPlantUml( self, tableList, title=None, packageName=None, generalizeTo=None, withSkin=True ): """ convert tableList to PlantUml notation Args: tableList(list): the tableList list of Dicts from getTableList() to convert title(string): optional title to be added packageName(string): optional packageName to be added generalizeTo(string): optional name of a general table to be derived withSkin(boolean): if True add default BITPlan skin parameters Returns: string: the Plantuml notation for the entities in columns of the given tablelist """ uml = "" indent = "" inherit = "" if title is not None: uml += "title\n%s\nend title\n" % title if packageName is not None: uml += "package %s {\n" % packageName indent = " " if generalizeTo is not None: generalTable = Schema.getGeneral(tableList, generalizeTo) for table in tableList: inherit += "%s%s <|-- %s\n" % (indent, generalizeTo, table["name"]) tableList.insert(0, generalTable) for table in tableList: colUml = "" sortedColumns = sorted(table["columns"], key=lambda col: col["name"]) for col in sortedColumns: mandatory = "*" if col["notnull"] == 1 else "" pk = "<<PK>>" if col["pk"] == 1 else "" colName = col["name"] colType = col["type"] if "link" in col: colName = col["link"] colUml += "%s %s%s : %s %s\n" % ( indent, mandatory, colName, colType, pk, ) tableName = table["name"] if "notes" in table: uml += "Note top of %s\n%s\nEnd note\n" % (tableName, table["notes"]) uml += "%sclass %s << Entity >> {\n%s%s}\n" % ( indent, tableName, colUml, indent, ) uml += inherit if packageName is not None: uml += "}\n" if withSkin: uml += UML.skinparams return uml
[docs] def mergeSchema( self, schemaManager, tableList, title=None, packageName=None, generalizeTo=None, withSkin=True, ): """ merge Schema and tableList to PlantUml notation Args: schemaManager(SchemaManager): a schema manager to be used tableList(list): the tableList list of Dicts from getTableList() to convert title(string): optional title to be added packageName(string): optional packageName to be added generalizeTo(string): optional name of a general table to be derived withSkin(boolean): if True add default BITPlan skin parameters Returns: string: the Plantuml notation for the entities in columns of the given tablelist """ if schemaManager is not None: for table in tableList: if "schema" in table: schema = schemaManager.schemasByName[table["schema"]] url = "%s/%s" % (schemaManager.baseUrl, schema.name) url = url.replace(" ", "_") # mediawiki instanceNote = "" if "instances" in table: instanceNote = "\n%d instances " % (table["instances"]) table["notes"] = """[[%s %s]]%s""" % ( url, schema.name, instanceNote, ) for col in table["columns"]: colName = col["name"] if colName in schema.propsByName: prop = schema.propsByName[colName] if prop.iri is not None: tooltip = "" if prop.definition is not None: tooltip = "{%s}" % prop.definition col["link"] = "[[%s%s %s]]" % ( prop.iri, tooltip, colName, ) col["special"] = True # keep column even if generalized pass plantuml = self.tableListToPlantUml( tableList, title=title, packageName=packageName, generalizeTo=generalizeTo, withSkin=withSkin, ) return plantuml