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)