Skip to content

Commit 365b0f1

Browse files
authored
Commonize how SAM transform checks are done (#4043)
1 parent 5dc59d3 commit 365b0f1

File tree

11 files changed

+32
-32
lines changed

11 files changed

+32
-32
lines changed

src/cfnlint/context/context.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
FUNCTIONS,
2020
PSEUDOPARAMS,
2121
REGION_PRIMARY,
22+
TRANSFORM_LANGUAGE_EXTENSION,
2223
TRANSFORM_SAM,
2324
)
2425
from cfnlint.schema import PROVIDER_SCHEMA_MANAGER, AttributeDict
@@ -52,10 +53,11 @@ def __post_init__(self, transforms) -> None:
5253
)
5354

5455
def has_language_extensions_transform(self):
55-
lang_extensions_transform = "AWS::LanguageExtensions"
56-
return bool(lang_extensions_transform in self._transforms)
56+
return bool(TRANSFORM_LANGUAGE_EXTENSION in self._transforms)
5757

5858
def has_sam_transform(self):
59+
# this function will always return False as SAM transform
60+
# will eliminate itself when the transform is done
5961
return bool(TRANSFORM_SAM in self._transforms)
6062

6163

src/cfnlint/helpers.py

+1
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@
357357
BOOLEAN_STRINGS = frozenset(list(BOOLEAN_STRINGS_TRUE) + list(BOOLEAN_STRINGS_FALSE))
358358

359359
TRANSFORM_SAM = "AWS::Serverless-2016-10-31"
360+
TRANSFORM_LANGUAGE_EXTENSION = "AWS::LanguageExtensions"
360361

361362

362363
# pylint: disable=missing-class-docstring

src/cfnlint/rules/functions/ToJsonString.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from typing import Any
99

10-
from cfnlint.helpers import PSEUDOPARAMS
10+
from cfnlint.helpers import PSEUDOPARAMS, TRANSFORM_LANGUAGE_EXTENSION
1111
from cfnlint.jsonschema import ValidationError, ValidationResult, Validator
1212
from cfnlint.rules.functions._BaseFn import BaseFn
1313

