Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
| author | guerler |
|---|---|
| date | Fri, 31 Jul 2020 00:32:28 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:d30785e31577 | 1:56ad4e20f292 |
|---|---|
| 1 """ | |
| 2 shared options and groups | |
| 3 | |
| 4 The principle here is to define options once, but *not* instantiate them | |
| 5 globally. One reason being that options with action='append' can carry state | |
| 6 between parses. pip parses general options twice internally, and shouldn't | |
| 7 pass on state. To be consistent, all options will follow this design. | |
| 8 | |
| 9 """ | |
| 10 from __future__ import absolute_import | |
| 11 | |
| 12 import logging | |
| 13 import textwrap | |
| 14 import warnings | |
| 15 from distutils.util import strtobool | |
| 16 from functools import partial | |
| 17 from optparse import SUPPRESS_HELP, Option, OptionGroup | |
| 18 from textwrap import dedent | |
| 19 | |
| 20 from pip._internal.exceptions import CommandError | |
| 21 from pip._internal.locations import USER_CACHE_DIR, get_src_prefix | |
| 22 from pip._internal.models.format_control import FormatControl | |
| 23 from pip._internal.models.index import PyPI | |
| 24 from pip._internal.models.search_scope import SearchScope | |
| 25 from pip._internal.models.target_python import TargetPython | |
| 26 from pip._internal.utils.hashes import STRONG_HASHES | |
| 27 from pip._internal.utils.misc import redact_password_from_url | |
| 28 from pip._internal.utils.typing import MYPY_CHECK_RUNNING | |
| 29 from pip._internal.utils.ui import BAR_TYPES | |
| 30 | |
| 31 if MYPY_CHECK_RUNNING: | |
| 32 from typing import Any, Callable, Dict, Optional, Tuple | |
| 33 from optparse import OptionParser, Values | |
| 34 from pip._internal.cli.parser import ConfigOptionParser | |
| 35 | |
| 36 logger = logging.getLogger(__name__) | |
| 37 | |
| 38 | |
| 39 def raise_option_error(parser, option, msg): | |
| 40 """ | |
| 41 Raise an option parsing error using parser.error(). | |
| 42 | |
| 43 Args: | |
| 44 parser: an OptionParser instance. | |
| 45 option: an Option instance. | |
| 46 msg: the error text. | |
| 47 """ | |
| 48 msg = '{} error: {}'.format(option, msg) | |
| 49 msg = textwrap.fill(' '.join(msg.split())) | |
| 50 parser.error(msg) | |
| 51 | |
| 52 | |
| 53 def make_option_group(group, parser): | |
| 54 # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup | |
| 55 """ | |
| 56 Return an OptionGroup object | |
| 57 group -- assumed to be dict with 'name' and 'options' keys | |
| 58 parser -- an optparse Parser | |
| 59 """ | |
| 60 option_group = OptionGroup(parser, group['name']) | |
| 61 for option in group['options']: | |
| 62 option_group.add_option(option()) | |
| 63 return option_group | |
| 64 | |
| 65 | |
| 66 def check_install_build_global(options, check_options=None): | |
| 67 # type: (Values, Optional[Values]) -> None | |
| 68 """Disable wheels if per-setup.py call options are set. | |
| 69 | |
| 70 :param options: The OptionParser options to update. | |
| 71 :param check_options: The options to check, if not supplied defaults to | |
| 72 options. | |
| 73 """ | |
| 74 if check_options is None: | |
| 75 check_options = options | |
| 76 | |
| 77 def getname(n): | |
| 78 return getattr(check_options, n, None) | |
| 79 names = ["build_options", "global_options", "install_options"] | |
| 80 if any(map(getname, names)): | |
| 81 control = options.format_control | |
| 82 control.disallow_binaries() | |
| 83 warnings.warn( | |
| 84 'Disabling all use of wheels due to the use of --build-options ' | |
| 85 '/ --global-options / --install-options.', stacklevel=2, | |
| 86 ) | |
| 87 | |
| 88 | |
| 89 def check_dist_restriction(options, check_target=False): | |
| 90 # type: (Values, bool) -> None | |
| 91 """Function for determining if custom platform options are allowed. | |
| 92 | |
| 93 :param options: The OptionParser options. | |
| 94 :param check_target: Whether or not to check if --target is being used. | |
| 95 """ | |
| 96 dist_restriction_set = any([ | |
| 97 options.python_version, | |
| 98 options.platform, | |
| 99 options.abi, | |
| 100 options.implementation, | |
| 101 ]) | |
| 102 | |
| 103 binary_only = FormatControl(set(), {':all:'}) | |
| 104 sdist_dependencies_allowed = ( | |
| 105 options.format_control != binary_only and | |
| 106 not options.ignore_dependencies | |
| 107 ) | |
| 108 | |
| 109 # Installations or downloads using dist restrictions must not combine | |
| 110 # source distributions and dist-specific wheels, as they are not | |
| 111 # guaranteed to be locally compatible. | |
| 112 if dist_restriction_set and sdist_dependencies_allowed: | |
| 113 raise CommandError( | |
| 114 "When restricting platform and interpreter constraints using " | |
| 115 "--python-version, --platform, --abi, or --implementation, " | |
| 116 "either --no-deps must be set, or --only-binary=:all: must be " | |
| 117 "set and --no-binary must not be set (or must be set to " | |
| 118 ":none:)." | |
| 119 ) | |
| 120 | |
| 121 if check_target: | |
| 122 if dist_restriction_set and not options.target_dir: | |
| 123 raise CommandError( | |
| 124 "Can not use any platform or abi specific options unless " | |
| 125 "installing via '--target'" | |
| 126 ) | |
| 127 | |
| 128 | |
| 129 ########### | |
| 130 # options # | |
| 131 ########### | |
| 132 | |
| 133 help_ = partial( | |
| 134 Option, | |
| 135 '-h', '--help', | |
| 136 dest='help', | |
| 137 action='help', | |
| 138 help='Show help.', | |
| 139 ) # type: Callable[..., Option] | |
| 140 | |
| 141 isolated_mode = partial( | |
| 142 Option, | |
| 143 "--isolated", | |
| 144 dest="isolated_mode", | |
| 145 action="store_true", | |
| 146 default=False, | |
| 147 help=( | |
| 148 "Run pip in an isolated mode, ignoring environment variables and user " | |
| 149 "configuration." | |
| 150 ), | |
| 151 ) # type: Callable[..., Option] | |
| 152 | |
| 153 require_virtualenv = partial( | |
| 154 Option, | |
| 155 # Run only if inside a virtualenv, bail if not. | |
| 156 '--require-virtualenv', '--require-venv', | |
| 157 dest='require_venv', | |
| 158 action='store_true', | |
| 159 default=False, | |
| 160 help=SUPPRESS_HELP | |
| 161 ) # type: Callable[..., Option] | |
| 162 | |
| 163 verbose = partial( | |
| 164 Option, | |
| 165 '-v', '--verbose', | |
| 166 dest='verbose', | |
| 167 action='count', | |
| 168 default=0, | |
| 169 help='Give more output. Option is additive, and can be used up to 3 times.' | |
| 170 ) # type: Callable[..., Option] | |
| 171 | |
| 172 no_color = partial( | |
| 173 Option, | |
| 174 '--no-color', | |
| 175 dest='no_color', | |
| 176 action='store_true', | |
| 177 default=False, | |
| 178 help="Suppress colored output", | |
| 179 ) # type: Callable[..., Option] | |
| 180 | |
| 181 version = partial( | |
| 182 Option, | |
| 183 '-V', '--version', | |
| 184 dest='version', | |
| 185 action='store_true', | |
| 186 help='Show version and exit.', | |
| 187 ) # type: Callable[..., Option] | |
| 188 | |
| 189 quiet = partial( | |
| 190 Option, | |
| 191 '-q', '--quiet', | |
| 192 dest='quiet', | |
| 193 action='count', | |
| 194 default=0, | |
| 195 help=( | |
| 196 'Give less output. Option is additive, and can be used up to 3' | |
| 197 ' times (corresponding to WARNING, ERROR, and CRITICAL logging' | |
| 198 ' levels).' | |
| 199 ), | |
| 200 ) # type: Callable[..., Option] | |
| 201 | |
| 202 progress_bar = partial( | |
| 203 Option, | |
| 204 '--progress-bar', | |
| 205 dest='progress_bar', | |
| 206 type='choice', | |
| 207 choices=list(BAR_TYPES.keys()), | |
| 208 default='on', | |
| 209 help=( | |
| 210 'Specify type of progress to be displayed [' + | |
| 211 '|'.join(BAR_TYPES.keys()) + '] (default: %default)' | |
| 212 ), | |
| 213 ) # type: Callable[..., Option] | |
| 214 | |
| 215 log = partial( | |
| 216 Option, | |
| 217 "--log", "--log-file", "--local-log", | |
| 218 dest="log", | |
| 219 metavar="path", | |
| 220 help="Path to a verbose appending log." | |
| 221 ) # type: Callable[..., Option] | |
| 222 | |
| 223 no_input = partial( | |
| 224 Option, | |
| 225 # Don't ask for input | |
| 226 '--no-input', | |
| 227 dest='no_input', | |
| 228 action='store_true', | |
| 229 default=False, | |
| 230 help=SUPPRESS_HELP | |
| 231 ) # type: Callable[..., Option] | |
| 232 | |
| 233 proxy = partial( | |
| 234 Option, | |
| 235 '--proxy', | |
| 236 dest='proxy', | |
| 237 type='str', | |
| 238 default='', | |
| 239 help="Specify a proxy in the form [user:passwd@]proxy.server:port." | |
| 240 ) # type: Callable[..., Option] | |
| 241 | |
| 242 retries = partial( | |
| 243 Option, | |
| 244 '--retries', | |
| 245 dest='retries', | |
| 246 type='int', | |
| 247 default=5, | |
| 248 help="Maximum number of retries each connection should attempt " | |
| 249 "(default %default times).", | |
| 250 ) # type: Callable[..., Option] | |
| 251 | |
| 252 timeout = partial( | |
| 253 Option, | |
| 254 '--timeout', '--default-timeout', | |
| 255 metavar='sec', | |
| 256 dest='timeout', | |
| 257 type='float', | |
| 258 default=15, | |
| 259 help='Set the socket timeout (default %default seconds).', | |
| 260 ) # type: Callable[..., Option] | |
| 261 | |
| 262 skip_requirements_regex = partial( | |
| 263 Option, | |
| 264 # A regex to be used to skip requirements | |
| 265 '--skip-requirements-regex', | |
| 266 dest='skip_requirements_regex', | |
| 267 type='str', | |
| 268 default='', | |
| 269 help=SUPPRESS_HELP, | |
| 270 ) # type: Callable[..., Option] | |
| 271 | |
| 272 | |
| 273 def exists_action(): | |
| 274 # type: () -> Option | |
| 275 return Option( | |
| 276 # Option when path already exist | |
| 277 '--exists-action', | |
| 278 dest='exists_action', | |
| 279 type='choice', | |
| 280 choices=['s', 'i', 'w', 'b', 'a'], | |
| 281 default=[], | |
| 282 action='append', | |
| 283 metavar='action', | |
| 284 help="Default action when a path already exists: " | |
| 285 "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", | |
| 286 ) | |
| 287 | |
| 288 | |
| 289 cert = partial( | |
| 290 Option, | |
| 291 '--cert', | |
| 292 dest='cert', | |
| 293 type='str', | |
| 294 metavar='path', | |
| 295 help="Path to alternate CA bundle.", | |
| 296 ) # type: Callable[..., Option] | |
| 297 | |
| 298 client_cert = partial( | |
| 299 Option, | |
| 300 '--client-cert', | |
| 301 dest='client_cert', | |
| 302 type='str', | |
| 303 default=None, | |
| 304 metavar='path', | |
| 305 help="Path to SSL client certificate, a single file containing the " | |
| 306 "private key and the certificate in PEM format.", | |
| 307 ) # type: Callable[..., Option] | |
| 308 | |
| 309 index_url = partial( | |
| 310 Option, | |
| 311 '-i', '--index-url', '--pypi-url', | |
| 312 dest='index_url', | |
| 313 metavar='URL', | |
| 314 default=PyPI.simple_url, | |
| 315 help="Base URL of the Python Package Index (default %default). " | |
| 316 "This should point to a repository compliant with PEP 503 " | |
| 317 "(the simple repository API) or a local directory laid out " | |
| 318 "in the same format.", | |
| 319 ) # type: Callable[..., Option] | |
| 320 | |
| 321 | |
| 322 def extra_index_url(): | |
| 323 return Option( | |
| 324 '--extra-index-url', | |
| 325 dest='extra_index_urls', | |
| 326 metavar='URL', | |
| 327 action='append', | |
| 328 default=[], | |
| 329 help="Extra URLs of package indexes to use in addition to " | |
| 330 "--index-url. Should follow the same rules as " | |
| 331 "--index-url.", | |
| 332 ) | |
| 333 | |
| 334 | |
| 335 no_index = partial( | |
| 336 Option, | |
| 337 '--no-index', | |
| 338 dest='no_index', | |
| 339 action='store_true', | |
| 340 default=False, | |
| 341 help='Ignore package index (only looking at --find-links URLs instead).', | |
| 342 ) # type: Callable[..., Option] | |
| 343 | |
| 344 | |
| 345 def find_links(): | |
| 346 # type: () -> Option | |
| 347 return Option( | |
| 348 '-f', '--find-links', | |
| 349 dest='find_links', | |
| 350 action='append', | |
| 351 default=[], | |
| 352 metavar='url', | |
| 353 help="If a url or path to an html file, then parse for links to " | |
| 354 "archives. If a local path or file:// url that's a directory, " | |
| 355 "then look for archives in the directory listing.", | |
| 356 ) | |
| 357 | |
| 358 | |
| 359 def make_search_scope(options, suppress_no_index=False): | |
| 360 # type: (Values, bool) -> SearchScope | |
| 361 """ | |
| 362 :param suppress_no_index: Whether to ignore the --no-index option | |
| 363 when constructing the SearchScope object. | |
| 364 """ | |
| 365 index_urls = [options.index_url] + options.extra_index_urls | |
| 366 if options.no_index and not suppress_no_index: | |
| 367 logger.debug( | |
| 368 'Ignoring indexes: %s', | |
| 369 ','.join(redact_password_from_url(url) for url in index_urls), | |
| 370 ) | |
| 371 index_urls = [] | |
| 372 | |
| 373 # Make sure find_links is a list before passing to create(). | |
| 374 find_links = options.find_links or [] | |
| 375 | |
| 376 search_scope = SearchScope.create( | |
| 377 find_links=find_links, index_urls=index_urls, | |
| 378 ) | |
| 379 | |
| 380 return search_scope | |
| 381 | |
| 382 | |
| 383 def trusted_host(): | |
| 384 # type: () -> Option | |
| 385 return Option( | |
| 386 "--trusted-host", | |
| 387 dest="trusted_hosts", | |
| 388 action="append", | |
| 389 metavar="HOSTNAME", | |
| 390 default=[], | |
| 391 help="Mark this host as trusted, even though it does not have valid " | |
| 392 "or any HTTPS.", | |
| 393 ) | |
| 394 | |
| 395 | |
| 396 def constraints(): | |
| 397 # type: () -> Option | |
| 398 return Option( | |
| 399 '-c', '--constraint', | |
| 400 dest='constraints', | |
| 401 action='append', | |
| 402 default=[], | |
| 403 metavar='file', | |
| 404 help='Constrain versions using the given constraints file. ' | |
| 405 'This option can be used multiple times.' | |
| 406 ) | |
| 407 | |
| 408 | |
| 409 def requirements(): | |
| 410 # type: () -> Option | |
| 411 return Option( | |
| 412 '-r', '--requirement', | |
| 413 dest='requirements', | |
| 414 action='append', | |
| 415 default=[], | |
| 416 metavar='file', | |
| 417 help='Install from the given requirements file. ' | |
| 418 'This option can be used multiple times.' | |
| 419 ) | |
| 420 | |
| 421 | |
| 422 def editable(): | |
| 423 # type: () -> Option | |
| 424 return Option( | |
| 425 '-e', '--editable', | |
| 426 dest='editables', | |
| 427 action='append', | |
| 428 default=[], | |
| 429 metavar='path/url', | |
| 430 help=('Install a project in editable mode (i.e. setuptools ' | |
| 431 '"develop mode") from a local project path or a VCS url.'), | |
| 432 ) | |
| 433 | |
| 434 | |
| 435 src = partial( | |
| 436 Option, | |
| 437 '--src', '--source', '--source-dir', '--source-directory', | |
| 438 dest='src_dir', | |
| 439 metavar='dir', | |
| 440 default=get_src_prefix(), | |
| 441 help='Directory to check out editable projects into. ' | |
| 442 'The default in a virtualenv is "<venv path>/src". ' | |
| 443 'The default for global installs is "<current dir>/src".' | |
| 444 ) # type: Callable[..., Option] | |
| 445 | |
| 446 | |
| 447 def _get_format_control(values, option): | |
| 448 # type: (Values, Option) -> Any | |
| 449 """Get a format_control object.""" | |
| 450 return getattr(values, option.dest) | |
| 451 | |
| 452 | |
| 453 def _handle_no_binary(option, opt_str, value, parser): | |
| 454 # type: (Option, str, str, OptionParser) -> None | |
| 455 existing = _get_format_control(parser.values, option) | |
| 456 FormatControl.handle_mutual_excludes( | |
| 457 value, existing.no_binary, existing.only_binary, | |
| 458 ) | |
| 459 | |
| 460 | |
| 461 def _handle_only_binary(option, opt_str, value, parser): | |
| 462 # type: (Option, str, str, OptionParser) -> None | |
| 463 existing = _get_format_control(parser.values, option) | |
| 464 FormatControl.handle_mutual_excludes( | |
| 465 value, existing.only_binary, existing.no_binary, | |
| 466 ) | |
| 467 | |
| 468 | |
| 469 def no_binary(): | |
| 470 # type: () -> Option | |
| 471 format_control = FormatControl(set(), set()) | |
| 472 return Option( | |
| 473 "--no-binary", dest="format_control", action="callback", | |
| 474 callback=_handle_no_binary, type="str", | |
| 475 default=format_control, | |
| 476 help="Do not use binary packages. Can be supplied multiple times, and " | |
| 477 "each time adds to the existing value. Accepts either :all: to " | |
| 478 "disable all binary packages, :none: to empty the set, or one or " | |
| 479 "more package names with commas between them. Note that some " | |
| 480 "packages are tricky to compile and may fail to install when " | |
| 481 "this option is used on them.", | |
| 482 ) | |
| 483 | |
| 484 | |
| 485 def only_binary(): | |
| 486 # type: () -> Option | |
| 487 format_control = FormatControl(set(), set()) | |
| 488 return Option( | |
| 489 "--only-binary", dest="format_control", action="callback", | |
| 490 callback=_handle_only_binary, type="str", | |
| 491 default=format_control, | |
| 492 help="Do not use source packages. Can be supplied multiple times, and " | |
| 493 "each time adds to the existing value. Accepts either :all: to " | |
| 494 "disable all source packages, :none: to empty the set, or one or " | |
| 495 "more package names with commas between them. Packages without " | |
| 496 "binary distributions will fail to install when this option is " | |
| 497 "used on them.", | |
| 498 ) | |
| 499 | |
| 500 | |
| 501 platform = partial( | |
| 502 Option, | |
| 503 '--platform', | |
| 504 dest='platform', | |
| 505 metavar='platform', | |
| 506 default=None, | |
| 507 help=("Only use wheels compatible with <platform>. " | |
| 508 "Defaults to the platform of the running system."), | |
| 509 ) # type: Callable[..., Option] | |
| 510 | |
| 511 | |
| 512 # This was made a separate function for unit-testing purposes. | |
| 513 def _convert_python_version(value): | |
| 514 # type: (str) -> Tuple[Tuple[int, ...], Optional[str]] | |
| 515 """ | |
| 516 Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. | |
| 517 | |
| 518 :return: A 2-tuple (version_info, error_msg), where `error_msg` is | |
| 519 non-None if and only if there was a parsing error. | |
| 520 """ | |
| 521 if not value: | |
| 522 # The empty string is the same as not providing a value. | |
| 523 return (None, None) | |
| 524 | |
| 525 parts = value.split('.') | |
| 526 if len(parts) > 3: | |
| 527 return ((), 'at most three version parts are allowed') | |
| 528 | |
| 529 if len(parts) == 1: | |
| 530 # Then we are in the case of "3" or "37". | |
| 531 value = parts[0] | |
| 532 if len(value) > 1: | |
| 533 parts = [value[0], value[1:]] | |
| 534 | |
| 535 try: | |
| 536 version_info = tuple(int(part) for part in parts) | |
| 537 except ValueError: | |
| 538 return ((), 'each version part must be an integer') | |
| 539 | |
| 540 return (version_info, None) | |
| 541 | |
| 542 | |
| 543 def _handle_python_version(option, opt_str, value, parser): | |
| 544 # type: (Option, str, str, OptionParser) -> None | |
| 545 """ | |
| 546 Handle a provided --python-version value. | |
| 547 """ | |
| 548 version_info, error_msg = _convert_python_version(value) | |
| 549 if error_msg is not None: | |
| 550 msg = ( | |
| 551 'invalid --python-version value: {!r}: {}'.format( | |
| 552 value, error_msg, | |
| 553 ) | |
| 554 ) | |
| 555 raise_option_error(parser, option=option, msg=msg) | |
| 556 | |
| 557 parser.values.python_version = version_info | |
| 558 | |
| 559 | |
| 560 python_version = partial( | |
| 561 Option, | |
| 562 '--python-version', | |
| 563 dest='python_version', | |
| 564 metavar='python_version', | |
| 565 action='callback', | |
| 566 callback=_handle_python_version, type='str', | |
| 567 default=None, | |
| 568 help=dedent("""\ | |
| 569 The Python interpreter version to use for wheel and "Requires-Python" | |
| 570 compatibility checks. Defaults to a version derived from the running | |
| 571 interpreter. The version can be specified using up to three dot-separated | |
| 572 integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor | |
| 573 version can also be given as a string without dots (e.g. "37" for 3.7.0). | |
| 574 """), | |
| 575 ) # type: Callable[..., Option] | |
| 576 | |
| 577 | |
| 578 implementation = partial( | |
| 579 Option, | |
| 580 '--implementation', | |
| 581 dest='implementation', | |
| 582 metavar='implementation', | |
| 583 default=None, | |
| 584 help=("Only use wheels compatible with Python " | |
| 585 "implementation <implementation>, e.g. 'pp', 'jy', 'cp', " | |
| 586 " or 'ip'. If not specified, then the current " | |
| 587 "interpreter implementation is used. Use 'py' to force " | |
| 588 "implementation-agnostic wheels."), | |
| 589 ) # type: Callable[..., Option] | |
| 590 | |
| 591 | |
| 592 abi = partial( | |
| 593 Option, | |
| 594 '--abi', | |
| 595 dest='abi', | |
| 596 metavar='abi', | |
| 597 default=None, | |
| 598 help=("Only use wheels compatible with Python " | |
| 599 "abi <abi>, e.g. 'pypy_41'. If not specified, then the " | |
| 600 "current interpreter abi tag is used. Generally " | |
| 601 "you will need to specify --implementation, " | |
| 602 "--platform, and --python-version when using " | |
| 603 "this option."), | |
| 604 ) # type: Callable[..., Option] | |
| 605 | |
| 606 | |
| 607 def add_target_python_options(cmd_opts): | |
| 608 # type: (OptionGroup) -> None | |
| 609 cmd_opts.add_option(platform()) | |
| 610 cmd_opts.add_option(python_version()) | |
| 611 cmd_opts.add_option(implementation()) | |
| 612 cmd_opts.add_option(abi()) | |
| 613 | |
| 614 | |
| 615 def make_target_python(options): | |
| 616 # type: (Values) -> TargetPython | |
| 617 target_python = TargetPython( | |
| 618 platform=options.platform, | |
| 619 py_version_info=options.python_version, | |
| 620 abi=options.abi, | |
| 621 implementation=options.implementation, | |
| 622 ) | |
| 623 | |
| 624 return target_python | |
| 625 | |
| 626 | |
| 627 def prefer_binary(): | |
| 628 # type: () -> Option | |
| 629 return Option( | |
| 630 "--prefer-binary", | |
| 631 dest="prefer_binary", | |
| 632 action="store_true", | |
| 633 default=False, | |
| 634 help="Prefer older binary packages over newer source packages." | |
| 635 ) | |
| 636 | |
| 637 | |
| 638 cache_dir = partial( | |
| 639 Option, | |
| 640 "--cache-dir", | |
| 641 dest="cache_dir", | |
| 642 default=USER_CACHE_DIR, | |
| 643 metavar="dir", | |
| 644 help="Store the cache data in <dir>." | |
| 645 ) # type: Callable[..., Option] | |
| 646 | |
| 647 | |
| 648 def _handle_no_cache_dir(option, opt, value, parser): | |
| 649 # type: (Option, str, str, OptionParser) -> None | |
| 650 """ | |
| 651 Process a value provided for the --no-cache-dir option. | |
| 652 | |
| 653 This is an optparse.Option callback for the --no-cache-dir option. | |
| 654 """ | |
| 655 # The value argument will be None if --no-cache-dir is passed via the | |
| 656 # command-line, since the option doesn't accept arguments. However, | |
| 657 # the value can be non-None if the option is triggered e.g. by an | |
| 658 # environment variable, like PIP_NO_CACHE_DIR=true. | |
| 659 if value is not None: | |
| 660 # Then parse the string value to get argument error-checking. | |
| 661 try: | |
| 662 strtobool(value) | |
| 663 except ValueError as exc: | |
| 664 raise_option_error(parser, option=option, msg=str(exc)) | |
| 665 | |
| 666 # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() | |
| 667 # converted to 0 (like "false" or "no") caused cache_dir to be disabled | |
| 668 # rather than enabled (logic would say the latter). Thus, we disable | |
| 669 # the cache directory not just on values that parse to True, but (for | |
| 670 # backwards compatibility reasons) also on values that parse to False. | |
| 671 # In other words, always set it to False if the option is provided in | |
| 672 # some (valid) form. | |
| 673 parser.values.cache_dir = False | |
| 674 | |
| 675 | |
| 676 no_cache = partial( | |
| 677 Option, | |
| 678 "--no-cache-dir", | |
| 679 dest="cache_dir", | |
| 680 action="callback", | |
| 681 callback=_handle_no_cache_dir, | |
| 682 help="Disable the cache.", | |
| 683 ) # type: Callable[..., Option] | |
| 684 | |
| 685 no_deps = partial( | |
| 686 Option, | |
| 687 '--no-deps', '--no-dependencies', | |
| 688 dest='ignore_dependencies', | |
| 689 action='store_true', | |
| 690 default=False, | |
| 691 help="Don't install package dependencies.", | |
| 692 ) # type: Callable[..., Option] | |
| 693 | |
| 694 build_dir = partial( | |
| 695 Option, | |
| 696 '-b', '--build', '--build-dir', '--build-directory', | |
| 697 dest='build_dir', | |
| 698 metavar='dir', | |
| 699 help='Directory to unpack packages into and build in. Note that ' | |
| 700 'an initial build still takes place in a temporary directory. ' | |
| 701 'The location of temporary directories can be controlled by setting ' | |
| 702 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' | |
| 703 'When passed, build directories are not cleaned in case of failures.' | |
| 704 ) # type: Callable[..., Option] | |
| 705 | |
| 706 ignore_requires_python = partial( | |
| 707 Option, | |
| 708 '--ignore-requires-python', | |
| 709 dest='ignore_requires_python', | |
| 710 action='store_true', | |
| 711 help='Ignore the Requires-Python information.' | |
| 712 ) # type: Callable[..., Option] | |
| 713 | |
| 714 no_build_isolation = partial( | |
| 715 Option, | |
| 716 '--no-build-isolation', | |
| 717 dest='build_isolation', | |
| 718 action='store_false', | |
| 719 default=True, | |
| 720 help='Disable isolation when building a modern source distribution. ' | |
| 721 'Build dependencies specified by PEP 518 must be already installed ' | |
| 722 'if this option is used.' | |
| 723 ) # type: Callable[..., Option] | |
| 724 | |
| 725 | |
| 726 def _handle_no_use_pep517(option, opt, value, parser): | |
| 727 # type: (Option, str, str, OptionParser) -> None | |
| 728 """ | |
| 729 Process a value provided for the --no-use-pep517 option. | |
| 730 | |
| 731 This is an optparse.Option callback for the no_use_pep517 option. | |
| 732 """ | |
| 733 # Since --no-use-pep517 doesn't accept arguments, the value argument | |
| 734 # will be None if --no-use-pep517 is passed via the command-line. | |
| 735 # However, the value can be non-None if the option is triggered e.g. | |
| 736 # by an environment variable, for example "PIP_NO_USE_PEP517=true". | |
| 737 if value is not None: | |
| 738 msg = """A value was passed for --no-use-pep517, | |
| 739 probably using either the PIP_NO_USE_PEP517 environment variable | |
| 740 or the "no-use-pep517" config file option. Use an appropriate value | |
| 741 of the PIP_USE_PEP517 environment variable or the "use-pep517" | |
| 742 config file option instead. | |
| 743 """ | |
| 744 raise_option_error(parser, option=option, msg=msg) | |
| 745 | |
| 746 # Otherwise, --no-use-pep517 was passed via the command-line. | |
| 747 parser.values.use_pep517 = False | |
| 748 | |
| 749 | |
| 750 use_pep517 = partial( | |
| 751 Option, | |
| 752 '--use-pep517', | |
| 753 dest='use_pep517', | |
| 754 action='store_true', | |
| 755 default=None, | |
| 756 help='Use PEP 517 for building source distributions ' | |
| 757 '(use --no-use-pep517 to force legacy behaviour).' | |
| 758 ) # type: Any | |
| 759 | |
| 760 no_use_pep517 = partial( | |
| 761 Option, | |
| 762 '--no-use-pep517', | |
| 763 dest='use_pep517', | |
| 764 action='callback', | |
| 765 callback=_handle_no_use_pep517, | |
| 766 default=None, | |
| 767 help=SUPPRESS_HELP | |
| 768 ) # type: Any | |
| 769 | |
| 770 install_options = partial( | |
| 771 Option, | |
| 772 '--install-option', | |
| 773 dest='install_options', | |
| 774 action='append', | |
| 775 metavar='options', | |
| 776 help="Extra arguments to be supplied to the setup.py install " | |
| 777 "command (use like --install-option=\"--install-scripts=/usr/local/" | |
| 778 "bin\"). Use multiple --install-option options to pass multiple " | |
| 779 "options to setup.py install. If you are using an option with a " | |
| 780 "directory path, be sure to use absolute path.", | |
| 781 ) # type: Callable[..., Option] | |
| 782 | |
| 783 global_options = partial( | |
| 784 Option, | |
| 785 '--global-option', | |
| 786 dest='global_options', | |
| 787 action='append', | |
| 788 metavar='options', | |
| 789 help="Extra global options to be supplied to the setup.py " | |
| 790 "call before the install command.", | |
| 791 ) # type: Callable[..., Option] | |
| 792 | |
| 793 no_clean = partial( | |
| 794 Option, | |
| 795 '--no-clean', | |
| 796 action='store_true', | |
| 797 default=False, | |
| 798 help="Don't clean up build directories." | |
| 799 ) # type: Callable[..., Option] | |
| 800 | |
| 801 pre = partial( | |
| 802 Option, | |
| 803 '--pre', | |
| 804 action='store_true', | |
| 805 default=False, | |
| 806 help="Include pre-release and development versions. By default, " | |
| 807 "pip only finds stable versions.", | |
| 808 ) # type: Callable[..., Option] | |
| 809 | |
| 810 disable_pip_version_check = partial( | |
| 811 Option, | |
| 812 "--disable-pip-version-check", | |
| 813 dest="disable_pip_version_check", | |
| 814 action="store_true", | |
| 815 default=False, | |
| 816 help="Don't periodically check PyPI to determine whether a new version " | |
| 817 "of pip is available for download. Implied with --no-index.", | |
| 818 ) # type: Callable[..., Option] | |
| 819 | |
| 820 | |
| 821 # Deprecated, Remove later | |
| 822 always_unzip = partial( | |
| 823 Option, | |
| 824 '-Z', '--always-unzip', | |
| 825 dest='always_unzip', | |
| 826 action='store_true', | |
| 827 help=SUPPRESS_HELP, | |
| 828 ) # type: Callable[..., Option] | |
| 829 | |
| 830 | |
| 831 def _handle_merge_hash(option, opt_str, value, parser): | |
| 832 # type: (Option, str, str, OptionParser) -> None | |
| 833 """Given a value spelled "algo:digest", append the digest to a list | |
| 834 pointed to in a dict by the algo name.""" | |
| 835 if not parser.values.hashes: | |
| 836 parser.values.hashes = {} | |
| 837 try: | |
| 838 algo, digest = value.split(':', 1) | |
| 839 except ValueError: | |
| 840 parser.error('Arguments to %s must be a hash name ' | |
| 841 'followed by a value, like --hash=sha256:abcde...' % | |
| 842 opt_str) | |
| 843 if algo not in STRONG_HASHES: | |
| 844 parser.error('Allowed hash algorithms for %s are %s.' % | |
| 845 (opt_str, ', '.join(STRONG_HASHES))) | |
| 846 parser.values.hashes.setdefault(algo, []).append(digest) | |
| 847 | |
| 848 | |
| 849 hash = partial( | |
| 850 Option, | |
| 851 '--hash', | |
| 852 # Hash values eventually end up in InstallRequirement.hashes due to | |
| 853 # __dict__ copying in process_line(). | |
| 854 dest='hashes', | |
| 855 action='callback', | |
| 856 callback=_handle_merge_hash, | |
| 857 type='string', | |
| 858 help="Verify that the package's archive matches this " | |
| 859 'hash before installing. Example: --hash=sha256:abcdef...', | |
| 860 ) # type: Callable[..., Option] | |
| 861 | |
| 862 | |
| 863 require_hashes = partial( | |
| 864 Option, | |
| 865 '--require-hashes', | |
| 866 dest='require_hashes', | |
| 867 action='store_true', | |
| 868 default=False, | |
| 869 help='Require a hash to check each requirement against, for ' | |
| 870 'repeatable installs. This option is implied when any package in a ' | |
| 871 'requirements file has a --hash option.', | |
| 872 ) # type: Callable[..., Option] | |
| 873 | |
| 874 | |
| 875 list_path = partial( | |
| 876 Option, | |
| 877 '--path', | |
| 878 dest='path', | |
| 879 action='append', | |
| 880 help='Restrict to the specified installation path for listing ' | |
| 881 'packages (can be used multiple times).' | |
| 882 ) # type: Callable[..., Option] | |
| 883 | |
| 884 | |
| 885 def check_list_path_option(options): | |
| 886 # type: (Values) -> None | |
| 887 if options.path and (options.user or options.local): | |
| 888 raise CommandError( | |
| 889 "Cannot combine '--path' with '--user' or '--local'" | |
| 890 ) | |
| 891 | |
| 892 | |
| 893 ########## | |
| 894 # groups # | |
| 895 ########## | |
| 896 | |
| 897 general_group = { | |
| 898 'name': 'General Options', | |
| 899 'options': [ | |
| 900 help_, | |
| 901 isolated_mode, | |
| 902 require_virtualenv, | |
| 903 verbose, | |
| 904 version, | |
| 905 quiet, | |
| 906 log, | |
| 907 no_input, | |
| 908 proxy, | |
| 909 retries, | |
| 910 timeout, | |
| 911 skip_requirements_regex, | |
| 912 exists_action, | |
| 913 trusted_host, | |
| 914 cert, | |
| 915 client_cert, | |
| 916 cache_dir, | |
| 917 no_cache, | |
| 918 disable_pip_version_check, | |
| 919 no_color, | |
| 920 ] | |
| 921 } # type: Dict[str, Any] | |
| 922 | |
| 923 index_group = { | |
| 924 'name': 'Package Index Options', | |
| 925 'options': [ | |
| 926 index_url, | |
| 927 extra_index_url, | |
| 928 no_index, | |
| 929 find_links, | |
| 930 ] | |
| 931 } # type: Dict[str, Any] |
