Skip to content

Commit f672988

Browse files
committed
Need to preserve backwards compat for RefResolvers without the new methods.
1 parent 33973dc commit f672988

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

jsonschema/_validators.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,20 @@ def enum(validator, enums, instance, schema):
190190

191191

192192
def ref(validator, ref, instance, schema):
193-
scope, resolved = validator.resolver.resolve(ref)
194-
validator.resolver.push_scope(scope)
193+
resolve = getattr(validator.resolver, "resolve", None)
194+
if resolve is None:
195+
with validator.resolver.resolving(ref) as resolved:
196+
for error in validator.descend(instance, resolved):
197+
yield error
198+
else:
199+
scope, resolved = validator.resolver.resolve(ref)
200+
validator.resolver.push_scope(scope)
195201

196-
try:
197-
for error in validator.descend(instance, resolved):
198-
yield error
199-
finally:
200-
validator.resolver.pop_scope()
202+
try:
203+
for error in validator.descend(instance, resolved):
204+
yield error
205+
finally:
206+
validator.resolver.pop_scope()
201207

202208

203209
def type_draft3(validator, types, instance, schema):

jsonschema/tests/test_validators.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from collections import deque
2+
from contextlib import contextmanager
23
import json
34

45
from jsonschema import FormatChecker, ValidationError
@@ -639,6 +640,25 @@ def test_it_delegates_to_a_ref_resolver(self):
639640

640641
resolve.assert_called_once_with(schema["$ref"])
641642

643+
def test_it_delegates_to_a_legacy_ref_resolver(self):
644+
"""
645+
Legacy RefResolvers support only the context manager form of
646+
resolution.
647+
648+
"""
649+
650+
class LegacyRefResolver(object):
651+
@contextmanager
652+
def resolving(this, ref):
653+
self.assertEqual(ref, "the ref")
654+
yield {"type" : "integer"}
655+
656+
resolver = LegacyRefResolver()
657+
schema = {"$ref" : "the ref"}
658+
659+
with self.assertRaises(ValidationError):
660+
self.validator_class(schema, resolver=resolver).validate(None)
661+
642662
def test_is_type_is_true_for_valid_type(self):
643663
self.assertTrue(self.validator.is_type("foo", "string"))
644664

0 commit comments

Comments
 (0)