diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index 416d8b6f707..3d10b5aeabf 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -221,7 +221,7 @@ interface expected of finders by Python's import system. an iterator over instances of the ``Distribution`` abstract class. This method must have the signature:: - def find_distributions(name=None, path=sys.path): + def find_distributions(name=None, path=None): """Return an iterable of all Distribution instances capable of loading the metadata for packages matching the name (or all names if not supplied) along the paths in the list diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index 9a4ba6171cc..24d45d2caad 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -35,7 +35,12 @@ class PackageNotFoundError(ModuleNotFoundError): class EntryPoint(collections.namedtuple('EntryPointBase', 'name value group')): - """An entry point as defined by Python packaging conventions.""" + """An entry point as defined by Python packaging conventions. + + See `the packaging docs on entry points + `_ + for more information. + """ pattern = re.compile( r'(?P[\w.]+)\s*' @@ -178,15 +183,6 @@ class Distribution: ) return filter(None, declared) - @classmethod - def find_local(cls): - dists = itertools.chain.from_iterable( - resolver(path=['.']) - for resolver in cls._discover_resolvers() - ) - dist, = dists - return dist - @property def metadata(self): """Return the parsed metadata for this Distribution. @@ -309,8 +305,10 @@ class DistributionFinder(MetaPathFinder): @abc.abstractmethod def find_distributions(self, name=None, path=None): """ + Find distributions. + Return an iterable of all Distribution instances capable of - loading the metadata for packages matching the name + loading the metadata for packages matching the ``name`` (or all names if not supplied) along the paths in the list of directories ``path`` (defaults to sys.path). """ @@ -347,14 +345,6 @@ def distributions(): return Distribution.discover() -def local_distribution(): - """Get the ``Distribution`` instance for the package in CWD. - - :return: A ``Distribution`` instance (or subclass thereof). - """ - return Distribution.find_local() - - def metadata(package): """Get the metadata for the package. diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py index 00fcffa9d92..3b926ba26df 100644 --- a/Lib/test/test_importlib/fixtures.py +++ b/Lib/test/test_importlib/fixtures.py @@ -48,23 +48,28 @@ def tempdir_as_cwd(): class SiteDir: - @staticmethod - @contextlib.contextmanager - def site_dir(): - with tempdir() as tmp: - sys.path[:0] = [str(tmp)] - try: - yield tmp - finally: - sys.path.remove(str(tmp)) - def setUp(self): self.fixtures = ExitStack() self.addCleanup(self.fixtures.close) - self.site_dir = self.fixtures.enter_context(self.site_dir()) + self.site_dir = self.fixtures.enter_context(tempdir()) -class DistInfoPkg(SiteDir): +class OnSysPath: + @staticmethod + @contextlib.contextmanager + def add_sys_path(dir): + sys.path[:0] = [str(dir)] + try: + yield + finally: + sys.path.remove(str(dir)) + + def setUp(self): + super(OnSysPath, self).setUp() + self.fixtures.enter_context(self.add_sys_path(self.site_dir)) + + +class DistInfoPkg(OnSysPath, SiteDir): files = { "distinfo_pkg-1.0.0.dist-info": { "METADATA": """ @@ -91,7 +96,13 @@ class DistInfoPkg(SiteDir): build_files(DistInfoPkg.files, self.site_dir) -class EggInfoPkg(SiteDir): +class DistInfoPkgOffPath(SiteDir): + def setUp(self): + super(DistInfoPkgOffPath, self).setUp() + build_files(DistInfoPkg.files, self.site_dir) + + +class EggInfoPkg(OnSysPath, SiteDir): files = { "egginfo_pkg.egg-info": { "PKG-INFO": """ @@ -128,7 +139,7 @@ class EggInfoPkg(SiteDir): build_files(EggInfoPkg.files, prefix=self.site_dir) -class EggInfoFile(SiteDir): +class EggInfoFile(OnSysPath, SiteDir): files = { "egginfo_file.egg-info": """ Metadata-Version: 1.0 @@ -149,14 +160,6 @@ class EggInfoFile(SiteDir): build_files(EggInfoFile.files, prefix=self.site_dir) -class LocalPackage: - def setUp(self): - self.fixtures = ExitStack() - self.addCleanup(self.fixtures.close) - self.fixtures.enter_context(tempdir_as_cwd()) - build_files(EggInfoPkg.files) - - def build_files(file_defs, prefix=pathlib.Path()): """Build a set of files/directories, as described by the diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py index bb5c6760f55..b70f9440f69 100644 --- a/Lib/test/test_importlib/test_main.py +++ b/Lib/test/test_importlib/test_main.py @@ -50,7 +50,8 @@ class ImportTests(fixtures.DistInfoPkg, unittest.TestCase): assert ep.load() is importlib.metadata -class NameNormalizationTests(fixtures.SiteDir, unittest.TestCase): +class NameNormalizationTests( + fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase): @staticmethod def pkg_with_dashes(site_dir): """ @@ -95,7 +96,7 @@ class NameNormalizationTests(fixtures.SiteDir, unittest.TestCase): assert version(pkg_name.upper()) == '1.0' -class NonASCIITests(fixtures.SiteDir, unittest.TestCase): +class NonASCIITests(fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase): @staticmethod def pkg_with_non_ascii_description(site_dir): """ @@ -146,7 +147,7 @@ class DiscoveryTests(fixtures.EggInfoPkg, assert all( isinstance(dist, Distribution) for dist in dists - ), dists + ) assert any( dist.metadata['Name'] == 'egginfo-pkg' for dist in dists diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py index 36c812da752..899777f4b1a 100644 --- a/Lib/test/test_importlib/test_metadata_api.py +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -1,13 +1,14 @@ import re import textwrap import unittest +import itertools from collections.abc import Iterator from . import fixtures from importlib.metadata import ( Distribution, PackageNotFoundError, distribution, - entry_points, files, local_distribution, metadata, requires, version, + entry_points, files, metadata, requires, version, ) @@ -138,7 +139,13 @@ class APITests( assert deps == expected -class LocalProjectTests(fixtures.LocalPackage, unittest.TestCase): - def test_find_local(self): - dist = local_distribution() - assert dist.metadata['Name'] == 'egginfo-pkg' +class OffSysPathTests(fixtures.DistInfoPkgOffPath, unittest.TestCase): + def test_find_distributions_specified_path(self): + dists = itertools.chain.from_iterable( + resolver(path=[str(self.site_dir)]) + for resolver in Distribution._discover_resolvers() + ) + assert any( + dist.metadata['Name'] == 'distinfo-pkg' + for dist in dists + ) diff --git a/Lib/test/test_importlib/test_zip.py b/Lib/test/test_importlib/test_zip.py index 22da0163081..db39e190ea7 100644 --- a/Lib/test/test_importlib/test_zip.py +++ b/Lib/test/test_importlib/test_zip.py @@ -48,7 +48,6 @@ class TestEgg(TestZip): egg = self.resources.enter_context( path(self.root, 'example-21.12-py3.6.egg')) sys.path.insert(0, str(egg)) - print('***', sys.path) self.resources.callback(sys.path.pop, 0) def test_files(self): diff --git a/Python.framework/Resources b/Python.framework/Resources new file mode 120000 index 00000000000..953ee36f3bb --- /dev/null +++ b/Python.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file