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

localstack / localstack / 18363705737

08 Oct 2025 07:39PM UTC coverage: 86.912% (+0.02%) from 86.893%
18363705737

push

github

web-flow
Fix Event Bridge input transformation of booleans (#13236)

6 of 6 new or added lines in 1 file covered. (100.0%)

145 existing lines in 8 files now uncovered.

67991 of 78230 relevant lines covered (86.91%)

0.87 hits per line

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

62.75
/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
    NodeDependsOn,
9
    NodeDivergence,
10
    NodeGlobalTransform,
11
    NodeIntrinsicFunction,
12
    NodeMapping,
13
    NodeMappings,
14
    NodeObject,
15
    NodeOutput,
16
    NodeOutputs,
17
    NodeParameter,
18
    NodeParameters,
19
    NodeProperties,
20
    NodeProperty,
21
    NodeResource,
22
    NodeResources,
23
    NodeTemplate,
24
    NodeTransform,
25
    TerminalValueCreated,
26
    TerminalValueModified,
27
    TerminalValueRemoved,
28
    TerminalValueUnchanged,
29
)
30
from localstack.utils.strings import camel_to_snake_case
1✔
31

32

33
class ChangeSetModelVisitor(abc.ABC):
1✔
34
    # TODO: this class should be auto generated.
35

36
    # TODO: add visitors for abstract classes so shared logic can be implemented
37
    #  just once in classes extending this.
38

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

47
    def visit_children(self, change_set_entity: ChangeSetEntity):
1✔
48
        children = change_set_entity.get_children()
1✔
49
        for child in children:
1✔
50
            self.visit(child)
1✔
51

52
    def visit_node_template(self, node_template: NodeTemplate):
1✔
53
        # Visit the resources, which will lazily evaluate all the referenced (direct and indirect)
54
        # entities (parameters, mappings, conditions, etc.). Then compute the output fields; computing
55
        # only the output fields would only result in the deployment logic of the referenced outputs
56
        # being evaluated, hence enforce the visiting of all the resources first.
57
        self.visit(node_template.resources)
1✔
58
        self.visit(node_template.outputs)
1✔
59

60
    def visit_node_transform(self, node_transform: NodeTransform):
1✔
61
        self.visit_children(node_transform)
×
62

63
    def visit_node_global_transform(self, node_global_transform: NodeGlobalTransform):
1✔
64
        self.visit_children(node_global_transform)
×
65

66
    def visit_node_outputs(self, node_outputs: NodeOutputs):
1✔
67
        self.visit_children(node_outputs)
×
68

69
    def visit_node_output(self, node_output: NodeOutput):
1✔
70
        self.visit_children(node_output)
×
71

72
    def visit_node_mapping(self, node_mapping: NodeMapping):
1✔
73
        self.visit_children(node_mapping)
×
74

75
    def visit_node_mappings(self, node_mappings: NodeMappings):
1✔
76
        self.visit_children(node_mappings)
1✔
77

78
    def visit_node_parameters(self, node_parameters: NodeParameters):
1✔
79
        self.visit_children(node_parameters)
×
80

81
    def visit_node_parameter(self, node_parameter: NodeParameter):
1✔
82
        self.visit_children(node_parameter)
×
83

84
    def visit_node_conditions(self, node_conditions: NodeConditions):
1✔
85
        self.visit_children(node_conditions)
×
86

87
    def visit_node_condition(self, node_condition: NodeCondition):
1✔
88
        self.visit_children(node_condition)
×
89

90
    def visit_node_depends_on(self, node_depends_on: NodeDependsOn):
1✔
91
        self.visit_children(node_depends_on)
×
92

93
    def visit_node_resources(self, node_resources: NodeResources):
1✔
UNCOV
94
        self.visit_children(node_resources)
×
95

96
    def visit_node_resource(self, node_resource: NodeResource):
1✔
97
        self.visit_children(node_resource)
×
98

99
    def visit_node_properties(self, node_properties: NodeProperties):
1✔
100
        self.visit_children(node_properties)
×
101

102
    def visit_node_property(self, node_property: NodeProperty):
1✔
103
        self.visit_children(node_property)
×
104

