Source code for xsdata.formats.plantuml.generator
from pathlib import Path
from typing import Iterator
from typing import List
from xsdata.codegen.models import Class
from xsdata.codegen.resolver import DependenciesResolver
from xsdata.formats.mixins import AbstractGenerator
from xsdata.formats.mixins import GeneratorResult
[docs]class PlantUmlGenerator(AbstractGenerator):
"""PlantUML generator."""
def __init__(self):
tpl_dir = Path(__file__).parent.joinpath("templates")
super().__init__(str(tpl_dir))
[docs] def render(self, classes: List[Class]) -> Iterator[GeneratorResult]:
"""Return a iterator of the generated results."""
packages = {obj.source_qname(): obj.target_module for obj in classes}
resolver = DependenciesResolver(packages=packages)
for module, cluster in self.group_by_module(classes).items():
yield GeneratorResult(
path=module.with_suffix(".pu"),
title=cluster[0].target_module,
source=self.render_module(resolver, cluster),
)
[docs] def render_module(
self, resolver: DependenciesResolver, classes: List[Class]
) -> str:
"""Render the source code for the target module of the given class
list."""
resolver.process(classes)
output = self.render_classes(resolver.sorted_classes())
return self.template("module").render(output=output)
[docs] def render_classes(self, classes: List[Class]) -> str:
"""Render the source code of the classes."""
load = self.template
classes = sorted(classes, key=lambda x: x.name)
def render_class(obj: Class) -> str:
"""Render class or enumeration."""
template = "enum" if obj.is_enumeration else "class"
return load(template).render(obj=obj).strip()
output = "\n".join(map(render_class, classes))
return f"\n{output}\n"