forked from RafaelKuebler/PyToUML
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdesc_to_uml.py
87 lines (67 loc) · 2.38 KB
/
desc_to_uml.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import subprocess
from pathlib import Path
from typing import List, Any
from desc import ClassDesc
# TODO: refactor to use "stringbuilding" = store strings in list and join in the end
# https://waymoot.org/home/python_string/
def desc_to_uml(data: List[Any], plantuml_path: Path) -> None:
with plantuml_path.open('w') as uml:
uml.write("@startuml\n\n")
uml.write("skinparam classAttributeIconSize 0\n\n") # turns off symbols for access modifiers
uml.write(class_defs(data))
# uml.write("hide empty members\n\n")
uml.write(inheritance(data))
# uml.write(dependencies()) # TODO: dependencies
uml.write(docstrings(data))
uml.write("\n@enduml")
create_plantuml(plantuml_path)
def class_defs(data: List[ClassDesc]) -> str:
string = ""
for class_def in data:
string += "class " + class_def.name + "{\n"
string += vars_in_class(class_def)
string += funcs_in_class(class_def)
string += "}\n\n"
return string
def vars_in_class(class_def: ClassDesc) -> str:
string = ""
for var in class_def.vars:
string += f" {var}\n"
return string
def funcs_in_class(class_def: ClassDesc) -> str:
string = ""
for func in class_def.functions:
string += f" {func.name}("
first = True
for arg in func.args:
if first:
first = False
else:
string += ", "
string += f"{arg}"
string += ")\n"
return string
def inheritance(data: List[ClassDesc]) -> str:
string = ""
for class_def in data:
for base in class_def.bases:
string += f"{base} <|-- {class_def.name}\n"
return string
def dependencies(data: List[ClassDesc]) -> str:
string = ""
for class_def in data:
for dep in class_def.dependencies:
string += f"{dep} <-- {class_def.name}\n"
return string
def docstrings(data: List[ClassDesc]) -> str:
string = "\n"
for class_def in data:
if not class_def.docstring:
continue
string += f"note top of {class_def.name}\n"
string += f"{class_def.docstring}\n"
string += f"end note\n\n"
return string
def create_plantuml(plantuml_path: Path) -> None:
print(f"Creating diagram for {plantuml_path}")
subprocess.run(['java', '-jar', 'plantuml.jar', '-duration', str(plantuml_path)])