50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
from typing import List
|
|
from ..models import Module
|
|
|
|
|
|
class AsciiDiagramGenerator:
|
|
def __init__(self):
|
|
self.box_width = 40
|
|
|
|
def generate(self, modules: List[Module]) -> str:
|
|
lines = []
|
|
lines.append("Architecture Overview")
|
|
lines.append("=" * 60)
|
|
lines.append("")
|
|
|
|
for module in modules:
|
|
self._render_module(lines, module, 0)
|
|
lines.append("")
|
|
|
|
return "\n".join(lines)
|
|
|
|
def _render_module(self, lines: List[str], module: Module, indent: int):
|
|
prefix = " " * indent
|
|
lines.append(f"{prefix}[ Module ] {module.name}")
|
|
|
|
for cls in module.classes:
|
|
self._render_class(lines, cls, indent + 1)
|
|
|
|
for func in module.functions:
|
|
self._render_function(lines, func, indent + 1)
|
|
|
|
def _render_class(self, lines: List[str], cls, indent: int):
|
|
prefix = " " * indent
|
|
lines.append(f"{prefix}+---[ Class ] {cls.name}")
|
|
|
|
if cls.bases:
|
|
lines.append(f"{prefix} inherits: {', '.join(cls.bases)}")
|
|
|
|
for method in cls.methods:
|
|
self._render_method(lines, method, indent + 1)
|
|
|
|
def _render_method(self, lines: List[str], method, indent: int):
|
|
prefix = " " * indent
|
|
sig = f"({', '.join(method.params)})")
|
|
lines.append(f"{prefix} |-- {method.name}{sig}")
|
|
|
|
def _render_function(self, lines: List[str], func, indent: int):
|
|
prefix = " " * indent
|
|
sig = f"({', '.join(func.params)})")
|
|
lines.append(f"{prefix}-- {func.name}{sig}")
|