Skip to content

Commit 1faf60d

Browse files
author
Heikki Mehtänen
committed
Move requests import to runtime
* Importing requests takes well over 100ms and is used only for resolving refs from remote URIs - move the import to runtime
1 parent aaee55c commit 1faf60d

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

jsonschema/tests/test_validators.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,26 @@ def test_schema_error_message(self):
10131013
)
10141014

10151015

1016+
class MockImport(object):
1017+
1018+
def __init__(self, module, _mock):
1019+
self._module = module
1020+
self._mock = _mock
1021+
self._orig_import = None
1022+
1023+
def __enter__(self):
1024+
self._orig_import = sys.modules.get(self._module, None)
1025+
sys.modules[self._module] = self._mock
1026+
return self._mock
1027+
1028+
def __exit__(self, *args):
1029+
if self._orig_import is None:
1030+
del sys.modules[self._module]
1031+
else:
1032+
sys.modules[self._module] = self._orig_import
1033+
return True
1034+
1035+
10161036
class TestRefResolver(TestCase):
10171037

10181038
base_uri = ""
@@ -1062,7 +1082,7 @@ def test_it_retrieves_unstored_refs_via_requests(self):
10621082
ref = "http://bar#baz"
10631083
schema = {"baz": 12}
10641084

1065-
with mock.patch("jsonschema.validators.requests") as requests:
1085+
with MockImport("requests", mock.Mock()) as requests:
10661086
requests.get.return_value.json.return_value = schema
10671087
with self.resolver.resolving(ref) as resolved:
10681088
self.assertEqual(resolved, 12)
@@ -1072,7 +1092,7 @@ def test_it_retrieves_unstored_refs_via_urlopen(self):
10721092
ref = "http://bar#baz"
10731093
schema = {"baz": 12}
10741094

1075-
with mock.patch("jsonschema.validators.requests", None):
1095+
with MockImport("requests", None):
10761096
with mock.patch("jsonschema.validators.urlopen") as urlopen:
10771097
urlopen.return_value.read.return_value = (
10781098
json.dumps(schema).encode("utf8"))

jsonschema/validators.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@
77

88
from six import add_metaclass
99

10-
try:
11-
import requests
12-
except ImportError:
13-
requests = None
14-
1510
from jsonschema import _utils, _validators, _types
1611
from jsonschema.compat import (
1712
Sequence, urljoin, urlsplit, urldefrag, unquote, urlopen,
@@ -671,6 +666,10 @@ def resolve_remote(self, uri):
671666
.. _requests: http://pypi.python.org/pypi/requests/
672667
673668
"""
669+
try:
670+
import requests
671+
except ImportError:
672+
requests = None
674673

675674
scheme = urlsplit(uri).scheme
676675

0 commit comments

Comments
 (0)