From ec153761dcfdf67451d5e6db33ee8e76d1b9f3a1 Mon Sep 17 00:00:00 2001 From: ndrwnaguib <24280372+ndrwnaguib@users.noreply.github.com> Date: Mon, 21 Aug 2023 12:54:19 -0700 Subject: [PATCH] config: validate `ignore-from-file` in `validate_rule_conf` This fixes commit 2f8ad70 "config: Implement for `ignore-from-file` option" that lacked rule config validation. Closes https://github.com/adrienverge/yamllint/issues/542. --- tests/test_config.py | 19 ++++++++++++++++--- yamllint/config.py | 17 +++++++++++++++-- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index 8e90246d..13d7ab3b 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -212,6 +212,14 @@ def test_invalid_rule_ignore(self): ' colons:\n' ' ignore: yes\n') + def test_invalid_rule_ignore_from_file(self): + self.assertRaises( + config.YamlLintConfigError, + config.YamlLintConfig, + 'rules:\n' + ' colons:\n' + ' ignore-from-file: 1337\n') + def test_invalid_locale(self): with self.assertRaisesRegex( config.YamlLintConfigError, @@ -660,12 +668,19 @@ def test_run_with_ignore_list(self): def test_run_with_ignore_from_file(self): with open(os.path.join(self.wd, '.yamllint'), 'w') as f: f.write('extends: default\n' - 'ignore-from-file: .gitignore\n') + 'ignore-from-file: .gitignore\n' + 'rules:\n' + ' key-duplicates:\n' + ' ignore-from-file: .ignore-key-duplicates\n') + with open(os.path.join(self.wd, '.gitignore'), 'w') as f: f.write('*.dont-lint-me.yaml\n' '/bin/\n' '!/bin/*.lint-me-anyway.yaml\n') + with open(os.path.join(self.wd, '.ignore-key-duplicates'), 'w') as f: + f.write('/ign-dup\n') + sys.stdout = StringIO() with self.assertRaises(SystemExit): cli.run(('-f', 'parsable', '.')) @@ -686,10 +701,8 @@ def test_run_with_ignore_from_file(self): './file-at-root.yaml:3:3: ' + keydup, './file-at-root.yaml:4:17: ' + trailing, './file-at-root.yaml:5:5: ' + hyphen, - './ign-dup/file.yaml:3:3: ' + keydup, './ign-dup/file.yaml:4:17: ' + trailing, './ign-dup/file.yaml:5:5: ' + hyphen, - './ign-dup/sub/dir/file.yaml:3:3: ' + keydup, './ign-dup/sub/dir/file.yaml:4:17: ' + trailing, './ign-dup/sub/dir/file.yaml:5:5: ' + hyphen, './ign-trail/file.yaml:3:3: ' + keydup, diff --git a/yamllint/config.py b/yamllint/config.py index 47a61a86..b07229f5 100644 --- a/yamllint/config.py +++ b/yamllint/config.py @@ -153,8 +153,21 @@ def validate_rule_conf(rule, conf): return False if isinstance(conf, dict): - if ('ignore' in conf and - not isinstance(conf['ignore'], pathspec.pathspec.PathSpec)): + if ('ignore-from-file' in conf and not isinstance( + conf['ignore-from-file'], pathspec.pathspec.PathSpec)): + if isinstance(conf['ignore-from-file'], str): + conf['ignore-from-file'] = [conf['ignore-from-file']] + if not (isinstance(conf['ignore-from-file'], list) + and all(isinstance(line, str) + for line in conf['ignore-from-file'])): + raise YamlLintConfigError( + 'invalid config: ignore-from-file should contain ' + 'valid filename(s), either as a list or string') + with fileinput.input(conf['ignore-from-file']) as f: + conf['ignore'] = pathspec.PathSpec.from_lines( + 'gitwildmatch', f) + elif ('ignore' in conf and not isinstance( + conf['ignore'], pathspec.pathspec.PathSpec)): if isinstance(conf['ignore'], str): conf['ignore'] = pathspec.PathSpec.from_lines( 'gitwildmatch', conf['ignore'].splitlines())