diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index 5322852b..3f16d907 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -12,7 +12,9 @@ import tempfile import warnings +from referencing.jsonschema import DRAFT202012 import attr +import referencing.exceptions from jsonschema import ( FormatChecker, @@ -2146,6 +2148,32 @@ def validate(): self.assertEqual((thread.is_alive(), failed), (False, [])) +class TestReferencing(TestCase): + def test_registry_with_retrieve(self): + def retrieve(uri): + return DRAFT202012.create_resource({"type": "integer"}) + + registry = referencing.Registry(retrieve=retrieve) + schema = {"$ref": "https://example.com/"} + validator = validators.Draft202012Validator(schema, registry=registry) + + self.assertEqual( + (validator.is_valid(12), validator.is_valid("foo")), + (True, False), + ) + + def test_custom_registries_do_not_autoretrieve_remote_resources(self): + registry = referencing.Registry() + schema = {"$ref": "https://example.com/"} + validator = validators.Draft202012Validator(schema, registry=registry) + + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + with self.assertRaises(referencing.exceptions.Unresolvable): + validator.validate(12) + self.assertFalse(w) + + class TestRefResolver(TestCase): base_uri = "" diff --git a/jsonschema/validators.py b/jsonschema/validators.py index 99b94e13..bed919e2 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -120,7 +120,7 @@ def _warn_for_remote_retrieve(uri: str): return referencing.Resource.from_contents(json.load(response)) -_DEFAULT_REGISTRY = SPECIFICATIONS.combine( +_REMOTE_WARNING_REGISTRY = SPECIFICATIONS.combine( referencing.Registry(retrieve=_warn_for_remote_retrieve), # type: ignore[call-arg] # noqa: E501 ) @@ -224,7 +224,7 @@ class Validator: format_checker: _format.FormatChecker | None = field(default=None) # TODO: include new meta-schemas added at runtime _registry: referencing.jsonschema.SchemaRegistry = field( - default=referencing.Registry(), + default=_REMOTE_WARNING_REGISTRY, kw_only=True, repr=False, ) @@ -269,7 +269,9 @@ def evolve(self, **changes): def __attrs_post_init__(self): if self._resolver is None: - registry = _DEFAULT_REGISTRY.combine(self._registry) + registry = self._registry + if registry is not _REMOTE_WARNING_REGISTRY: + registry = SPECIFICATIONS.combine(registry) resource = specification.create_resource(self.schema) self._resolver = registry.resolver_with_root(resource)