Non local refs.

This commit is contained in:
Julian Berman
2012-11-07 00:08:38 -05:00
parent de3a3b6130
commit fe5d9ff6aa
2 changed files with 23 additions and 3 deletions

View File

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

View File

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