From bf912cfebb8fdd3d16bb9335e93f7c9dada949f8 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Fri, 6 Jun 2014 06:53:00 -0700 Subject: [PATCH] Add checking for manifest files regex. --- pre_commit/clientlib/validate_base.py | 9 ++++++ pre_commit/clientlib/validate_config.py | 6 ++-- pre_commit/clientlib/validate_manifest.py | 34 ++++++++++++++++------- tests/clientlib/validate_manifest_test.py | 15 ++++++---- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/pre_commit/clientlib/validate_base.py b/pre_commit/clientlib/validate_base.py index 1b8856aa..27f363a9 100644 --- a/pre_commit/clientlib/validate_base.py +++ b/pre_commit/clientlib/validate_base.py @@ -4,12 +4,21 @@ import argparse import jsonschema import jsonschema.exceptions import os.path +import re import yaml from pre_commit.jsonschema_extensions import apply_defaults from pre_commit.util import entry +def is_regex_valid(regex): + try: + re.compile(regex) + return True + except re.error: + return False + + def get_validator( json_schema, exception_type, diff --git a/pre_commit/clientlib/validate_config.py b/pre_commit/clientlib/validate_config.py index d9f97698..997c84fe 100644 --- a/pre_commit/clientlib/validate_config.py +++ b/pre_commit/clientlib/validate_config.py @@ -1,8 +1,8 @@ -import re import sys from pre_commit.clientlib.validate_base import get_run_function from pre_commit.clientlib.validate_base import get_validator +from pre_commit.clientlib.validate_base import is_regex_valid class InvalidConfigError(ValueError): @@ -42,9 +42,7 @@ CONFIG_JSON_SCHEMA = { def try_regex(repo, hook, value, field_name): - try: - re.compile(value) - except re.error: + if not is_regex_valid(value): raise InvalidConfigError( 'Invalid {0} regex at {1}, {2}: {3}'.format( field_name, repo, hook, value, diff --git a/pre_commit/clientlib/validate_manifest.py b/pre_commit/clientlib/validate_manifest.py index 72e8a53f..fed5a033 100644 --- a/pre_commit/clientlib/validate_manifest.py +++ b/pre_commit/clientlib/validate_manifest.py @@ -2,6 +2,7 @@ import sys from pre_commit.clientlib.validate_base import get_run_function from pre_commit.clientlib.validate_base import get_validator +from pre_commit.clientlib.validate_base import is_regex_valid from pre_commit.languages.all import all_languages @@ -29,18 +30,31 @@ MANIFEST_JSON_SCHEMA = { } +def validate_languages(hook_config): + if hook_config['language'] not in all_languages: + raise InvalidManifestError( + 'Expected language {0} for {1} to be one of {2!r}'.format( + hook_config['id'], + hook_config['language'], + all_languages, + ) + ) + + +def validate_files(hook_config): + if not is_regex_valid(hook_config['files']): + raise InvalidManifestError( + 'Invalid files regex at {0}: {1}'.format( + hook_config['id'], + hook_config['files'], + ) + ) + + def additional_manifest_check(obj): for hook_config in obj: - language = hook_config['language'] - - if language not in all_languages: - raise InvalidManifestError( - 'Expected language {0} for {1} to be one of {2!r}'.format( - hook_config['id'], - hook_config['language'], - all_languages, - ) - ) + validate_languages(hook_config) + validate_files(hook_config) load_manifest = get_validator( diff --git a/tests/clientlib/validate_manifest_test.py b/tests/clientlib/validate_manifest_test.py index 800d292b..5dba2747 100644 --- a/tests/clientlib/validate_manifest_test.py +++ b/tests/clientlib/validate_manifest_test.py @@ -28,20 +28,25 @@ def test_additional_manifest_check_raises_for_bad_language(): @pytest.mark.parametrize( - 'obj', ([{'language': 'python'}], [{'language': 'ruby'}]), + 'obj', + ( + [{'language': 'python', 'files': ''}], + [{'language': 'ruby', 'files': ''}] + ), ) -def test_additional_manifest_check_languages(obj): +def test_additional_manifest_check_passing(obj): additional_manifest_check(obj) @pytest.mark.parametrize( 'obj', ( - [{'id': 'a', 'language': 'not a language'}], - [{'id': 'a', 'language': 'python3'}], + [{'id': 'a', 'language': 'not a language', 'files': ''}], + [{'id': 'a', 'language': 'python3', 'files': ''}], + [{'id': 'a', 'language': 'python', 'files': 'invalid regex('}], ), ) -def test_additional_manifest_check_languages_failing(obj): +def test_additional_manifest_failing(obj): with pytest.raises(InvalidManifestError): additional_manifest_check(obj)