Skip to content

Commit d1e2448

Browse files
committed
Remove context manager from ref() validation.
1 parent 613cf3e commit d1e2448

File tree

3 files changed

+27
-15
lines changed

3 files changed

+27
-15
lines changed

jsonschema/_validators.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,14 @@ def enum(validator, enums, instance, schema):
190190

191191

192192
def ref(validator, ref, instance, schema):
193-
with validator.resolver.resolving(ref) as resolved:
193+
scope, resolved = validator.resolver.resolve(ref)
194+
validator.resolver.push_scope(scope)
195+
196+
try:
194197
for error in validator.descend(instance, resolved):
195198
yield error
199+
finally:
200+
validator.resolver.pop_scope()
196201

197202

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

jsonschema/tests/test_validators.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -633,12 +633,8 @@ def test_it_delegates_to_a_ref_resolver(self):
633633
resolver = RefResolver("", {})
634634
schema = {"$ref" : mock.Mock()}
635635

636-
@contextmanager
637-
def resolving():
638-
yield {"type": "integer"}
639-
640-
with mock.patch.object(resolver, "resolving") as resolve:
641-
resolve.return_value = resolving()
636+
with mock.patch.object(resolver, "resolve") as resolve:
637+
resolve.return_value = "url", {"type": "integer"}
642638
with self.assertRaises(ValidationError):
643639
self.validator_class(schema, resolver=resolver).validate(None)
644640

jsonschema/validators.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def iter_errors(self, instance, _schema=None):
108108
yield error
109109
finally:
110110
if scope:
111-
self.resolver.scopes_stack.pop()
111+
self.resolver.pop_scope()
112112

113113
def descend(self, instance, schema, path=None, schema_path=None):
114114
for error in self.iter_errors(instance, schema):
@@ -271,20 +271,36 @@ def push_scope(self, scope):
271271
self.scopes_stack.append(
272272
self.urljoin_cache(self.resolution_scope, scope))
273273

274+
def pop_scope(self):
275+
self.scopes_stack.pop()
276+
274277
@property
275278
def resolution_scope(self):
276279
return self.scopes_stack[-1]
277280

281+
282+
# Deprecated, this function is no longer used, but is preserved for
283+
# backwards compatibility
278284
@contextlib.contextmanager
279285
def in_scope(self, scope):
280286
self.push_scope(scope)
281287
try:
282288
yield
283289
finally:
284-
self.scopes_stack.pop()
290+
self.pop_scope()
285291

292+
# Deprecated, this function is no longer used, but is preserved for
293+
# backwards compatibility
286294
@contextlib.contextmanager
287295
def resolving(self, ref):
296+
url, resolved = self.resolve(ref)
297+
self.push_scope(url)
298+
try:
299+
yield resolved
300+
finally:
301+
self.pop_scope()
302+
303+
def resolve(self, ref):
288304
"""
289305
Context manager which resolves a JSON ``ref`` and enters the
290306
resolution scope of this ref.
@@ -293,12 +309,7 @@ def resolving(self, ref):
293309
294310
"""
295311
url = self.urljoin_cache(self.resolution_scope, ref)
296-
297-
self.push_scope(url)
298-
try:
299-
yield self.resolve_cache(url)
300-
finally:
301-
self.scopes_stack.pop()
312+
return url, self.resolve_cache(url)
302313

303314
def resolve_from_url(self, url):
304315
ref = urldefrag(url)

0 commit comments

Comments
 (0)