Skip to content

Commit 1e79c52

Browse files
committed
More additions to testing
1 parent f58f5a9 commit 1e79c52

File tree

14 files changed

+319
-95
lines changed

14 files changed

+319
-95
lines changed

src/cfnlint/config.py

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -250,17 +250,6 @@ def comma_separated_arg(string):
250250
return string.split(",")
251251

252252

253-
class key_value(argparse.Action):
254-
def __call__(self, parser, namespace, values, option_string=None):
255-
setattr(namespace, self.dest, dict())
256-
257-
for value in values:
258-
# split it into key and value
259-
key, value = value.split("=", 1)
260-
# assign into dictionary
261-
getattr(namespace, self.dest)[key.strip()] = value.strip()
262-
263-
264253
def _ensure_value(namespace, name, value):
265254
if getattr(namespace, name, None) is None:
266255
setattr(namespace, name, value)
@@ -324,7 +313,7 @@ def __call__(self, parser, namespace, values, option_string=None):
324313
setattr(namespace, self.dest, items)
325314
except Exception: # pylint: disable=W0703
326315
parser.print_help()
327-
parser.exit()
316+
parser.exit(32)
328317

329318

330319
class ExtendKeyValuePairs(argparse.Action):
@@ -366,7 +355,7 @@ def __call__(self, parser, namespace, values, option_string=None):
366355
setattr(namespace, self.dest, result)
367356
except Exception: # pylint: disable=W0703
368357
parser.print_help()
369-
parser.exit()
358+
parser.exit(1)
370359

371360

372361
class ExtendAction(argparse.Action):
@@ -460,9 +449,8 @@ def error(self, message):
460449
action="extend",
461450
)
462451
parameter_group.add_argument(
463-
"-tp",
464-
"--template-parameters",
465-
dest="template_parameters",
452+
"--parameters",
453+
dest="parameters",
466454
nargs="+",
467455
default=[],
468456
action="extend_key_value",
@@ -693,7 +681,7 @@ class ManualArgs(TypedDict, total=False):
693681
non_zero_exit_code: str
694682
output_file: str
695683
regions: list
696-
template_parameters: list[dict[str, Any]]
684+
parameters: list[dict[str, Any]]
697685

698686

699687
# pylint: disable=too-many-public-methods
@@ -730,7 +718,7 @@ def __repr__(self):
730718
"non_zero_exit_code": self.non_zero_exit_code,
731719
"override_spec": self.override_spec,
732720
"regions": self.regions,
733-
"template_parameters": self.template_parameters,
721+
"parameters": self.parameters,
734722
"templates": self.templates,
735723
}
736724
)
@@ -890,12 +878,12 @@ def append_rules(self):
890878
)
891879

892880
@property
893-
def template_parameters(self):
894-
return self._get_argument_value("template_parameters", True, True)
881+
def parameters(self):
882+
return self._get_argument_value("parameters", True, True)
895883

896-
@template_parameters.setter
897-
def template_parameters(self, template_parameters: list[dict[str, Any]]):
898-
self._manual_args["template_parameters"] = template_parameters
884+
@parameters.setter
885+
def parameters(self, parameters: list[dict[str, Any]]):
886+
self._manual_args["parameters"] = parameters
899887

900888
@property
901889
def override_spec(self):

src/cfnlint/rules/deployment_files/Parameters.py

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def __init__(self):
3232
)
3333

3434
def _is_type_a_list(self, parameter_type: str) -> bool:
35-
return "List" in parameter_type and "CommaDelimitedList" not in parameter_type
35+
return "List" in parameter_type
3636

3737
def _build_schema(self, instance: Any) -> dict[str, Any]:
3838
if not isinstance(instance, dict):
@@ -58,32 +58,23 @@ def _build_schema(self, instance: Any) -> dict[str, Any]:
5858
if not isinstance(parameter_type, str):
5959
continue
6060

61+
schema_constraints = {}
62+
if "AllowedValues" in parameter_object:
63+
schema_constraints["enum"] = parameter_object["AllowedValues"]
64+
if "Pattern" in parameter_object:
65+
schema_constraints["pattern"] = parameter_object["Pattern"]
66+
6167
if self._is_type_a_list(parameter_type):
6268
schema["properties"][parameter_name] = {
6369
"type": "array",
6470
"items": {
6571
"type": singular_types,
6672
},
6773
}
68-
if "AllowedValues" in parameter_object:
69-
schema["properties"][parameter_name]["items"]["enum"] = (
70-
parameter_object["AllowedValues"]
71-
)
72-
if "Pattern" in parameter_object:
73-
if self._is_type_a_list(parameter_type):
74-
schema["properties"][parameter_name]["items"]["pattern"] = (
75-
parameter_object["Pattern"]
76-
)
74+
schema["properties"][parameter_name]["items"].update(schema_constraints)
7775
else:
7876
schema["properties"][parameter_name]["type"] = singular_types
79-
if "AllowedValues" in parameter_object:
80-
schema["properties"][parameter_name]["enum"] = parameter_object[
81-
"AllowedValues"
82-
]
83-
if "Pattern" in parameter_object:
84-
schema["properties"][parameter_name]["pattern"] = parameter_object[
85-
"Pattern"
86-
]
77+
schema["properties"][parameter_name].update(schema_constraints)
8778

