Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py: 41%

27 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-07 06:48 +0000

1"""Metadata generation logic for legacy source distributions. 

2""" 

3 

4import logging 

5import os 

6 

7from pip._internal.build_env import BuildEnvironment 

8from pip._internal.cli.spinners import open_spinner 

9from pip._internal.exceptions import ( 

10 InstallationError, 

11 InstallationSubprocessError, 

12 MetadataGenerationFailed, 

13) 

14from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args 

15from pip._internal.utils.subprocess import call_subprocess 

16from pip._internal.utils.temp_dir import TempDirectory 

17 

18logger = logging.getLogger(__name__) 

19 

20 

21def _find_egg_info(directory: str) -> str: 

22 """Find an .egg-info subdirectory in `directory`.""" 

23 filenames = [f for f in os.listdir(directory) if f.endswith(".egg-info")] 

24 

25 if not filenames: 

26 raise InstallationError(f"No .egg-info directory found in {directory}") 

27 

28 if len(filenames) > 1: 

29 raise InstallationError( 

30 "More than one .egg-info directory found in {}".format(directory) 

31 ) 

32 

33 return os.path.join(directory, filenames[0]) 

34 

35 

36def generate_metadata( 

37 build_env: BuildEnvironment, 

38 setup_py_path: str, 

39 source_dir: str, 

40 isolated: bool, 

41 details: str, 

42) -> str: 

43 """Generate metadata using setup.py-based defacto mechanisms. 

44 

45 Returns the generated metadata directory. 

46 """ 

47 logger.debug( 

48 "Running setup.py (path:%s) egg_info for package %s", 

49 setup_py_path, 

50 details, 

51 ) 

52 

53 egg_info_dir = TempDirectory(kind="pip-egg-info", globally_managed=True).path 

54 

55 args = make_setuptools_egg_info_args( 

56 setup_py_path, 

57 egg_info_dir=egg_info_dir, 

58 no_user_config=isolated, 

59 ) 

60 

61 with build_env: 

62 with open_spinner("Preparing metadata (setup.py)") as spinner: 

63 try: 

64 call_subprocess( 

65 args, 

66 cwd=source_dir, 

67 command_desc="python setup.py egg_info", 

68 spinner=spinner, 

69 ) 

70 except InstallationSubprocessError as error: 

71 raise MetadataGenerationFailed(package_details=details) from error 

72 

73 # Return the .egg-info directory. 

74 return _find_egg_info(egg_info_dir)