diff --git a/jsonschema/compat.py b/jsonschema/compat.py index 93492f9b4..1dacc55b6 100644 --- a/jsonschema/compat.py +++ b/jsonschema/compat.py @@ -22,7 +22,7 @@ from urllib.parse import ( unquote, urljoin, urlunsplit, SplitResult, urlsplit as _urlsplit ) - from urllib.request import pathname2url, urlopen + from urllib.request import pathname2url, url2pathname, urlopen str_types = str, int_types = int, iteritems = operator.methodcaller("items") @@ -32,7 +32,7 @@ from urlparse import ( urljoin, urlunsplit, SplitResult, urlsplit as _urlsplit # noqa ) - from urllib import pathname2url, unquote # noqa + from urllib import pathname2url, url2pathname, unquote # noqa import urllib2 # noqa def urlopen(*args, **kwargs): return contextlib.closing(urllib2.urlopen(*args, **kwargs)) diff --git a/jsonschema/validators.py b/jsonschema/validators.py index a49e125c6..a27402a00 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -25,6 +25,7 @@ urljoin, urlopen, urlsplit, + url2pathname, ) # Sigh. https://gitlab.com/pycqa/flake8/issues/280 @@ -818,6 +819,13 @@ def resolve_remote(self, uri): if scheme in self.handlers: result = self.handlers[scheme](uri) + elif scheme in [u"file", u""]: + # Resolve local files + path = uri + if path.startswith('file:'): + path = path[len('file:'):] + with open(url2pathname(path)) as _file: + result = json.load(_file) elif scheme in [u"http", u"https"] and requests: # Requests has support for detecting the correct encoding of # json over http