110 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
import sys
 | 
						|
from optparse import Values
 | 
						|
from typing import AbstractSet, List
 | 
						|
 | 
						|
from pip._internal.cli import cmdoptions
 | 
						|
from pip._internal.cli.base_command import Command
 | 
						|
from pip._internal.cli.status_codes import SUCCESS
 | 
						|
from pip._internal.operations.freeze import freeze
 | 
						|
from pip._internal.utils.compat import stdlib_pkgs
 | 
						|
 | 
						|
 | 
						|
def _should_suppress_build_backends() -> bool:
 | 
						|
    return sys.version_info < (3, 12)
 | 
						|
 | 
						|
 | 
						|
def _dev_pkgs() -> AbstractSet[str]:
 | 
						|
    pkgs = {"pip"}
 | 
						|
 | 
						|
    if _should_suppress_build_backends():
 | 
						|
        pkgs |= {"setuptools", "distribute", "wheel"}
 | 
						|
        pkgs |= {"setuptools", "distribute", "wheel", "pkg-resources"}
 | 
						|
 | 
						|
    return pkgs
 | 
						|
 | 
						|
 | 
						|
class FreezeCommand(Command):
 | 
						|
    """
 | 
						|
    Output installed packages in requirements format.
 | 
						|
 | 
						|
    packages are listed in a case-insensitive sorted order.
 | 
						|
    """
 | 
						|
 | 
						|
    usage = """
 | 
						|
      %prog [options]"""
 | 
						|
    log_streams = ("ext://sys.stderr", "ext://sys.stderr")
 | 
						|
 | 
						|
    def add_options(self) -> None:
 | 
						|
        self.cmd_opts.add_option(
 | 
						|
            "-r",
 | 
						|
            "--requirement",
 | 
						|
            dest="requirements",
 | 
						|
            action="append",
 | 
						|
            default=[],
 | 
						|
            metavar="file",
 | 
						|
            help=(
 | 
						|
                "Use the order in the given requirements file and its "
 | 
						|
                "comments when generating output. This option can be "
 | 
						|
                "used multiple times."
 | 
						|
            ),
 | 
						|
        )
 | 
						|
        self.cmd_opts.add_option(
 | 
						|
            "-l",
 | 
						|
            "--local",
 | 
						|
            dest="local",
 | 
						|
            action="store_true",
 | 
						|
            default=False,
 | 
						|
            help=(
 | 
						|
                "If in a virtualenv that has global access, do not output "
 | 
						|
                "globally-installed packages."
 | 
						|
            ),
 | 
						|
        )
 | 
						|
        self.cmd_opts.add_option(
 | 
						|
            "--user",
 | 
						|
            dest="user",
 | 
						|
            action="store_true",
 | 
						|
            default=False,
 | 
						|
            help="Only output packages installed in user-site.",
 | 
						|
        )
 | 
						|
        self.cmd_opts.add_option(cmdoptions.list_path())
 | 
						|
        self.cmd_opts.add_option(
 | 
						|
            "--all",
 | 
						|
            dest="freeze_all",
 | 
						|
            action="store_true",
 | 
						|
            help=(
 | 
						|
                "Do not skip these packages in the output:"
 | 
						|
                " {}".format(", ".join(_dev_pkgs()))
 | 
						|
            ),
 | 
						|
        )
 | 
						|
        self.cmd_opts.add_option(
 | 
						|
            "--exclude-editable",
 | 
						|
            dest="exclude_editable",
 | 
						|
            action="store_true",
 | 
						|
            help="Exclude editable package from output.",
 | 
						|
        )
 | 
						|
        self.cmd_opts.add_option(cmdoptions.list_exclude())
 | 
						|
 | 
						|
        self.parser.insert_option_group(0, self.cmd_opts)
 | 
						|
 | 
						|
    def run(self, options: Values, args: List[str]) -> int:
 | 
						|
        skip = set(stdlib_pkgs)
 | 
						|
        if not options.freeze_all:
 | 
						|
            skip.update(_dev_pkgs())
 | 
						|
 | 
						|
        if options.excludes:
 | 
						|
            skip.update(options.excludes)
 | 
						|
 | 
						|
        cmdoptions.check_list_path_option(options)
 | 
						|
 | 
						|
        for line in freeze(
 | 
						|
            requirement=options.requirements,
 | 
						|
            local_only=options.local,
 | 
						|
            user_only=options.user,
 | 
						|
            paths=options.path,
 | 
						|
            isolated=options.isolated_mode,
 | 
						|
            skip=skip,
 | 
						|
            exclude_editable=options.exclude_editable,
 | 
						|
        ):
 | 
						|
            sys.stdout.write(line + "\n")
 | 
						|
        return SUCCESS
 |