Non local refs.
This commit is contained in:
@@ -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):
|
||||
"""
|
||||
|
||||
17
tests.py
17
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)
|
||||
|
||||
Reference in New Issue
Block a user