Skip to content

# sanitize_enumeration_class

## `xsdata.codegen.handlers.sanitize_enumeration_class`

### `SanitizeEnumerationClass`

Bases: `RelativeHandlerInterface`

Enumeration class processor.

Source code in `xsdata/codegen/handlers/sanitize_enumeration_class.py`

     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63

    class SanitizeEnumerationClass(RelativeHandlerInterface):
        """Enumeration class processor."""

        __slots__ = ()

        def process(self, target: Class) -> None:
            """Process entrypoint for classes.

            Steps:
                1. Filter attrs not derived from xs:enumeration
                2. Flatten attrs derived from xs:union of enumerations

            Args:
                target: The target class instance
            """
            self.filter(target)
            self.flatten(target)

        @classmethod
        def filter(cls, target: Class):
            """Remove attrs not derived from xs:enumeration.

            Args:
                target: The target class instance
            """
            enumerations = [attr for attr in target.attrs if attr.is_enumeration]
            if enumerations:
                target.attrs = enumerations

        def flatten(self, target: Class) -> None:
            """Flatten attrs derived from xs:union of enumeration classes.

            Find the enumeration classes and merge all of their members in
            the target class.

            Args:
                target: The target class instance
            """
            if len(target.attrs) != 1 or target.attrs[0].tag != Tag.UNION:
                return

            enums: list[Any] = []
            for attr_type in target.attrs[0].types:
                if attr_type.forward:
                    enums.extend(target.inner)
                elif not attr_type.native:
                    enums.append(self.container.find(attr_type.qname))
                else:
                    enums.append(None)

            merge = all(isinstance(x, Class) and x.is_enumeration for x in enums)
            if merge:
                target.attrs.clear()
                target.inner.clear()

                target.attrs.extend(attr.clone() for enum in enums for attr in enum.attrs)

#### `process(target)`

Process entrypoint for classes.

Steps

1. Filter attrs not derived from xs:enumeration
2. Flatten attrs derived from xs:union of enumerations

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`target` | `Class` | The target class instance | required

Source code in `xsdata/codegen/handlers/sanitize_enumeration_class.py`

    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    def process(self, target: Class) -> None:
        """Process entrypoint for classes.

        Steps:
            1. Filter attrs not derived from xs:enumeration
            2. Flatten attrs derived from xs:union of enumerations

        Args:
            target: The target class instance
        """
        self.filter(target)
        self.flatten(target)

#### `filter(target)` `classmethod`

Remove attrs not derived from xs:enumeration.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`target` | `Class` | The target class instance | required

Source code in `xsdata/codegen/handlers/sanitize_enumeration_class.py`

    26
    27
    28
    29
    30
    31
    32
    33
    34
    35

    @classmethod
    def filter(cls, target: Class):
        """Remove attrs not derived from xs:enumeration.

        Args:
            target: The target class instance
        """
        enumerations = [attr for attr in target.attrs if attr.is_enumeration]
        if enumerations:
            target.attrs = enumerations

#### `flatten(target)`

Flatten attrs derived from xs:union of enumeration classes.

Find the enumeration classes and merge all of their members in the target class.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`target` | `Class` | The target class instance | required

Source code in `xsdata/codegen/handlers/sanitize_enumeration_class.py`

    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63

    def flatten(self, target: Class) -> None:
        """Flatten attrs derived from xs:union of enumeration classes.

        Find the enumeration classes and merge all of their members in
        the target class.

        Args:
            target: The target class instance
        """
        if len(target.attrs) != 1 or target.attrs[0].tag != Tag.UNION:
            return

        enums: list[Any] = []
        for attr_type in target.attrs[0].types:
            if attr_type.forward:
                enums.extend(target.inner)
            elif not attr_type.native:
                enums.append(self.container.find(attr_type.qname))
            else:
                enums.append(None)

        merge = all(isinstance(x, Class) and x.is_enumeration for x in enums)
        if merge:
            target.attrs.clear()
            target.inner.clear()

            target.attrs.extend(attr.clone() for enum in enums for attr in enum.attrs)