diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 98925166..be6d73b7 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,9 @@ +v4.18.3 +======= + +* Properly preserve ``applicable_validators`` in extended validators. + Specifically, validators extending early drafts where siblings of ``$ref`` were ignored will properly ignore siblings in the extended validator. + v4.18.2 ======= diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index ca03efd4..940a86da 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -285,6 +285,23 @@ def id_of(schema): Derived = validators.extend(Original) self.assertEqual(Derived.ID_OF(Derived.META_SCHEMA), correct_id) + def test_extend_applicable_validators(self): + """ + Extending a validator preserves its notion of applicable validators. + """ + + schema = { + "$defs": {"test": {"type": "number"}}, + "$ref": "#/$defs/test", + "maximum": 1 + } + + draft4 = validators.Draft4Validator(schema) + self.assertTrue(draft4.is_valid(37)) # as $ref ignores siblings + + Derived = validators.extend(validators.Draft4Validator) + self.assertTrue(Derived(schema).is_valid(37)) + class TestValidationErrorMessages(TestCase): def message_for(self, instance, schema, *args, **kwargs): diff --git a/jsonschema/validators.py b/jsonschema/validators.py index 60c19821..d5b4fcda 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -219,6 +219,8 @@ class Validator: FORMAT_CHECKER = format_checker_arg ID_OF = staticmethod(id_of) + _APPLICABLE_VALIDATORS = applicable_validators + schema: referencing.jsonschema.Schema = field(repr=reprlib.repr) _ref_resolver = field(default=None, repr=False, alias="resolver") format_checker: _format.FormatChecker | None = field(default=None) @@ -570,6 +572,7 @@ def extend( type_checker=type_checker, format_checker=format_checker, id_of=validator.ID_OF, + applicable_validators=validator._APPLICABLE_VALIDATORS, )