]> granicus.if.org Git - python/commitdiff
bpo-38010 Sync importlib.metadata with importlib_metadata 0.20. (GH-15646)
authorJason R. Coombs <jaraco@jaraco.com>
Mon, 2 Sep 2019 15:08:03 +0000 (11:08 -0400)
committerGitHub <noreply@github.com>
Mon, 2 Sep 2019 15:08:03 +0000 (11:08 -0400)
Sync importlib.metadata with importlib_metadata 0.20.

Doc/library/importlib.metadata.rst
Lib/importlib/metadata.py
Lib/test/test_importlib/test_metadata_api.py
Misc/NEWS.d/next/Library/2019-09-02-14-30-39.bpo-38010.JOnz9Z.rst [new file with mode: 0644]

index 2126498e728cfa4667ea8a470a0040df3708d8b5..23c8cdeb21c25d98a932daeb73d298161368daad 100644 (file)
@@ -158,6 +158,13 @@ Once you have the file, you can also read its contents::
             return s.encode('utf-8')
         return s
 
+In the case where the metadata file listing files
+(RECORD or SOURCES.txt) is missing, ``files()`` will
+return ``None``. The caller may wish to wrap calls to
+``files()`` in `always_iterable
+<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable>`_
+or otherwise guard against this condition if the target
+distribution is not known to have the metadata present.
 
 .. _requirements:
 
index e80f4fa6409bc7b08e99ac1d7fb2851bace6191e..3b46142231ec21101053360991505a12fb0af0b3 100644 (file)
@@ -213,6 +213,15 @@ class Distribution:
 
     @property
     def files(self):
+        """Files in this distribution.
+
+        :return: Iterable of PackagePath for this distribution or None
+
+        Result is `None` if the metadata file that enumerates files
+        (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is
+        missing.
+        Result may be empty if the metadata exists but is empty.
+        """
         file_lines = self._read_files_distinfo() or self._read_files_egginfo()
 
         def make_file(name, hash=None, size_str=None):
@@ -245,8 +254,7 @@ class Distribution:
         return self._read_dist_info_reqs() or self._read_egg_info_reqs()
 
     def _read_dist_info_reqs(self):
-        spec = self.metadata['Requires-Dist']
-        return spec and filter(None, spec.splitlines())
+        return self.metadata.get_all('Requires-Dist')
 
     def _read_egg_info_reqs(self):
         source = self.read_text('requires.txt')
@@ -318,7 +326,11 @@ class DistributionFinder(MetaPathFinder):
 
 class PathDistribution(Distribution):
     def __init__(self, path):
-        """Construct a distribution from a path to the metadata directory."""
+        """Construct a distribution from a path to the metadata directory.
+
+        :param path: A pathlib.Path or similar object supporting
+                     .joinpath(), __div__, .parent, and .read_text().
+        """
         self._path = path
 
     def read_text(self, filename):
index 899777f4b1ad0178e6021c07232104bdf6fa36ab..af3bab3558ef663234aa9111fb4ac1c741cbb289 100644 (file)
@@ -109,6 +109,8 @@ class APITests(
     def test_requires_dist_info(self):
         deps = list(requires('distinfo-pkg'))
         assert deps and all(deps)
+        assert 'wheel >= 1.0' in deps
+        assert "pytest; extra == 'test'" in deps
 
     def test_more_complex_deps_requires_text(self):
         requires = textwrap.dedent("""
diff --git a/Misc/NEWS.d/next/Library/2019-09-02-14-30-39.bpo-38010.JOnz9Z.rst b/Misc/NEWS.d/next/Library/2019-09-02-14-30-39.bpo-38010.JOnz9Z.rst
new file mode 100644 (file)
index 0000000..a97f9b7
--- /dev/null
@@ -0,0 +1 @@
+In ``importlib.metadata`` sync with ``importlib_metadata`` 0.20, clarifying behavior of ``files()`` and fixing issue where only one requirement was returned for ``requires()`` on ``dist-info`` packages.