class PackageNotFoundError(ModuleNotFoundError):
"""The package was not found."""
+ def __str__(self):
+ tmpl = "No package metadata was found for {self.name}"
+ return tmpl.format(**locals())
+
+ @property
+ def name(self):
+ name, = self.args
+ return name
+
class EntryPoint(
collections.namedtuple('EntryPointBase', 'name value group')):
import textwrap
import contextlib
+from test.support.os_helper import FS_NONASCII
+
@contextlib.contextmanager
def tempdir():
class FileBuilder:
def unicode_filename(self):
- try:
- from test.support import os_helper
- except ImportError:
- # outside CPython, hard-code a unicode snowman
- return '☃'
- return os_helper.FS_NONASCII or \
+ return FS_NONASCII or \
self.skip("File system does not support non-ascii.")
with self.assertRaises(PackageNotFoundError):
Distribution.from_name('does-not-exist')
+ def test_package_not_found_mentions_metadata(self):
+ """
+ When a package is not found, that could indicate that the
+ packgae is not installed or that it is installed without
+ metadata. Ensure the exception mentions metadata to help
+ guide users toward the cause. See #124.
+ """
+ with self.assertRaises(PackageNotFoundError) as ctx:
+ Distribution.from_name('does-not-exist')
+
+ assert "metadata" in str(ctx.exception)
+
def test_new_style_classes(self):
self.assertIsInstance(Distribution, type)
--- /dev/null
+In ``importlib.metadata.PackageNotFoundError``, make reference to the
+package metadata being missing to improve the user experience.