| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  | import re | 
					
						
							|  |  |  | import textwrap | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from . import fixtures | 
					
						
							|  |  |  | from importlib.metadata import ( | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |     Distribution, | 
					
						
							|  |  |  |     PackageNotFoundError, | 
					
						
							|  |  |  |     distribution, | 
					
						
							|  |  |  |     entry_points, | 
					
						
							|  |  |  |     files, | 
					
						
							|  |  |  |     metadata, | 
					
						
							|  |  |  |     requires, | 
					
						
							|  |  |  |     version, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class APITests( | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |     fixtures.EggInfoPkg, | 
					
						
							|  |  |  |     fixtures.DistInfoPkg, | 
					
						
							|  |  |  |     fixtures.DistInfoPkgWithDot, | 
					
						
							|  |  |  |     fixtures.EggInfoFile, | 
					
						
							|  |  |  |     unittest.TestCase, | 
					
						
							|  |  |  | ): | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |     def test_name_normalization(self): | 
					
						
							|  |  |  |         names = 'pkg.dot', 'pkg_dot', 'pkg-dot', 'pkg..dot', 'Pkg.Dot' | 
					
						
							|  |  |  |         for name in names: | 
					
						
							|  |  |  |             with self.subTest(name): | 
					
						
							|  |  |  |                 assert distribution(name).metadata['Name'] == 'pkg.dot' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_prefix_not_matched(self): | 
					
						
							|  |  |  |         prefixes = 'p', 'pkg', 'pkg.' | 
					
						
							|  |  |  |         for prefix in prefixes: | 
					
						
							|  |  |  |             with self.subTest(prefix): | 
					
						
							|  |  |  |                 with self.assertRaises(PackageNotFoundError): | 
					
						
							|  |  |  |                     distribution(prefix) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  |     def test_for_top_level(self): | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |             distribution('egginfo-pkg').read_text('top_level.txt').strip(), 'mod' | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_read_text(self): | 
					
						
							|  |  |  |         top_level = [ | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |             path for path in files('egginfo-pkg') if path.name == 'top_level.txt' | 
					
						
							|  |  |  |         ][0] | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  |         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, []) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |     def test_entry_points_distribution(self): | 
					
						
							|  |  |  |         entries = dict(entry_points()['entries']) | 
					
						
							|  |  |  |         for entry in ("main", "ns:sub"): | 
					
						
							|  |  |  |             ep = entries[entry] | 
					
						
							|  |  |  |             self.assertIn(ep.dist.name, ('distinfo-pkg', 'egginfo-pkg')) | 
					
						
							|  |  |  |             self.assertEqual(ep.dist.version, "1.0.0") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2019-09-10 14:53:31 +01:00
										 |  |  |     def _test_files(files): | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  |         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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |         util = [p for p in files('distinfo-pkg') if p.name == 'mod.py'][0] | 
					
						
							|  |  |  |         assertRegex(repr(util.hash), '<FileHash mode: sha256 value: .*>') | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 14:53:31 +01:00
										 |  |  |     def test_requires_egg_info(self): | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  |         deps = requires('egginfo-pkg') | 
					
						
							| 
									
										
										
										
											2019-09-10 14:53:31 +01:00
										 |  |  |         assert len(deps) == 2 | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |         assert any(dep == 'wheel >= 1.0; python_version >= "2.7"' for dep in deps) | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_requires_dist_info(self): | 
					
						
							| 
									
										
										
										
											2019-09-10 14:53:31 +01:00
										 |  |  |         deps = requires('distinfo-pkg') | 
					
						
							|  |  |  |         assert len(deps) == 2 | 
					
						
							|  |  |  |         assert all(deps) | 
					
						
							| 
									
										
										
										
											2019-09-02 11:08:03 -04:00
										 |  |  |         assert 'wheel >= 1.0' in deps | 
					
						
							|  |  |  |         assert "pytest; extra == 'test'" in deps | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_more_complex_deps_requires_text(self): | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |         requires = textwrap.dedent( | 
					
						
							|  |  |  |             """
 | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  |             dep1 | 
					
						
							|  |  |  |             dep2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             [:python_version < "3"] | 
					
						
							|  |  |  |             dep3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             [extra1] | 
					
						
							|  |  |  |             dep4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             [extra2:python_version < "3"] | 
					
						
							|  |  |  |             dep5 | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |             """
 | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  |         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"', | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |         ] | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  |         # 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  | class LegacyDots(fixtures.DistInfoPkgWithDotLegacy, unittest.TestCase): | 
					
						
							|  |  |  |     def test_name_normalization(self): | 
					
						
							|  |  |  |         names = 'pkg.dot', 'pkg_dot', 'pkg-dot', 'pkg..dot', 'Pkg.Dot' | 
					
						
							|  |  |  |         for name in names: | 
					
						
							|  |  |  |             with self.subTest(name): | 
					
						
							|  |  |  |                 assert distribution(name).metadata['Name'] == 'pkg.dot' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_name_normalization_versionless_egg_info(self): | 
					
						
							|  |  |  |         names = 'pkg.lot', 'pkg_lot', 'pkg-lot', 'pkg..lot', 'Pkg.Lot' | 
					
						
							|  |  |  |         for name in names: | 
					
						
							|  |  |  |             with self.subTest(name): | 
					
						
							|  |  |  |                 assert distribution(name).metadata['Name'] == 'pkg.lot' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 19:59:01 -04:00
										 |  |  | class OffSysPathTests(fixtures.DistInfoPkgOffPath, unittest.TestCase): | 
					
						
							|  |  |  |     def test_find_distributions_specified_path(self): | 
					
						
							| 
									
										
										
										
											2019-09-10 14:53:31 +01:00
										 |  |  |         dists = Distribution.discover(path=[str(self.site_dir)]) | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |         assert any(dist.metadata['Name'] == 'distinfo-pkg' for dist in dists) | 
					
						
							| 
									
										
										
										
											2019-09-10 14:53:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_distribution_at_pathlib(self): | 
					
						
							| 
									
										
										
										
											2020-12-31 12:56:43 -05:00
										 |  |  |         """Demonstrate how to load metadata direct from a directory.""" | 
					
						
							| 
									
										
										
										
											2019-09-10 14:53:31 +01:00
										 |  |  |         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' |