Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions Lib/pyclbr.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,17 +160,20 @@ def _readmodule(module, path, inpackage=None):
else:
search_path = path + sys.path
spec = importlib.util._find_spec_from_path(fullmodule, search_path)
if spec is None:
raise ModuleNotFoundError(f"no module named {fullmodule!r}", name=fullmodule)
Comment thread
brettcannon marked this conversation as resolved.
_modules[fullmodule] = tree
# Is module a package?
if spec.submodule_search_locations is not None:
tree['__path__'] = spec.submodule_search_locations
try:
source = spec.loader.get_source(fullmodule)
if source is None:
return tree
except (AttributeError, ImportError):
# If module is not Python source, we cannot do anything.
return tree
else:
if source is None:
return tree
Comment thread
brettcannon marked this conversation as resolved.

fname = spec.loader.get_filename(fullmodule)
return _create_tree(fullmodule, path, fname, source, tree, inpackage)
Expand Down
24 changes: 22 additions & 2 deletions Lib/test/test_pyclbr.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import pyclbr
from unittest import TestCase, main as unittest_main
from test import support
from test.test_importlib import util as test_importlib_util
from functools import partial

StaticMethodType = type(staticmethod(lambda: None))
Expand Down Expand Up @@ -235,11 +236,30 @@ def test_others(self):
cm('email.parser')
cm('test.test_pyclbr')

def test_issue_14798(self):

class ReadmoduleTests(TestCase):

def setUp(self):
self._modules = pyclbr._modules.copy()

def tearDown(self):
pyclbr._modules = self._modules


def test_dotted_name_not_a_package(self):
# test ImportError is raised when the first part of a dotted name is
# not a package
# not a package.
#
# Issue #14798.
self.assertRaises(ImportError, pyclbr.readmodule_ex, 'asyncore.foo')

def test_module_has_no_spec(self):
module_name = "doesnotexist"
assert module_name not in pyclbr._modules
with test_importlib_util.uncache(module_name):
with self.assertRaises(ModuleNotFoundError):
pyclbr.readmodule_ex(module_name)


if __name__ == "__main__":
unittest_main()
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Raise ModuleNotFoundError in pyclbr when a module can't be found.
Thanks to 'mental' for the bug report.