diff --git a/src/cfnlint/config.py b/src/cfnlint/config.py index a7c27f4985..f7472575fc 100644 --- a/src/cfnlint/config.py +++ b/src/cfnlint/config.py @@ -1052,7 +1052,10 @@ def _glob_filenames( all_filenames = [] for filename in filenames: - add_filenames = glob.glob(filename, recursive=True) + if Path(filename).is_file(): + add_filenames = [filename] + else: + add_filenames = glob.glob(filename, recursive=True) if not add_filenames and not self.ignore_bad_template: if raise_exception: diff --git a/test/unit/module/config/test_config_mixin.py b/test/unit/module/config/test_config_mixin.py index 06a21ffaf3..28314105d0 100644 --- a/test/unit/module/config/test_config_mixin.py +++ b/test/unit/module/config/test_config_mixin.py @@ -5,6 +5,7 @@ import logging import os +import tempfile from pathlib import Path from test.testlib.testcase import BaseTestCase from unittest.mock import patch @@ -199,6 +200,18 @@ def test_config_expand_paths(self, isatty_mock, yaml_mock): ], ) + @patch("cfnlint.config.ConfigFileArgs._read_config", create=True) + def test_config_literal_path_with_glob_characters(self, yaml_mock): + """Test literal paths containing glob metacharacters.""" + yaml_mock.side_effect = [{}, {}] + with tempfile.TemporaryDirectory() as temp_dir: + filename = Path(temp_dir) / "template[1].yaml" + filename.touch() + + config = cfnlint.config.ConfigMixIn(templates=[str(filename)]) + + self.assertEqual(config.templates, [str(filename)]) + @patch("cfnlint.config.ConfigFileArgs._read_config", create=True) @patch("sys.stdin.isatty", return_va=True) def test_config_expand_paths_nomatch(self, isatty_mock, yaml_mock):