8879
return schema
8980

src/cfnlint/runner/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
]
1616

1717
from cfnlint.runner.cli import Runner, main
18-
from cfnlint.runner.deployment_file import run_deployment_file
18+
from cfnlint.runner.deployment_file import run_deployment_files
1919
from cfnlint.runner.exceptions import (
2020
CfnLintExitException,
2121
InvalidRegionException,

src/cfnlint/runner/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def cli(self) -> None:
307307

308308
if self.config.templates and self.config.deployment_files:
309309
self.config.parser.print_help()
310-
sys.exit(1)
310+
sys.exit(32)
311311

312312
try:
313313
self._cli_output(list(self.run()))

src/cfnlint/runner/deployment_file/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
SPDX-License-Identifier: MIT-0
44
"""
55

6-
__all__ = ["run_deployment_file"]
6+
__all__ = ["run_deployment_files"]
77

8-
from cfnlint.runner.deployment_file.runner import run_deployment_file
8+
from cfnlint.runner.deployment_file.runner import run_deployment_files

src/cfnlint/runner/deployment_file/runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def run_deployment_file(
6868
)
6969
template_path = Path(filename).parent / deployment_data.template_file_path
7070
template_config = deepcopy(config)
71-
template_config.template_parameters = [deployment_data.parameters]
71+
template_config.parameters = [deployment_data.parameters]
7272

7373
yield from run_template_by_file_path(
7474
filename=template_path,

src/cfnlint/runner/template/runner.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ def _run_template(
107107
) -> Iterator[Match]:
108108

109109
config.set_template_args(template)
110-
if config.template_parameters:
110+
if config.parameters:
111111
matches: list[Match] = []
112-
for template_parameters in config.template_parameters:
113-
cfn = Template(filename, template, config.regions, template_parameters)
112+
for parameters in config.parameters:
113+
cfn = Template(filename, template, config.regions, parameters)
114114
matches.extend(list(_run_template_per_config(cfn, config, rules)))
115115
yield from _dedup(iter(matches))
116116
else:

test/integration/test_run_deployment_files.py

Whitespace-only changes.

test/unit/module/config/test_cli_args.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,14 @@ def test_create_parser_rule_configuration(self):
121121
{"E3012": {"key": "value", "strict": "true"}, "E3001": {"key": "value"}},
122122
)
123123

124+
@patch("argparse.ArgumentParser.print_help")
125+
def test_bad_rule_configuration(self, mock_print_help):
126+
with self.assertRaises(SystemExit) as e:
127+
cfnlint.config.CliArgs(["-x", "E3012:key;value"])
128+
129+
self.assertEqual(e.exception.code, 32)
130+
mock_print_help.assert_called_once()
131+
124132
def test_exit_code_parameter(self):
125133
"""Test values of exit code"""
126134

test/unit/module/config/test_config_mixin.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,56 @@ def test_config_merge(self, yaml_mock):
277277
)
278278
# template file wins over config file
279279
self.assertEqual(config.ignore_checks, ["W3001", "E3001"])
280+
281+
@patch("cfnlint.config.ConfigFileArgs._read_config", create=True)
282+
def test_parameters(self, yaml_mock):
283+
yaml_mock.side_effect = [{}, {}]
284+
config = cfnlint.config.ConfigMixIn(["--parameters", "Foo=Bar"])
285+
286+
# test defaults
287+
self.assertEqual(config.parameters, [{"Foo": "Bar"}])
288+
289+
@patch("cfnlint.config.ConfigFileArgs._read_config", create=True)
290+
def test_parameters_lists(self, yaml_mock):
291+
yaml_mock.side_effect = [{}, {}]
292+
config = cfnlint.config.ConfigMixIn(["--parameters", "A=1", "B=2"])
293+
294+
# test defaults
295+
self.assertEqual(config.parameters, [{"A": "1", "B": "2"}])
296+
297+
@patch("cfnlint.config.ConfigFileArgs._read_config", create=True)
298+
def test_parameters_lists_bad_value(self, yaml_mock):
299+
yaml_mock.side_effect = [{}, {}]
300+
301+
with patch("sys.exit") as exit:
302+
cfnlint.config.ConfigMixIn(
303+
[
304+
"--parameters",
305+
"A",
306+
]
307+
)
308+
exit.assert_called_once_with(1)
309+
310+
@patch("cfnlint.config.ConfigFileArgs._read_config", create=True)
311+
def test_template_files(self, yaml_mock):
312+
yaml_mock.side_effect = [{}, {}]
313+
config = cfnlint.config.ConfigMixIn(["--deployment-files", "file1.json"])
314+
315+
# test defaults
316+
self.assertEqual(config.deployment_files, ["file1.json"])
317+
318+
@patch("argparse.ArgumentParser.print_help")
319+
def test_templates_with_deployment_files(self, mock_print_help):
320+
321+
with self.assertRaises(SystemExit) as e:
322+
cfnlint.config.ConfigMixIn(
323+
[
324+
"--deployment-files",
325+
"test/fixtures/templates/good/generic.yaml",
326+
"--template",
327+
"test/fixtures/templates/good/generic.yaml",
328+
]
329+
)
330+
331+
self.assertEqual(e.exception.code, 32)
332+
mock_print_help.assert_called_once()

0 commit comments

Comments
 (0)