Source code for xsdata.writer

from dataclasses import dataclass
from dataclasses import field
from typing import Dict
from typing import List

from xsdata.formats.dataclass.generator import DataclassGenerator
from xsdata.formats.generators import AbstractGenerator
from xsdata.formats.plantuml.generator import PlantUmlGenerator
from xsdata.logger import logger
from xsdata.models.codegen import Class


[docs]@dataclass class CodeWriter: generators: Dict[str, AbstractGenerator] = field(default_factory=dict) modules: Dict = field(default_factory=dict) packages: Dict = field(default_factory=dict) module_names: Dict = field(default_factory=dict) @property def formats(self): return list(self.generators.keys())
[docs] def register_format(self, name, generator: AbstractGenerator): self.generators[name] = generator
[docs] def get_format(self, name) -> AbstractGenerator: return self.generators[name]
[docs] def write(self, classes: List[Class], output: str): engine = self.get_format(output) for file, package, buffer in engine.render(classes): if len(buffer.strip()) > 0: logger.info("Generating package: %s", package) file.parent.mkdir(parents=True, exist_ok=True) file.write_text(buffer)
[docs] def print(self, classes: List[Class], output: str): engine = self.get_format(output) for _, _, buffer in engine.render(classes): print(buffer, end="")
[docs] def designate(self, classes: List[Class], output: str): for obj in classes: obj.module = self.unique_module_name(obj.module, output) obj.package = self.unique_package_name(obj.package, output)
[docs] def unique_module_name(self, module: str, output: str): if module not in self.modules: engine = self.get_format(output) name = module[:-4] if module.endswith(".xsd") else module name = engine.module_name(name) if name in self.module_names: self.module_names[name] += 1 name = engine.module_name(f"{name}_{self.module_names[name] - 1}") else: self.module_names[name] = 1 self.modules[module] = name return self.modules[module]
[docs] def unique_package_name(self, package: str, output: str): if package not in self.packages: engine = self.get_format(output) self.packages[package] = engine.package_name(package) return self.packages[package]
writer = CodeWriter() writer.register_format("pydata", DataclassGenerator()) writer.register_format("plantuml", PlantUmlGenerator())