Source code for xsdata.codegen.handlers.attribute_group

from dataclasses import dataclass

from xsdata.codegen.mixins import ContainerInterface
from xsdata.codegen.mixins import HandlerInterface
from xsdata.codegen.models import Attr
from xsdata.codegen.models import Class
from xsdata.codegen.utils import ClassUtils
from xsdata.exceptions import AnalyzerValueError
from xsdata.models.xsd import AttributeGroup
from xsdata.models.xsd import Group


[docs]@dataclass class AttributeGroupHandler(HandlerInterface): """Replace attribute groups with the source class attributes.""" container: ContainerInterface
[docs] def process(self, target: Class): """ Iterate over all group attributes and apply handler logic. Group attributes can refer to attributes or other group attributes, repeat until there is no group attribute left. """ repeat = False for attr in list(target.attrs): if attr.is_group: repeat = True self.process_attribute(target, attr) if repeat: self.process(target)
[docs] def process_attribute(self, target: Class, attr: Attr): """ Find the source class the attribute refers to and copy its attributes to the target class. :raises AnalyzerValueError: if source class is not found. """ qname = attr.types[0].qname # group attributes have one type only. source = self.container.find( qname, condition=lambda x: x.type in (AttributeGroup, Group) ) if not source: raise AnalyzerValueError(f"Group attribute not found: `{qname}`") if source is target: target.attrs.remove(attr) else: ClassUtils.copy_group_attributes(source, target, attr)