summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Berman <Julian@GrayVines.com>2013-05-20 20:27:18 -0400
committerJulian Berman <Julian@GrayVines.com>2013-05-20 20:27:18 -0400
commit85739b63ec438f6aa50b6ec128115310997a00dc (patch)
tree0b797b3c539e9d873b5edede323a17ff8a270357
parent0a7fe815301dcc64abd22e567e0045ec6715d46b (diff)
downloadjsonschema-85739b63ec438f6aa50b6ec128115310997a00dc.tar.gz
Add jsonschema.validators.extend
-rw-r--r--docs/creating.rst11
-rw-r--r--jsonschema/tests/test_validators.py15
-rw-r--r--jsonschema/validators.py11
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)