Skip to content

Commit ed0f98e

Browse files
committed
Added validator_for to provide direct access to validators
1 parent 0f534a0 commit ed0f98e

File tree

4 files changed

+34
-5
lines changed

4 files changed

+34
-5
lines changed

docs/creating.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ Creating or Extending Validators
4545
:returns: an :class:`jsonschema.IValidator`
4646

4747

48+
.. autofunction:: validate_for
49+
4850
.. autofunction:: validates
4951

5052

jsonschema/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
)
1818
from jsonschema.validators import (
1919
ErrorTree, Draft3Validator, Draft4Validator, RefResolver, ValidatorMixin,
20-
validate, validates,
20+
validator_for, validate, validates,
2121
)
2222

2323

jsonschema/tests/test_validators.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from jsonschema.compat import PY3
99
from jsonschema.tests.compat import mock, unittest
1010
from jsonschema.validators import (
11-
RefResolutionError, UnknownType, ErrorTree, Draft3Validator,
12-
Draft4Validator, RefResolver, ValidatorMixin, create, extend, validate,
11+
_unset, RefResolutionError, UnknownType, ErrorTree, Draft3Validator,
12+
Draft4Validator, RefResolver, ValidatorMixin, create, extend, validator_for, validate,
1313
)
1414

1515

@@ -624,6 +624,25 @@ class TestDraft4Validator(ValidatorTestMixin, unittest.TestCase):
624624
validator_class = Draft4Validator
625625

626626

627+
class TestValidatorFor(unittest.TestCase):
628+
def do_it(self, schema_url, expected_draft):
629+
schema = {"$schema" : schema_url}
630+
with mock.patch.object(expected_draft, "check_schema") as chk_schema:
631+
validator_for(schema)
632+
chk_schema.assert_called_once_with(schema)
633+
634+
def test_validator_for(self):
635+
self.do_it("http://json-schema.org/draft-03/schema#", Draft3Validator)
636+
self.do_it("http://json-schema.org/draft-03/schema", Draft3Validator)
637+
self.do_it("http://json-schema.org/draft-04/schema#", Draft4Validator)
638+
self.do_it("http://json-schema.org/draft-04/schema", Draft4Validator)
639+
640+
def test_validator_unset(self):
641+
schema = {}
642+
validator = validator_for(schema)
643+
self.assertEqual(validator, _unset)
644+
645+
627646
class TestValidate(unittest.TestCase):
628647
def test_draft3_validator_is_chosen(self):
629648
schema = {"$schema" : "http://json-schema.org/draft-03/schema#"}

jsonschema/validators.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,8 +473,16 @@ def total_errors(self):
473473
return len(self.errors) + child_errors
474474

475475

476+
def validator_for(schema, default=_unset):
477+
cls = meta_schemas.get(schema.get("$schema", ""), default)
478+
if not cls is _unset:
479+
cls.check_schema(schema)
480+
return cls
481+
482+
476483
def validate(instance, schema, cls=None, *args, **kwargs):
477484
if cls is None:
478-
cls = meta_schemas.get(schema.get("$schema", ""), Draft4Validator)
479-
cls.check_schema(schema)
485+
cls = validator_for(schema)
486+
else:
487+
cls.check_schema(schema)
480488
cls(schema, *args, **kwargs).validate(instance)

0 commit comments

Comments
 (0)