bpo-42089: Sync with current cpython branch of importlib_metadata (GH-22775)

~~The only differences are in the test files.~~

Automerge-Triggered-By: @jaraco
This commit is contained in:
Barry Warsaw 2020-10-19 14:14:21 -07:00 committed by GitHub
parent 95ad890a7b
commit 96ddc58281
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 6 deletions

View File

@ -37,6 +37,15 @@ __all__ = [
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')):

View File

@ -6,6 +6,8 @@ import tempfile
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.")

View File

@ -32,6 +32,18 @@ class BasicTests(fixtures.DistInfoPkg, unittest.TestCase):
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)

View File

@ -0,0 +1,2 @@
In ``importlib.metadata.PackageNotFoundError``, make reference to the
package metadata being missing to improve the user experience.