diff options
author | Julian Berman <Julian@GrayVines.com> | 2013-05-20 20:27:18 -0400 |
---|---|---|
committer | Julian Berman <Julian@GrayVines.com> | 2013-05-20 20:27:18 -0400 |
commit | 85739b63ec438f6aa50b6ec128115310997a00dc (patch) | |
tree | 0b797b3c539e9d873b5edede323a17ff8a270357 | |
parent | 0a7fe815301dcc64abd22e567e0045ec6715d46b (diff) | |
download | jsonschema-85739b63ec438f6aa50b6ec128115310997a00dc.tar.gz |
Add jsonschema.validators.extend
-rw-r--r-- | docs/creating.rst | 11 | ||||
-rw-r--r-- | jsonschema/tests/test_validators.py | 15 | ||||
-rw-r--r-- | jsonschema/validators.py | 11 |
3 files changed, 35 insertions, 2 deletions
diff --git a/docs/creating.rst b/docs/creating.rst index 1b67011..6467756 100644 --- a/docs/creating.rst +++ b/docs/creating.rst @@ -25,6 +25,17 @@ Creating or Extending Validators can still have their types customized on a per-instance basis. :returns: an :class:`jsonschema.IValidator` +.. autofunction:: extend + + Create a new validator that extends an existing validator. + + :argument :class:`jsonschema.IValidator` validator: an existing validator + :argument dict validators: a set of new validators to add to the new + validator. Any validators with the same name as an existing one will + (silently) replace the old validator entirely. + :argument str version: a version for the new validator + :returns: an :class:`jsonschema.IValidator` + .. autofunction:: validates diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index 1457be5..5162f6f 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -9,11 +9,11 @@ from jsonschema.compat import PY3 from jsonschema.tests.compat import mock, unittest from jsonschema.validators import ( RefResolutionError, UnknownType, ErrorTree, Draft3Validator, - Draft4Validator, RefResolver, ValidatorMixin, create, validate, + Draft4Validator, RefResolver, ValidatorMixin, create, extend, validate, ) -class TestCreate(unittest.TestCase): +class TestCreateAndExtend(unittest.TestCase): def setUp(self): self.meta_schema = {"properties" : {"smelly" : {}}} self.smelly = mock.MagicMock() @@ -63,6 +63,17 @@ class TestCreate(unittest.TestCase): create(meta_schema={"id" : "id"}) self.assertFalse(validates.called) + def test_extend(self): + validators = dict(self.Validator.VALIDATORS) + new = mock.Mock() + + Extended = extend(self.Validator, validators={"a new one" : new}) + + validators.update([("a new one", new)]) + self.assertEqual(Extended.VALIDATORS, validators) + self.assertEqual(Extended.META_SCHEMA, self.Validator.META_SCHEMA) + self.assertEqual(Extended.DEFAULT_TYPES, self.Validator.DEFAULT_TYPES) + class TestIterErrors(unittest.TestCase): def setUp(self): diff --git a/jsonschema/validators.py b/jsonschema/validators.py index 3db7ce9..c8ee8d8 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -146,6 +146,17 @@ def create(meta_schema, validators=(), version=None, default_types=None): # noq return Validator +def extend(validator, validators, version=None): + all_validators = validator.VALIDATORS + all_validators.update(validators) + return create( + meta_schema=validator.META_SCHEMA, + validators=all_validators, + version=version, + default_types=validator.DEFAULT_TYPES, + ) + + class ValidatorMixin(create(meta_schema={})): def __init__(self, *args, **kwargs): super(ValidatorMixin, self).__init__(*args, **kwargs) |