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