from __future__ import annotations import collections import copy import difflib import itertools import json import os import re import shlex import sys from pathlib import Path from typing import Any, Callable, Iterable, Iterator, TypeVar, cast from click.core import ParameterSource if sys.version_info >= (3, 11): import tomllib else: import tomli as tomllib import click from click.utils import LazyFile from pip._internal.req import InstallRequirement from pip._internal.req.constructors import install_req_from_line from pip._internal.resolution.resolvelib.base import Requirement as PipRequirement from pip._internal.utils.misc import redact_auth_from_url from pip._internal.vcs import is_url from pip._vendor.packaging.markers import Marker from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.packaging.version import Version from pip._vendor.pkg_resources import get_distribution from piptools._compat import PIP_VERSION from piptools.locations import DEFAULT_CONFIG_FILE_NAMES from piptools.subprocess_utils import run_python_snippet _KT = TypeVar("_KT") _VT = TypeVar("_VT") _T = TypeVar("_T") _S = TypeVar("_S") UNSAFE_PACKAGES = {"setuptools", "distribute", "pip"} COMPILE_EXCLUDE_OPTIONS = { "--dry-run", "--quiet", "--rebuild", "--upgrade", "--upgrade-package", "--verbose", "--cache-dir", "--no-reuse-hashes", "--no-config", } # Set of option that are only negative, i.e. --no-