• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

localstack / localstack / 4ecb9222-1031-4b49-9473-440da7a54636

31 Mar 2025 04:19PM UTC coverage: 86.891% (-0.02%) from 86.913%
4ecb9222-1031-4b49-9473-440da7a54636

push

circleci

web-flow
CloudFormation: POC Support for Modeling of Outputs Blocks in the Update Graph, Improved Handling of Intrinsic Function Types (#12443)

159 of 177 new or added lines in 3 files covered. (89.83%)

84 existing lines in 17 files now uncovered.

63469 of 73044 relevant lines covered (86.89%)

0.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

71.23
/localstack-core/localstack/services/cloudformation/engine/v2/change_set_model_visitor.py
1
import abc
1✔
2

3
from localstack.services.cloudformation.engine.v2.change_set_model import (
1✔
4
    ChangeSetEntity,
5
    NodeArray,
6
    NodeCondition,
7
    NodeConditions,
8
    NodeDivergence,
9
    NodeIntrinsicFunction,
10
    NodeMapping,
11
    NodeMappings,
12
    NodeObject,
13
    NodeOutput,
14
    NodeOutputs,
15
    NodeParameter,
16
    NodeParameters,
17
    NodeProperties,
18
    NodeProperty,
19
    NodeResource,
20
    NodeResources,
21
    NodeTemplate,
22
    TerminalValueCreated,
23
    TerminalValueModified,
24
    TerminalValueRemoved,
25
    TerminalValueUnchanged,
26
)
27
from localstack.utils.strings import camel_to_snake_case
1✔
28

29

30
class ChangeSetModelVisitor(abc.ABC):
1✔
31
    # TODO: this class should be auto generated.
32

33
    # TODO: add visitors for abstract classes so shared logic can be implemented
34
    #  just once in classes extending this.
35

36
    def visit(self, change_set_entity: ChangeSetEntity):
1✔
37
        # TODO: speed up this lookup logic
38
        type_str = change_set_entity.__class__.__name__
1✔
39
        type_str = camel_to_snake_case(type_str)
1✔
40
        visit_function_name = f"visit_{type_str}"
1✔
41
        visit_function = getattr(self, visit_function_name)
1✔
42
        return visit_function(change_set_entity)
1✔
43

44
    def visit_children(self, change_set_entity: ChangeSetEntity):
1✔
45
        children = change_set_entity.get_children()
1✔
46
        for child in children:
1✔
47
            self.visit(child)
1✔
48

49
    def visit_node_template(self, node_template: NodeTemplate):
1✔
50
        self.visit_children(node_template)
1✔
51

52
    def visit_node_mapping(self, node_mapping: NodeMapping):
1✔
UNCOV
53
        self.visit_children(node_mapping)
×
54

55
    def visit_node_mappings(self, node_mappings: NodeMappings):
1✔
56
        self.visit_children(node_mappings)
1✔
57

58
    def visit_node_outputs(self, node_outputs: NodeOutputs):
1✔
NEW
59
        self.visit_children(node_outputs)
×
60

61
    def visit_node_output(self, node_output: NodeOutput):
1✔
NEW
62
        self.visit_children(node_output)
×
63

64
    def visit_node_parameters(self, node_parameters: NodeParameters):
1✔
65
        self.visit_children(node_parameters)
1✔
66

67
    def visit_node_parameter(self, node_parameter: NodeParameter):
1✔
UNCOV
68
        self.visit_children(node_parameter)
×
69

70
    def visit_node_conditions(self, node_conditions: NodeConditions):
1✔
71
        self.visit_children(node_conditions)
1✔
72

73
    def visit_node_condition(self, node_condition: NodeCondition):
1✔
UNCOV
74
        self.visit_children(node_condition)
×
75

76
    def visit_node_resources(self, node_resources: NodeResources):
1✔
77
        self.visit_children(node_resources)
1✔
78

79
    def visit_node_resource(self, node_resource: NodeResource):
1✔
UNCOV
80
        self.visit_children(node_resource)
×
81

82
    def visit_node_properties(self, node_properties: NodeProperties):
1✔
UNCOV
83
        self.visit_children(node_properties)
×
84

85
    def visit_node_property(self, node_property: NodeProperty):
1✔
UNCOV
86
        self.visit_children(node_property)
×
87

88
    def visit_node_intrinsic_function(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
89
        # TODO: speed up this lookup logic
90
        function_name = node_intrinsic_function.intrinsic_function
1✔
91
        function_name = function_name.replace("::", "_")
1✔
92
        function_name = camel_to_snake_case(function_name)
1✔
93
        visit_function_name = f"visit_node_intrinsic_function_{function_name}"
1✔
94
        visit_function = getattr(self, visit_function_name)
1✔
95
        return visit_function(node_intrinsic_function)
1✔
96

97
    def visit_node_intrinsic_function_fn_get_att(
1✔
98
        self, node_intrinsic_function: NodeIntrinsicFunction
99
    ):
UNCOV
100
        self.visit_children(node_intrinsic_function)
×
101

102
    def visit_node_intrinsic_function_fn_equals(
1✔
103
        self, node_intrinsic_function: NodeIntrinsicFunction
104
    ):
UNCOV
105
        self.visit_children(node_intrinsic_function)
×
106

107
    def visit_node_intrinsic_function_fn_if(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
108
        self.visit_children(node_intrinsic_function)
×
109

110
    def visit_node_intrinsic_function_fn_not(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
UNCOV
111
        self.visit_children(node_intrinsic_function)
×
112

113
    def visit_node_intrinsic_function_fn_find_in_map(
1✔
114
        self, node_intrinsic_function: NodeIntrinsicFunction
115
    ):
116
        self.visit_children(node_intrinsic_function)
×
117

118
    def visit_node_intrinsic_function_ref(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
119
        self.visit_children(node_intrinsic_function)
×
120

121
    def visit_node_divergence(self, node_divergence: NodeDivergence):
1✔
UNCOV
122
        self.visit_children(node_divergence)
×
123

124
    def visit_node_object(self, node_object: NodeObject):
1✔
UNCOV
125
        self.visit_children(node_object)
×
126

127
    def visit_node_array(self, node_array: NodeArray):
1✔
UNCOV
128
        self.visit_children(node_array)
×
129

130
    def visit_terminal_value_modified(self, terminal_value_modified: TerminalValueModified):
1✔
UNCOV
131
        self.visit_children(terminal_value_modified)
×
132

133
    def visit_terminal_value_created(self, terminal_value_created: TerminalValueCreated):
1✔
UNCOV
134
        self.visit_children(terminal_value_created)
×
135

136
    def visit_terminal_value_removed(self, terminal_value_removed: TerminalValueRemoved):
1✔
UNCOV
137
        self.visit_children(terminal_value_removed)
×
138

139
    def visit_terminal_value_unchanged(self, terminal_value_unchanged: TerminalValueUnchanged):
1✔
UNCOV
140
        self.visit_children(terminal_value_unchanged)
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc