localstack-core 4.7.1.dev40__py3-none-any.whl → 4.7.1.dev42__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of localstack-core might be problematic. Click here for more details.
- localstack/aws/handlers/service.py +2 -2
- localstack/aws/mocking.py +1 -1
- localstack/aws/protocol/serializer.py +1 -1
- localstack/config.py +1 -1
- localstack/dev/run/__main__.py +1 -1
- localstack/services/cloudformation/engine/entities.py +1 -1
- localstack/services/cloudformation/engine/parameters.py +1 -1
- localstack/services/cloudformation/engine/v2/change_set_model.py +16 -16
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +1 -1
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +3 -3
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +16 -16
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py +3 -3
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py +1 -1
- localstack/services/cloudformation/provider_utils.py +31 -1
- localstack/services/cloudformation/scaffolding/__main__.py +5 -5
- localstack/services/cloudformation/stores.py +1 -1
- localstack/services/cloudformation/v2/provider.py +3 -3
- localstack/services/lambda_/api_utils.py +1 -1
- localstack/services/lambda_/invocation/docker_runtime_executor.py +1 -1
- localstack/services/lambda_/provider.py +1 -1
- localstack/services/secretsmanager/provider.py +1 -1
- localstack/services/sqs/provider.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl_binding.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/error_name/states_error_name_type.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/path/input_path.py +1 -1
- localstack/services/stepfunctions/asl/component/common/path/output_path.py +1 -1
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadarr/payload_arr.py +1 -1
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadtmpl/payload_tmpl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/string/string_expression.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/array/array_partition.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/generic/string_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_array.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +1 -1
- localstack/services/stepfunctions/asl/component/program/program.py +1 -1
- localstack/services/stepfunctions/asl/component/program/states.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_output_transformer/resource_output_transformer_csv.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +1 -1
- localstack/services/stepfunctions/asl/eval/environment.py +6 -6
- localstack/services/stepfunctions/asl/eval/event/event_manager.py +1 -1
- localstack/services/stepfunctions/asl/eval/states.py +1 -1
- localstack/services/stepfunctions/asl/eval/variable_store.py +3 -3
- localstack/services/stepfunctions/asl/jsonata/jsonata.py +1 -1
- localstack/services/stepfunctions/asl/parse/asl_parser.py +1 -1
- localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +1 -1
- localstack/services/stepfunctions/asl/parse/preprocessor.py +14 -14
- localstack/services/stepfunctions/asl/static_analyser/intrinsic/variable_names_intrinsic_static_analyser.py +1 -1
- localstack/services/stepfunctions/asl/static_analyser/variable_references_static_analyser.py +2 -2
- localstack/services/stepfunctions/backend/alias.py +2 -2
- localstack/services/stepfunctions/backend/execution.py +2 -2
- localstack/services/stepfunctions/backend/state_machine.py +2 -2
- localstack/services/stepfunctions/mocking/mock_config.py +4 -4
- localstack/services/stepfunctions/provider.py +7 -7
- localstack/testing/pytest/cloudformation/fixtures.py +4 -4
- localstack/testing/pytest/fixtures.py +2 -2
- localstack/testing/pytest/marking.py +1 -1
- localstack/testing/pytest/stepfunctions/fixtures.py +4 -4
- localstack/testing/pytest/stepfunctions/utils.py +6 -6
- localstack/utils/analytics/metrics/counter.py +3 -3
- localstack/utils/analytics/metrics/registry.py +1 -1
- localstack/utils/scheduler.py +2 -2
- localstack/utils/testutil.py +1 -1
- localstack/version.py +2 -2
- {localstack_core-4.7.1.dev40.dist-info → localstack_core-4.7.1.dev42.dist-info}/METADATA +1 -1
- {localstack_core-4.7.1.dev40.dist-info → localstack_core-4.7.1.dev42.dist-info}/RECORD +86 -86
- localstack_core-4.7.1.dev42.dist-info/plux.json +1 -0
- localstack_core-4.7.1.dev40.dist-info/plux.json +0 -1
- {localstack_core-4.7.1.dev40.data → localstack_core-4.7.1.dev42.data}/scripts/localstack +0 -0
- {localstack_core-4.7.1.dev40.data → localstack_core-4.7.1.dev42.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.7.1.dev40.data → localstack_core-4.7.1.dev42.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.7.1.dev40.dist-info → localstack_core-4.7.1.dev42.dist-info}/WHEEL +0 -0
- {localstack_core-4.7.1.dev40.dist-info → localstack_core-4.7.1.dev42.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.7.1.dev40.dist-info → localstack_core-4.7.1.dev42.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.7.1.dev40.dist-info → localstack_core-4.7.1.dev42.dist-info}/top_level.txt +0 -0
|
@@ -52,7 +52,7 @@ class ServiceRequestParser(Handler):
|
|
|
52
52
|
parsers: dict[str, RequestParser]
|
|
53
53
|
|
|
54
54
|
def __init__(self):
|
|
55
|
-
self.parsers =
|
|
55
|
+
self.parsers = {}
|
|
56
56
|
|
|
57
57
|
def __call__(self, chain: HandlerChain, context: RequestContext, response: Response):
|
|
58
58
|
# determine service
|
|
@@ -92,7 +92,7 @@ class ServiceRequestRouter(Handler):
|
|
|
92
92
|
handlers: dict[ServiceOperation, Handler]
|
|
93
93
|
|
|
94
94
|
def __init__(self):
|
|
95
|
-
self.handlers =
|
|
95
|
+
self.handlers = {}
|
|
96
96
|
|
|
97
97
|
def __call__(self, chain: HandlerChain, context: RequestContext, response: Response):
|
|
98
98
|
if not context.service:
|
localstack/aws/mocking.py
CHANGED
|
@@ -1215,7 +1215,7 @@ class JSONResponseSerializer(ResponseSerializer):
|
|
|
1215
1215
|
mime_type: str,
|
|
1216
1216
|
request_id: str,
|
|
1217
1217
|
) -> None:
|
|
1218
|
-
body =
|
|
1218
|
+
body = {}
|
|
1219
1219
|
|
|
1220
1220
|
# TODO implement different service-specific serializer configurations
|
|
1221
1221
|
# - currently we set both, the `__type` member as well as the `X-Amzn-Errortype` header
|
localstack/config.py
CHANGED
|
@@ -660,7 +660,7 @@ class UniqueHostAndPortList(list[HostAndPort]):
|
|
|
660
660
|
if len(self) <= 1:
|
|
661
661
|
return
|
|
662
662
|
|
|
663
|
-
unique: list[HostAndPort] =
|
|
663
|
+
unique: list[HostAndPort] = []
|
|
664
664
|
|
|
665
665
|
# Build a dictionary of hosts by port
|
|
666
666
|
hosts_by_port: dict[int, list[str]] = defaultdict(list)
|
localstack/dev/run/__main__.py
CHANGED
|
@@ -76,7 +76,7 @@ def resolve_parameters(
|
|
|
76
76
|
:param old_parameters: The old parameters from the previous stack deployment, if available
|
|
77
77
|
:return: a copy of new_parameters with resolved values
|
|
78
78
|
"""
|
|
79
|
-
resolved_parameters =
|
|
79
|
+
resolved_parameters = {}
|
|
80
80
|
|
|
81
81
|
# populate values for every parameter declared in the template
|
|
82
82
|
for pm in parameter_declarations.values():
|
|
@@ -174,8 +174,8 @@ class UpdateModel:
|
|
|
174
174
|
node_template: NodeTemplate,
|
|
175
175
|
):
|
|
176
176
|
self.node_template = node_template
|
|
177
|
-
self.before_runtime_cache =
|
|
178
|
-
self.after_runtime_cache =
|
|
177
|
+
self.before_runtime_cache = {}
|
|
178
|
+
self.after_runtime_cache = {}
|
|
179
179
|
|
|
180
180
|
|
|
181
181
|
class NodeTemplate(ChangeSetNode):
|
|
@@ -555,7 +555,7 @@ class ChangeSetModel:
|
|
|
555
555
|
self._after_template = after_template or Nothing
|
|
556
556
|
self._before_parameters = before_parameters or Nothing
|
|
557
557
|
self._after_parameters = after_parameters or Nothing
|
|
558
|
-
self._visited_scopes =
|
|
558
|
+
self._visited_scopes = {}
|
|
559
559
|
# TODO: move this modeling process to the `get_update_model` method as constructors shouldn't do work
|
|
560
560
|
self._node_template = self._model(
|
|
561
561
|
before_template=self._before_template, after_template=self._after_template
|
|
@@ -767,7 +767,7 @@ class ChangeSetModel:
|
|
|
767
767
|
def _visit_array(
|
|
768
768
|
self, scope: Scope, before_array: Maybe[list], after_array: Maybe[list]
|
|
769
769
|
) -> NodeArray:
|
|
770
|
-
array: list[ChangeSetEntity] =
|
|
770
|
+
array: list[ChangeSetEntity] = []
|
|
771
771
|
for index, (before_value, after_value) in enumerate(
|
|
772
772
|
zip_longest(before_array, after_array, fillvalue=Nothing)
|
|
773
773
|
):
|
|
@@ -786,7 +786,7 @@ class ChangeSetModel:
|
|
|
786
786
|
if isinstance(node_object, NodeObject):
|
|
787
787
|
return node_object
|
|
788
788
|
binding_names = self._safe_keys_of(before_object, after_object)
|
|
789
|
-
bindings: dict[str, ChangeSetEntity] =
|
|
789
|
+
bindings: dict[str, ChangeSetEntity] = {}
|
|
790
790
|
for binding_name in binding_names:
|
|
791
791
|
binding_scope, (before_value, after_value) = self._safe_access_in(
|
|
792
792
|
scope, binding_name, before_object, after_object
|
|
@@ -888,7 +888,7 @@ class ChangeSetModel:
|
|
|
888
888
|
if isinstance(node_properties, NodeProperties):
|
|
889
889
|
return node_properties
|
|
890
890
|
property_names: list[str] = self._safe_keys_of(before_properties, after_properties)
|
|
891
|
-
properties: list[NodeProperty] =
|
|
891
|
+
properties: list[NodeProperty] = []
|
|
892
892
|
for property_name in property_names:
|
|
893
893
|
property_scope, (before_property, after_property) = self._safe_access_in(
|
|
894
894
|
scope, property_name, before_properties, after_properties
|
|
@@ -1027,7 +1027,7 @@ class ChangeSetModel:
|
|
|
1027
1027
|
self, scope: Scope, before_resources: Maybe[dict], after_resources: Maybe[dict]
|
|
1028
1028
|
) -> NodeResources:
|
|
1029
1029
|
# TODO: investigate type changes behavior.
|
|
1030
|
-
resources: list[NodeResource] =
|
|
1030
|
+
resources: list[NodeResource] = []
|
|
1031
1031
|
resource_names = self._safe_keys_of(before_resources, after_resources)
|
|
1032
1032
|
for resource_name in resource_names:
|
|
1033
1033
|
resource_scope, (before_resource, after_resource) = self._safe_access_in(
|
|
@@ -1053,7 +1053,7 @@ class ChangeSetModel:
|
|
|
1053
1053
|
def _visit_mappings(
|
|
1054
1054
|
self, scope: Scope, before_mappings: Maybe[dict], after_mappings: Maybe[dict]
|
|
1055
1055
|
) -> NodeMappings:
|
|
1056
|
-
mappings: list[NodeMapping] =
|
|
1056
|
+
mappings: list[NodeMapping] = []
|
|
1057
1057
|
mapping_names = self._safe_keys_of(before_mappings, after_mappings)
|
|
1058
1058
|
for mapping_name in mapping_names:
|
|
1059
1059
|
scope_mapping, (before_mapping, after_mapping) = self._safe_access_in(
|
|
@@ -1131,7 +1131,7 @@ class ChangeSetModel:
|
|
|
1131
1131
|
if isinstance(node_parameters, NodeParameters):
|
|
1132
1132
|
return node_parameters
|
|
1133
1133
|
parameter_names: list[str] = self._safe_keys_of(before_parameters, after_parameters)
|
|
1134
|
-
parameters: list[NodeParameter] =
|
|
1134
|
+
parameters: list[NodeParameter] = []
|
|
1135
1135
|
for parameter_name in parameter_names:
|
|
1136
1136
|
parameter_scope, (before_parameter, after_parameter) = self._safe_access_in(
|
|
1137
1137
|
scope, parameter_name, before_parameters, after_parameters
|
|
@@ -1201,7 +1201,7 @@ class ChangeSetModel:
|
|
|
1201
1201
|
if isinstance(node_conditions, NodeConditions):
|
|
1202
1202
|
return node_conditions
|
|
1203
1203
|
condition_names: list[str] = self._safe_keys_of(before_conditions, after_conditions)
|
|
1204
|
-
conditions: list[NodeCondition] =
|
|
1204
|
+
conditions: list[NodeCondition] = []
|
|
1205
1205
|
for condition_name in condition_names:
|
|
1206
1206
|
condition_scope, (before_condition, after_condition) = self._safe_access_in(
|
|
1207
1207
|
scope, condition_name, before_conditions, after_conditions
|
|
@@ -1253,7 +1253,7 @@ class ChangeSetModel:
|
|
|
1253
1253
|
def _visit_outputs(
|
|
1254
1254
|
self, scope: Scope, before_outputs: Maybe[dict], after_outputs: Maybe[dict]
|
|
1255
1255
|
) -> NodeOutputs:
|
|
1256
|
-
outputs: list[NodeOutput] =
|
|
1256
|
+
outputs: list[NodeOutput] = []
|
|
1257
1257
|
output_names: list[str] = self._safe_keys_of(before_outputs, after_outputs)
|
|
1258
1258
|
for output_name in output_names:
|
|
1259
1259
|
scope_output, (before_output, after_output) = self._safe_access_in(
|
|
@@ -1300,7 +1300,7 @@ class ChangeSetModel:
|
|
|
1300
1300
|
elif isinstance(value, str):
|
|
1301
1301
|
value = [NormalisedGlobalTransformDefinition(Name=value, Parameters=Nothing)]
|
|
1302
1302
|
elif isinstance(value, list):
|
|
1303
|
-
tmp_value =
|
|
1303
|
+
tmp_value = []
|
|
1304
1304
|
for item in value:
|
|
1305
1305
|
if isinstance(item, str):
|
|
1306
1306
|
tmp_value.append(
|
|
@@ -1324,7 +1324,7 @@ class ChangeSetModel:
|
|
|
1324
1324
|
) -> NodeTransform:
|
|
1325
1325
|
before_transform_normalised = self._normalise_transformer_value(before_transform)
|
|
1326
1326
|
after_transform_normalised = self._normalise_transformer_value(after_transform)
|
|
1327
|
-
global_transforms =
|
|
1327
|
+
global_transforms = []
|
|
1328
1328
|
for index, (before_global_transform, after_global_transform) in enumerate(
|
|
1329
1329
|
zip_longest(before_transform_normalised, after_transform_normalised, fillvalue=Nothing)
|
|
1330
1330
|
):
|
|
@@ -1405,8 +1405,8 @@ class ChangeSetModel:
|
|
|
1405
1405
|
conditions_scope, (before_conditions, after_conditions) = self._safe_access_in(
|
|
1406
1406
|
Scope(), ConditionsKey, self._before_template, self._after_template
|
|
1407
1407
|
)
|
|
1408
|
-
before_conditions = before_conditions or
|
|
1409
|
-
after_conditions = after_conditions or
|
|
1408
|
+
before_conditions = before_conditions or {}
|
|
1409
|
+
after_conditions = after_conditions or {}
|
|
1410
1410
|
if condition_name in before_conditions or condition_name in after_conditions:
|
|
1411
1411
|
condition_scope, (before_condition, after_condition) = self._safe_access_in(
|
|
1412
1412
|
conditions_scope, condition_name, before_conditions, after_conditions
|
|
@@ -1476,7 +1476,7 @@ class ChangeSetModel:
|
|
|
1476
1476
|
|
|
1477
1477
|
@staticmethod
|
|
1478
1478
|
def _safe_access_in(scope: Scope, key: str, *objects: Maybe[dict]) -> tuple[Scope, Maybe[Any]]:
|
|
1479
|
-
results =
|
|
1479
|
+
results = []
|
|
1480
1480
|
for obj in objects:
|
|
1481
1481
|
if not isinstance(obj, (dict, NothingType)):
|
|
1482
1482
|
raise RuntimeError(f"Invalid definition type at '{obj}'")
|
|
@@ -35,7 +35,7 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
|
|
|
35
35
|
):
|
|
36
36
|
super().__init__(change_set=change_set)
|
|
37
37
|
self._include_property_values = include_property_values
|
|
38
|
-
self._changes =
|
|
38
|
+
self._changes = []
|
|
39
39
|
|
|
40
40
|
def get_changes(self) -> cfn_api.Changes:
|
|
41
41
|
self._changes.clear()
|
|
@@ -66,9 +66,9 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
66
66
|
|
|
67
67
|
def __init__(self, change_set: ChangeSet):
|
|
68
68
|
super().__init__(change_set=change_set)
|
|
69
|
-
self.resources =
|
|
69
|
+
self.resources = {}
|
|
70
70
|
self.outputs = []
|
|
71
|
-
self._deferred_actions =
|
|
71
|
+
self._deferred_actions = []
|
|
72
72
|
self.resource_provider_executor = ResourceProviderExecutor(
|
|
73
73
|
stack_name=change_set.stack.stack_name,
|
|
74
74
|
stack_id=change_set.stack.stack_id,
|
|
@@ -205,7 +205,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
205
205
|
# references or other downstream operations.
|
|
206
206
|
if not is_nothing(before):
|
|
207
207
|
before_logical_id = delta.before.logical_id
|
|
208
|
-
before_resource = self._before_resolved_resources.get(before_logical_id,
|
|
208
|
+
before_resource = self._before_resolved_resources.get(before_logical_id, {})
|
|
209
209
|
self.resources[before_logical_id] = before_resource
|
|
210
210
|
|
|
211
211
|
# Update the latest version of this resource for downstream references.
|
|
@@ -186,8 +186,8 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
186
186
|
def __init__(self, change_set: ChangeSet):
|
|
187
187
|
self._change_set = change_set
|
|
188
188
|
self._before_resolved_resources = change_set.stack.resolved_resources
|
|
189
|
-
self._before_cache =
|
|
190
|
-
self._after_cache =
|
|
189
|
+
self._before_cache = {}
|
|
190
|
+
self._after_cache = {}
|
|
191
191
|
|
|
192
192
|
def _setup_runtime_cache(self) -> None:
|
|
193
193
|
runtime_cache_key = self.__class__.__name__
|
|
@@ -259,7 +259,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
259
259
|
raise RuntimeError(
|
|
260
260
|
f"No deployed instances of resource '{resource_logical_id}' were found"
|
|
261
261
|
)
|
|
262
|
-
properties = resolved_resource.get("Properties",
|
|
262
|
+
properties = resolved_resource.get("Properties", {})
|
|
263
263
|
# support structured properties, e.g. NestedStack.Outputs.OutputName
|
|
264
264
|
property_value: Any | None = get_value_from_path(properties, property_name)
|
|
265
265
|
|
|
@@ -480,8 +480,8 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
480
480
|
|
|
481
481
|
def visit_node_object(self, node_object: NodeObject) -> PreprocEntityDelta:
|
|
482
482
|
node_change_type = node_object.change_type
|
|
483
|
-
before =
|
|
484
|
-
after =
|
|
483
|
+
before = {} if node_change_type != ChangeType.CREATED else Nothing
|
|
484
|
+
after = {} if node_change_type != ChangeType.REMOVED else Nothing
|
|
485
485
|
for name, change_set_entity in node_object.bindings.items():
|
|
486
486
|
delta: PreprocEntityDelta = self.visit(change_set_entity=change_set_entity)
|
|
487
487
|
delta_before = delta.before
|
|
@@ -650,7 +650,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
650
650
|
sub_parameters: dict
|
|
651
651
|
if isinstance(args, str):
|
|
652
652
|
string_template = args
|
|
653
|
-
sub_parameters =
|
|
653
|
+
sub_parameters = {}
|
|
654
654
|
elif (
|
|
655
655
|
isinstance(args, list)
|
|
656
656
|
and len(args) == 2
|
|
@@ -757,7 +757,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
757
757
|
if values == "":
|
|
758
758
|
return ""
|
|
759
759
|
raise RuntimeError(f"Invalid arguments list definition for Fn::Join: '{args}'")
|
|
760
|
-
str_values: list[str] =
|
|
760
|
+
str_values: list[str] = []
|
|
761
761
|
for value in values:
|
|
762
762
|
if value is None:
|
|
763
763
|
continue
|
|
@@ -898,8 +898,8 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
898
898
|
def visit_node_parameters(
|
|
899
899
|
self, node_parameters: NodeParameters
|
|
900
900
|
) -> PreprocEntityDelta[dict[str, Any], dict[str, Any]]:
|
|
901
|
-
before_parameters =
|
|
902
|
-
after_parameters =
|
|
901
|
+
before_parameters = {}
|
|
902
|
+
after_parameters = {}
|
|
903
903
|
for parameter in node_parameters.parameters:
|
|
904
904
|
parameter_delta = self.visit(parameter)
|
|
905
905
|
parameter_before = parameter_delta.before
|
|
@@ -945,7 +945,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
945
945
|
self, logical_resource_id: str, resolved_resources: dict
|
|
946
946
|
) -> str:
|
|
947
947
|
# TODO: typing around resolved resources is needed and should be reflected here.
|
|
948
|
-
resolved_resource = resolved_resources.get(logical_resource_id,
|
|
948
|
+
resolved_resource = resolved_resources.get(logical_resource_id, {})
|
|
949
949
|
physical_resource_id: str | None = resolved_resource.get("PhysicalResourceId")
|
|
950
950
|
if not isinstance(physical_resource_id, str):
|
|
951
951
|
raise RuntimeError(f"No PhysicalResourceId found for resource '{logical_resource_id}'")
|
|
@@ -1001,8 +1001,8 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
1001
1001
|
|
|
1002
1002
|
def visit_node_array(self, node_array: NodeArray) -> PreprocEntityDelta:
|
|
1003
1003
|
node_change_type = node_array.change_type
|
|
1004
|
-
before =
|
|
1005
|
-
after =
|
|
1004
|
+
before = [] if node_change_type != ChangeType.CREATED else Nothing
|
|
1005
|
+
after = [] if node_change_type != ChangeType.REMOVED else Nothing
|
|
1006
1006
|
for change_set_entity in node_array.array:
|
|
1007
1007
|
delta: PreprocEntityDelta = self.visit(change_set_entity=change_set_entity)
|
|
1008
1008
|
delta_before = delta.before
|
|
@@ -1036,8 +1036,8 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
1036
1036
|
self, node_properties: NodeProperties
|
|
1037
1037
|
) -> PreprocEntityDelta[PreprocProperties, PreprocProperties]:
|
|
1038
1038
|
node_change_type = node_properties.change_type
|
|
1039
|
-
before_bindings =
|
|
1040
|
-
after_bindings =
|
|
1039
|
+
before_bindings = {} if node_change_type != ChangeType.CREATED else Nothing
|
|
1040
|
+
after_bindings = {} if node_change_type != ChangeType.REMOVED else Nothing
|
|
1041
1041
|
for node_property in node_properties.properties:
|
|
1042
1042
|
property_name = node_property.name
|
|
1043
1043
|
delta = self.visit(node_property)
|
|
@@ -1184,8 +1184,8 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
|
1184
1184
|
def visit_node_outputs(
|
|
1185
1185
|
self, node_outputs: NodeOutputs
|
|
1186
1186
|
) -> PreprocEntityDelta[list[PreprocOutput], list[PreprocOutput]]:
|
|
1187
|
-
before: list[PreprocOutput] =
|
|
1188
|
-
after: list[PreprocOutput] =
|
|
1187
|
+
before: list[PreprocOutput] = []
|
|
1188
|
+
after: list[PreprocOutput] = []
|
|
1189
1189
|
for node_output in node_outputs.outputs:
|
|
1190
1190
|
output_delta: PreprocEntityDelta[PreprocOutput, PreprocOutput] = self.visit(node_output)
|
|
1191
1191
|
output_before = output_delta.before
|
|
@@ -184,7 +184,7 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
|
184
184
|
macro = macros_store.get(macro_name)
|
|
185
185
|
if macro is None:
|
|
186
186
|
raise RuntimeError(f"No definitions for global transform '{macro_name}'")
|
|
187
|
-
transformation_parameters = global_transform.parameters or
|
|
187
|
+
transformation_parameters = global_transform.parameters or {}
|
|
188
188
|
transformed_template = execute_macro(
|
|
189
189
|
account_id,
|
|
190
190
|
region_name,
|
|
@@ -298,8 +298,8 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
|
298
298
|
self, node_transform: NodeTransform
|
|
299
299
|
) -> PreprocEntityDelta[list[GlobalTransform], list[GlobalTransform]]:
|
|
300
300
|
change_type = node_transform.change_type
|
|
301
|
-
before =
|
|
302
|
-
after =
|
|
301
|
+
before = [] if change_type != ChangeType.CREATED else Nothing
|
|
302
|
+
after = [] if change_type != ChangeType.REMOVED else Nothing
|
|
303
303
|
for change_set_entity in node_transform.global_transforms:
|
|
304
304
|
delta: PreprocEntityDelta[GlobalTransform, GlobalTransform] = self.visit(
|
|
305
305
|
change_set_entity=change_set_entity
|
|
@@ -73,9 +73,12 @@ def recurse_properties(properties: dict, fn: Callable) -> dict:
|
|
|
73
73
|
return _recurse_properties(deepcopy(properties), fn)
|
|
74
74
|
|
|
75
75
|
|
|
76
|
-
def keys_pascalcase_to_lower_camelcase(model: dict) -> dict:
|
|
76
|
+
def keys_pascalcase_to_lower_camelcase(model: dict, skip_keys: set = None) -> dict:
|
|
77
77
|
"""Recursively change any dicts keys to lower camelcase"""
|
|
78
78
|
|
|
79
|
+
if skip_keys:
|
|
80
|
+
return _pascal_to_camel_keys_preserve_values(model, skip_keys)
|
|
81
|
+
|
|
79
82
|
def _keys_pascalcase_to_lower_camelcase(obj):
|
|
80
83
|
if isinstance(obj, dict):
|
|
81
84
|
return {convert_pascalcase_to_lower_camelcase(k): v for k, v in obj.items()}
|
|
@@ -85,6 +88,33 @@ def keys_pascalcase_to_lower_camelcase(model: dict) -> dict:
|
|
|
85
88
|
return _recurse_properties(model, _keys_pascalcase_to_lower_camelcase)
|
|
86
89
|
|
|
87
90
|
|
|
91
|
+
def _pascal_to_camel_keys_preserve_values(model: dict, skip_keys: set = None) -> dict:
|
|
92
|
+
"""
|
|
93
|
+
Variant of keys_pascalcase_to_lower_camelcase
|
|
94
|
+
All VALUES of provided keys are skipped and not transformed to lower camelcase.
|
|
95
|
+
The keys themselves will be transformed.
|
|
96
|
+
The function simply stops recursion if a key matches, so make sure no lower level values are ignored.
|
|
97
|
+
"""
|
|
98
|
+
skip_keys = skip_keys or set()
|
|
99
|
+
|
|
100
|
+
def _transform(obj):
|
|
101
|
+
if isinstance(obj, dict):
|
|
102
|
+
new_dict = {}
|
|
103
|
+
for k, v in obj.items():
|
|
104
|
+
new_key = convert_pascalcase_to_lower_camelcase(k)
|
|
105
|
+
if k in skip_keys:
|
|
106
|
+
new_dict[new_key] = v
|
|
107
|
+
else:
|
|
108
|
+
new_dict[new_key] = _transform(v)
|
|
109
|
+
return new_dict
|
|
110
|
+
elif isinstance(obj, list):
|
|
111
|
+
return [_transform(i) for i in obj]
|
|
112
|
+
else:
|
|
113
|
+
return obj
|
|
114
|
+
|
|
115
|
+
return _transform(model)
|
|
116
|
+
|
|
117
|
+
|
|
88
118
|
def keys_lower_camelcase_to_pascalcase(model: dict) -> dict:
|
|
89
119
|
"""Recursively change any dicts keys to PascalCase"""
|
|
90
120
|
|
|
@@ -267,11 +267,11 @@ class TemplateRenderer:
|
|
|
267
267
|
# FileType.cloudcontrol_test: "test_cloudcontrol_template.py.j2",
|
|
268
268
|
FileType.parity_test: "test_parity_template.py.j2",
|
|
269
269
|
}
|
|
270
|
-
kwargs =
|
|
271
|
-
name
|
|
272
|
-
resource
|
|
273
|
-
scaffolding_version
|
|
274
|
-
|
|
270
|
+
kwargs = {
|
|
271
|
+
"name": resource_name.full_name, # AWS::SNS::Topic
|
|
272
|
+
"resource": resource_name.provider_name(), # SNSTopic
|
|
273
|
+
"scaffolding_version": f"v{SCAFFOLDING_VERSION}",
|
|
274
|
+
}
|
|
275
275
|
# TODO: we might want to segregate each provider in its own directory
|
|
276
276
|
# e.g. .../resource_providers/aws_iam_role/test_X.py vs. .../resource_providers/iam/test_X.py
|
|
277
277
|
# add extra parameters
|
|
@@ -423,7 +423,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
423
423
|
# The options might be reduce to using the current style, or passing the extra information
|
|
424
424
|
# as a metadata object. The choice should be made considering when the extra information
|
|
425
425
|
# is needed for the update graph building, or only looked up in downstream tasks (metadata).
|
|
426
|
-
request_parameters = request.get("Parameters",
|
|
426
|
+
request_parameters = request.get("Parameters", [])
|
|
427
427
|
# TODO: handle parameter defaults and resolution
|
|
428
428
|
after_parameters = self._extract_after_parameters(request_parameters, before_parameters)
|
|
429
429
|
|
|
@@ -707,7 +707,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
707
707
|
# The options might be reduce to using the current style, or passing the extra information
|
|
708
708
|
# as a metadata object. The choice should be made considering when the extra information
|
|
709
709
|
# is needed for the update graph building, or only looked up in downstream tasks (metadata).
|
|
710
|
-
request_parameters = request.get("Parameters",
|
|
710
|
+
request_parameters = request.get("Parameters", [])
|
|
711
711
|
# TODO: handle parameter defaults and resolution
|
|
712
712
|
after_parameters = self._extract_after_parameters(request_parameters)
|
|
713
713
|
after_template = structured_template
|
|
@@ -1328,7 +1328,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
1328
1328
|
# The options might be reduce to using the current style, or passing the extra information
|
|
1329
1329
|
# as a metadata object. The choice should be made considering when the extra information
|
|
1330
1330
|
# is needed for the update graph building, or only looked up in downstream tasks (metadata).
|
|
1331
|
-
request_parameters = request.get("Parameters",
|
|
1331
|
+
request_parameters = request.get("Parameters", [])
|
|
1332
1332
|
# TODO: handle parameter defaults and resolution
|
|
1333
1333
|
after_parameters = self._extract_after_parameters(request_parameters, before_parameters)
|
|
1334
1334
|
|
|
@@ -146,7 +146,7 @@ class RuntimeImageResolver:
|
|
|
146
146
|
def __init__(
|
|
147
147
|
self, default_resolve_fn: Callable[[Runtime], str] = get_default_image_for_runtime
|
|
148
148
|
):
|
|
149
|
-
self._mapping =
|
|
149
|
+
self._mapping = {}
|
|
150
150
|
self._default_resolve_fn = default_resolve_fn
|
|
151
151
|
|
|
152
152
|
def _resolve(self, runtime: Runtime, custom_image_mapping: str = "") -> str:
|
|
@@ -521,7 +521,7 @@ def moto_smb_list_secret_version_ids(
|
|
|
521
521
|
secret = self.secrets[secret_id]
|
|
522
522
|
|
|
523
523
|
# Patch: output format, report exact createdate instead of current time.
|
|
524
|
-
versions: list[SecretVersionsListEntry] =
|
|
524
|
+
versions: list[SecretVersionsListEntry] = []
|
|
525
525
|
for version_id, version in secret.versions.items():
|
|
526
526
|
version_stages = version["version_stages"]
|
|
527
527
|
# Patch: include deprecated versions if include_deprecated is True.
|
|
@@ -461,7 +461,7 @@ class MessageMoveTaskManager:
|
|
|
461
461
|
def __init__(self, stores: AccountRegionBundle[SqsStore] = None) -> None:
|
|
462
462
|
self.stores = stores or sqs_stores
|
|
463
463
|
self.mutex = threading.RLock()
|
|
464
|
-
self.move_tasks: dict[str, MessageMoveTask] =
|
|
464
|
+
self.move_tasks: dict[str, MessageMoveTask] = {}
|
|
465
465
|
self.executor = ThreadPoolExecutor(max_workers=100, thread_name_prefix="sqs-move-message")
|
|
466
466
|
|
|
467
467
|
def submit(self, move_task: MessageMoveTask):
|
|
@@ -15,7 +15,7 @@ class AssignDecl(EvalComponent):
|
|
|
15
15
|
self.declaration_bindings = declaration_bindings
|
|
16
16
|
|
|
17
17
|
def _eval_body(self, env: Environment) -> None:
|
|
18
|
-
declarations: dict[str, Any] =
|
|
18
|
+
declarations: dict[str, Any] = {}
|
|
19
19
|
for declaration_binding in self.declaration_bindings:
|
|
20
20
|
declaration_binding.eval(env=env)
|
|
21
21
|
binding: dict[str, Any] = env.stack.pop()
|
|
@@ -40,7 +40,7 @@ def _error_name(error_name: StatesErrorNameType) -> str:
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
def _reverse_error_name_lookup() -> dict[str, StatesErrorNameType]:
|
|
43
|
-
lookup: dict[str, StatesErrorNameType] =
|
|
43
|
+
lookup: dict[str, StatesErrorNameType] = {}
|
|
44
44
|
for error_name in StatesErrorNameType:
|
|
45
45
|
error_text: str = _error_name(error_name)
|
|
46
46
|
lookup[error_text] = error_name
|
|
@@ -29,7 +29,7 @@ class InputPath(EvalComponent):
|
|
|
29
29
|
|
|
30
30
|
def _eval_body(self, env: Environment) -> None:
|
|
31
31
|
if self.string_sampler is None:
|
|
32
|
-
env.stack.append(
|
|
32
|
+
env.stack.append({})
|
|
33
33
|
return
|
|
34
34
|
if isinstance(self.string_sampler, StringJsonPath):
|
|
35
35
|
# JsonPaths are sampled from a given state, hence pass the state's input.
|
|
@@ -11,7 +11,7 @@ class PayloadArr(PayloadValue):
|
|
|
11
11
|
self.payload_values: Final[list[PayloadValue]] = payload_values
|
|
12
12
|
|
|
13
13
|
def _eval_body(self, env: Environment) -> None:
|
|
14
|
-
arr =
|
|
14
|
+
arr = []
|
|
15
15
|
for payload_value in self.payload_values:
|
|
16
16
|
payload_value.eval(env)
|
|
17
17
|
arr.append(env.stack.pop())
|
|
@@ -14,6 +14,6 @@ class PayloadTmpl(PayloadValue):
|
|
|
14
14
|
self.payload_bindings: Final[list[PayloadBinding]] = payload_bindings
|
|
15
15
|
|
|
16
16
|
def _eval_body(self, env: Environment) -> None:
|
|
17
|
-
env.stack.append(
|
|
17
|
+
env.stack.append({})
|
|
18
18
|
for payload_binding in self.payload_bindings:
|
|
19
19
|
payload_binding.eval(env)
|
|
@@ -129,7 +129,7 @@ class StringVariableSample(StringSampler):
|
|
|
129
129
|
expression_variable_references: set[VariableReference] = (
|
|
130
130
|
extract_jsonata_variable_references(self.expression)
|
|
131
131
|
)
|
|
132
|
-
variable_declarations_list =
|
|
132
|
+
variable_declarations_list = []
|
|
133
133
|
if self.query_language_mode == QueryLanguageMode.JSONata:
|
|
134
134
|
# Sample $states values into expression.
|
|
135
135
|
states_variable_declarations: VariableDeclarations = (
|