diff options
author | Gaetano Guerriero <gaetano.guerriero@viralize.com> | 2018-10-02 14:39:27 +0200 |
---|---|---|
committer | Gaetano Guerriero <gaetano.guerriero@viralize.com> | 2018-10-02 16:35:52 +0200 |
commit | 7454f0fffd065e6015af2d997f52ff32eab70dcd (patch) | |
tree | 32c26194fe120b973c891151c13aefd25a18935d | |
parent | 7e2a6bcc3207b616d7a8eed4452905ad981bea98 (diff) | |
download | jsonschema-7454f0fffd065e6015af2d997f52ff32eab70dcd.tar.gz |
fix urlopen usage in python2 when resolving refs
urlopen() result was used as a context manager in python2 too and this was
causing error.
-rw-r--r-- | jsonschema/compat.py | 6 | ||||
-rw-r--r-- | jsonschema/tests/test_validators.py | 17 |
2 files changed, 22 insertions, 1 deletions
diff --git a/jsonschema/compat.py b/jsonschema/compat.py index 952b146..ce946a7 100644 --- a/jsonschema/compat.py +++ b/jsonschema/compat.py @@ -1,3 +1,4 @@ +import contextlib import operator import sys @@ -27,7 +28,10 @@ else: urljoin, urlunsplit, SplitResult, urlsplit as _urlsplit # noqa ) from urllib import unquote # noqa - from urllib2 import urlopen # noqa + import urllib2 # noqa + def urlopen(*args, **kwargs): + return contextlib.closing(urllib2.urlopen(*args, **kwargs)) + str_types = basestring int_types = int, long iteritems = operator.methodcaller("iteritems") diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py index 8bb3880..f5d9872 100644 --- a/jsonschema/tests/test_validators.py +++ b/jsonschema/tests/test_validators.py @@ -4,7 +4,9 @@ from decimal import Decimal from io import BytesIO from unittest import TestCase import json +import os import sys +import tempfile import unittest from twisted.trial.unittest import SynchronousTestCase @@ -22,6 +24,12 @@ from jsonschema.compat import PY3 from jsonschema.tests.compat import mock +if PY3: + from urllib.request import pathname2url +else: + from urllib import pathname2url + + def startswith(validator, startswith, instance, schema): if not instance.startswith(startswith): yield ValidationError(u"Whoops!") @@ -1341,6 +1349,15 @@ class TestRefResolver(TestCase): pass self.assertEqual(resolved, 12) + def test_it_retrieves_local_refs_via_urlopen(self): + with tempfile.NamedTemporaryFile(delete=False, mode='wt') as tempf: + self.addCleanup(os.remove, tempf.name) + json.dump({'foo': 'bar'}, tempf) + + ref = "file://{}#foo".format(pathname2url(tempf.name)) + with self.resolver.resolving(ref) as resolved: + self.assertEqual(resolved, 'bar') + def test_it_can_construct_a_base_uri_from_a_schema(self): schema = {"id": "foo"} resolver = validators.RefResolver.from_schema( |