bpo-42089: Sync with current cpython branch of importlib_metadata (GH-22775)
~~The only differences are in the test files.~~
Automerge-Triggered-By: @jaraco
diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py
index ffa0cba..302d61d 100644
--- a/Lib/importlib/metadata.py
+++ b/Lib/importlib/metadata.py
@@ -37,6 +37,15 @@
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')):
diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py
index 985277f..8fa9290 100644
--- a/Lib/test/test_importlib/fixtures.py
+++ b/Lib/test/test_importlib/fixtures.py
@@ -6,6 +6,8 @@
import textwrap
import contextlib
+from test.support.os_helper import FS_NONASCII
+
@contextlib.contextmanager
def tempdir():
@@ -212,12 +214,7 @@ def build_files(file_defs, prefix=pathlib.Path()):
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.")
diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py
index 91e501a..a26bab6 100644
--- a/Lib/test/test_importlib/test_main.py
+++ b/Lib/test/test_importlib/test_main.py
@@ -32,6 +32,18 @@ def test_for_name_does_not_exist(self):
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)