summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_importlib
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2021-12-16 20:49:42 (GMT)
committerGitHub <noreply@github.com>2021-12-16 20:49:42 (GMT)
commit04deaee4c8d313717f3ea8f6a4fd70286d510d6e (patch)
tree16af6d5242d248eb93107332099485783599fd4b /Lib/test/test_importlib
parent109d96602199a91e94eb14b8cb3720841f22ded7 (diff)
downloadcpython-04deaee4c8d313717f3ea8f6a4fd70286d510d6e.zip
cpython-04deaee4c8d313717f3ea8f6a4fd70286d510d6e.tar.gz
cpython-04deaee4c8d313717f3ea8f6a4fd70286d510d6e.tar.bz2
bpo-44893: Implement EntryPoint as simple class with attributes. (GH-30150)
* bpo-44893: Implement EntryPoint as simple class and deprecate tuple access in favor of attribute access. Syncs with importlib_metadata 4.8.1. * Apply refactorings found in importlib_metadata 4.8.2.
Diffstat (limited to 'Lib/test/test_importlib')
-rw-r--r--Lib/test/test_importlib/data/example2-1.0.0-py3-none-any.whlbin0 -> 1167 bytes
-rw-r--r--Lib/test/test_importlib/fixtures.py42
-rw-r--r--Lib/test/test_importlib/test_main.py54
-rw-r--r--Lib/test/test_importlib/test_metadata_api.py8
-rw-r--r--Lib/test/test_importlib/test_zip.py28
5 files changed, 90 insertions, 42 deletions
diff --git a/Lib/test/test_importlib/data/example2-1.0.0-py3-none-any.whl b/Lib/test/test_importlib/data/example2-1.0.0-py3-none-any.whl
new file mode 100644
index 0000000..5ca9365
--- /dev/null
+++ b/Lib/test/test_importlib/data/example2-1.0.0-py3-none-any.whl
Binary files differ
diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py
index 12ed07d..d7ed4e9 100644
--- a/Lib/test/test_importlib/fixtures.py
+++ b/Lib/test/test_importlib/fixtures.py
@@ -8,8 +8,17 @@ import textwrap
import contextlib
from test.support.os_helper import FS_NONASCII
+from test.support import requires_zlib
from typing import Dict, Union
+try:
+ from importlib import resources
+
+ getattr(resources, 'files')
+ getattr(resources, 'as_file')
+except (ImportError, AttributeError):
+ import importlib_resources as resources # type: ignore
+
@contextlib.contextmanager
def tempdir():
@@ -54,7 +63,7 @@ class Fixtures:
class SiteDir(Fixtures):
def setUp(self):
- super(SiteDir, self).setUp()
+ super().setUp()
self.site_dir = self.fixtures.enter_context(tempdir())
@@ -69,7 +78,7 @@ class OnSysPath(Fixtures):
sys.path.remove(str(dir))
def setUp(self):
- super(OnSysPath, self).setUp()
+ super().setUp()
self.fixtures.enter_context(self.add_sys_path(self.site_dir))
@@ -106,7 +115,7 @@ class DistInfoPkg(OnSysPath, SiteDir):
}
def setUp(self):
- super(DistInfoPkg, self).setUp()
+ super().setUp()
build_files(DistInfoPkg.files, self.site_dir)
def make_uppercase(self):
@@ -131,7 +140,7 @@ class DistInfoPkgWithDot(OnSysPath, SiteDir):
}
def setUp(self):
- super(DistInfoPkgWithDot, self).setUp()
+ super().setUp()
build_files(DistInfoPkgWithDot.files, self.site_dir)
@@ -152,13 +161,13 @@ class DistInfoPkgWithDotLegacy(OnSysPath, SiteDir):
}
def setUp(self):
- super(DistInfoPkgWithDotLegacy, self).setUp()
+ super().setUp()
build_files(DistInfoPkgWithDotLegacy.files, self.site_dir)
class DistInfoPkgOffPath(SiteDir):
def setUp(self):
- super(DistInfoPkgOffPath, self).setUp()
+ super().setUp()
build_files(DistInfoPkg.files, self.site_dir)
@@ -198,7 +207,7 @@ class EggInfoPkg(OnSysPath, SiteDir):
}
def setUp(self):
- super(EggInfoPkg, self).setUp()
+ super().setUp()
build_files(EggInfoPkg.files, prefix=self.site_dir)
@@ -219,7 +228,7 @@ class EggInfoFile(OnSysPath, SiteDir):
}
def setUp(self):
- super(EggInfoFile, self).setUp()
+ super().setUp()
build_files(EggInfoFile.files, prefix=self.site_dir)
@@ -285,3 +294,20 @@ def DALS(str):
class NullFinder:
def find_module(self, name):
pass
+
+
+@requires_zlib()
+class ZipFixtures:
+ root = 'test.test_importlib.data'
+
+ def _fixture_on_path(self, filename):
+ pkg_file = resources.files(self.root).joinpath(filename)
+ file = self.resources.enter_context(resources.as_file(pkg_file))
+ assert file.name.startswith('example'), file.name
+ sys.path.insert(0, str(file))
+ self.resources.callback(sys.path.pop, 0)
+
+ def setUp(self):
+ # Add self.zip_name to the front of sys.path.
+ self.resources = contextlib.ExitStack()
+ self.addCleanup(self.resources.close)
diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py
index 52cb637..2e120f7 100644
--- a/Lib/test/test_importlib/test_main.py
+++ b/Lib/test/test_importlib/test_main.py
@@ -19,6 +19,7 @@ from importlib.metadata import (
distributions,
entry_points,
metadata,
+ packages_distributions,
version,
)
@@ -203,7 +204,7 @@ class InaccessibleSysPath(fixtures.OnSysPath, ffs.TestCase):
site_dir = '/access-denied'
def setUp(self):
- super(InaccessibleSysPath, self).setUp()
+ super().setUp()
self.setUpPyfakefs()
self.fs.create_dir(self.site_dir, perm_bits=000)
@@ -217,13 +218,21 @@ class InaccessibleSysPath(fixtures.OnSysPath, ffs.TestCase):
class TestEntryPoints(unittest.TestCase):
def __init__(self, *args):
- super(TestEntryPoints, self).__init__(*args)
- self.ep = importlib.metadata.EntryPoint('name', 'value', 'group')
+ super().__init__(*args)
+ self.ep = importlib.metadata.EntryPoint(
+ name='name', value='value', group='group'
+ )
def test_entry_point_pickleable(self):
revived = pickle.loads(pickle.dumps(self.ep))
assert revived == self.ep
+ def test_positional_args(self):
+ """
+ Capture legacy (namedtuple) construction, discouraged.
+ """
+ EntryPoint('name', 'value', 'group')
+
def test_immutable(self):
"""EntryPoints should be immutable"""
with self.assertRaises(AttributeError):
@@ -254,8 +263,8 @@ class TestEntryPoints(unittest.TestCase):
# EntryPoint objects are sortable, but result is undefined.
sorted(
[
- EntryPoint('b', 'val', 'group'),
- EntryPoint('a', 'val', 'group'),
+ EntryPoint(name='b', value='val', group='group'),
+ EntryPoint(name='a', value='val', group='group'),
]
)
@@ -271,3 +280,38 @@ class FileSystem(
prefix=self.site_dir,
)
list(distributions())
+
+
+class PackagesDistributionsPrebuiltTest(fixtures.ZipFixtures, unittest.TestCase):
+ def test_packages_distributions_example(self):
+ self._fixture_on_path('example-21.12-py3-none-any.whl')
+ assert packages_distributions()['example'] == ['example']
+
+ def test_packages_distributions_example2(self):
+ """
+ Test packages_distributions on a wheel built
+ by trampolim.
+ """
+ self._fixture_on_path('example2-1.0.0-py3-none-any.whl')
+ assert packages_distributions()['example2'] == ['example2']
+
+
+class PackagesDistributionsTest(
+ fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase
+):
+ def test_packages_distributions_neither_toplevel_nor_files(self):
+ """
+ Test a package built without 'top-level.txt' or a file list.
+ """
+ fixtures.build_files(
+ {
+ 'trim_example-1.0.0.dist-info': {
+ 'METADATA': """
+ Name: trim_example
+ Version: 1.0.0
+ """,
+ }
+ },
+ prefix=self.site_dir,
+ )
+ packages_distributions()
diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py
index 4a45312..e16773a 100644
--- a/Lib/test/test_importlib/test_metadata_api.py
+++ b/Lib/test/test_importlib/test_metadata_api.py
@@ -21,7 +21,7 @@ from importlib.metadata import (
@contextlib.contextmanager
def suppress_known_deprecation():
with warnings.catch_warnings(record=True) as ctx:
- warnings.simplefilter('default')
+ warnings.simplefilter('default', category=DeprecationWarning)
yield ctx
@@ -113,7 +113,7 @@ class APITests(
for ep in entries
)
# ns:sub doesn't exist in alt_pkg
- assert 'ns:sub' not in entries
+ assert 'ns:sub' not in entries.names
def test_entry_points_missing_name(self):
with self.assertRaises(KeyError):
@@ -194,10 +194,8 @@ class APITests(
file.read_text()
def test_file_hash_repr(self):
- assertRegex = self.assertRegex
-
util = [p for p in files('distinfo-pkg') if p.name == 'mod.py'][0]
- assertRegex(repr(util.hash), '<FileHash mode: sha256 value: .*>')
+ self.assertRegex(repr(util.hash), '<FileHash mode: sha256 value: .*>')
def test_files_dist_info(self):
self._test_files(files('distinfo-pkg'))
diff --git a/Lib/test/test_importlib/test_zip.py b/Lib/test/test_importlib/test_zip.py
index bf16a3b..276f628 100644
--- a/Lib/test/test_importlib/test_zip.py
+++ b/Lib/test/test_importlib/test_zip.py
@@ -1,7 +1,7 @@
import sys
import unittest
-from contextlib import ExitStack
+from . import fixtures
from importlib.metadata import (
PackageNotFoundError,
distribution,
@@ -10,27 +10,11 @@ from importlib.metadata import (
files,
version,
)
-from importlib import resources
-from test.support import requires_zlib
-
-
-@requires_zlib()
-class TestZip(unittest.TestCase):
- root = 'test.test_importlib.data'
-
- def _fixture_on_path(self, filename):
- pkg_file = resources.files(self.root).joinpath(filename)
- file = self.resources.enter_context(resources.as_file(pkg_file))
- assert file.name.startswith('example-'), file.name
- sys.path.insert(0, str(file))
- self.resources.callback(sys.path.pop, 0)
+class TestZip(fixtures.ZipFixtures, unittest.TestCase):
def setUp(self):
- # Find the path to the example-*.whl so we can add it to the front of
- # sys.path, where we'll then try to find the metadata thereof.
- self.resources = ExitStack()
- self.addCleanup(self.resources.close)
+ super().setUp()
self._fixture_on_path('example-21.12-py3-none-any.whl')
def test_zip_version(self):
@@ -63,13 +47,9 @@ class TestZip(unittest.TestCase):
assert len(dists) == 1
-@requires_zlib()
class TestEgg(TestZip):
def setUp(self):
- # Find the path to the example-*.egg so we can add it to the front of
- # sys.path, where we'll then try to find the metadata thereof.
- self.resources = ExitStack()
- self.addCleanup(self.resources.close)
+ super().setUp()
self._fixture_on_path('example-21.12-py3.6.egg')
def test_files(self):