Source code for xsdata.formats.dataclass.filters

from docformatter import format_code

from xsdata.models.codegen import Class
from xsdata.models.enums import UseType


[docs]def arguments(data: dict): def prep(key, value): if isinstance(value, UseType): value = value.value if isinstance(value, str) and not has_quotes(value): value = '"{}"'.format(value.replace('"', "'")) if key == "pattern": value = f"r{value}" return f"{key}={value}" return ",\n".join( [ prep(key, value) for key, value in data.items() if value is not None and value is not False ] )
[docs]def docstring(obj: Class, enum=False): lines = [] if obj.help: lines.append(obj.help) var_type = "cvar" if enum else "ivar" for attr in obj.attrs: description = attr.help.strip() if attr.help else "" lines.append(f":{var_type} {attr.name}: {description}".strip()) return format_code('"""\n{}\n"""'.format("\n".join(lines))) if lines else ""
[docs]def lib_imports(output: str): result = [] if "Decimal" in output: result.append("from decimal import Decimal") if "(Enum)" in output: result.append("from enum import Enum") dataclasses = [] if "@dataclass" in output: dataclasses.append("dataclass") if "field(" in output: dataclasses.append("field") if dataclasses: result.append(f"from dataclasses import {', '.join(dataclasses)}") if "QName" in output: result.append("from lxml.etree import QName") types = [tp for tp in ["Dict", "List", "Optional", "Union"] if f"{tp}[" in output] if types: result.append(f"from typing import {', '.join(types)}") return "\n".join(result)
[docs]def has_quotes(string: str): quote_types = ["'''", '"""', "'", '"'] for quote in quote_types: if string.startswith(quote) and string.endswith(quote): return True return False
filters = {"arguments": arguments, "docstring": docstring, "lib_imports": lib_imports}