Source code for xsdata.formats.plantuml.generator
from collections import defaultdict
from pathlib import Path
from typing import Dict
from typing import Iterator
from typing import List
from typing import Tuple
from xsdata.formats.generators import AbstractGenerator
from xsdata.models.codegen import Class
from xsdata.resolver import DependenciesResolver
[docs]class PlantUmlGenerator(AbstractGenerator):
templates_dir = Path(__file__).parent.joinpath("templates")
[docs] def render_module(self, output: str) -> str:
return self.template("module").render(output=output)
[docs] def render_class(self, obj: Class) -> str:
template = "enum" if obj.is_enumeration else "class"
return self.template(template).render(obj=obj)
[docs] def render(self, classes: List[Class]) -> Iterator[Tuple[Path, str, str]]:
"""Given a list of classes return to the writer factory the target
file path full module path and the rendered code."""
packages = {obj.source_qname(): obj.target_module for obj in classes}
resolver = DependenciesResolver(packages=packages)
groups: Dict[str, List] = defaultdict(list)
for obj in classes:
groups[obj.target_module].append(obj)
for target_module, classes in groups.items():
resolver.process(classes)
output = self.render_classes(resolver.sorted_classes())
file_path = Path.cwd().joinpath(target_module.replace(".", "/") + ".pu")
yield file_path, target_module, self.render_module(output=output)
[docs] def render_classes(self, classes: List[Class]) -> str:
"""Sort classes by name and return the rendered output."""
classes = sorted(classes, key=lambda x: x.name)
output = "\n".join(map(self.render_class, classes)).strip()
return f"\n{output}\n"