mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			161 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import re
 | |
| import textwrap
 | |
| import unittest
 | |
| 
 | |
| from collections.abc import Iterator
 | |
| 
 | |
| from . import fixtures
 | |
| from importlib.metadata import (
 | |
|     Distribution, PackageNotFoundError, distribution,
 | |
|     entry_points, files, metadata, requires, version,
 | |
|     )
 | |
| 
 | |
| 
 | |
| class APITests(
 | |
|         fixtures.EggInfoPkg,
 | |
|         fixtures.DistInfoPkg,
 | |
|         fixtures.EggInfoFile,
 | |
|         unittest.TestCase):
 | |
| 
 | |
|     version_pattern = r'\d+\.\d+(\.\d)?'
 | |
| 
 | |
|     def test_retrieves_version_of_self(self):
 | |
|         pkg_version = version('egginfo-pkg')
 | |
|         assert isinstance(pkg_version, str)
 | |
|         assert re.match(self.version_pattern, pkg_version)
 | |
| 
 | |
|     def test_retrieves_version_of_distinfo_pkg(self):
 | |
|         pkg_version = version('distinfo-pkg')
 | |
|         assert isinstance(pkg_version, str)
 | |
|         assert re.match(self.version_pattern, pkg_version)
 | |
| 
 | |
|     def test_for_name_does_not_exist(self):
 | |
|         with self.assertRaises(PackageNotFoundError):
 | |
|             distribution('does-not-exist')
 | |
| 
 | |
|     def test_for_top_level(self):
 | |
|         self.assertEqual(
 | |
|             distribution('egginfo-pkg').read_text('top_level.txt').strip(),
 | |
|             'mod')
 | |
| 
 | |
|     def test_read_text(self):
 | |
|         top_level = [
 | |
|             path for path in files('egginfo-pkg')
 | |
|             if path.name == 'top_level.txt'
 | |
|             ][0]
 | |
|         self.assertEqual(top_level.read_text(), 'mod\n')
 | |
| 
 | |
|     def test_entry_points(self):
 | |
|         entries = dict(entry_points()['entries'])
 | |
|         ep = entries['main']
 | |
|         self.assertEqual(ep.value, 'mod:main')
 | |
|         self.assertEqual(ep.extras, [])
 | |
| 
 | |
|     def test_metadata_for_this_package(self):
 | |
|         md = metadata('egginfo-pkg')
 | |
|         assert md['author'] == 'Steven Ma'
 | |
|         assert md['LICENSE'] == 'Unknown'
 | |
|         assert md['Name'] == 'egginfo-pkg'
 | |
|         classifiers = md.get_all('Classifier')
 | |
|         assert 'Topic :: Software Development :: Libraries' in classifiers
 | |
| 
 | |
|     @staticmethod
 | |
|     def _test_files(files):
 | |
|         root = files[0].root
 | |
|         for file in files:
 | |
|             assert file.root == root
 | |
|             assert not file.hash or file.hash.value
 | |
|             assert not file.hash or file.hash.mode == 'sha256'
 | |
|             assert not file.size or file.size >= 0
 | |
|             assert file.locate().exists()
 | |
|             assert isinstance(file.read_binary(), bytes)
 | |
|             if file.name.endswith('.py'):
 | |
|                 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: .*>')
 | |
| 
 | |
|     def test_files_dist_info(self):
 | |
|         self._test_files(files('distinfo-pkg'))
 | |
| 
 | |
|     def test_files_egg_info(self):
 | |
|         self._test_files(files('egginfo-pkg'))
 | |
| 
 | |
|     def test_version_egg_info_file(self):
 | |
|         self.assertEqual(version('egginfo-file'), '0.1')
 | |
| 
 | |
|     def test_requires_egg_info_file(self):
 | |
|         requirements = requires('egginfo-file')
 | |
|         self.assertIsNone(requirements)
 | |
| 
 | |
|     def test_requires_egg_info(self):
 | |
|         deps = requires('egginfo-pkg')
 | |
|         assert len(deps) == 2
 | |
|         assert any(
 | |
|             dep == 'wheel >= 1.0; python_version >= "2.7"'
 | |
|             for dep in deps
 | |
|             )
 | |
| 
 | |
|     def test_requires_dist_info(self):
 | |
|         deps = requires('distinfo-pkg')
 | |
|         assert len(deps) == 2
 | |
|         assert 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("""
 | |
|             dep1
 | |
|             dep2
 | |
| 
 | |
|             [:python_version < "3"]
 | |
|             dep3
 | |
| 
 | |
|             [extra1]
 | |
|             dep4
 | |
| 
 | |
|             [extra2:python_version < "3"]
 | |
|             dep5
 | |
|             """)
 | |
|         deps = sorted(Distribution._deps_from_requires_text(requires))
 | |
|         expected = [
 | |
|             'dep1',
 | |
|             'dep2',
 | |
|             'dep3; python_version < "3"',
 | |
|             'dep4; extra == "extra1"',
 | |
|             'dep5; (python_version < "3") and extra == "extra2"',
 | |
|             ]
 | |
|         # It's important that the environment marker expression be
 | |
|         # wrapped in parentheses to avoid the following 'and' binding more
 | |
|         # tightly than some other part of the environment expression.
 | |
| 
 | |
|         assert deps == expected
 | |
| 
 | |
| 
 | |
| class OffSysPathTests(fixtures.DistInfoPkgOffPath, unittest.TestCase):
 | |
|     def test_find_distributions_specified_path(self):
 | |
|         dists = Distribution.discover(path=[str(self.site_dir)])
 | |
|         assert any(
 | |
|             dist.metadata['Name'] == 'distinfo-pkg'
 | |
|             for dist in dists
 | |
|             )
 | |
| 
 | |
|     def test_distribution_at_pathlib(self):
 | |
|         """Demonstrate how to load metadata direct from a directory.
 | |
|         """
 | |
|         dist_info_path = self.site_dir / 'distinfo_pkg-1.0.0.dist-info'
 | |
|         dist = Distribution.at(dist_info_path)
 | |
|         assert dist.version == '1.0.0'
 | |
| 
 | |
|     def test_distribution_at_str(self):
 | |
|         dist_info_path = self.site_dir / 'distinfo_pkg-1.0.0.dist-info'
 | |
|         dist = Distribution.at(str(dist_info_path))
 | |
|         assert dist.version == '1.0.0'
 | 
