Skip to content

Commit dfcd6e8

Browse files
committed
Add ValidatorMixin.validator_for
Helps subclasses / mixersin be able to override where validators look for their validator functions.
1 parent 101ed8c commit dfcd6e8

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

jsonschema.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@ def check_schema(cls, schema):
267267
for error in cls(cls.META_SCHEMA).iter_errors(schema):
268268
raise SchemaError.create_from(error)
269269

270+
def validator_for(self, validator):
271+
validator_attr = "validate_%s" % (validator.lstrip("$"),)
272+
return getattr(self, validator_attr, None)
273+
270274
def iter_errors(self, instance, _schema=None):
271275
if _schema is None:
272276
_schema = self.schema
@@ -279,9 +283,7 @@ def iter_errors(self, instance, _schema=None):
279283
validators = iteritems(_schema)
280284

281285
for k, v in validators:
282-
validator_attr = "validate_%s" % (k.lstrip("$"),)
283-
validator = getattr(self, validator_attr, None)
284-
286+
validator = self.validator_for(k)
285287
if validator is None:
286288
continue
287289

tests.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,24 @@ class Validator(ValidatorMixin):
834834
self.assertTrue(Validator.validate_ref.called)
835835
self.assertFalse(Validator.validate_type.called)
836836

837+
def test_validator_for(self):
838+
class Validator(ValidatorMixin):
839+
validate_type = mock.Mock()
840+
validator = Validator({})
841+
self.assertEqual(
842+
validator.validator_for("type"), validator.validate_type,
843+
)
844+
845+
def test_redefined_validator_for(self):
846+
v = mock.Mock(return_value=[])
847+
848+
class Validator(ValidatorMixin):
849+
def validator_for(self, validator):
850+
return v
851+
852+
Validator({"foo" : 12}).validate(42)
853+
v.assert_called_once_with(12, 42, {"foo" : 12})
854+
837855

838856
class TestRefResolver(unittest.TestCase):
839857

0 commit comments

Comments
 (0)