105
    def visit_node_intrinsic_function(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
106
        # TODO: speed up this lookup logic
107
        function_name = node_intrinsic_function.intrinsic_function
1✔
108
        function_name = function_name.replace("::", "_")
1✔
109
        function_name = camel_to_snake_case(function_name)
1✔
110
        visit_function_name = f"visit_node_intrinsic_function_{function_name}"
1✔
111
        visit_function = getattr(self, visit_function_name)
1✔
112
        return visit_function(node_intrinsic_function)
1✔
113

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

119
    def visit_node_intrinsic_function_fn_equals(
1✔
120
        self, node_intrinsic_function: NodeIntrinsicFunction
121
    ):
122
        self.visit_children(node_intrinsic_function)
×
123

124
    def visit_node_intrinsic_function_fn_transform(
1✔
125
        self, node_intrinsic_function: NodeIntrinsicFunction
126
    ):
127
        self.visit_children(node_intrinsic_function)
×
128

129
    def visit_node_intrinsic_function_fn_select(
1✔
130
        self, node_intrinsic_function: NodeIntrinsicFunction
131
    ):
132
        self.visit_children(node_intrinsic_function)
×
133

134
    def visit_node_intrinsic_function_fn_split(
1✔
135
        self, node_intrinsic_function: NodeIntrinsicFunction
136
    ):
137
        self.visit_children(node_intrinsic_function)
×
138

139
    def visit_node_intrinsic_function_fn_get_a_zs(
1✔
140
        self, node_intrinsic_function: NodeIntrinsicFunction
141
    ):
142
        self.visit_children(node_intrinsic_function)
×
143

144
    def visit_node_intrinsic_function_fn_base64(
1✔
145
        self, node_intrinsic_function: NodeIntrinsicFunction
146
    ):
147
        self.visit_children(node_intrinsic_function)
×
148

149
    def visit_node_intrinsic_function_fn_sub(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
150
        self.visit_children(node_intrinsic_function)
×
151

152
    def visit_node_intrinsic_function_fn_if(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
153
        self.visit_children(node_intrinsic_function)
×
154

155
    def visit_node_intrinsic_function_fn_and(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
156
        self.visit_children(node_intrinsic_function)
×
157

158
    def visit_node_intrinsic_function_fn_or(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
159
        self.visit_children(node_intrinsic_function)
×
160

161
    def visit_node_intrinsic_function_fn_not(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
162
        self.visit_children(node_intrinsic_function)
×
163

164
    def visit_node_intrinsic_function_fn_join(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
165
        self.visit_children(node_intrinsic_function)
×
166

167
    def visit_node_intrinsic_function_fn_find_in_map(
1✔
168
        self, node_intrinsic_function: NodeIntrinsicFunction
169
    ):
170
        self.visit_children(node_intrinsic_function)
×
171

172
    def visit_node_intrinsic_function_ref(self, node_intrinsic_function: NodeIntrinsicFunction):
1✔
173
        self.visit_children(node_intrinsic_function)
×
174

175
    def visit_node_intrinsic_function_condition(
1✔
176
        self, node_intrinsic_function: NodeIntrinsicFunction
177
    ):
178
        self.visit_children(node_intrinsic_function)
×
179

180
    def visit_node_intrinsic_function_fn_import_value(
1✔
181
        self, node_intrinsic_function: NodeIntrinsicFunction
182
    ):
183
        self.visit_children(node_intrinsic_function)
×
184

185
    def visit_node_divergence(self, node_divergence: NodeDivergence):
1✔
186
        self.visit_children(node_divergence)
×
187

188
    def visit_node_object(self, node_object: NodeObject):
1✔
189
        self.visit_children(node_object)
×
190

191
    def visit_node_array(self, node_array: NodeArray):
1✔
192
        self.visit_children(node_array)
×
193

194
    def visit_terminal_value_modified(self, terminal_value_modified: TerminalValueModified):
1✔
195
        self.visit_children(terminal_value_modified)
×
196

197
    def visit_terminal_value_created(self, terminal_value_created: TerminalValueCreated):
1✔
198
        self.visit_children(terminal_value_created)
×
199

200
    def visit_terminal_value_removed(self, terminal_value_removed: TerminalValueRemoved):
1✔
201
        self.visit_children(terminal_value_removed)
×
202

203
    def visit_terminal_value_unchanged(self, terminal_value_unchanged: TerminalValueUnchanged):
1✔
204
        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