From f672988e2cb68aec04877d288057c37bf9587e44 Mon Sep 17 00:00:00 2001 From: Julian Berman Date: Sat, 21 Mar 2015 22:08:54 -0400 Subject: [PATCH] Need to preserve backwards compat for RefResolvers without the new methods. --- jsonschema/_validators.py | 20 +++++++++++++------- jsonschema/tests/test_validators.py | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/jsonschema/_validators.py b/jsonschema/_validators.py index a51681e..f566f6d 100644 --- a/jsonschema/_validators.py +++ b/jsonschema/_validators.py @@ -190,14 +190,20 @@ def enum(validator, enums, instance, schema): def ref(validator, ref, instance, schema): - scope, resolved = validator.resolver.resolve(ref) - validator.resolver.push_scope(scope) + resolve = getattr(validator.resolver, "resolve", None) + if resolve is None: + with validator.resolver.resolving(ref) as resolved: + for error in validator.descend(instance, resolved): + yield error + else: + scope, resolved = validator.resolver.resolve(ref) + validator.resolver.push_scope(scope) - try: - for error in validator.descend(instance, resolved): - yield error - finally: - validator.resolver.pop_scope() + try: + for error in validator.descend(instance, resolved): + yield error + finally: + validator.resolver.pop_scope() def type_draft3(validator, types, instance, schema): diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index cc4bea8..e34efca 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -1,4 +1,5 @@ from collections import deque +from contextlib import contextmanager import json from jsonschema import FormatChecker, ValidationError @@ -639,6 +640,25 @@ class ValidatorTestMixin(object): resolve.assert_called_once_with(schema["$ref"]) + def test_it_delegates_to_a_legacy_ref_resolver(self): + """ + Legacy RefResolvers support only the context manager form of + resolution. + + """ + + class LegacyRefResolver(object): + @contextmanager + def resolving(this, ref): + self.assertEqual(ref, "the ref") + yield {"type" : "integer"} + + resolver = LegacyRefResolver() + schema = {"$ref" : "the ref"} + + with self.assertRaises(ValidationError): + self.validator_class(schema, resolver=resolver).validate(None) + def test_is_type_is_true_for_valid_type(self): self.assertTrue(self.validator.is_type("foo", "string"))