Skip to content

Commit

Permalink
Need to preserve backwards compat for RefResolvers without the new me…
Browse files Browse the repository at this point in the history
…thods.
  • Loading branch information
Julian committed Mar 22, 2015
1 parent 33973dc commit f672988
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 7 deletions.
20 changes: 13 additions & 7 deletions jsonschema/_validators.py
Expand Up @@ -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):
Expand Down
20 changes: 20 additions & 0 deletions jsonschema/tests/test_validators.py
@@ -1,4 +1,5 @@
from collections import deque
from contextlib import contextmanager
import json

from jsonschema import FormatChecker, ValidationError
Expand Down Expand Up @@ -639,6 +640,25 @@ def test_it_delegates_to_a_ref_resolver(self):

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"))

Expand Down

0 comments on commit f672988

Please sign in to comment.