|
| 1 | +import sys |
| 2 | +import pathlib |
1 | 3 | import unittest |
2 | 4 | import packaging.requirements |
3 | 5 | import packaging.version |
|
6 | 8 | from importlib_metadata import ( |
7 | 9 | MetadataPathFinder, |
8 | 10 | _compat, |
| 11 | + distribution, |
9 | 12 | distributions, |
| 13 | + entry_points, |
| 14 | + metadata, |
10 | 15 | version, |
11 | 16 | ) |
12 | 17 |
|
@@ -43,6 +48,48 @@ def __getattribute__(self, name): |
43 | 48 | _compat.disable_stdlib_finder() |
44 | 49 |
|
45 | 50 |
|
| 51 | +class OldStdlibFinderTests(fixtures.DistInfoPkgOffPath, unittest.TestCase): |
| 52 | + def setUp(self): |
| 53 | + python_version = sys.version_info[:2] |
| 54 | + if python_version < (3, 8) or python_version > (3, 9): |
| 55 | + self.skipTest("Tests specific for Python 3.8/3.9") |
| 56 | + super().setUp() |
| 57 | + |
| 58 | + def _meta_path_finder(self): |
| 59 | + from importlib.metadata import DistributionFinder, PathDistribution |
| 60 | + from importlib.util import spec_from_file_location |
| 61 | + |
| 62 | + path = pathlib.Path(self.site_dir) |
| 63 | + |
| 64 | + class CustomFinder: |
| 65 | + @classmethod |
| 66 | + def find_spec(cls, fullname, _path=None, _target=None): |
| 67 | + candidate = pathlib.Path(path, *fullname.split(".")).with_suffix(".py") |
| 68 | + if candidate.exists(): |
| 69 | + return spec_from_file_location(fullname, candidate) |
| 70 | + |
| 71 | + @classmethod |
| 72 | + def find_distributions(self, context=DistributionFinder.Context()): |
| 73 | + for dist_info in path.glob("*.dist-info"): |
| 74 | + yield PathDistribution(dist_info) |
| 75 | + |
| 76 | + return CustomFinder |
| 77 | + |
| 78 | + def test_compatibility_with_old_stdlib_path_distribution(self): |
| 79 | + """ |
| 80 | + Given a custom finder that uses Python 3.8/3.9 importlib.metadata is installed, |
| 81 | + when importlib_metadata functions are called, there should be no exceptions. |
| 82 | + Ref python/importlib_metadata#396. |
| 83 | + """ |
| 84 | + self.fixtures.enter_context(fixtures.install_finder(self._meta_path_finder())) |
| 85 | + |
| 86 | + assert list(distributions()) |
| 87 | + assert distribution("distinfo_pkg") |
| 88 | + assert version("distinfo_pkg") > "0" |
| 89 | + assert list(metadata("distinfo_pkg")) |
| 90 | + assert list(entry_points(group="entries")) |
| 91 | + |
| 92 | + |
46 | 93 | class DistSearch(unittest.TestCase): |
47 | 94 | def test_search_dist_dirs(self): |
48 | 95 | """ |
|
0 commit comments