Skip to content

Commit 42a1956

Browse files
authored
Protect against unset spec (#556)
* Protect against unset spec * Add test * Fix test * Remove unused import
1 parent b4b1517 commit 42a1956

File tree

2 files changed

+28
-25
lines changed

2 files changed

+28
-25
lines changed

jupyter_server/tests/test_utils.py

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from pathlib import Path
2-
import sys
2+
from unittest.mock import patch
33

44
import pytest
55

@@ -45,28 +45,27 @@ def test_url_escaping(unescaped, escaped):
4545
assert path == unescaped
4646

4747

48-
@pytest.fixture
49-
def namespace_package_test(monkeypatch):
50-
"""Adds a blank namespace package into the PYTHONPATH for testing.
51-
52-
Yields the name of the importable namespace.
53-
"""
54-
monkeypatch.setattr(
55-
sys,
56-
'path',
57-
[
58-
str(Path(__file__).parent / 'namespace-package-test'),
59-
*sys.path
60-
]
61-
)
62-
yield 'test_namespace'
48+
@pytest.mark.parametrize(
49+
'name, expected',
50+
[
51+
# returns True if it is a namespace package
52+
('test_namespace', True),
53+
# returns False if it isn't a namespace package
54+
('sys', False),
55+
('jupyter_server', False),
56+
# returns None if it isn't importable
57+
('not_a_python_namespace', None)
58+
]
59+
)
60+
def test_is_namespace_package(monkeypatch, name, expected):
61+
monkeypatch.syspath_prepend(Path(__file__).parent / 'namespace-package-test')
62+
63+
assert is_namespace_package(name) is expected
64+
6365

66+
def test_is_namespace_package_no_spec():
67+
with patch("importlib.util.find_spec") as mocked_spec:
68+
mocked_spec.side_effect = ValueError()
6469

65-
def test_is_namespace_package(namespace_package_test):
66-
# returns True if it is a namespace package
67-
assert is_namespace_package(namespace_package_test)
68-
# returns False if it isn't a namespace package
69-
assert not is_namespace_package('sys')
70-
assert not is_namespace_package('jupyter_server')
71-
# returns None if it isn't importable
72-
assert is_namespace_package('not_a_python_namespace') is None
70+
assert is_namespace_package('dummy') is None
71+
mocked_spec.assert_called_once_with('dummy')

jupyter_server/utils.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,11 @@ def is_namespace_package(namespace):
388388
389389
"""
390390
# NOTE: using submodule_search_locations because the loader can be None
391-
spec = importlib.util.find_spec(namespace)
391+
try:
392+
spec = importlib.util.find_spec(namespace)
393+
except ValueError: # spec is not set - see https://docs.python.org/3/library/importlib.html#importlib.util.find_spec
394+
return None
395+
392396
if not spec:
393397
# e.g. module not installed
394398
return None

0 commit comments

Comments
 (0)