diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index 0adbf3060..d2077e091 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -1124,6 +1124,26 @@ def test_enum_allows_non_unique_items(self): self.Validator.check_schema({"enum": [12, 12]}) +class InvalidRegexMixin(object): + def test_invalid_patternProperty(self): + with self.assertRaises(exceptions.SchemaError): + self.Validator.check_schema( + {"patternProperties":{"\q": {"type": "number"}}}, + ) + + def test_invalid_pattern(self): + with self.assertRaises(exceptions.SchemaError): + self.Validator.check_schema({"pattern": "\q"}) + + +class TestDraft6InvalidRegex(InvalidRegexMixin, TestCase): + Validator = validators.Draft6Validator + + +class TestDraft7InvalidRegex(InvalidRegexMixin, TestCase): + Validator = validators.Draft7Validator + + class ValidatorTestMixin(MetaSchemaTestsMixin, object): def test_valid_instances_are_valid(self): schema, instance = self.valid diff --git a/jsonschema/validators.py b/jsonschema/validators.py index 7b7d76dfb..54b510bf3 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -8,6 +8,7 @@ from six import add_metaclass from jsonschema import ( + _format, _legacy_validators, _types, _utils, @@ -158,6 +159,7 @@ def create( default_types=None, type_checker=None, id_of=_id_of, + format_checker=None, ): """ Create a new validator class. @@ -208,7 +210,14 @@ def create( id_of (callable): - A function that given a schema, returns its ID. + a function that given a schema, returns its ID. + + format_checker (jsonschema.FormatChecker): + + a format checker, used when applying the :validator:`format` + validator. + + If unprovided, none will be associated. Returns: @@ -284,8 +293,9 @@ def __init__( self.schema = schema @classmethod - def check_schema(cls, schema): - for error in cls(cls.META_SCHEMA).iter_errors(schema): + def check_schema(cls, schema, format_checker=format_checker): + validator = cls(cls.META_SCHEMA, format_checker=format_checker) + for error in validator.iter_errors(schema): raise exceptions.SchemaError.create_from(error) def iter_errors(self, instance, _schema=None): @@ -465,6 +475,7 @@ def extend(validator, validators=(), version=None, type_checker=None): type_checker=_types.draft3_type_checker, version="draft3", id_of=lambda schema: schema.get(u"id", ""), + format_checker=_format.draft3_format_checker, ) Draft4Validator = create( @@ -500,6 +511,7 @@ def extend(validator, validators=(), version=None, type_checker=None): type_checker=_types.draft4_type_checker, version="draft4", id_of=lambda schema: schema.get(u"id", ""), + format_checker=_format.draft4_format_checker, ) Draft6Validator = create( @@ -539,6 +551,7 @@ def extend(validator, validators=(), version=None, type_checker=None): }, type_checker=_types.draft6_type_checker, version="draft6", + format_checker=_format.draft6_format_checker, ) Draft7Validator = create( @@ -579,6 +592,7 @@ def extend(validator, validators=(), version=None, type_checker=None): }, type_checker=_types.draft7_type_checker, version="draft7", + format_checker=_format.draft7_format_checker, ) _LATEST_VERSION = Draft7Validator