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 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())