diff --git a/jsonschema.py b/jsonschema.py index e4a6bab..ef7af9f 100644 --- a/jsonschema.py +++ b/jsonschema.py @@ -12,11 +12,11 @@ instance under a schema, and will create a validator for you. from __future__ import division, unicode_literals import collections +import json import itertools import operator import re import sys -import warnings __version__ = "0.8dev" @@ -28,10 +28,12 @@ if PY3: basestring = unicode = str iteritems = operator.methodcaller("items") from urllib.parse import unquote + from urllib.request import urlopen else: from itertools import izip as zip iteritems = operator.methodcaller("iteritems") from urllib import unquote + from urllib2 import urlopen class UnknownType(Exception): @@ -499,10 +501,11 @@ class RefResolver(object): """ - def __init__(self, store=None): + def __init__(self, store=None, get_page=urlopen): if store is None: store = {} + self.get_page = get_page self.store = store def resolve(self, root_schema, ref): @@ -515,6 +518,8 @@ class RefResolver(object): return self.store[ref] elif ref.startswith("#"): return self.resolve_local(root_schema, ref) + else: + return json.load(self.get_page(ref)) def resolve_local(self, root_schema, ref): """ diff --git a/tests.py b/tests.py index 26fcda2..821794a 100644 --- a/tests.py +++ b/tests.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from decimal import Decimal from functools import wraps +from io import StringIO import glob import os import re @@ -20,7 +21,7 @@ except ImportError: from jsonschema import ( PY3, SchemaError, UnknownType, ValidationError, ErrorTree, - Draft3Validator, RefResolver, iteritems, validate + Draft3Validator, RefResolver, iteritems, urlopen, validate ) @@ -654,6 +655,20 @@ class TestRefResolver(TestCase): resolved = self.resolver.resolve(self.schema, ref) self.assertEqual(resolved, self.schema["properties"]["foo"]) + def test_it_retrieves_non_local_refs(self): + schema = '{"type" : "integer"}' + get_page = mock.Mock(return_value=StringIO(schema)) + resolver = RefResolver(get_page=get_page) + + url = "http://example.com/schema" + resolved = resolver.resolve(mock.Mock(), url) + + self.assertEqual(resolved, json.loads(schema)) + get_page.assert_called_once_with(url) + + def test_it_uses_urlopen_by_default_for_nonlocal_refs(self): + self.assertEqual(self.resolver.get_page, urlopen) + def test_it_accepts_a_ref_store(self): store = mock.Mock() self.assertEqual(RefResolver(store).store, store)