@@ -64,7 +64,7 @@ def fn_tojsonstring(
6464
yield ValidationError(
6565
(
6666
f"{self.fn.name} is not supported without "
67-
"'AWS::LanguageExtensions' transform"
67+
f"{TRANSFORM_LANGUAGE_EXTENSION!r} transform"
6868
),
6969
validator=self.fn.py,
7070
rule=self,

src/cfnlint/rules/parameters/Used.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ class Used(CloudFormationLintRule):
2020
tags = ["parameters"]
2121

2222
def match(self, cfn: Template) -> RuleMatches:
23-
if cfn.transform_pre["Transform"]:
24-
return []
2523
matches: RuleMatches = []
24+
if cfn.transform_pre["Transform"]:
25+
return matches
2626

2727
le_refs = None
2828
if cfn.has_language_extensions_transform():

src/cfnlint/rules/resources/HardCodedArnProperties.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import regex as re
77

88
from cfnlint._typing import RuleMatches
9-
from cfnlint.helpers import TRANSFORM_SAM
109
from cfnlint.rules import CloudFormationLintRule, RuleMatch
1110
from cfnlint.template import Template
1211

@@ -86,9 +85,7 @@ def match_values(self, cfn):
8685
def match(self, cfn: Template) -> RuleMatches:
8786
matches: RuleMatches = []
8887

89-
transforms = cfn.transform_pre["Transform"]
90-
transforms = transforms if isinstance(transforms, list) else [transforms]
91-
if TRANSFORM_SAM in cfn.transform_pre["Transform"]:
88+
if cfn.has_serverless_transform():
9289
return matches
9390

9491
# Get a list of paths to every leaf node string containing at least one ${parameter}

src/cfnlint/rules/resources/ServerlessTransform.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def validate(
3131
if not validator.is_type(instance, "string"):
3232
return
3333

34-
if validator.context.transforms.has_sam_transform():
34+
if validator.cfn.has_serverless_transform():
3535
return
3636

3737
if instance.startswith("AWS::Serverless::"):

src/cfnlint/rules/resources/iam/Permissions.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import regex as re
1111

1212
from cfnlint.data import AdditionalSpecs
13-
from cfnlint.helpers import TRANSFORM_SAM, ensure_list, load_resource
13+
from cfnlint.helpers import ensure_list, load_resource
1414
from cfnlint.jsonschema import ValidationError, ValidationResult, Validator
1515
from cfnlint.rules.jsonschema.CfnLintKeyword import CfnLintKeyword
1616

@@ -41,7 +41,7 @@ def validate(
4141
) -> ValidationResult:
4242
# Escape validation when using SAM transforms as a result of
4343
# https://github.com/aws/serverless-application-model/issues/3633
44-
if TRANSFORM_SAM in validator.cfn.transform_pre["Transform"]:
44+
if validator.cfn.has_serverless_transform():
4545
return
4646

4747
actions = ensure_list(instance)

src/cfnlint/template/template.py

+4-14
Original file line numberDiff line numberDiff line change
@@ -142,28 +142,18 @@ def has_language_extensions_transform(self) -> bool:
142142
Returns:
143143
bool: True if the AWS::LanguageExtensions transform is declared, False otherwise.
144144
"""
145-
lang_extensions_transform = "AWS::LanguageExtensions"
146-
transform_declaration = self.transform_pre["Transform"]
147-
transform_type = (
148-
transform_declaration
149-
if isinstance(transform_declaration, list)
150-
else [transform_declaration]
145+
return bool(
146+
cfnlint.helpers.TRANSFORM_LANGUAGE_EXTENSION
147+
in self.transform_pre["Transform"]
151148
)
152-
return bool(lang_extensions_transform in transform_type)
153149

154150
def has_serverless_transform(self) -> bool:
155151
"""Check if the template has the AWS::Serverless-2016-10-31 transform declared.
156152
157153
Returns:
158154
bool: True if the AWS::Serverless-2016-10-31 transform is declared, False otherwise.
159155
"""
160-
transform_declaration = self.transform_pre["Transform"]
161-
transform_type = (
162-
transform_declaration
163-
if isinstance(transform_declaration, list)
164-
else [transform_declaration]
165-
)
166-
return bool(cfnlint.helpers.TRANSFORM_SAM in transform_type)
156+
return bool(cfnlint.helpers.TRANSFORM_SAM in self.transform_pre["Transform"])
167157

168158
def is_cdk_template(self) -> bool:
169159
"""Check if the template was created by the AWS Cloud Development Kit (CDK).

src/cfnlint/template/transforms/_sam.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@
1717

1818
from cfnlint.data import Serverless
1919
from cfnlint.decode.utils import convert_dict
20-
from cfnlint.helpers import ensure_list, is_function, load_resource
20+
from cfnlint.helpers import (
21+
TRANSFORM_LANGUAGE_EXTENSION,
22+
ensure_list,
23+
is_function,
24+
load_resource,
25+
)
2126
from cfnlint.template.transforms._types import TransformResult
2227

2328
LOGGER = logging.getLogger("cfnlint")
@@ -148,7 +153,7 @@ def _replace_variables_with_language_extension(self):
148153
transforms = self._template.get("Transform", [])
149154

150155
transforms = ensure_list(transforms)
151-
if "AWS::LanguageExtensions" in transforms:
156+
if TRANSFORM_LANGUAGE_EXTENSION in transforms:
152157
parameters = {}
153158
for k, v in self._template.get("Parameters", {}).items():
154159
p_type = v.get("Type")

src/cfnlint/template/transforms/transform.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@
1111
from cfnlint.conditions import Conditions
1212
from cfnlint.context import create_context_for_template
1313
from cfnlint.graph import Graph
14-
from cfnlint.helpers import TRANSFORM_SAM, format_json_string
14+
from cfnlint.helpers import (
15+
TRANSFORM_LANGUAGE_EXTENSION,
16+
TRANSFORM_SAM,
17+
format_json_string,
18+
)
1519
from cfnlint.match import Match
1620
from cfnlint.template.transforms._language_extensions import language_extension
1721
from cfnlint.template.transforms._sam import sam
@@ -24,7 +28,7 @@ class Transform:
2428
def __init__(self) -> None:
2529
self.transforms: Mapping[str, Callable[[Any], TransformResult]] = {
2630
TRANSFORM_SAM: sam,
27-
"AWS::LanguageExtensions": language_extension,
31+
TRANSFORM_LANGUAGE_EXTENSION: language_extension,
2832
}
2933

3034
def transform(self, cfn: Any) -> list[Match]:

test/unit/rules/resources/test_serverless_transform.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def rule():
5656
],
5757
indirect=["template"],
5858
)
59-
def test_validate(name, instance, template, expected, rule, validator):
59+
def test_validate(name, instance, template, expected, rule, validator, cfn):
60+
print(cfn.transform_pre)
6061
errors = list(rule.validate(validator, False, instance, {}))
6162
assert errors == expected, f"Test {name!r} got {errors!r}"

0 commit comments

Comments
 (0)