Skip to content

filter_classes

xsdata.codegen.handlers.filter_classes

FilterClasses

Bases: ContainerHandlerInterface

Filter classes for code generation based on the configuration strategy.

Source code in xsdata/codegen/handlers/filter_classes.py
 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
64
65
66
67
68
69
70
71
72
73
74
75
76
class FilterClasses(ContainerHandlerInterface):
    """Filter classes for code generation based on the configuration strategy."""

    __slots__ = ()

    def run(self):
        """Main entrypoint to filter the class container.

        In order for a class to be considered global it has
        to be a non-abstract element, a complex type without
        simple content or a wsdl binding element.

        Strategies:
            - Filter all global classes and the referenced simple types.
            - Filter global classes with references to other global classes.
            - Filter all classes
        """
        classes = []
        filter_strategy = self.container.config.output.filter_strategy
        if filter_strategy == ClassFilterStrategy.ALL_GLOBALS:
            classes = self.filter_all_globals()
        elif filter_strategy == ClassFilterStrategy.REFERRED_GLOBALS:
            classes = self.filter_referred_globals()

        if classes:
            self.container.set(classes)
        elif filter_strategy != ClassFilterStrategy.ALL:
            logger.warning(
                "The filter strategy '%s' returned no classes,"
                " will generate all types.",
                filter_strategy.value,
            )

    def filter_all_globals(self) -> List[Class]:
        """Filter all globals and any referenced types.

        This filter is trying to remove unused simple
        types.

        Returns:
            The list of classes for generation.
        """
        occurs = set()
        for obj in self.container:
            if obj.is_global_type:
                occurs.add(obj.ref)
                occurs.update(obj.references)

        return [obj for obj in self.container if obj.ref in occurs]

    def filter_referred_globals(self) -> List[Class]:
        """Filter globals with any references.

        This filter is trying to remove unused global
        types.

        Returns:
            The list of classes for generation.
        """
        occurs = set()
        for obj in self.container:
            if obj.is_global_type:
                references = list(obj.references)
                occurs.update(references)
                if references:
                    occurs.add(obj.ref)

        return [obj for obj in self.container if obj.ref in occurs]

run()

Main entrypoint to filter the class container.

In order for a class to be considered global it has to be a non-abstract element, a complex type without simple content or a wsdl binding element.

Strategies
  • Filter all global classes and the referenced simple types.
  • Filter global classes with references to other global classes.
  • Filter all classes
Source code in xsdata/codegen/handlers/filter_classes.py
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
def run(self):
    """Main entrypoint to filter the class container.

    In order for a class to be considered global it has
    to be a non-abstract element, a complex type without
    simple content or a wsdl binding element.

    Strategies:
        - Filter all global classes and the referenced simple types.
        - Filter global classes with references to other global classes.
        - Filter all classes
    """
    classes = []
    filter_strategy = self.container.config.output.filter_strategy
    if filter_strategy == ClassFilterStrategy.ALL_GLOBALS:
        classes = self.filter_all_globals()
    elif filter_strategy == ClassFilterStrategy.REFERRED_GLOBALS:
        classes = self.filter_referred_globals()

    if classes:
        self.container.set(classes)
    elif filter_strategy != ClassFilterStrategy.ALL:
        logger.warning(
            "The filter strategy '%s' returned no classes,"
            " will generate all types.",
            filter_strategy.value,
        )

filter_all_globals()

Filter all globals and any referenced types.

This filter is trying to remove unused simple types.

Returns:

Type Description
List[Class]

The list of classes for generation.

Source code in xsdata/codegen/handlers/filter_classes.py
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def filter_all_globals(self) -> List[Class]:
    """Filter all globals and any referenced types.

    This filter is trying to remove unused simple
    types.

    Returns:
        The list of classes for generation.
    """
    occurs = set()
    for obj in self.container:
        if obj.is_global_type:
            occurs.add(obj.ref)
            occurs.update(obj.references)

    return [obj for obj in self.container if obj.ref in occurs]

filter_referred_globals()

Filter globals with any references.

This filter is trying to remove unused global types.

Returns:

Type Description
List[Class]

The list of classes for generation.

Source code in xsdata/codegen/handlers/filter_classes.py
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
def filter_referred_globals(self) -> List[Class]:
    """Filter globals with any references.

    This filter is trying to remove unused global
    types.

    Returns:
        The list of classes for generation.
    """
    occurs = set()
    for obj in self.container:
        if obj.is_global_type:
            references = list(obj.references)
            occurs.update(references)
            if references:
                occurs.add(obj.ref)

    return [obj for obj in self.container if obj.ref in occurs]