mirror of https://github.com/pypa/pip
Merge branch 'main' into switch-to-tenacity
This commit is contained in:
commit
5457c6f399
|
@ -1,36 +0,0 @@
|
||||||
parameters:
|
|
||||||
vmImage:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
- job: Package
|
|
||||||
dependsOn:
|
|
||||||
- Test_Primary
|
|
||||||
- Test_Secondary
|
|
||||||
pool:
|
|
||||||
vmImage: ${{ parameters.vmImage }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
displayName: Use Python 3 latest
|
|
||||||
inputs:
|
|
||||||
versionSpec: '3'
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
git config --global user.email "distutils-sig@python.org"
|
|
||||||
git config --global user.name "pip"
|
|
||||||
displayName: Setup Git credentials
|
|
||||||
|
|
||||||
- bash: pip install nox
|
|
||||||
displayName: Install dependencies
|
|
||||||
|
|
||||||
- bash: nox -s prepare-release -- 99.9
|
|
||||||
displayName: Prepare dummy release
|
|
||||||
|
|
||||||
- bash: nox -s build-release -- 99.9
|
|
||||||
displayName: Generate distributions for the dummy release
|
|
||||||
|
|
||||||
- task: PublishBuildArtifacts@1
|
|
||||||
displayName: 'Publish Artifact: dist'
|
|
||||||
inputs:
|
|
||||||
pathtoPublish: dist
|
|
||||||
artifactName: dist
|
|
|
@ -1,53 +0,0 @@
|
||||||
parameters:
|
|
||||||
vmImage:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
- job: Test_Primary
|
|
||||||
displayName: Tests /
|
|
||||||
|
|
||||||
pool:
|
|
||||||
vmImage: ${{ parameters.vmImage }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
"3.6": # lowest Python version
|
|
||||||
python.version: '3.6'
|
|
||||||
python.architecture: x64
|
|
||||||
"3.8": # current
|
|
||||||
python.version: '3.8'
|
|
||||||
python.architecture: x64
|
|
||||||
maxParallel: 6
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- template: ../steps/run-tests-windows.yml
|
|
||||||
parameters:
|
|
||||||
runIntegrationTests: true
|
|
||||||
|
|
||||||
- job: Test_Secondary
|
|
||||||
displayName: Tests /
|
|
||||||
# Don't run integration tests for these runs
|
|
||||||
# Run after Test_Primary so we don't devour time and jobs if tests are going to fail
|
|
||||||
dependsOn: Test_Primary
|
|
||||||
|
|
||||||
pool:
|
|
||||||
vmImage: ${{ parameters.vmImage }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
"3.7":
|
|
||||||
python.version: '3.7'
|
|
||||||
python.architecture: x64
|
|
||||||
# This is for Windows, so test x86 builds
|
|
||||||
"3.6-x86":
|
|
||||||
python.version: '3.6'
|
|
||||||
python.architecture: x86
|
|
||||||
"3.7-x86":
|
|
||||||
python.version: '3.7'
|
|
||||||
python.architecture: x86
|
|
||||||
"3.8-x86":
|
|
||||||
python.version: '3.8'
|
|
||||||
python.architecture: x86
|
|
||||||
maxParallel: 6
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- template: ../steps/run-tests-windows.yml
|
|
||||||
parameters:
|
|
||||||
runIntegrationTests: false
|
|
|
@ -1,38 +0,0 @@
|
||||||
parameters:
|
|
||||||
vmImage:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
- job: Test_Primary
|
|
||||||
displayName: Tests /
|
|
||||||
|
|
||||||
pool:
|
|
||||||
vmImage: ${{ parameters.vmImage }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
"3.6": # lowest Python version
|
|
||||||
python.version: '3.6'
|
|
||||||
python.architecture: x64
|
|
||||||
"3.8":
|
|
||||||
python.version: '3.8'
|
|
||||||
python.architecture: x64
|
|
||||||
maxParallel: 2
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- template: ../steps/run-tests.yml
|
|
||||||
|
|
||||||
- job: Test_Secondary
|
|
||||||
displayName: Tests /
|
|
||||||
# Run after Test_Primary so we don't devour time and jobs if tests are going to fail
|
|
||||||
dependsOn: Test_Primary
|
|
||||||
|
|
||||||
pool:
|
|
||||||
vmImage: ${{ parameters.vmImage }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
"3.7":
|
|
||||||
python.version: '3.7'
|
|
||||||
python.architecture: x64
|
|
||||||
maxParallel: 4
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- template: ../steps/run-tests.yml
|
|
|
@ -1,11 +0,0 @@
|
||||||
variables:
|
|
||||||
CI: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
- template: jobs/test.yml
|
|
||||||
parameters:
|
|
||||||
vmImage: ubuntu-16.04
|
|
||||||
|
|
||||||
- template: jobs/package.yml
|
|
||||||
parameters:
|
|
||||||
vmImage: ubuntu-16.04
|
|
|
@ -1,54 +0,0 @@
|
||||||
parameters:
|
|
||||||
runIntegrationTests:
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
displayName: Use Python $(python.version)
|
|
||||||
inputs:
|
|
||||||
versionSpec: '$(python.version)'
|
|
||||||
architecture: '$(python.architecture)'
|
|
||||||
|
|
||||||
- task: PowerShell@2
|
|
||||||
inputs:
|
|
||||||
filePath: .azure-pipelines/scripts/New-RAMDisk.ps1
|
|
||||||
arguments: "-Drive R -Size 1GB"
|
|
||||||
displayName: Setup RAMDisk
|
|
||||||
|
|
||||||
- powershell: |
|
|
||||||
mkdir R:\Temp
|
|
||||||
$acl = Get-Acl "R:\Temp"
|
|
||||||
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
|
|
||||||
"Everyone", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
|
|
||||||
)
|
|
||||||
$acl.AddAccessRule($rule)
|
|
||||||
Set-Acl "R:\Temp" $acl
|
|
||||||
displayName: Set RAMDisk Permissions
|
|
||||||
|
|
||||||
- bash: pip install --upgrade 'virtualenv<20' setuptools tox
|
|
||||||
displayName: Install Tox
|
|
||||||
|
|
||||||
- script: tox -e py -- -m unit -n auto --junit-xml=junit/unit-test.xml
|
|
||||||
env:
|
|
||||||
TEMP: "R:\\Temp"
|
|
||||||
displayName: Tox run unit tests
|
|
||||||
|
|
||||||
- ${{ if eq(parameters.runIntegrationTests, 'true') }}:
|
|
||||||
- powershell: |
|
|
||||||
# Fix Git SSL errors
|
|
||||||
pip install certifi tox
|
|
||||||
python -m certifi > cacert.txt
|
|
||||||
$env:GIT_SSL_CAINFO = $(Get-Content cacert.txt)
|
|
||||||
|
|
||||||
# Shorten paths to get under MAX_PATH or else integration tests will fail
|
|
||||||
# https://bugs.python.org/issue18199
|
|
||||||
$env:TEMP = "R:\Temp"
|
|
||||||
|
|
||||||
tox -e py -- -m integration -n auto --durations=5 --junit-xml=junit/integration-test.xml
|
|
||||||
displayName: Tox run integration tests
|
|
||||||
|
|
||||||
- task: PublishTestResults@2
|
|
||||||
displayName: Publish Test Results
|
|
||||||
inputs:
|
|
||||||
testResultsFiles: junit/*.xml
|
|
||||||
testRunTitle: 'Python $(python.version)'
|
|
||||||
condition: succeededOrFailed()
|
|
|
@ -1,25 +0,0 @@
|
||||||
steps:
|
|
||||||
- task: UsePythonVersion@0
|
|
||||||
displayName: Use Python $(python.version)
|
|
||||||
inputs:
|
|
||||||
versionSpec: '$(python.version)'
|
|
||||||
|
|
||||||
- bash: pip install --upgrade 'virtualenv<20' setuptools tox
|
|
||||||
displayName: Install Tox
|
|
||||||
|
|
||||||
- script: tox -e py -- -m unit -n auto --junit-xml=junit/unit-test.xml
|
|
||||||
displayName: Tox run unit tests
|
|
||||||
|
|
||||||
# Run integration tests in two groups so we will fail faster if there is a failure in the first group
|
|
||||||
- script: tox -e py -- -m integration -n auto --durations=5 -k "not test_install" --junit-xml=junit/integration-test-group0.xml
|
|
||||||
displayName: Tox run Group 0 integration tests
|
|
||||||
|
|
||||||
- script: tox -e py -- -m integration -n auto --durations=5 -k "test_install" --junit-xml=junit/integration-test-group1.xml
|
|
||||||
displayName: Tox run Group 1 integration tests
|
|
||||||
|
|
||||||
- task: PublishTestResults@2
|
|
||||||
displayName: Publish Test Results
|
|
||||||
inputs:
|
|
||||||
testResultsFiles: junit/*.xml
|
|
||||||
testRunTitle: 'Python $(python.version)'
|
|
||||||
condition: succeededOrFailed()
|
|
|
@ -1,11 +0,0 @@
|
||||||
variables:
|
|
||||||
CI: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
- template: jobs/test-windows.yml
|
|
||||||
parameters:
|
|
||||||
vmImage: vs2017-win2016
|
|
||||||
|
|
||||||
- template: jobs/package.yml
|
|
||||||
parameters:
|
|
||||||
vmImage: vs2017-win2016
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Patches must have Unix-style line endings, even on Windows
|
# Patches must have Unix-style line endings, even on Windows
|
||||||
tools/automation/vendoring/patches/* eol=lf
|
tools/vendoring/patches/* eol=lf
|
||||||
# The CA Bundle should always use Unix-style line endings, even on Windows
|
# The CA Bundle should always use Unix-style line endings, even on Windows
|
||||||
src/pip/_vendor/certifi/*.pem eol=lf
|
src/pip/_vendor/certifi/*.pem eol=lf
|
||||||
|
|
|
@ -1,81 +1,62 @@
|
||||||
---
|
|
||||||
name: Bug report
|
name: Bug report
|
||||||
about: Something is not working correctly.
|
description: Something is not working correctly.
|
||||||
title: ""
|
title: ""
|
||||||
labels: "S: needs triage, type: bug"
|
labels: "S: needs triage, type: bug"
|
||||||
issue_body: true # default: true, adds a classic WSYWIG textarea, if on
|
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
label: Description
|
||||||
⚠
|
description: >-
|
||||||
If you're reporting an issue for `--use-feature=2020-resolver`,
|
A clear and concise description of what the bug is.
|
||||||
use the "Dependency resolver failures / errors" template instead.
|
validations:
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: "**Environment**"
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: pip version
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Python version
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: OS
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Additional information
|
|
||||||
description: >-
|
|
||||||
Feel free to add more information about your environment here.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Description
|
|
||||||
description: >-
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Expected behavior
|
|
||||||
description: >-
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: How to Reproduce
|
|
||||||
description: >-
|
|
||||||
Describe the steps to reproduce this bug.
|
|
||||||
value: |
|
|
||||||
1. Get package from '...'
|
|
||||||
2. Then run '...'
|
|
||||||
3. An error occurs.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Output
|
|
||||||
description: >-
|
|
||||||
Paste the output of the steps above, including the commands
|
|
||||||
themselves and pip's output/traceback etc.
|
|
||||||
value: |
|
|
||||||
```console
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
- type: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: Code of Conduct
|
|
||||||
description: |
|
|
||||||
Read the [PSF Code of Conduct][CoC] first.
|
|
||||||
|
|
||||||
[CoC]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
|
|
||||||
options:
|
|
||||||
- label: I agree to follow the PSF Code of Conduct
|
|
||||||
required: true
|
required: true
|
||||||
...
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected behavior
|
||||||
|
description: >-
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: pip version
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Python version
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: OS
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: How to Reproduce
|
||||||
|
description: Please provide steps to reproduce this bug.
|
||||||
|
value: |
|
||||||
|
1. Get package from '...'
|
||||||
|
2. Then run '...'
|
||||||
|
3. An error occurs.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Output
|
||||||
|
description: >-
|
||||||
|
Provide the output of the steps above, including the commands
|
||||||
|
themselves and pip's output/traceback etc.
|
||||||
|
render: sh-session
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Code of Conduct
|
||||||
|
options:
|
||||||
|
- label: >-
|
||||||
|
I agree to follow the [PSF Code of Conduct](https://www.python.org/psf/conduct/).
|
||||||
|
required: true
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
---
|
|
||||||
name: Dependency resolver failures / errors
|
|
||||||
about: Report when the pip dependency resolver fails
|
|
||||||
labels: ["K: UX", "K: crash", "C: new resolver", "C: dependency resolution"]
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Please provide as much information as you can about your failure, so that we can understand the root cause.
|
|
||||||
|
|
||||||
Try if your issue has been fixed in the in-development version of pip. Use the following command to install pip from master:
|
|
||||||
|
|
||||||
python -m pip install -U "pip @ https://github.com/pypa/pip/archive/master.zip"
|
|
||||||
-->
|
|
||||||
|
|
||||||
**What did you want to do?**
|
|
||||||
<!-- Include any inputs you gave to pip, for example:
|
|
||||||
|
|
||||||
* Package requirements: any CLI arguments and/or your requirements.txt file
|
|
||||||
* Already installed packages, outputted via `pip freeze`
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Output**
|
|
||||||
|
|
||||||
```
|
|
||||||
Paste what pip outputted in a code block. https://github.github.com/gfm/#fenced-code-blocks
|
|
||||||
```
|
|
||||||
|
|
||||||
**Additional information**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
It would be great if you could also include your dependency tree. For this you can use pipdeptree: https://pypi.org/project/pipdeptree/
|
|
||||||
|
|
||||||
For users installing packages from a private repository or local directory, please try your best to describe your setup. We'd like to understand how to reproduce the error locally, so would need (at a minimum) a description of the packages you are trying to install, and a list of dependencies for each package.
|
|
||||||
-->
|
|
|
@ -0,0 +1,187 @@
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
tags:
|
||||||
|
# Tags for all potential release numbers till 2030.
|
||||||
|
- "2[0-9].[0-3]" # 20.0 -> 29.3
|
||||||
|
- "2[0-9].[0-3].[0-9]+" # 20.0.0 -> 29.3.[0-9]+
|
||||||
|
pull_request:
|
||||||
|
schedule:
|
||||||
|
- cron: 0 0 * * MON # Run every Monday at 00:00 UTC
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
determine-changes:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
tests: ${{ steps.filter.outputs.tests }}
|
||||||
|
vendoring: ${{ steps.filter.outputs.vendoring }}
|
||||||
|
steps:
|
||||||
|
# For pull requests it's not necessary to checkout the code
|
||||||
|
- uses: dorny/paths-filter@v2
|
||||||
|
id: filter
|
||||||
|
with:
|
||||||
|
filters: |
|
||||||
|
vendoring:
|
||||||
|
# Anything that's touching "vendored code"
|
||||||
|
- "src/pip/_vendor/**"
|
||||||
|
- "pyproject.toml"
|
||||||
|
tests:
|
||||||
|
# Anything that's touching testable stuff
|
||||||
|
- ".github/workflows/ci.yml"
|
||||||
|
- "tools/requirements/tests.txt"
|
||||||
|
- "src/**"
|
||||||
|
- "tests/**"
|
||||||
|
|
||||||
|
pre-commit:
|
||||||
|
name: pre-commit
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
- uses: pre-commit/action@v2.0.0
|
||||||
|
with:
|
||||||
|
extra_args: --hook-stage=manual
|
||||||
|
|
||||||
|
packaging:
|
||||||
|
name: packaging
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
- name: Set up git credentials
|
||||||
|
run: |
|
||||||
|
git config --global user.email "pypa-dev@googlegroups.com"
|
||||||
|
git config --global user.name "pip"
|
||||||
|
|
||||||
|
- run: pip install nox
|
||||||
|
- run: nox -s prepare-release -- 99.9
|
||||||
|
- run: nox -s build-release -- 99.9
|
||||||
|
|
||||||
|
vendoring:
|
||||||
|
name: vendoring
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
needs: [determine-changes]
|
||||||
|
if: ${{ needs.determine-changes.outputs.vendoring == 'true' }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
|
||||||
|
- run: pip install vendoring
|
||||||
|
- run: vendoring sync . --verbose
|
||||||
|
- run: git diff --exit-code
|
||||||
|
|
||||||
|
tests-unix:
|
||||||
|
name: tests / ${{ matrix.python }} / ${{ matrix.os }}
|
||||||
|
runs-on: ${{ matrix.os }}-latest
|
||||||
|
|
||||||
|
needs: [pre-commit, packaging, determine-changes]
|
||||||
|
if: ${{ needs.determine-changes.outputs.tests == 'true' }}
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
os: [Ubuntu, MacOS]
|
||||||
|
python:
|
||||||
|
- 3.6
|
||||||
|
- 3.7
|
||||||
|
- 3.8
|
||||||
|
- 3.9
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python }}
|
||||||
|
|
||||||
|
- run: pip install tox 'virtualenv<20'
|
||||||
|
|
||||||
|
# Main check
|
||||||
|
- name: Run unit tests
|
||||||
|
run: >-
|
||||||
|
tox -e py --
|
||||||
|
-m unit
|
||||||
|
--verbose --numprocesses auto --showlocals
|
||||||
|
- name: Run integration tests
|
||||||
|
run: >-
|
||||||
|
tox -e py --
|
||||||
|
-m integration
|
||||||
|
--verbose --numprocesses auto --showlocals
|
||||||
|
--durations=5
|
||||||
|
|
||||||
|
tests-windows:
|
||||||
|
name: tests / ${{ matrix.python }} / ${{ matrix.os }} / ${{ matrix.group }}
|
||||||
|
runs-on: ${{ matrix.os }}-latest
|
||||||
|
|
||||||
|
needs: [pre-commit, packaging, determine-changes]
|
||||||
|
if: ${{ needs.determine-changes.outputs.tests == 'true' }}
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
os: [Windows]
|
||||||
|
python:
|
||||||
|
- 3.6
|
||||||
|
# Commented out, since Windows tests are expensively slow.
|
||||||
|
# - 3.7
|
||||||
|
# - 3.8
|
||||||
|
- 3.9
|
||||||
|
group: [1, 2]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python }}
|
||||||
|
|
||||||
|
# We use a RAMDisk on Windows, since filesystem IO is a big slowdown
|
||||||
|
# for our tests.
|
||||||
|
- name: Create a RAMDisk
|
||||||
|
run: ./tools/ci/New-RAMDisk.ps1 -Drive R -Size 1GB
|
||||||
|
|
||||||
|
- name: Setup RAMDisk permissions
|
||||||
|
run: |
|
||||||
|
mkdir R:\Temp
|
||||||
|
$acl = Get-Acl "R:\Temp"
|
||||||
|
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
|
||||||
|
"Everyone", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
|
||||||
|
)
|
||||||
|
$acl.AddAccessRule($rule)
|
||||||
|
Set-Acl "R:\Temp" $acl
|
||||||
|
|
||||||
|
- run: pip install tox 'virtualenv<20'
|
||||||
|
env:
|
||||||
|
TEMP: "R:\\Temp"
|
||||||
|
|
||||||
|
# Main check
|
||||||
|
- name: Run unit tests
|
||||||
|
if: matrix.group == 1
|
||||||
|
run: >-
|
||||||
|
tox -e py --
|
||||||
|
-m unit
|
||||||
|
--verbose --numprocesses auto --showlocals
|
||||||
|
env:
|
||||||
|
TEMP: "R:\\Temp"
|
||||||
|
|
||||||
|
- name: Run integration tests (group 1)
|
||||||
|
if: matrix.group == 1
|
||||||
|
run: >-
|
||||||
|
tox -e py --
|
||||||
|
-m integration -k "not test_install"
|
||||||
|
--verbose --numprocesses auto --showlocals
|
||||||
|
env:
|
||||||
|
TEMP: "R:\\Temp"
|
||||||
|
|
||||||
|
- name: Run integration tests (group 2)
|
||||||
|
if: matrix.group == 2
|
||||||
|
run: >-
|
||||||
|
tox -e py --
|
||||||
|
-m integration -k "test_install"
|
||||||
|
--verbose --numprocesses auto --showlocals
|
||||||
|
env:
|
||||||
|
TEMP: "R:\\Temp"
|
|
@ -1,53 +0,0 @@
|
||||||
name: Linting
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
pull_request:
|
|
||||||
schedule:
|
|
||||||
# Run every Friday at 18:02 UTC
|
|
||||||
- cron: 2 18 * * 5
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
name: ${{ matrix.os }}
|
|
||||||
runs-on: ${{ matrix.os }}-latest
|
|
||||||
env:
|
|
||||||
TOXENV: lint,docs,vendoring
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os:
|
|
||||||
- Ubuntu
|
|
||||||
- Windows
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Set up Python 3.9
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: 3.9
|
|
||||||
|
|
||||||
# Setup Caching
|
|
||||||
- name: pip cache
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('tools/requirements/tests.txt') }}-${{ hashFiles('tools/requirements/docs.txt') }}-${{ hashFiles('tox.ini') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
|
|
||||||
- name: Set PY (for pre-commit cache)
|
|
||||||
run: echo "PY=$(python -c 'import hashlib, sys;print(hashlib.sha256(sys.version.encode()+sys.executable.encode()).hexdigest())')" >> $GITHUB_ENV
|
|
||||||
- name: pre-commit cache
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pre-commit
|
|
||||||
key: pre-commit|2020-02-14|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
|
|
||||||
|
|
||||||
# Get the latest tox
|
|
||||||
- name: Install tox
|
|
||||||
run: python -m pip install tox
|
|
||||||
|
|
||||||
# Main check
|
|
||||||
- run: python -m tox
|
|
|
@ -1,127 +0,0 @@
|
||||||
name: MacOS
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
pull_request:
|
|
||||||
schedule:
|
|
||||||
# Run every Friday at 18:02 UTC
|
|
||||||
- cron: 2 18 * * 5
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
dev-tools:
|
|
||||||
name: Quality Check
|
|
||||||
runs-on: macos-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
# Caches
|
|
||||||
- name: pip cache
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('tools/requirements/tests.txt') }}-${{ hashFiles('tools/requirements/docs.txt') }}-${{ hashFiles('tox.ini') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
- name: Set PY (for pre-commit cache)
|
|
||||||
run: echo "PY=$(python -c 'import hashlib, sys;print(hashlib.sha256(sys.version.encode()+sys.executable.encode()).hexdigest())')" >> $GITHUB_ENV
|
|
||||||
- name: pre-commit cache
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pre-commit
|
|
||||||
key: pre-commit|2020-02-14|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
|
|
||||||
|
|
||||||
# Setup
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Set up Python 3.8
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: 3.8
|
|
||||||
|
|
||||||
- name: Install tox
|
|
||||||
run: python -m pip install tox
|
|
||||||
|
|
||||||
# Main check
|
|
||||||
- run: python -m tox -e "lint,docs"
|
|
||||||
|
|
||||||
packaging:
|
|
||||||
name: Packaging
|
|
||||||
runs-on: macos-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
# Caches
|
|
||||||
- name: pip cache
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('tools/requirements/tests.txt') }}-${{ hashFiles('tools/requirements/docs.txt') }}-${{ hashFiles('tox.ini') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
# Setup
|
|
||||||
- name: Set up git credentials
|
|
||||||
run: |
|
|
||||||
git config --global user.email "pypa-dev@googlegroups.com"
|
|
||||||
git config --global user.name "pip"
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Set up Python 3.8
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: 3.8
|
|
||||||
- name: Install tox and nox
|
|
||||||
run: python -m pip install tox nox
|
|
||||||
|
|
||||||
# Main check
|
|
||||||
- name: Check vendored packages
|
|
||||||
run: python -m tox -e "vendoring"
|
|
||||||
|
|
||||||
- name: Prepare dummy release
|
|
||||||
run: nox -s prepare-release -- 99.9
|
|
||||||
|
|
||||||
- name: Generate distributions for the dummy release
|
|
||||||
run: nox -s build-release -- 99.9
|
|
||||||
|
|
||||||
tests:
|
|
||||||
name: Tests / ${{ matrix.python }}
|
|
||||||
runs-on: macos-latest
|
|
||||||
|
|
||||||
needs: dev-tools
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
python: [3.6, 3.7, 3.8, 3.9]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
# Caches
|
|
||||||
- name: pip cache
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('tools/requirements/tests.txt') }}-${{ hashFiles('tools/requirements/docs.txt') }}-${{ hashFiles('tox.ini') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
# Setup
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: ${{ matrix.python }}
|
|
||||||
|
|
||||||
- name: Install tox
|
|
||||||
run: python -m pip install tox 'virtualenv<20'
|
|
||||||
|
|
||||||
# Main check
|
|
||||||
- name: Run unit tests
|
|
||||||
run: >-
|
|
||||||
python -m tox -e py --
|
|
||||||
-m unit
|
|
||||||
--verbose
|
|
||||||
--numprocesses auto
|
|
||||||
|
|
||||||
- name: Run integration tests
|
|
||||||
run: >-
|
|
||||||
python -m tox -e py --
|
|
||||||
-m integration
|
|
||||||
--verbose
|
|
||||||
--numprocesses auto
|
|
||||||
--durations=5
|
|
|
@ -48,3 +48,6 @@ tests/data/common_wheels/
|
||||||
|
|
||||||
# Mac
|
# Mac
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
# Profiling related artifacts
|
||||||
|
*.prof
|
||||||
|
|
|
@ -22,36 +22,23 @@ repos:
|
||||||
- id: black
|
- id: black
|
||||||
exclude: |
|
exclude: |
|
||||||
(?x)
|
(?x)
|
||||||
^docs/|
|
|
||||||
^src/pip/_internal/cli|
|
|
||||||
^src/pip/_internal/commands|
|
^src/pip/_internal/commands|
|
||||||
^src/pip/_internal/distributions|
|
|
||||||
^src/pip/_internal/index|
|
^src/pip/_internal/index|
|
||||||
^src/pip/_internal/models|
|
^src/pip/_internal/models|
|
||||||
^src/pip/_internal/network|
|
^src/pip/_internal/network|
|
||||||
^src/pip/_internal/operations|
|
^src/pip/_internal/operations|
|
||||||
^src/pip/_internal/req|
|
^src/pip/_internal/req|
|
||||||
^src/pip/_internal/resolution|
|
|
||||||
^src/pip/_internal/utils|
|
|
||||||
^src/pip/_internal/vcs|
|
^src/pip/_internal/vcs|
|
||||||
^src/pip/_internal/\w+\.py$|
|
^src/pip/_internal/\w+\.py$|
|
||||||
^src/pip/__main__.py$|
|
|
||||||
^tools/|
|
^tools/|
|
||||||
# Tests
|
# Tests
|
||||||
^tests/conftest.py|
|
|
||||||
^tests/yaml|
|
|
||||||
^tests/lib|
|
|
||||||
^tests/data|
|
^tests/data|
|
||||||
^tests/unit|
|
^tests/unit|
|
||||||
^tests/functional/(?!test_install)|
|
^tests/functional/(?!test_install)|
|
||||||
^tests/functional/test_install|
|
^tests/functional/test_install|
|
||||||
# Files in the root of the repository
|
|
||||||
^setup.py|
|
|
||||||
^noxfile.py|
|
|
||||||
# A blank ignore, to avoid merge conflicts later.
|
# A blank ignore, to avoid merge conflicts later.
|
||||||
^$
|
^$
|
||||||
|
|
||||||
|
|
||||||
- repo: https://gitlab.com/pycqa/flake8
|
- repo: https://gitlab.com/pycqa/flake8
|
||||||
rev: 3.8.4
|
rev: 3.8.4
|
||||||
hooks:
|
hooks:
|
||||||
|
@ -72,7 +59,7 @@ repos:
|
||||||
rev: v0.800
|
rev: v0.800
|
||||||
hooks:
|
hooks:
|
||||||
- id: mypy
|
- id: mypy
|
||||||
exclude: docs|tests
|
exclude: tests
|
||||||
args: ["--pretty"]
|
args: ["--pretty"]
|
||||||
additional_dependencies: ['nox==2020.12.31']
|
additional_dependencies: ['nox==2020.12.31']
|
||||||
|
|
||||||
|
|
32
.travis.yml
32
.travis.yml
|
@ -1,32 +0,0 @@
|
||||||
language: python
|
|
||||||
cache: pip
|
|
||||||
dist: xenial
|
|
||||||
python: 3.9
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- bzr
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- primary
|
|
||||||
- secondary
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
# Basic Checks
|
|
||||||
- stage: primary
|
|
||||||
env: TOXENV=docs
|
|
||||||
- env: TOXENV=lint
|
|
||||||
- env: TOXENV=vendoring
|
|
||||||
|
|
||||||
# Complete checking for ensuring compatibility
|
|
||||||
# PyPy
|
|
||||||
- stage: secondary
|
|
||||||
env: GROUP=1
|
|
||||||
python: pypy3.6-7.3.1
|
|
||||||
- env: GROUP=2
|
|
||||||
python: pypy3.6-7.3.1
|
|
||||||
|
|
||||||
before_install: tools/travis/setup.sh
|
|
||||||
install: travis_retry tools/travis/install.sh
|
|
||||||
script: tools/travis/run.sh
|
|
|
@ -22,7 +22,7 @@ exclude noxfile.py
|
||||||
|
|
||||||
recursive-include src/pip/_vendor *.pem
|
recursive-include src/pip/_vendor *.pem
|
||||||
recursive-include src/pip/_vendor py.typed
|
recursive-include src/pip/_vendor py.typed
|
||||||
recursive-include docs *.css *.rst *.py
|
recursive-include docs *.css *.py *.rst *.md
|
||||||
|
|
||||||
exclude src/pip/_vendor/six
|
exclude src/pip/_vendor/six
|
||||||
exclude src/pip/_vendor/six/moves
|
exclude src/pip/_vendor/six/moves
|
||||||
|
|
|
@ -1,160 +0,0 @@
|
||||||
"""A sphinx extension for collecting per doc feedback."""
|
|
||||||
|
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from itertools import chain
|
|
||||||
from typing import Dict, List, Union
|
|
||||||
|
|
||||||
from sphinx.application import Sphinx
|
|
||||||
|
|
||||||
DEFAULT_DOC_LINES_THRESHOLD = 250
|
|
||||||
RST_INDENT = 4
|
|
||||||
EMAIL_INDENT = 6
|
|
||||||
|
|
||||||
|
|
||||||
def _modify_rst_document_source_on_read(
|
|
||||||
app: Sphinx,
|
|
||||||
docname: str,
|
|
||||||
source: List[str],
|
|
||||||
) -> None:
|
|
||||||
"""Add info block to top and bottom of each document source.
|
|
||||||
|
|
||||||
This function modifies RST source in-place by adding an admonition
|
|
||||||
block at the top and the bottom of each document right after it's
|
|
||||||
been read from disk preserving :orphan: at top, if present.
|
|
||||||
"""
|
|
||||||
admonition_type = app.config.docs_feedback_admonition_type
|
|
||||||
big_doc_lines = app.config.docs_feedback_big_doc_lines
|
|
||||||
escaped_email = app.config.docs_feedback_email.replace(' ', r'\ ')
|
|
||||||
excluded_documents = set(app.config.docs_feedback_excluded_documents)
|
|
||||||
questions_list = app.config.docs_feedback_questions_list
|
|
||||||
|
|
||||||
valid_admonitions = {
|
|
||||||
'attention', 'caution', 'danger', 'error', 'hint',
|
|
||||||
'important', 'note', 'tip', 'warning', 'admonition',
|
|
||||||
}
|
|
||||||
|
|
||||||
if admonition_type not in valid_admonitions:
|
|
||||||
raise ValueError(
|
|
||||||
'Expected `docs_feedback_admonition_type` to be one of '
|
|
||||||
f'{valid_admonitions} but got {admonition_type}.'
|
|
||||||
)
|
|
||||||
|
|
||||||
if not questions_list:
|
|
||||||
raise ValueError(
|
|
||||||
'Expected `docs_feedback_questions_list` to list questions '
|
|
||||||
'but got none.'
|
|
||||||
)
|
|
||||||
|
|
||||||
if docname in excluded_documents:
|
|
||||||
# NOTE: Completely ignore any document
|
|
||||||
# NOTE: listed in 'docs_feedback_excluded_documents'.
|
|
||||||
return
|
|
||||||
|
|
||||||
is_doc_big = source[0].count('\n') >= big_doc_lines
|
|
||||||
|
|
||||||
questions_list_rst = '\n'.join(
|
|
||||||
f'{" " * RST_INDENT}{number!s}. {question}'
|
|
||||||
for number, question in enumerate(questions_list, 1)
|
|
||||||
)
|
|
||||||
questions_list_urlencoded = (
|
|
||||||
'\n'.join(
|
|
||||||
f'\n{" " * RST_INDENT}{number!s}. {question} '
|
|
||||||
for number, question in enumerate(
|
|
||||||
chain(
|
|
||||||
(f'Document: {docname}. Page URL: https://', ),
|
|
||||||
questions_list,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
).
|
|
||||||
rstrip('\r\n\t ').
|
|
||||||
replace('\r', '%0D').
|
|
||||||
replace('\n', '%0A').
|
|
||||||
replace(' ', '%20')
|
|
||||||
)
|
|
||||||
|
|
||||||
admonition_msg = rf"""
|
|
||||||
**Did this article help?**
|
|
||||||
|
|
||||||
We are currently doing research to improve pip's documentation
|
|
||||||
and would love your feedback.
|
|
||||||
Please `email us`_ and let us know{{let_us_know_ending}}
|
|
||||||
|
|
||||||
{{questions_list_rst}}
|
|
||||||
|
|
||||||
.. _email us:
|
|
||||||
mailto:{escaped_email}\
|
|
||||||
?subject=[Doc:\ {docname}]\ Pip\ docs\ feedback\ \
|
|
||||||
(URL\:\ https\://)\
|
|
||||||
&body={questions_list_urlencoded}
|
|
||||||
"""
|
|
||||||
let_us_know_ending = ':'
|
|
||||||
|
|
||||||
info_block_bottom = (
|
|
||||||
f'.. {admonition_type}::\n\t\t{admonition_msg.format_map(locals())}\n'
|
|
||||||
)
|
|
||||||
|
|
||||||
questions_list_rst = ''
|
|
||||||
let_us_know_ending = (
|
|
||||||
' why you came to this page and what on it helped '
|
|
||||||
'you and what did not. '
|
|
||||||
'(:issue:`Read more about this research <8517>`)'
|
|
||||||
)
|
|
||||||
info_block_top = '' if is_doc_big else (
|
|
||||||
f'.. {admonition_type}::\n\t\t{admonition_msg.format_map(locals())}\n'
|
|
||||||
)
|
|
||||||
|
|
||||||
orphan_mark = ':orphan:'
|
|
||||||
is_orphan = orphan_mark in source[0]
|
|
||||||
if is_orphan:
|
|
||||||
source[0] = source[0].replace(orphan_mark, '')
|
|
||||||
else:
|
|
||||||
orphan_mark = ''
|
|
||||||
|
|
||||||
source[0] = '\n\n'.join((
|
|
||||||
orphan_mark, info_block_top, source[0], info_block_bottom,
|
|
||||||
))
|
|
||||||
|
|
||||||
|
|
||||||
def setup(app: Sphinx) -> Dict[str, Union[bool, str]]:
|
|
||||||
"""Initialize the Sphinx extension.
|
|
||||||
|
|
||||||
This function adds a callback for modifying the document sources
|
|
||||||
in-place on read.
|
|
||||||
|
|
||||||
It also declares the extension settings changable via :file:`conf.py`.
|
|
||||||
"""
|
|
||||||
rebuild_trigger = 'html' # rebuild full html on settings change
|
|
||||||
app.add_config_value(
|
|
||||||
'docs_feedback_admonition_type',
|
|
||||||
default='important',
|
|
||||||
rebuild=rebuild_trigger,
|
|
||||||
)
|
|
||||||
app.add_config_value(
|
|
||||||
'docs_feedback_big_doc_lines',
|
|
||||||
default=DEFAULT_DOC_LINES_THRESHOLD,
|
|
||||||
rebuild=rebuild_trigger,
|
|
||||||
)
|
|
||||||
app.add_config_value(
|
|
||||||
'docs_feedback_email',
|
|
||||||
default='Docs UX Team <docs-feedback@pypa.io>',
|
|
||||||
rebuild=rebuild_trigger,
|
|
||||||
)
|
|
||||||
app.add_config_value(
|
|
||||||
'docs_feedback_excluded_documents',
|
|
||||||
default=set(),
|
|
||||||
rebuild=rebuild_trigger,
|
|
||||||
)
|
|
||||||
app.add_config_value(
|
|
||||||
'docs_feedback_questions_list',
|
|
||||||
default=(),
|
|
||||||
rebuild=rebuild_trigger,
|
|
||||||
)
|
|
||||||
|
|
||||||
app.connect('source-read', _modify_rst_document_source_on_read)
|
|
||||||
|
|
||||||
return {
|
|
||||||
'parallel_read_safe': True,
|
|
||||||
'parallel_write_safe': True,
|
|
||||||
'version': 'builtin',
|
|
||||||
}
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
# Commands
|
||||||
|
|
||||||
|
The general options that apply to all the commands listed below can be
|
||||||
|
found [under the `pip` page in this section](pip).
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 1
|
||||||
|
:hidden:
|
||||||
|
|
||||||
|
pip
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 1
|
||||||
|
:caption: Environment Management and Introspection
|
||||||
|
|
||||||
|
pip_install
|
||||||
|
pip_uninstall
|
||||||
|
pip_list
|
||||||
|
pip_freeze
|
||||||
|
pip_check
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 1
|
||||||
|
:caption: Handling Distribution Files
|
||||||
|
|
||||||
|
pip_download
|
||||||
|
pip_wheel
|
||||||
|
pip_hash
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 1
|
||||||
|
:caption: Package Index information
|
||||||
|
|
||||||
|
pip_show
|
||||||
|
pip_search
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 1
|
||||||
|
:caption: Managing pip itself
|
||||||
|
|
||||||
|
pip_cache
|
||||||
|
pip_config
|
||||||
|
pip_debug
|
||||||
|
```
|
|
@ -0,0 +1,255 @@
|
||||||
|
===
|
||||||
|
pip
|
||||||
|
===
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
*****
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip <command> [options]
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip <command> [options]
|
||||||
|
|
||||||
|
Description
|
||||||
|
***********
|
||||||
|
|
||||||
|
|
||||||
|
.. _`Logging`:
|
||||||
|
|
||||||
|
|
||||||
|
Logging
|
||||||
|
=======
|
||||||
|
|
||||||
|
Console logging
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
pip offers :ref:`-v, --verbose <--verbose>` and :ref:`-q, --quiet <--quiet>`
|
||||||
|
to control the console log level. By default, some messages (error and warnings)
|
||||||
|
are colored in the terminal. If you want to suppress the colored output use
|
||||||
|
:ref:`--no-color <--no-color>`.
|
||||||
|
|
||||||
|
|
||||||
|
.. _`FileLogging`:
|
||||||
|
|
||||||
|
File logging
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
pip offers the :ref:`--log <--log>` option for specifying a file where a maximum
|
||||||
|
verbosity log will be kept. This option is empty by default. This log appends
|
||||||
|
to previous logging.
|
||||||
|
|
||||||
|
Like all pip options, ``--log`` can also be set as an environment variable, or
|
||||||
|
placed into the pip config file. See the :ref:`Configuration` section.
|
||||||
|
|
||||||
|
.. _`exists-action`:
|
||||||
|
|
||||||
|
--exists-action option
|
||||||
|
======================
|
||||||
|
|
||||||
|
This option specifies default behavior when path already exists.
|
||||||
|
Possible cases: downloading files or checking out repositories for installation,
|
||||||
|
creating archives. If ``--exists-action`` is not defined, pip will prompt
|
||||||
|
when decision is needed.
|
||||||
|
|
||||||
|
*(s)witch*
|
||||||
|
Only relevant to VCS checkout. Attempt to switch the checkout
|
||||||
|
to the appropriate URL and/or revision.
|
||||||
|
*(i)gnore*
|
||||||
|
Abort current operation (e.g. don't copy file, don't create archive,
|
||||||
|
don't modify a checkout).
|
||||||
|
*(w)ipe*
|
||||||
|
Delete the file or VCS checkout before trying to create, download, or checkout a new one.
|
||||||
|
*(b)ackup*
|
||||||
|
Rename the file or checkout to ``{name}{'.bak' * n}``, where n is some number
|
||||||
|
of ``.bak`` extensions, such that the file didn't exist at some point.
|
||||||
|
So the most recent backup will be the one with the largest number after ``.bak``.
|
||||||
|
*(a)abort*
|
||||||
|
Abort pip and return non-zero exit status.
|
||||||
|
|
||||||
|
.. _`build-interface`:
|
||||||
|
|
||||||
|
|
||||||
|
Build System Interface
|
||||||
|
======================
|
||||||
|
|
||||||
|
pip builds packages by invoking the build system. By default, builds will use
|
||||||
|
``setuptools``, but if a project specifies a different build system using a
|
||||||
|
``pyproject.toml`` file, as per :pep:`517`, pip will use that instead. As well
|
||||||
|
as package building, the build system is also invoked to install packages
|
||||||
|
direct from source. This is handled by invoking the build system to build a
|
||||||
|
wheel, and then installing from that wheel. The built wheel is cached locally
|
||||||
|
by pip to avoid repeated identical builds.
|
||||||
|
|
||||||
|
The current interface to the build system is via the ``setup.py`` command line
|
||||||
|
script - all build actions are defined in terms of the specific ``setup.py``
|
||||||
|
command line that will be run to invoke the required action.
|
||||||
|
|
||||||
|
Setuptools Injection
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
When :pep:`517` is not used, the supported build system is ``setuptools``.
|
||||||
|
However, not all packages use ``setuptools`` in their build scripts. To support
|
||||||
|
projects that use "pure ``distutils``", pip injects ``setuptools`` into
|
||||||
|
``sys.modules`` before invoking ``setup.py``. The injection should be
|
||||||
|
transparent to ``distutils``-based projects, but 3rd party build tools wishing
|
||||||
|
to provide a ``setup.py`` emulating the commands pip requires may need to be
|
||||||
|
aware that it takes place.
|
||||||
|
|
||||||
|
Projects using :pep:`517` *must* explicitly use setuptools - pip does not do
|
||||||
|
the above injection process in this case.
|
||||||
|
|
||||||
|
Build System Output
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Any output produced by the build system will be read by pip (for display to the
|
||||||
|
user if requested). In order to correctly read the build system output, pip
|
||||||
|
requires that the output is written in a well-defined encoding, specifically
|
||||||
|
the encoding the user has configured for text output (which can be obtained in
|
||||||
|
Python using ``locale.getpreferredencoding``). If the configured encoding is
|
||||||
|
ASCII, pip assumes UTF-8 (to account for the behaviour of some Unix systems).
|
||||||
|
|
||||||
|
Build systems should ensure that any tools they invoke (compilers, etc) produce
|
||||||
|
output in the correct encoding. In practice - and in particular on Windows,
|
||||||
|
where tools are inconsistent in their use of the "OEM" and "ANSI" codepages -
|
||||||
|
this may not always be possible. pip will therefore attempt to recover cleanly
|
||||||
|
if presented with incorrectly encoded build tool output, by translating
|
||||||
|
unexpected byte sequences to Python-style hexadecimal escape sequences
|
||||||
|
(``"\x80\xff"``, etc). However, it is still possible for output to be displayed
|
||||||
|
using an incorrect encoding (mojibake).
|
||||||
|
|
||||||
|
Under :pep:`517`, handling of build tool output is the backend's responsibility,
|
||||||
|
and pip simply displays the output produced by the backend. (Backends, however,
|
||||||
|
will likely still have to address the issues described above).
|
||||||
|
|
||||||
|
PEP 517 and 518 Support
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
As of version 10.0, pip supports projects declaring dependencies that are
|
||||||
|
required at install time using a ``pyproject.toml`` file, in the form described
|
||||||
|
in :pep:`518`. When building a project, pip will install the required
|
||||||
|
dependencies locally, and make them available to the build process.
|
||||||
|
Furthermore, from version 19.0 onwards, pip supports projects specifying the
|
||||||
|
build backend they use in ``pyproject.toml``, in the form described in
|
||||||
|
:pep:`517`.
|
||||||
|
|
||||||
|
When making build requirements available, pip does so in an *isolated
|
||||||
|
environment*. That is, pip does not install those requirements into the user's
|
||||||
|
``site-packages``, but rather installs them in a temporary directory which it
|
||||||
|
adds to the user's ``sys.path`` for the duration of the build. This ensures
|
||||||
|
that build requirements are handled independently of the user's runtime
|
||||||
|
environment. For example, a project that needs a recent version of setuptools
|
||||||
|
to build can still be installed, even if the user has an older version
|
||||||
|
installed (and without silently replacing that version).
|
||||||
|
|
||||||
|
In certain cases, projects (or redistributors) may have workflows that
|
||||||
|
explicitly manage the build environment. For such workflows, build isolation
|
||||||
|
can be problematic. If this is the case, pip provides a
|
||||||
|
``--no-build-isolation`` flag to disable build isolation. Users supplying this
|
||||||
|
flag are responsible for ensuring the build environment is managed
|
||||||
|
appropriately (including ensuring that all required build dependencies are
|
||||||
|
installed).
|
||||||
|
|
||||||
|
By default, pip will continue to use the legacy (direct ``setup.py`` execution
|
||||||
|
based) build processing for projects that do not have a ``pyproject.toml`` file.
|
||||||
|
Projects with a ``pyproject.toml`` file will use a :pep:`517` backend. Projects
|
||||||
|
with a ``pyproject.toml`` file, but which don't have a ``build-system`` section,
|
||||||
|
will be assumed to have the following backend settings::
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=40.8.0", "wheel"]
|
||||||
|
build-backend = "setuptools.build_meta:__legacy__"
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
``setuptools`` 40.8.0 is the first version of setuptools that offers a
|
||||||
|
:pep:`517` backend that closely mimics directly executing ``setup.py``.
|
||||||
|
|
||||||
|
If a project has ``[build-system]``, but no ``build-backend``, pip will also use
|
||||||
|
``setuptools.build_meta:__legacy__``, but will expect the project requirements
|
||||||
|
to include ``setuptools`` and ``wheel`` (and will report an error if the
|
||||||
|
installed version of ``setuptools`` is not recent enough).
|
||||||
|
|
||||||
|
If a user wants to explicitly request :pep:`517` handling even though a project
|
||||||
|
doesn't have a ``pyproject.toml`` file, this can be done using the
|
||||||
|
``--use-pep517`` command line option. Similarly, to request legacy processing
|
||||||
|
even though ``pyproject.toml`` is present, the ``--no-use-pep517`` option is
|
||||||
|
available (although obviously it is an error to choose ``--no-use-pep517`` if
|
||||||
|
the project has no ``setup.py``, or explicitly requests a build backend). As
|
||||||
|
with other command line flags, pip recognises the ``PIP_USE_PEP517``
|
||||||
|
environment veriable and a ``use-pep517`` config file option (set to true or
|
||||||
|
false) to set this option globally. Note that overriding pip's choice of
|
||||||
|
whether to use :pep:`517` processing in this way does *not* affect whether pip
|
||||||
|
will use an isolated build environment (which is controlled via
|
||||||
|
``--no-build-isolation`` as noted above).
|
||||||
|
|
||||||
|
Except in the case noted above (projects with no :pep:`518` ``[build-system]``
|
||||||
|
section in ``pyproject.toml``), pip will never implicitly install a build
|
||||||
|
system. Projects **must** ensure that the correct build system is listed in
|
||||||
|
their ``requires`` list (this applies even if pip assumes that the
|
||||||
|
``setuptools`` backend is being used, as noted above).
|
||||||
|
|
||||||
|
.. _pep-518-limitations:
|
||||||
|
|
||||||
|
**Historical Limitations**:
|
||||||
|
|
||||||
|
* ``pip<18.0``: only supports installing build requirements from wheels, and
|
||||||
|
does not support the use of environment markers and extras (only version
|
||||||
|
specifiers are respected).
|
||||||
|
|
||||||
|
* ``pip<18.1``: build dependencies using .pth files are not properly supported;
|
||||||
|
as a result namespace packages do not work under Python 3.2 and earlier.
|
||||||
|
|
||||||
|
Future Developments
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
:pep:`426` notes that the intention is to add hooks to project metadata in
|
||||||
|
version 2.1 of the metadata spec, to explicitly define how to build a project
|
||||||
|
from its source. Once this version of the metadata spec is final, pip will
|
||||||
|
migrate to using that interface. At that point, the ``setup.py`` interface
|
||||||
|
documented here will be retained solely for legacy purposes, until projects
|
||||||
|
have migrated.
|
||||||
|
|
||||||
|
Specifically, applications should *not* expect to rely on there being any form
|
||||||
|
of backward compatibility guarantees around the ``setup.py`` interface.
|
||||||
|
|
||||||
|
|
||||||
|
Build Options
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The ``--global-option`` and ``--build-option`` arguments to the ``pip install``
|
||||||
|
and ``pip wheel`` inject additional arguments into the ``setup.py`` command
|
||||||
|
(``--build-option`` is only available in ``pip wheel``). These arguments are
|
||||||
|
included in the command as follows:
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
python setup.py <global_options> BUILD COMMAND <build_options>
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py setup.py <global_options> BUILD COMMAND <build_options>
|
||||||
|
|
||||||
|
The options are passed unmodified, and presently offer direct access to the
|
||||||
|
distutils command line. Use of ``--global-option`` and ``--build-option``
|
||||||
|
should be considered as build system dependent, and may not be supported in the
|
||||||
|
current form if support for alternative build systems is added to pip.
|
||||||
|
|
||||||
|
|
||||||
|
.. _`General Options`:
|
||||||
|
|
||||||
|
General Options
|
||||||
|
***************
|
||||||
|
|
||||||
|
.. pip-general-options::
|
|
@ -0,0 +1,27 @@
|
||||||
|
|
||||||
|
.. _`pip cache`:
|
||||||
|
|
||||||
|
pip cache
|
||||||
|
---------
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
*****
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: cache "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: cache "py -m pip"
|
||||||
|
|
||||||
|
Description
|
||||||
|
***********
|
||||||
|
|
||||||
|
.. pip-command-description:: cache
|
||||||
|
|
||||||
|
Options
|
||||||
|
*******
|
||||||
|
|
||||||
|
.. pip-command-options:: cache
|
|
@ -0,0 +1,87 @@
|
||||||
|
.. _`pip check`:
|
||||||
|
|
||||||
|
=========
|
||||||
|
pip check
|
||||||
|
=========
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: check "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: check "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: check
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
#. If all dependencies are compatible:
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip check
|
||||||
|
No broken requirements found.
|
||||||
|
$ echo $?
|
||||||
|
0
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip check
|
||||||
|
No broken requirements found.
|
||||||
|
C:\> echo %errorlevel%
|
||||||
|
0
|
||||||
|
|
||||||
|
#. If a package is missing:
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip check
|
||||||
|
pyramid 1.5.2 requires WebOb, which is not installed.
|
||||||
|
$ echo $?
|
||||||
|
1
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip check
|
||||||
|
pyramid 1.5.2 requires WebOb, which is not installed.
|
||||||
|
C:\> echo %errorlevel%
|
||||||
|
1
|
||||||
|
|
||||||
|
#. If a package has the wrong version:
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip check
|
||||||
|
pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
|
||||||
|
$ echo $?
|
||||||
|
1
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip check
|
||||||
|
pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
|
||||||
|
C:\> echo %errorlevel%
|
||||||
|
1
|
|
@ -0,0 +1,30 @@
|
||||||
|
|
||||||
|
.. _`pip config`:
|
||||||
|
|
||||||
|
==========
|
||||||
|
pip config
|
||||||
|
==========
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: config "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: config "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: config
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: config
|
|
@ -0,0 +1,35 @@
|
||||||
|
.. _`pip debug`:
|
||||||
|
|
||||||
|
=========
|
||||||
|
pip debug
|
||||||
|
=========
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: debug "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: debug "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
This command is only meant for debugging.
|
||||||
|
Its options and outputs are provisional and may change without notice.
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: debug
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: debug
|
|
@ -0,0 +1,226 @@
|
||||||
|
|
||||||
|
.. _`pip download`:
|
||||||
|
|
||||||
|
============
|
||||||
|
pip download
|
||||||
|
============
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: download "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: download "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: download
|
||||||
|
|
||||||
|
Overview
|
||||||
|
--------
|
||||||
|
|
||||||
|
``pip download`` does the same resolution and downloading as ``pip install``,
|
||||||
|
but instead of installing the dependencies, it collects the downloaded
|
||||||
|
distributions into the directory provided (defaulting to the current
|
||||||
|
directory). This directory can later be passed as the value to ``pip install
|
||||||
|
--find-links`` to facilitate offline or locked down package installation.
|
||||||
|
|
||||||
|
``pip download`` with the ``--platform``, ``--python-version``,
|
||||||
|
``--implementation``, and ``--abi`` options provides the ability to fetch
|
||||||
|
dependencies for an interpreter and system other than the ones that pip is
|
||||||
|
running on. ``--only-binary=:all:`` or ``--no-deps`` is required when using any
|
||||||
|
of these options. It is important to note that these options all default to the
|
||||||
|
current system/interpreter, and not to the most restrictive constraints (e.g.
|
||||||
|
platform any, abi none, etc). To avoid fetching dependencies that happen to
|
||||||
|
match the constraint of the current interpreter (but not your target one), it
|
||||||
|
is recommended to specify all of these options if you are specifying one of
|
||||||
|
them. Generic dependencies (e.g. universal wheels, or dependencies with no
|
||||||
|
platform, abi, or implementation constraints) will still match an over-
|
||||||
|
constrained download requirement.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: download
|
||||||
|
|
||||||
|
.. pip-index-options:: download
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
#. Download a package and all of its dependencies
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download SomePackage
|
||||||
|
python -m pip download -d . SomePackage # equivalent to above
|
||||||
|
python -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download SomePackage
|
||||||
|
py -m pip download -d . SomePackage # equivalent to above
|
||||||
|
py -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
|
||||||
|
|
||||||
|
|
||||||
|
#. Download a package and all of its dependencies with OSX specific interpreter constraints.
|
||||||
|
This forces OSX 10.10 or lower compatibility. Since OSX deps are forward compatible,
|
||||||
|
this will also match ``macosx-10_9_x86_64``, ``macosx-10_8_x86_64``, ``macosx-10_8_intel``,
|
||||||
|
etc.
|
||||||
|
It will also match deps with platform ``any``. Also force the interpreter version to ``27``
|
||||||
|
(or more generic, i.e. ``2``) and implementation to ``cp`` (or more generic, i.e. ``py``).
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download \
|
||||||
|
--only-binary=:all: \
|
||||||
|
--platform macosx-10_10_x86_64 \
|
||||||
|
--python-version 27 \
|
||||||
|
--implementation cp \
|
||||||
|
SomePackage
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform macosx-10_10_x86_64 ^
|
||||||
|
--python-version 27 ^
|
||||||
|
--implementation cp ^
|
||||||
|
SomePackage
|
||||||
|
|
||||||
|
#. Download a package and its dependencies with linux specific constraints.
|
||||||
|
Force the interpreter to be any minor version of py3k, and only accept
|
||||||
|
``cp34m`` or ``none`` as the abi.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download \
|
||||||
|
--only-binary=:all: \
|
||||||
|
--platform linux_x86_64 \
|
||||||
|
--python-version 3 \
|
||||||
|
--implementation cp \
|
||||||
|
--abi cp34m \
|
||||||
|
SomePackage
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform linux_x86_64 ^
|
||||||
|
--python-version 3 ^
|
||||||
|
--implementation cp ^
|
||||||
|
--abi cp34m ^
|
||||||
|
SomePackage
|
||||||
|
|
||||||
|
#. Force platform, implementation, and abi agnostic deps.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip download \
|
||||||
|
--only-binary=:all: \
|
||||||
|
--platform any \
|
||||||
|
--python-version 3 \
|
||||||
|
--implementation py \
|
||||||
|
--abi none \
|
||||||
|
SomePackage
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform any ^
|
||||||
|
--python-version 3 ^
|
||||||
|
--implementation py ^
|
||||||
|
--abi none ^
|
||||||
|
SomePackage
|
||||||
|
|
||||||
|
#. Even when overconstrained, this will still correctly fetch the pip universal wheel.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip download \
|
||||||
|
--only-binary=:all: \
|
||||||
|
--platform linux_x86_64 \
|
||||||
|
--python-version 33 \
|
||||||
|
--implementation cp \
|
||||||
|
--abi cp34m \
|
||||||
|
pip>=8
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ ls pip-8.1.1-py2.py3-none-any.whl
|
||||||
|
pip-8.1.1-py2.py3-none-any.whl
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform linux_x86_64 ^
|
||||||
|
--python-version 33 ^
|
||||||
|
--implementation cp ^
|
||||||
|
--abi cp34m ^
|
||||||
|
pip>=8
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> dir pip-8.1.1-py2.py3-none-any.whl
|
||||||
|
pip-8.1.1-py2.py3-none-any.whl
|
||||||
|
|
||||||
|
#. Download a package supporting one of several ABIs and platforms.
|
||||||
|
This is useful when fetching wheels for a well-defined interpreter, whose
|
||||||
|
supported ABIs and platforms are known and fixed, different than the one pip is
|
||||||
|
running under.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip download \
|
||||||
|
--only-binary=:all: \
|
||||||
|
--platform manylinux1_x86_64 --platform linux_x86_64 --platform any \
|
||||||
|
--python-version 36 \
|
||||||
|
--implementation cp \
|
||||||
|
--abi cp36m --abi cp36 --abi abi3 --abi none \
|
||||||
|
SomePackage
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:> py -m pip download ^
|
||||||
|
--only-binary=:all: ^
|
||||||
|
--platform manylinux1_x86_64 --platform linux_x86_64 --platform any ^
|
||||||
|
--python-version 36 ^
|
||||||
|
--implementation cp ^
|
||||||
|
--abi cp36m --abi cp36 --abi abi3 --abi none ^
|
||||||
|
SomePackage
|
|
@ -0,0 +1,92 @@
|
||||||
|
|
||||||
|
.. _`pip freeze`:
|
||||||
|
|
||||||
|
==========
|
||||||
|
pip freeze
|
||||||
|
==========
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: freeze "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: freeze "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: freeze
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: freeze
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
#. Generate output suitable for a requirements file.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip freeze
|
||||||
|
docutils==0.11
|
||||||
|
Jinja2==2.7.2
|
||||||
|
MarkupSafe==0.19
|
||||||
|
Pygments==1.6
|
||||||
|
Sphinx==1.2.2
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip freeze
|
||||||
|
docutils==0.11
|
||||||
|
Jinja2==2.7.2
|
||||||
|
MarkupSafe==0.19
|
||||||
|
Pygments==1.6
|
||||||
|
Sphinx==1.2.2
|
||||||
|
|
||||||
|
#. Generate a requirements file and then install from it in another environment.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
env1/bin/python -m pip freeze > requirements.txt
|
||||||
|
env2/bin/python -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
env1\bin\python -m pip freeze > requirements.txt
|
||||||
|
env2\bin\python -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
|
||||||
|
Fixing "Permission denied:" errors
|
||||||
|
==================================
|
||||||
|
|
||||||
|
The purpose of this section of documentation is to provide practical
|
||||||
|
suggestions to users seeing a `"Permission denied" error <https://github.com/pypa/pip/issues/8418>`__ on ``pip freeze``.
|
||||||
|
|
||||||
|
This error occurs, for instance, when the command is installed only for another
|
||||||
|
user, and the current user doesn't have the permission to execute the other
|
||||||
|
user's command.
|
||||||
|
|
||||||
|
To solve that issue, you can try one of the followings:
|
||||||
|
|
||||||
|
- Install the command for yourself (e.g. in your home directory).
|
||||||
|
- Ask the system admin to allow this command for all users.
|
||||||
|
- Check and correct the PATH variable of your own environment.
|
||||||
|
- Check the `ACL (Access-Control List) <https://en.wikipedia.org/wiki/Access-control_list>`_ for this command.
|
|
@ -0,0 +1,72 @@
|
||||||
|
.. _`pip hash`:
|
||||||
|
|
||||||
|
========
|
||||||
|
pip hash
|
||||||
|
========
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: hash "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: hash "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: hash
|
||||||
|
|
||||||
|
Overview
|
||||||
|
--------
|
||||||
|
|
||||||
|
``pip hash`` is a convenient way to get a hash digest for use with
|
||||||
|
:ref:`hash-checking mode`, especially for packages with multiple archives. The
|
||||||
|
error message from ``pip install --require-hashes ...`` will give you one
|
||||||
|
hash, but, if there are multiple archives (like source and binary ones), you
|
||||||
|
will need to manually download and compute a hash for the others. Otherwise, a
|
||||||
|
spurious hash mismatch could occur when :ref:`pip install` is passed a
|
||||||
|
different set of options, like :ref:`--no-binary <install_--no-binary>`.
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: hash
|
||||||
|
|
||||||
|
|
||||||
|
Example
|
||||||
|
=======
|
||||||
|
|
||||||
|
Compute the hash of a downloaded archive:
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip download SomePackage
|
||||||
|
Collecting SomePackage
|
||||||
|
Downloading SomePackage-2.2.tar.gz
|
||||||
|
Saved ./pip_downloads/SomePackage-2.2.tar.gz
|
||||||
|
Successfully downloaded SomePackage
|
||||||
|
$ python -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz
|
||||||
|
./pip_downloads/SomePackage-2.2.tar.gz:
|
||||||
|
--hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip download SomePackage
|
||||||
|
Collecting SomePackage
|
||||||
|
Downloading SomePackage-2.2.tar.gz
|
||||||
|
Saved ./pip_downloads/SomePackage-2.2.tar.gz
|
||||||
|
Successfully downloaded SomePackage
|
||||||
|
C:\> py -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz
|
||||||
|
./pip_downloads/SomePackage-2.2.tar.gz:
|
||||||
|
--hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,201 @@
|
||||||
|
.. _`pip list`:
|
||||||
|
|
||||||
|
========
|
||||||
|
pip list
|
||||||
|
========
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: list "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: list "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: list
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: list
|
||||||
|
|
||||||
|
.. pip-index-options:: list
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
#. List installed packages.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list
|
||||||
|
docutils (0.10)
|
||||||
|
Jinja2 (2.7.2)
|
||||||
|
MarkupSafe (0.18)
|
||||||
|
Pygments (1.6)
|
||||||
|
Sphinx (1.2.1)
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list
|
||||||
|
docutils (0.10)
|
||||||
|
Jinja2 (2.7.2)
|
||||||
|
MarkupSafe (0.18)
|
||||||
|
Pygments (1.6)
|
||||||
|
Sphinx (1.2.1)
|
||||||
|
|
||||||
|
#. List outdated packages (excluding editables), and the latest version available.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --outdated
|
||||||
|
docutils (Current: 0.10 Latest: 0.11)
|
||||||
|
Sphinx (Current: 1.2.1 Latest: 1.2.2)
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --outdated
|
||||||
|
docutils (Current: 0.10 Latest: 0.11)
|
||||||
|
Sphinx (Current: 1.2.1 Latest: 1.2.2)
|
||||||
|
|
||||||
|
#. List installed packages with column formatting.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --format columns
|
||||||
|
Package Version
|
||||||
|
------- -------
|
||||||
|
docopt 0.6.2
|
||||||
|
idlex 1.13
|
||||||
|
jedi 0.9.0
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --format columns
|
||||||
|
Package Version
|
||||||
|
------- -------
|
||||||
|
docopt 0.6.2
|
||||||
|
idlex 1.13
|
||||||
|
jedi 0.9.0
|
||||||
|
|
||||||
|
#. List outdated packages with column formatting.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list -o --format columns
|
||||||
|
Package Version Latest Type
|
||||||
|
---------- ------- ------ -----
|
||||||
|
retry 0.8.1 0.9.1 wheel
|
||||||
|
setuptools 20.6.7 21.0.0 wheel
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list -o --format columns
|
||||||
|
Package Version Latest Type
|
||||||
|
---------- ------- ------ -----
|
||||||
|
retry 0.8.1 0.9.1 wheel
|
||||||
|
setuptools 20.6.7 21.0.0 wheel
|
||||||
|
|
||||||
|
#. List packages that are not dependencies of other packages. Can be combined with
|
||||||
|
other options.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --outdated --not-required
|
||||||
|
docutils (Current: 0.10 Latest: 0.11)
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --outdated --not-required
|
||||||
|
docutils (Current: 0.10 Latest: 0.11)
|
||||||
|
|
||||||
|
#. Use legacy formatting
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --format=legacy
|
||||||
|
colorama (0.3.7)
|
||||||
|
docopt (0.6.2)
|
||||||
|
idlex (1.13)
|
||||||
|
jedi (0.9.0)
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --format=legacy
|
||||||
|
colorama (0.3.7)
|
||||||
|
docopt (0.6.2)
|
||||||
|
idlex (1.13)
|
||||||
|
jedi (0.9.0)
|
||||||
|
|
||||||
|
#. Use json formatting
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --format=json
|
||||||
|
[{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --format=json
|
||||||
|
[{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
|
||||||
|
|
||||||
|
#. Use freeze formatting
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip list --format=freeze
|
||||||
|
colorama==0.3.7
|
||||||
|
docopt==0.6.2
|
||||||
|
idlex==1.13
|
||||||
|
jedi==0.9.0
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip list --format=freeze
|
||||||
|
colorama==0.3.7
|
||||||
|
docopt==0.6.2
|
||||||
|
idlex==1.13
|
||||||
|
jedi==0.9.0
|
|
@ -0,0 +1,52 @@
|
||||||
|
.. _`pip search`:
|
||||||
|
|
||||||
|
==========
|
||||||
|
pip search
|
||||||
|
==========
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: search "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: search "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: search
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: search
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
#. Search for "peppercorn"
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip search peppercorn
|
||||||
|
pepperedform - Helpers for using peppercorn with formprocess.
|
||||||
|
peppercorn - A library for converting a token stream into [...]
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip search peppercorn
|
||||||
|
pepperedform - Helpers for using peppercorn with formprocess.
|
||||||
|
peppercorn - A library for converting a token stream into [...]
|
|
@ -0,0 +1,154 @@
|
||||||
|
.. _`pip show`:
|
||||||
|
|
||||||
|
========
|
||||||
|
pip show
|
||||||
|
========
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: show "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: show "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: show
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: show
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
#. Show information about a package:
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip show sphinx
|
||||||
|
Name: Sphinx
|
||||||
|
Version: 1.4.5
|
||||||
|
Summary: Python documentation generator
|
||||||
|
Home-page: http://sphinx-doc.org/
|
||||||
|
Author: Georg Brandl
|
||||||
|
Author-email: georg@python.org
|
||||||
|
License: BSD
|
||||||
|
Location: /my/env/lib/python2.7/site-packages
|
||||||
|
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip show sphinx
|
||||||
|
Name: Sphinx
|
||||||
|
Version: 1.4.5
|
||||||
|
Summary: Python documentation generator
|
||||||
|
Home-page: http://sphinx-doc.org/
|
||||||
|
Author: Georg Brandl
|
||||||
|
Author-email: georg@python.org
|
||||||
|
License: BSD
|
||||||
|
Location: /my/env/lib/python2.7/site-packages
|
||||||
|
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
||||||
|
|
||||||
|
#. Show all information about a package
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip show --verbose sphinx
|
||||||
|
Name: Sphinx
|
||||||
|
Version: 1.4.5
|
||||||
|
Summary: Python documentation generator
|
||||||
|
Home-page: http://sphinx-doc.org/
|
||||||
|
Author: Georg Brandl
|
||||||
|
Author-email: georg@python.org
|
||||||
|
License: BSD
|
||||||
|
Location: /my/env/lib/python2.7/site-packages
|
||||||
|
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
||||||
|
Metadata-Version: 2.0
|
||||||
|
Installer:
|
||||||
|
Classifiers:
|
||||||
|
Development Status :: 5 - Production/Stable
|
||||||
|
Environment :: Console
|
||||||
|
Environment :: Web Environment
|
||||||
|
Intended Audience :: Developers
|
||||||
|
Intended Audience :: Education
|
||||||
|
License :: OSI Approved :: BSD License
|
||||||
|
Operating System :: OS Independent
|
||||||
|
Programming Language :: Python
|
||||||
|
Programming Language :: Python :: 2
|
||||||
|
Programming Language :: Python :: 3
|
||||||
|
Framework :: Sphinx
|
||||||
|
Framework :: Sphinx :: Extension
|
||||||
|
Framework :: Sphinx :: Theme
|
||||||
|
Topic :: Documentation
|
||||||
|
Topic :: Documentation :: Sphinx
|
||||||
|
Topic :: Text Processing
|
||||||
|
Topic :: Utilities
|
||||||
|
Entry-points:
|
||||||
|
[console_scripts]
|
||||||
|
sphinx-apidoc = sphinx.apidoc:main
|
||||||
|
sphinx-autogen = sphinx.ext.autosummary.generate:main
|
||||||
|
sphinx-build = sphinx:main
|
||||||
|
sphinx-quickstart = sphinx.quickstart:main
|
||||||
|
[distutils.commands]
|
||||||
|
build_sphinx = sphinx.setup_command:BuildDoc
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip show --verbose sphinx
|
||||||
|
Name: Sphinx
|
||||||
|
Version: 1.4.5
|
||||||
|
Summary: Python documentation generator
|
||||||
|
Home-page: http://sphinx-doc.org/
|
||||||
|
Author: Georg Brandl
|
||||||
|
Author-email: georg@python.org
|
||||||
|
License: BSD
|
||||||
|
Location: /my/env/lib/python2.7/site-packages
|
||||||
|
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
||||||
|
Metadata-Version: 2.0
|
||||||
|
Installer:
|
||||||
|
Classifiers:
|
||||||
|
Development Status :: 5 - Production/Stable
|
||||||
|
Environment :: Console
|
||||||
|
Environment :: Web Environment
|
||||||
|
Intended Audience :: Developers
|
||||||
|
Intended Audience :: Education
|
||||||
|
License :: OSI Approved :: BSD License
|
||||||
|
Operating System :: OS Independent
|
||||||
|
Programming Language :: Python
|
||||||
|
Programming Language :: Python :: 2
|
||||||
|
Programming Language :: Python :: 3
|
||||||
|
Framework :: Sphinx
|
||||||
|
Framework :: Sphinx :: Extension
|
||||||
|
Framework :: Sphinx :: Theme
|
||||||
|
Topic :: Documentation
|
||||||
|
Topic :: Documentation :: Sphinx
|
||||||
|
Topic :: Text Processing
|
||||||
|
Topic :: Utilities
|
||||||
|
Entry-points:
|
||||||
|
[console_scripts]
|
||||||
|
sphinx-apidoc = sphinx.apidoc:main
|
||||||
|
sphinx-autogen = sphinx.ext.autosummary.generate:main
|
||||||
|
sphinx-build = sphinx:main
|
||||||
|
sphinx-quickstart = sphinx.quickstart:main
|
||||||
|
[distutils.commands]
|
||||||
|
build_sphinx = sphinx.setup_command:BuildDoc
|
|
@ -0,0 +1,58 @@
|
||||||
|
.. _`pip uninstall`:
|
||||||
|
|
||||||
|
=============
|
||||||
|
pip uninstall
|
||||||
|
=============
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: uninstall "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: uninstall "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: uninstall
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: uninstall
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
#. Uninstall a package.
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ python -m pip uninstall simplejson
|
||||||
|
Uninstalling simplejson:
|
||||||
|
/home/me/env/lib/python3.9/site-packages/simplejson
|
||||||
|
/home/me/env/lib/python3.9/site-packages/simplejson-2.2.1-py3.9.egg-info
|
||||||
|
Proceed (y/n)? y
|
||||||
|
Successfully uninstalled simplejson
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
C:\> py -m pip uninstall simplejson
|
||||||
|
Uninstalling simplejson:
|
||||||
|
/home/me/env/lib/python3.9/site-packages/simplejson
|
||||||
|
/home/me/env/lib/python3.9/site-packages/simplejson-2.2.1-py3.9.egg-info
|
||||||
|
Proceed (y/n)? y
|
||||||
|
Successfully uninstalled simplejson
|
|
@ -0,0 +1,125 @@
|
||||||
|
|
||||||
|
.. _`pip wheel`:
|
||||||
|
|
||||||
|
=========
|
||||||
|
pip wheel
|
||||||
|
=========
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. pip-command-usage:: wheel "python -m pip"
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. pip-command-usage:: wheel "py -m pip"
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. pip-command-description:: wheel
|
||||||
|
|
||||||
|
|
||||||
|
Build System Interface
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
In order for pip to build a wheel, ``setup.py`` must implement the
|
||||||
|
``bdist_wheel`` command with the following syntax:
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python setup.py bdist_wheel -d TARGET
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py setup.py bdist_wheel -d TARGET
|
||||||
|
|
||||||
|
|
||||||
|
This command must create a wheel compatible with the invoking Python
|
||||||
|
interpreter, and save that wheel in the directory TARGET.
|
||||||
|
|
||||||
|
No other build system commands are invoked by the ``pip wheel`` command.
|
||||||
|
|
||||||
|
Customising the build
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
It is possible using ``--global-option`` to include additional build commands
|
||||||
|
with their arguments in the ``setup.py`` command. This is currently the only
|
||||||
|
way to influence the building of C extensions from the command line. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
|
||||||
|
|
||||||
|
|
||||||
|
will result in a build command of
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
setup.py bdist_ext -DFOO bdist_wheel -d TARGET
|
||||||
|
|
||||||
|
which passes a preprocessor symbol to the extension build.
|
||||||
|
|
||||||
|
Such usage is considered highly build-system specific and more an accident of
|
||||||
|
the current implementation than a supported interface.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. pip-command-options:: wheel
|
||||||
|
|
||||||
|
.. pip-index-options:: wheel
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
#. Build wheels for a requirement (and all its dependencies), and then install
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
|
||||||
|
python -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
|
||||||
|
py -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
|
||||||
|
|
||||||
|
#. Build a wheel for a package from source
|
||||||
|
|
||||||
|
.. tab:: Unix/macOS
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
python -m pip wheel --no-binary SomePackage SomePackage
|
||||||
|
|
||||||
|
.. tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
py -m pip wheel --no-binary SomePackage SomePackage
|
|
@ -1,325 +1,128 @@
|
||||||
# pip documentation build configuration file, created by
|
"""Sphinx configuration file for pip's documentation."""
|
||||||
# sphinx-quickstart on Tue Apr 22 22:08:49 2008
|
|
||||||
#
|
|
||||||
# This file is execfile()d with the current directory set to its containing dir
|
|
||||||
#
|
|
||||||
# Note that not all possible configuration values are present in this
|
|
||||||
# autogenerated file.
|
|
||||||
#
|
|
||||||
# All configuration values have a default; values that are commented out
|
|
||||||
# serve to show the default.
|
|
||||||
|
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
import pathlib
|
import pathlib
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
from typing import List, Tuple
|
||||||
|
|
||||||
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
|
# Add the docs/ directory to sys.path, because pip_sphinxext.py is there.
|
||||||
|
|
||||||
docs_dir = os.path.dirname(os.path.dirname(__file__))
|
docs_dir = os.path.dirname(os.path.dirname(__file__))
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
||||||
sys.path.insert(0, docs_dir)
|
sys.path.insert(0, docs_dir)
|
||||||
# sys.path.append(os.path.join(os.path.dirname(__file__), '../'))
|
|
||||||
|
|
||||||
# -- General configuration ----------------------------------------------------
|
# -- General configuration ------------------------------------------------------------
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
|
||||||
# extensions = ['sphinx.ext.autodoc']
|
|
||||||
extensions = [
|
extensions = [
|
||||||
# native:
|
# first-party extensions
|
||||||
'sphinx.ext.extlinks',
|
"sphinx.ext.autodoc",
|
||||||
'sphinx.ext.intersphinx',
|
"sphinx.ext.todo",
|
||||||
# third-party:
|
"sphinx.ext.extlinks",
|
||||||
'sphinx_inline_tabs',
|
"sphinx.ext.intersphinx",
|
||||||
'sphinxcontrib.towncrier',
|
# our extensions
|
||||||
# in-tree:
|
"pip_sphinxext",
|
||||||
'docs_feedback_sphinxext',
|
# third-party extensions
|
||||||
'pip_sphinxext',
|
"myst_parser",
|
||||||
|
"sphinx_copybutton",
|
||||||
|
"sphinx_inline_tabs",
|
||||||
|
"sphinxcontrib.towncrier",
|
||||||
]
|
]
|
||||||
|
|
||||||
# intersphinx
|
|
||||||
intersphinx_cache_limit = 0
|
|
||||||
intersphinx_mapping = {
|
|
||||||
'pypug': ('https://packaging.python.org/', None),
|
|
||||||
'pypa': ('https://www.pypa.io/en/latest/', None),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
|
||||||
templates_path = []
|
|
||||||
|
|
||||||
# The suffix of source filenames.
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The encoding of source files.
|
|
||||||
# source_encoding = 'utf-8'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = 'pip'
|
project = "pip"
|
||||||
copyright = '2008-2020, PyPA'
|
copyright = "2008-2020, PyPA"
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# Find the version and release information.
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# We have a single source of truth for our version number: pip's __init__.py file.
|
||||||
# built documents.
|
# This next bit of code reads from it.
|
||||||
#
|
file_with_version = os.path.join(docs_dir, "..", "src", "pip", "__init__.py")
|
||||||
# The short X.Y version.
|
with open(file_with_version) as f:
|
||||||
|
|
||||||
version = release = 'dev'
|
|
||||||
|
|
||||||
# Readthedocs seems to install pip as an egg (via setup.py install) which
|
|
||||||
# is somehow resulting in "import pip" picking up an older copy of pip.
|
|
||||||
# Rather than trying to force RTD to install pip properly, we'll simply
|
|
||||||
# read the version direct from the __init__.py file. (Yes, this is
|
|
||||||
# fragile, but it works...)
|
|
||||||
|
|
||||||
pip_init = os.path.join(docs_dir, '..', 'src', 'pip', '__init__.py')
|
|
||||||
with open(pip_init) as f:
|
|
||||||
for line in f:
|
for line in f:
|
||||||
m = re.match(r'__version__ = "(.*)"', line)
|
m = re.match(r'__version__ = "(.*)"', line)
|
||||||
if m:
|
if m:
|
||||||
__version__ = m.group(1)
|
__version__ = m.group(1)
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = '.'.join(__version__.split('.')[:2])
|
version = ".".join(__version__.split(".")[:2])
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = __version__
|
release = __version__
|
||||||
break
|
break
|
||||||
|
else: # AKA no-break
|
||||||
|
version = release = "dev"
|
||||||
|
|
||||||
# We have this here because readthedocs plays tricks sometimes and there seems
|
|
||||||
# to be a heisenbug, related to the version of pip discovered. This is here to
|
|
||||||
# help debug that if someone decides to do that in the future.
|
|
||||||
print("pip version:", version)
|
print("pip version:", version)
|
||||||
print("pip release:", release)
|
print("pip release:", release)
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# -- Options for smartquotes ----------------------------------------------------------
|
||||||
# for a list of supported languages.
|
|
||||||
# language = None
|
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
# Disable the conversion of dashes so that long options like "--find-links" won't
|
||||||
# non-false value, then it is used:
|
# render as "-find-links" if included in the text.The default of "qDe" converts normal
|
||||||
# today = ''
|
# quote characters ('"' and "'"), en and em dashes ("--" and "---"), and ellipses "..."
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
|
||||||
today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of documents that shouldn't be included in the build.
|
|
||||||
# unused_docs = []
|
|
||||||
|
|
||||||
# List of directories, relative to source directory, that shouldn't be searched
|
|
||||||
# for source files.
|
|
||||||
exclude_patterns = ['build/']
|
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all documents
|
|
||||||
# default_role = None
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
# add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
# add_module_names = True
|
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
||||||
# output. They are ignored by default.
|
|
||||||
# show_authors = False
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
# modindex_common_prefix = []
|
|
||||||
|
|
||||||
extlinks = {
|
|
||||||
'issue': ('https://github.com/pypa/pip/issues/%s', '#'),
|
|
||||||
'pull': ('https://github.com/pypa/pip/pull/%s', 'PR #'),
|
|
||||||
'pypi': ('https://pypi.org/project/%s/', ''),
|
|
||||||
}
|
|
||||||
|
|
||||||
# Turn off sphinx build warnings because of sphinx tabs during man pages build
|
|
||||||
sphinx_tabs_nowarn = True
|
|
||||||
|
|
||||||
# -- Options for HTML output --------------------------------------------------
|
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. Major themes that come with
|
|
||||||
# Sphinx are currently 'default' and 'sphinxdoc'.
|
|
||||||
html_theme = "furo"
|
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
|
||||||
# further. For a list of options available for each theme, see the
|
|
||||||
# documentation.
|
|
||||||
html_theme_options = {}
|
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
|
||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to
|
|
||||||
# "<project> v<release> documentation".
|
|
||||||
html_title = f"{project} documentation v{release}"
|
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
||||||
# html_short_title = None
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
|
||||||
# of the sidebar.
|
|
||||||
# html_logo = '_static/piplogo.png'
|
|
||||||
|
|
||||||
# The name of an image file (within the static path) to use as favicon of the
|
|
||||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
||||||
# pixels large.
|
|
||||||
# html_favicon = 'favicon.png'
|
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
||||||
html_static_path = []
|
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
|
||||||
# using the given strftime format.
|
|
||||||
html_last_updated_fmt = '%b %d, %Y'
|
|
||||||
|
|
||||||
# If true, the Docutils Smart Quotes transform (originally based on
|
|
||||||
# SmartyPants) will be used to convert characters like quotes and dashes
|
|
||||||
# to typographically correct entities. The default is True.
|
|
||||||
smartquotes = True
|
|
||||||
|
|
||||||
# This string, for use with Docutils 0.14 or later, customizes the
|
|
||||||
# SmartQuotes transform. The default of "qDe" converts normal quote
|
|
||||||
# characters ('"' and "'"), en and em dashes ("--" and "---"), and
|
|
||||||
# ellipses "...".
|
|
||||||
# For now, we disable the conversion of dashes so that long options
|
|
||||||
# like "--find-links" won't render as "-find-links" if included in the
|
|
||||||
# text in places where monospaced type can't be used. For example, backticks
|
|
||||||
# can't be used inside roles like :ref:`--no-index <--no-index>` because
|
|
||||||
# of nesting.
|
|
||||||
smartquotes_action = "qe"
|
smartquotes_action = "qe"
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
# -- Options for intersphinx ----------------------------------------------------------
|
||||||
html_sidebars = {}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
intersphinx_mapping = {
|
||||||
# template names.
|
"python": ("https://docs.python.org/3", None),
|
||||||
# html_additional_pages = {}
|
"pypug": ("https://packaging.python.org", None),
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
html_use_modindex = False
|
|
||||||
|
|
||||||
# If false, no index is generated.
|
|
||||||
html_use_index = False
|
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
|
||||||
# html_split_index = False
|
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
|
||||||
html_show_sourcelink = False
|
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
|
||||||
# base URL from which the finished HTML is served.
|
|
||||||
# html_use_opensearch = ''
|
|
||||||
|
|
||||||
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
|
|
||||||
# html_file_suffix = ''
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = 'pipdocs'
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output -------------------------------------------------
|
|
||||||
|
|
||||||
# The paper size ('letter' or 'a4').
|
|
||||||
# latex_paper_size = 'letter'
|
|
||||||
|
|
||||||
# The font size ('10pt', '11pt' or '12pt').
|
|
||||||
# latex_font_size = '10pt'
|
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
|
||||||
# (source start file, target name, title, author, documentclass [howto/manual])
|
|
||||||
latex_documents = [
|
|
||||||
(
|
|
||||||
'index',
|
|
||||||
'pip.tex',
|
|
||||||
'pip Documentation',
|
|
||||||
'pip developers',
|
|
||||||
'manual',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
|
||||||
# the title page.
|
|
||||||
# latex_logo = None
|
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
||||||
# not chapters.
|
|
||||||
# latex_use_parts = False
|
|
||||||
|
|
||||||
# Additional stuff for the LaTeX preamble.
|
|
||||||
# latex_preamble = ''
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
# latex_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
# latex_use_modindex = True
|
|
||||||
|
|
||||||
# -- Options for Manual Pages -------------------------------------------------
|
|
||||||
|
|
||||||
# List of manual pages generated
|
|
||||||
man_pages = [
|
|
||||||
(
|
|
||||||
'index',
|
|
||||||
'pip',
|
|
||||||
'package manager for Python packages',
|
|
||||||
'pip developers',
|
|
||||||
1
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def to_document_name(path, base_dir):
|
|
||||||
"""Convert a provided path to a Sphinx "document name".
|
|
||||||
"""
|
|
||||||
relative_path = os.path.relpath(path, base_dir)
|
|
||||||
root, _ = os.path.splitext(relative_path)
|
|
||||||
return root.replace(os.sep, '/')
|
|
||||||
|
|
||||||
|
|
||||||
# Here, we crawl the entire man/commands/ directory and list every file with
|
|
||||||
# appropriate name and details
|
|
||||||
man_dir = os.path.join(docs_dir, 'man')
|
|
||||||
raw_subcommands = glob.glob(os.path.join(man_dir, 'commands/*.rst'))
|
|
||||||
if not raw_subcommands:
|
|
||||||
raise FileNotFoundError(
|
|
||||||
'The individual subcommand manpages could not be found!'
|
|
||||||
)
|
|
||||||
for fname in raw_subcommands:
|
|
||||||
fname_base = to_document_name(fname, man_dir)
|
|
||||||
outname = 'pip-' + fname_base.split('/')[1]
|
|
||||||
description = 'description of {} command'.format(
|
|
||||||
outname.replace('-', ' ')
|
|
||||||
)
|
|
||||||
|
|
||||||
man_pages.append((fname_base, outname, description, 'pip developers', 1))
|
|
||||||
|
|
||||||
# -- Options for docs_feedback_sphinxext --------------------------------------
|
|
||||||
|
|
||||||
# NOTE: Must be one of 'attention', 'caution', 'danger', 'error', 'hint',
|
|
||||||
# NOTE: 'important', 'note', 'tip', 'warning' or 'admonition'.
|
|
||||||
docs_feedback_admonition_type = 'important'
|
|
||||||
docs_feedback_big_doc_lines = 50 # bigger docs will have a banner on top
|
|
||||||
docs_feedback_email = 'Docs UX Team <docs-feedback@pypa.io>'
|
|
||||||
docs_feedback_excluded_documents = { # these won't have any banners
|
|
||||||
'news', 'reference/index',
|
|
||||||
}
|
}
|
||||||
docs_feedback_questions_list = (
|
|
||||||
'What problem were you trying to solve when you came to this page?',
|
|
||||||
'What content was useful?',
|
|
||||||
'What content was not useful?',
|
|
||||||
)
|
|
||||||
|
|
||||||
# -- Options for towncrier_draft extension -----------------------------------
|
# -- Options for extlinks -------------------------------------------------------------
|
||||||
|
|
||||||
towncrier_draft_autoversion_mode = 'draft' # or: 'sphinx-release', 'sphinx-version'
|
extlinks = {
|
||||||
towncrier_draft_include_empty = False
|
"issue": ("https://github.com/pypa/pip/issues/%s", "#"),
|
||||||
|
"pull": ("https://github.com/pypa/pip/pull/%s", "PR #"),
|
||||||
|
"pypi": ("https://pypi.org/project/%s/", ""),
|
||||||
|
}
|
||||||
|
|
||||||
|
# -- Options for towncrier_draft extension --------------------------------------------
|
||||||
|
|
||||||
|
towncrier_draft_autoversion_mode = "draft" # or: 'sphinx-release', 'sphinx-version'
|
||||||
|
towncrier_draft_include_empty = True
|
||||||
towncrier_draft_working_directory = pathlib.Path(docs_dir).parent
|
towncrier_draft_working_directory = pathlib.Path(docs_dir).parent
|
||||||
# Not yet supported: towncrier_draft_config_path = 'pyproject.toml' # relative to cwd
|
# Not yet supported: towncrier_draft_config_path = 'pyproject.toml' # relative to cwd
|
||||||
|
|
||||||
|
# -- Options for HTML -----------------------------------------------------------------
|
||||||
|
|
||||||
|
html_theme = "furo"
|
||||||
|
html_title = f"{project} documentation v{release}"
|
||||||
|
|
||||||
|
# Disable the generation of the various indexes
|
||||||
|
html_use_modindex = False
|
||||||
|
html_use_index = False
|
||||||
|
|
||||||
|
# -- Options for Manual Pages ---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# List of manual pages generated
|
||||||
|
def determine_man_pages() -> List[Tuple[str, str, str, str, int]]:
|
||||||
|
"""Determine which man pages need to be generated."""
|
||||||
|
|
||||||
|
def to_document_name(path: str, base_dir: str) -> str:
|
||||||
|
"""Convert a provided path to a Sphinx "document name"."""
|
||||||
|
relative_path = os.path.relpath(path, base_dir)
|
||||||
|
root, _ = os.path.splitext(relative_path)
|
||||||
|
return root.replace(os.sep, "/")
|
||||||
|
|
||||||
|
# Crawl the entire man/commands/ directory and list every file with appropriate
|
||||||
|
# name and details.
|
||||||
|
man_dir = os.path.join(docs_dir, "man")
|
||||||
|
raw_subcommands = glob.glob(os.path.join(man_dir, "commands/*.rst"))
|
||||||
|
if not raw_subcommands:
|
||||||
|
raise FileNotFoundError(
|
||||||
|
"The individual subcommand manpages could not be found!"
|
||||||
|
)
|
||||||
|
|
||||||
|
retval = [
|
||||||
|
("index", "pip", "package manager for Python packages", "pip developers", 1),
|
||||||
|
]
|
||||||
|
for fname in raw_subcommands:
|
||||||
|
fname_base = to_document_name(fname, man_dir)
|
||||||
|
outname = "pip-" + fname_base.split("/")[1]
|
||||||
|
description = "description of {} command".format(outname.replace("-", " "))
|
||||||
|
|
||||||
|
retval.append((fname_base, outname, description, "pip developers", 1))
|
||||||
|
|
||||||
|
return retval
|
||||||
|
|
||||||
|
|
||||||
|
man_pages = determine_man_pages()
|
||||||
|
|
|
@ -6,4 +6,4 @@ Copyright
|
||||||
|
|
||||||
pip and this documentation is:
|
pip and this documentation is:
|
||||||
|
|
||||||
Copyright © 2008-2020 The pip developers (see `AUTHORS.txt <https://github.com/pypa/pip/blob/master/AUTHORS.txt>`_ file). All rights reserved.
|
Copyright © 2008-2020 The pip developers (see `AUTHORS.txt <https://github.com/pypa/pip/blob/main/AUTHORS.txt>`_ file). All rights reserved.
|
||||||
|
|
|
@ -51,7 +51,6 @@ The ``README``, license, ``pyproject.toml``, ``setup.py``, and so on are in the
|
||||||
* ``functional/`` *[functional tests of pip’s CLI -- end-to-end, invoke pip in subprocess & check results of execution against desired result. This also is what makes test suite slow]*
|
* ``functional/`` *[functional tests of pip’s CLI -- end-to-end, invoke pip in subprocess & check results of execution against desired result. This also is what makes test suite slow]*
|
||||||
* ``lib/`` *[helpers for tests]*
|
* ``lib/`` *[helpers for tests]*
|
||||||
* ``unit/`` *[unit tests -- fast and small and nice!]*
|
* ``unit/`` *[unit tests -- fast and small and nice!]*
|
||||||
* ``yaml/`` *[resolver tests! They’re written in YAML. This folder just contains .yaml files -- actual code for reading/running them is in lib/yaml.py . This is fine!]*
|
|
||||||
|
|
||||||
* ``tools`` *[misc development workflow tools, like requirements files & Travis CI files & helpers for tox]*
|
* ``tools`` *[misc development workflow tools, like requirements files & Travis CI files & helpers for tox]*
|
||||||
* ``.azure-pipelines``
|
* ``.azure-pipelines``
|
||||||
|
@ -105,5 +104,5 @@ Within ``src/``:
|
||||||
|
|
||||||
.. _`tracking issue`: https://github.com/pypa/pip/issues/6831
|
.. _`tracking issue`: https://github.com/pypa/pip/issues/6831
|
||||||
.. _GitHub repository: https://github.com/pypa/pip/
|
.. _GitHub repository: https://github.com/pypa/pip/
|
||||||
.. _tox.ini: https://github.com/pypa/pip/blob/master/tox.ini
|
.. _tox.ini: https://github.com/pypa/pip/blob/main/tox.ini
|
||||||
.. _improving the pip dependency resolver: https://github.com/pypa/pip/issues/988
|
.. _improving the pip dependency resolver: https://github.com/pypa/pip/issues/988
|
||||||
|
|
|
@ -30,7 +30,8 @@ candidate.
|
||||||
``--upgrade-strategy``
|
``--upgrade-strategy``
|
||||||
|
|
||||||
This option affects which packages are allowed to be installed. It is only
|
This option affects which packages are allowed to be installed. It is only
|
||||||
relevant if ``--upgrade`` is specified. The base behaviour is to allow
|
relevant if ``--upgrade`` is specified (except for the ``to-satisfy-only``
|
||||||
|
option mentioned below). The base behaviour is to allow
|
||||||
packages specified on pip's command line to be upgraded. This option controls
|
packages specified on pip's command line to be upgraded. This option controls
|
||||||
what *other* packages can be upgraded:
|
what *other* packages can be upgraded:
|
||||||
|
|
||||||
|
@ -43,9 +44,15 @@ what *other* packages can be upgraded:
|
||||||
pip command or a requirement file (i.e, they are direct requirements), or
|
pip command or a requirement file (i.e, they are direct requirements), or
|
||||||
an upgraded parent needs a later version of the dependency than is
|
an upgraded parent needs a later version of the dependency than is
|
||||||
currently installed.
|
currently installed.
|
||||||
* ``to-satisfy-only`` (**undocumented**) - packages are not upgraded (not
|
* ``to-satisfy-only`` (**undocumented, please avoid**) - packages are not
|
||||||
even direct requirements) unless the currently installed version fails to
|
upgraded (not even direct requirements) unless the currently installed
|
||||||
satisfy a requirement (either explicitly specified or a dependency).
|
version fails to satisfy a requirement (either explicitly specified or a
|
||||||
|
dependency).
|
||||||
|
|
||||||
|
* This is actually the "default" upgrade strategy when ``--upgrade`` is
|
||||||
|
*not set*, i.e. ``pip install AlreadyInstalled`` and
|
||||||
|
``pip install --upgrade --upgrade-strategy=to-satisfy-only AlreadyInstalled``
|
||||||
|
yield the same behavior.
|
||||||
|
|
||||||
``--force-reinstall``
|
``--force-reinstall``
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
This section of the documentation is currently being written. pip
|
This section of the documentation is currently out of date.
|
||||||
developers welcome your help to complete this documentation. If
|
|
||||||
|
pip developers welcome your help to update this documentation. If
|
||||||
you're interested in helping out, please let us know in the
|
you're interested in helping out, please let us know in the
|
||||||
`tracking issue`_, or just submit a pull request and mention it in
|
`tracking issue`_, or just submit a pull request and mention it in
|
||||||
that tracking issue.
|
that tracking issue.
|
||||||
|
@ -133,11 +134,11 @@ Actual testing
|
||||||
| | +-------+---------------+-----------------+
|
| | +-------+---------------+-----------------+
|
||||||
| | | PyPy3 | | |
|
| | | PyPy3 | | |
|
||||||
| MacOS +----------+-------+---------------+-----------------+
|
| MacOS +----------+-------+---------------+-----------------+
|
||||||
| | | CP3.6 | Azure | Azure |
|
| | | CP3.6 | Github | Github |
|
||||||
| | +-------+---------------+-----------------+
|
| | +-------+---------------+-----------------+
|
||||||
| | x64 | CP3.7 | Azure | Azure |
|
| | x64 | CP3.7 | Github | Github |
|
||||||
| | +-------+---------------+-----------------+
|
| | +-------+---------------+-----------------+
|
||||||
| | | CP3.8 | Azure | Azure |
|
| | | CP3.8 | Github | Github |
|
||||||
| | +-------+---------------+-----------------+
|
| | +-------+---------------+-----------------+
|
||||||
| | | PyPy3 | | |
|
| | | PyPy3 | | |
|
||||||
+-----------+----------+-------+---------------+-----------------+
|
+-----------+----------+-------+---------------+-----------------+
|
||||||
|
|
|
@ -11,7 +11,7 @@ We have an in-progress guide to the
|
||||||
Submitting Pull Requests
|
Submitting Pull Requests
|
||||||
========================
|
========================
|
||||||
|
|
||||||
Submit pull requests against the ``master`` branch, providing a good
|
Submit pull requests against the ``main`` branch, providing a good
|
||||||
description of what you're doing and why. You must have legal permission to
|
description of what you're doing and why. You must have legal permission to
|
||||||
distribute any code you contribute to pip and it must be available under the
|
distribute any code you contribute to pip and it must be available under the
|
||||||
MIT License.
|
MIT License.
|
||||||
|
@ -39,7 +39,7 @@ separately, as a "formatting cleanup" PR, if needed.
|
||||||
Automated Testing
|
Automated Testing
|
||||||
=================
|
=================
|
||||||
|
|
||||||
All pull requests and merges to 'master' branch are tested using `Travis CI`_,
|
All pull requests and merges to 'main' branch are tested using `Travis CI`_,
|
||||||
`Azure Pipelines`_ and `GitHub Actions`_ based on our `.travis.yml`_,
|
`Azure Pipelines`_ and `GitHub Actions`_ based on our `.travis.yml`_,
|
||||||
`.azure-pipelines`_ and `.github/workflows`_ files. More details about pip's
|
`.azure-pipelines`_ and `.github/workflows`_ files. More details about pip's
|
||||||
Continuous Integration can be found in the `CI Documentation`_
|
Continuous Integration can be found in the `CI Documentation`_
|
||||||
|
@ -131,8 +131,8 @@ updating deprecation policy, etc.
|
||||||
Updating your branch
|
Updating your branch
|
||||||
====================
|
====================
|
||||||
|
|
||||||
As you work, you might need to update your local master branch up-to-date with
|
As you work, you might need to update your local main branch up-to-date with
|
||||||
the ``master`` branch in the main pip repository, which moves forward as the
|
the ``main`` branch in the main pip repository, which moves forward as the
|
||||||
maintainers merge pull requests. Most people working on the project use the
|
maintainers merge pull requests. Most people working on the project use the
|
||||||
following workflow.
|
following workflow.
|
||||||
|
|
||||||
|
@ -160,24 +160,24 @@ First, fetch the latest changes from the main pip repository, ``upstream``:
|
||||||
|
|
||||||
git fetch upstream
|
git fetch upstream
|
||||||
|
|
||||||
Then, check out your local ``master`` branch, and rebase the changes on top of
|
Then, check out your local ``main`` branch, and rebase the changes on top of
|
||||||
it:
|
it:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
git checkout master
|
git checkout main
|
||||||
git rebase upstream/master
|
git rebase upstream/main
|
||||||
|
|
||||||
At this point, you might have to `resolve merge conflicts`_. Once this is done,
|
At this point, you might have to `resolve merge conflicts`_. Once this is done,
|
||||||
push the updates you have just made to your local ``master`` branch to your
|
push the updates you have just made to your local ``main`` branch to your
|
||||||
``origin`` repository on GitHub:
|
``origin`` repository on GitHub:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
git checkout master
|
git checkout main
|
||||||
git push origin master
|
git push origin main
|
||||||
|
|
||||||
Now your local ``master`` branch and the ``master`` branch in your ``origin``
|
Now your local ``main`` branch and the ``main`` branch in your ``origin``
|
||||||
repo have been updated with the most recent changes from the main pip
|
repo have been updated with the most recent changes from the main pip
|
||||||
repository.
|
repository.
|
||||||
|
|
||||||
|
@ -187,10 +187,10 @@ To keep your branches updated, the process is similar:
|
||||||
|
|
||||||
git checkout awesome-feature
|
git checkout awesome-feature
|
||||||
git fetch upstream
|
git fetch upstream
|
||||||
git rebase upstream/master
|
git rebase upstream/main
|
||||||
|
|
||||||
Now your branch has been updated with the latest changes from the
|
Now your branch has been updated with the latest changes from the
|
||||||
``master`` branch on the upstream pip repository.
|
``main`` branch on the upstream pip repository.
|
||||||
|
|
||||||
It's good practice to back up your branches by pushing them to your
|
It's good practice to back up your branches by pushing them to your
|
||||||
``origin`` on GitHub as you are working on them. To push a branch,
|
``origin`` on GitHub as you are working on them. To push a branch,
|
||||||
|
@ -230,7 +230,7 @@ If you get an error message like this:
|
||||||
|
|
||||||
Try force-pushing your branch with ``push -f``.
|
Try force-pushing your branch with ``push -f``.
|
||||||
|
|
||||||
The ``master`` branch in the main pip repository gets updated frequently, so
|
The ``main`` branch in the main pip repository gets updated frequently, so
|
||||||
you might have to update your branch at least once while you are working on it.
|
you might have to update your branch at least once while you are working on it.
|
||||||
|
|
||||||
Thank you for your contribution!
|
Thank you for your contribution!
|
||||||
|
@ -267,9 +267,9 @@ will initiate a vote among the existing maintainers.
|
||||||
.. _`Travis CI`: https://travis-ci.org/
|
.. _`Travis CI`: https://travis-ci.org/
|
||||||
.. _`Azure Pipelines`: https://azure.microsoft.com/en-in/services/devops/pipelines/
|
.. _`Azure Pipelines`: https://azure.microsoft.com/en-in/services/devops/pipelines/
|
||||||
.. _`GitHub Actions`: https://github.com/features/actions
|
.. _`GitHub Actions`: https://github.com/features/actions
|
||||||
.. _`.travis.yml`: https://github.com/pypa/pip/blob/master/.travis.yml
|
.. _`.travis.yml`: https://github.com/pypa/pip/blob/main/.travis.yml
|
||||||
.. _`.azure-pipelines`: https://github.com/pypa/pip/blob/master/.azure-pipelines
|
.. _`.azure-pipelines`: https://github.com/pypa/pip/blob/main/.azure-pipelines
|
||||||
.. _`.github/workflows`: https://github.com/pypa/pip/blob/master/.github/workflows
|
.. _`.github/workflows`: https://github.com/pypa/pip/blob/main/.github/workflows
|
||||||
.. _`CI Documentation`: https://pip.pypa.io/en/latest/development/ci/
|
.. _`CI Documentation`: https://pip.pypa.io/en/latest/development/ci/
|
||||||
.. _`towncrier`: https://pypi.org/project/towncrier/
|
.. _`towncrier`: https://pypi.org/project/towncrier/
|
||||||
.. _`Testing the next-gen pip dependency resolver`: https://pradyunsg.me/blog/2020/03/27/pip-resolver-testing/
|
.. _`Testing the next-gen pip dependency resolver`: https://pradyunsg.me/blog/2020/03/27/pip-resolver-testing/
|
||||||
|
|
|
@ -229,7 +229,7 @@ Examples:
|
||||||
(`link <https://github.com/pypa/pip/issues/6498#issuecomment-513501112>`__)
|
(`link <https://github.com/pypa/pip/issues/6498#issuecomment-513501112>`__)
|
||||||
- get-pip on system with no ``/usr/lib64``
|
- get-pip on system with no ``/usr/lib64``
|
||||||
(`link <https://github.com/pypa/pip/issues/5379#issuecomment-515270576>`__)
|
(`link <https://github.com/pypa/pip/issues/5379#issuecomment-515270576>`__)
|
||||||
- reproducing with ``pip`` from master branch
|
- reproducing with ``pip`` from current development branch
|
||||||
(`link <https://github.com/pypa/pip/issues/6707#issue-467770959>`__)
|
(`link <https://github.com/pypa/pip/issues/6707#issue-467770959>`__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ An issue may be considered resolved and closed when:
|
||||||
- already tracked by another issue
|
- already tracked by another issue
|
||||||
|
|
||||||
- A project-specific issue has been identified and the issue no
|
- A project-specific issue has been identified and the issue no
|
||||||
longer occurs as of the latest commit on the master branch.
|
longer occurs as of the latest commit on the main branch.
|
||||||
|
|
||||||
- An enhancement or feature request no longer has a proponent and the maintainers
|
- An enhancement or feature request no longer has a proponent and the maintainers
|
||||||
don't think it's worth keeping open.
|
don't think it's worth keeping open.
|
||||||
|
|
|
@ -7,7 +7,7 @@ Release process
|
||||||
Release Cadence
|
Release Cadence
|
||||||
===============
|
===============
|
||||||
|
|
||||||
The pip project has a release cadence of releasing whatever is on ``master``
|
The pip project has a release cadence of releasing whatever is on ``main``
|
||||||
every 3 months. This gives users a predictable pattern for when releases
|
every 3 months. This gives users a predictable pattern for when releases
|
||||||
are going to happen and prevents locking up improvements for fixes for long
|
are going to happen and prevents locking up improvements for fixes for long
|
||||||
periods of time, while still preventing massively fracturing the user base
|
periods of time, while still preventing massively fracturing the user base
|
||||||
|
@ -22,8 +22,8 @@ The release manager may, at their discretion, choose whether or not there
|
||||||
will be a pre-release period for a release, and if there is may extend that
|
will be a pre-release period for a release, and if there is may extend that
|
||||||
period into the next month if needed.
|
period into the next month if needed.
|
||||||
|
|
||||||
Because releases are made direct from the ``master`` branch, it is essential
|
Because releases are made direct from the ``main`` branch, it is essential
|
||||||
that ``master`` is always in a releasable state. It is acceptable to merge
|
that ``main`` is always in a releasable state. It is acceptable to merge
|
||||||
PRs that partially implement a new feature, but only if the partially
|
PRs that partially implement a new feature, but only if the partially
|
||||||
implemented version is usable in that state (for example, with reduced
|
implemented version is usable in that state (for example, with reduced
|
||||||
functionality or disabled by default). In the case where a merged PR is found
|
functionality or disabled by default). In the case where a merged PR is found
|
||||||
|
@ -116,13 +116,13 @@ Release Process
|
||||||
Creating a new release
|
Creating a new release
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
#. Checkout the current pip ``master`` branch.
|
#. Checkout the current pip ``main`` branch.
|
||||||
#. Ensure you have the latest ``nox`` installed.
|
#. Ensure you have the latest ``nox`` installed.
|
||||||
#. Prepare for release using ``nox -s prepare-release -- YY.N``.
|
#. Prepare for release using ``nox -s prepare-release -- YY.N``.
|
||||||
This will update the relevant files and tag the correct commit.
|
This will update the relevant files and tag the correct commit.
|
||||||
#. Build the release artifacts using ``nox -s build-release -- YY.N``.
|
#. Build the release artifacts using ``nox -s build-release -- YY.N``.
|
||||||
This will checkout the tag, generate the distribution files to be
|
This will checkout the tag, generate the distribution files to be
|
||||||
uploaded and checkout the master branch again.
|
uploaded and checkout the main branch again.
|
||||||
#. Upload the release to PyPI using ``nox -s upload-release -- YY.N``.
|
#. Upload the release to PyPI using ``nox -s upload-release -- YY.N``.
|
||||||
#. Push all of the changes including the tag.
|
#. Push all of the changes including the tag.
|
||||||
#. Regenerate the ``get-pip.py`` script in the `get-pip repository`_ (as
|
#. Regenerate the ``get-pip.py`` script in the `get-pip repository`_ (as
|
||||||
|
@ -155,20 +155,20 @@ Creating a bug-fix release
|
||||||
|
|
||||||
Sometimes we need to release a bugfix release of the form ``YY.N.Z+1``. In
|
Sometimes we need to release a bugfix release of the form ``YY.N.Z+1``. In
|
||||||
order to create one of these the changes should already be merged into the
|
order to create one of these the changes should already be merged into the
|
||||||
``master`` branch.
|
``main`` branch.
|
||||||
|
|
||||||
#. Create a new ``release/YY.N.Z+1`` branch off of the ``YY.N`` tag using the
|
#. Create a new ``release/YY.N.Z+1`` branch off of the ``YY.N`` tag using the
|
||||||
command ``git checkout -b release/YY.N.Z+1 YY.N``.
|
command ``git checkout -b release/YY.N.Z+1 YY.N``.
|
||||||
#. Cherry pick the fixed commits off of the ``master`` branch, fixing any
|
#. Cherry pick the fixed commits off of the ``main`` branch, fixing any
|
||||||
conflicts.
|
conflicts.
|
||||||
#. Run ``nox -s prepare-release -- YY.N.Z+1``.
|
#. Run ``nox -s prepare-release -- YY.N.Z+1``.
|
||||||
#. Merge master into your release branch and drop the news files that have been
|
#. Merge main into your release branch and drop the news files that have been
|
||||||
included in your release (otherwise they would also appear in the ``YY.N+1``
|
included in your release (otherwise they would also appear in the ``YY.N+1``
|
||||||
changelog)
|
changelog)
|
||||||
#. Push the ``release/YY.N.Z+1`` branch to github and submit a PR for it against
|
#. Push the ``release/YY.N.Z+1`` branch to github and submit a PR for it against
|
||||||
the ``master`` branch and wait for the tests to run.
|
the ``main`` branch and wait for the tests to run.
|
||||||
#. Once tests run, merge the ``release/YY.N.Z+1`` branch into master, and follow
|
#. Once tests run, merge the ``release/YY.N.Z+1`` branch into ``main``, and
|
||||||
the above release process starting with step 4.
|
follow the above release process starting with step 4.
|
||||||
|
|
||||||
.. _`get-pip repository`: https://github.com/pypa/get-pip
|
.. _`get-pip repository`: https://github.com/pypa/get-pip
|
||||||
.. _`psf-salt repository`: https://github.com/python/psf-salt
|
.. _`psf-salt repository`: https://github.com/python/psf-salt
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
---
|
||||||
|
hide-toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# pip
|
||||||
|
|
||||||
|
pip is the [package installer for Python][recommended]. You can use it to
|
||||||
|
install packages from the [Python Package Index][pypi] and other indexes.
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:hidden:
|
||||||
|
|
||||||
|
quickstart
|
||||||
|
installing
|
||||||
|
user_guide
|
||||||
|
cli/index
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:caption: Project
|
||||||
|
:hidden:
|
||||||
|
|
||||||
|
development/index
|
||||||
|
ux_research_design
|
||||||
|
news
|
||||||
|
Code of Conduct <https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md>
|
||||||
|
GitHub <https://github.com/pypa/pip>
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to learn about how to use pip, check out the following resources:
|
||||||
|
|
||||||
|
- [Quickstart](quickstart)
|
||||||
|
- [Python Packaging User Guide](https://packaging.python.org)
|
||||||
|
|
||||||
|
If you find bugs, need help, or want to talk to the developers, use our mailing
|
||||||
|
lists or chat rooms:
|
||||||
|
|
||||||
|
- [GitHub Issues][issue-tracker]
|
||||||
|
- [Discourse channel][packaging-discourse]
|
||||||
|
- [User IRC][irc-pypa]
|
||||||
|
- [Development IRC][irc-pypa-dev]
|
||||||
|
|
||||||
|
[recommended]: https://packaging.python.org/guides/tool-recommendations/
|
||||||
|
[pypi]: https://pypi.org/
|
||||||
|
[issue-tracker]: https://github.com/pypa/pip/issues/
|
||||||
|
[packaging-discourse]: https://discuss.python.org/c/packaging/14
|
||||||
|
[irc-pypa]: https://webchat.freenode.net/#pypa
|
||||||
|
[irc-pypa-dev]: https://webchat.freenode.net/#pypa-dev
|
|
@ -1,63 +0,0 @@
|
||||||
==================================
|
|
||||||
pip - The Python Package Installer
|
|
||||||
==================================
|
|
||||||
|
|
||||||
pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
|
|
||||||
|
|
||||||
Please take a look at our documentation for how to install and use pip:
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
quickstart
|
|
||||||
installing
|
|
||||||
user_guide
|
|
||||||
reference/index
|
|
||||||
development/index
|
|
||||||
ux_research_design
|
|
||||||
news
|
|
||||||
|
|
||||||
.. warning::
|
|
||||||
|
|
||||||
In pip 20.3, we've `made a big improvement to the heart of pip`_;
|
|
||||||
:ref:`Resolver changes 2020`. We want your input, so `sign up for
|
|
||||||
our user experience research studies`_ to help us do it right.
|
|
||||||
|
|
||||||
.. warning::
|
|
||||||
|
|
||||||
pip 21.0, in January 2021, removed Python 2 support, per pip's
|
|
||||||
:ref:`Python 2 Support` policy. Please migrate to Python 3.
|
|
||||||
|
|
||||||
If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
|
|
||||||
|
|
||||||
* `Issue tracking`_
|
|
||||||
* `Discourse channel`_
|
|
||||||
* `User IRC`_
|
|
||||||
|
|
||||||
If you want to get involved, head over to GitHub to get the source code, and feel free to jump on the developer mailing lists and chat rooms:
|
|
||||||
|
|
||||||
* `GitHub page`_
|
|
||||||
* `Development mailing list`_
|
|
||||||
* `Development IRC`_
|
|
||||||
|
|
||||||
|
|
||||||
Code of Conduct
|
|
||||||
===============
|
|
||||||
|
|
||||||
Everyone interacting in the pip project's codebases, issue trackers, chat
|
|
||||||
rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
|
|
||||||
|
|
||||||
.. _package installer: https://packaging.python.org/guides/tool-recommendations/
|
|
||||||
.. _Python Package Index: https://pypi.org
|
|
||||||
.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html
|
|
||||||
.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
|
|
||||||
.. _Installation: https://pip.pypa.io/en/stable/installing.html
|
|
||||||
.. _Documentation: https://pip.pypa.io/en/stable/
|
|
||||||
.. _Changelog: https://pip.pypa.io/en/stable/news.html
|
|
||||||
.. _GitHub page: https://github.com/pypa/pip
|
|
||||||
.. _Issue tracking: https://github.com/pypa/pip/issues
|
|
||||||
.. _Discourse channel: https://discuss.python.org/c/packaging
|
|
||||||
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
|
|
||||||
.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
|
|
||||||
.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
|
|
||||||
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
|
|
|
@ -9,4 +9,4 @@ Changelog
|
||||||
|
|
||||||
.. towncrier-draft-entries:: |release|, unreleased as on
|
.. towncrier-draft-entries:: |release|, unreleased as on
|
||||||
|
|
||||||
.. include:: ../../NEWS.rst
|
.. pip-news-include:: ../../NEWS.rst
|
||||||
|
|
|
@ -1,21 +1,11 @@
|
||||||
===============
|
:orphan:
|
||||||
Reference Guide
|
|
||||||
===============
|
|
||||||
|
|
||||||
.. toctree::
|
.. meta::
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
pip
|
:http-equiv=refresh: 3; url=../cli/
|
||||||
pip_install
|
|
||||||
pip_download
|
This page has moved
|
||||||
pip_uninstall
|
===================
|
||||||
pip_freeze
|
|
||||||
pip_list
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
pip_show
|
work, here's a link: :doc:`../cli/index`
|
||||||
pip_search
|
|
||||||
pip_cache
|
|
||||||
pip_check
|
|
||||||
pip_config
|
|
||||||
pip_wheel
|
|
||||||
pip_hash
|
|
||||||
pip_debug
|
|
||||||
|
|
|
@ -1,255 +1,11 @@
|
||||||
===
|
:orphan:
|
||||||
pip
|
|
||||||
===
|
|
||||||
|
|
||||||
|
.. meta::
|
||||||
|
|
||||||
Usage
|
:http-equiv=refresh: 3; url=../../cli/pip/
|
||||||
*****
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
.. code-block:: shell
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
|
work, here's a link: :doc:`../cli/pip`
|
||||||
python -m pip <command> [options]
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py -m pip <command> [options]
|
|
||||||
|
|
||||||
Description
|
|
||||||
***********
|
|
||||||
|
|
||||||
|
|
||||||
.. _`Logging`:
|
|
||||||
|
|
||||||
|
|
||||||
Logging
|
|
||||||
=======
|
|
||||||
|
|
||||||
Console logging
|
|
||||||
~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
pip offers :ref:`-v, --verbose <--verbose>` and :ref:`-q, --quiet <--quiet>`
|
|
||||||
to control the console log level. By default, some messages (error and warnings)
|
|
||||||
are colored in the terminal. If you want to suppress the colored output use
|
|
||||||
:ref:`--no-color <--no-color>`.
|
|
||||||
|
|
||||||
|
|
||||||
.. _`FileLogging`:
|
|
||||||
|
|
||||||
File logging
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
pip offers the :ref:`--log <--log>` option for specifying a file where a maximum
|
|
||||||
verbosity log will be kept. This option is empty by default. This log appends
|
|
||||||
to previous logging.
|
|
||||||
|
|
||||||
Like all pip options, ``--log`` can also be set as an environment variable, or
|
|
||||||
placed into the pip config file. See the :ref:`Configuration` section.
|
|
||||||
|
|
||||||
.. _`exists-action`:
|
|
||||||
|
|
||||||
--exists-action option
|
|
||||||
======================
|
|
||||||
|
|
||||||
This option specifies default behavior when path already exists.
|
|
||||||
Possible cases: downloading files or checking out repositories for installation,
|
|
||||||
creating archives. If ``--exists-action`` is not defined, pip will prompt
|
|
||||||
when decision is needed.
|
|
||||||
|
|
||||||
*(s)witch*
|
|
||||||
Only relevant to VCS checkout. Attempt to switch the checkout
|
|
||||||
to the appropriate URL and/or revision.
|
|
||||||
*(i)gnore*
|
|
||||||
Abort current operation (e.g. don't copy file, don't create archive,
|
|
||||||
don't modify a checkout).
|
|
||||||
*(w)ipe*
|
|
||||||
Delete the file or VCS checkout before trying to create, download, or checkout a new one.
|
|
||||||
*(b)ackup*
|
|
||||||
Rename the file or checkout to ``{name}{'.bak' * n}``, where n is some number
|
|
||||||
of ``.bak`` extensions, such that the file didn't exist at some point.
|
|
||||||
So the most recent backup will be the one with the largest number after ``.bak``.
|
|
||||||
*(a)abort*
|
|
||||||
Abort pip and return non-zero exit status.
|
|
||||||
|
|
||||||
.. _`build-interface`:
|
|
||||||
|
|
||||||
|
|
||||||
Build System Interface
|
|
||||||
======================
|
|
||||||
|
|
||||||
pip builds packages by invoking the build system. By default, builds will use
|
|
||||||
``setuptools``, but if a project specifies a different build system using a
|
|
||||||
``pyproject.toml`` file, as per :pep:`517`, pip will use that instead. As well
|
|
||||||
as package building, the build system is also invoked to install packages
|
|
||||||
direct from source. This is handled by invoking the build system to build a
|
|
||||||
wheel, and then installing from that wheel. The built wheel is cached locally
|
|
||||||
by pip to avoid repeated identical builds.
|
|
||||||
|
|
||||||
The current interface to the build system is via the ``setup.py`` command line
|
|
||||||
script - all build actions are defined in terms of the specific ``setup.py``
|
|
||||||
command line that will be run to invoke the required action.
|
|
||||||
|
|
||||||
Setuptools Injection
|
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
When :pep:`517` is not used, the supported build system is ``setuptools``.
|
|
||||||
However, not all packages use ``setuptools`` in their build scripts. To support
|
|
||||||
projects that use "pure ``distutils``", pip injects ``setuptools`` into
|
|
||||||
``sys.modules`` before invoking ``setup.py``. The injection should be
|
|
||||||
transparent to ``distutils``-based projects, but 3rd party build tools wishing
|
|
||||||
to provide a ``setup.py`` emulating the commands pip requires may need to be
|
|
||||||
aware that it takes place.
|
|
||||||
|
|
||||||
Projects using :pep:`517` *must* explicitly use setuptools - pip does not do
|
|
||||||
the above injection process in this case.
|
|
||||||
|
|
||||||
Build System Output
|
|
||||||
~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Any output produced by the build system will be read by pip (for display to the
|
|
||||||
user if requested). In order to correctly read the build system output, pip
|
|
||||||
requires that the output is written in a well-defined encoding, specifically
|
|
||||||
the encoding the user has configured for text output (which can be obtained in
|
|
||||||
Python using ``locale.getpreferredencoding``). If the configured encoding is
|
|
||||||
ASCII, pip assumes UTF-8 (to account for the behaviour of some Unix systems).
|
|
||||||
|
|
||||||
Build systems should ensure that any tools they invoke (compilers, etc) produce
|
|
||||||
output in the correct encoding. In practice - and in particular on Windows,
|
|
||||||
where tools are inconsistent in their use of the "OEM" and "ANSI" codepages -
|
|
||||||
this may not always be possible. pip will therefore attempt to recover cleanly
|
|
||||||
if presented with incorrectly encoded build tool output, by translating
|
|
||||||
unexpected byte sequences to Python-style hexadecimal escape sequences
|
|
||||||
(``"\x80\xff"``, etc). However, it is still possible for output to be displayed
|
|
||||||
using an incorrect encoding (mojibake).
|
|
||||||
|
|
||||||
Under :pep:`517`, handling of build tool output is the backend's responsibility,
|
|
||||||
and pip simply displays the output produced by the backend. (Backends, however,
|
|
||||||
will likely still have to address the issues described above).
|
|
||||||
|
|
||||||
PEP 517 and 518 Support
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
As of version 10.0, pip supports projects declaring dependencies that are
|
|
||||||
required at install time using a ``pyproject.toml`` file, in the form described
|
|
||||||
in :pep:`518`. When building a project, pip will install the required
|
|
||||||
dependencies locally, and make them available to the build process.
|
|
||||||
Furthermore, from version 19.0 onwards, pip supports projects specifying the
|
|
||||||
build backend they use in ``pyproject.toml``, in the form described in
|
|
||||||
:pep:`517`.
|
|
||||||
|
|
||||||
When making build requirements available, pip does so in an *isolated
|
|
||||||
environment*. That is, pip does not install those requirements into the user's
|
|
||||||
``site-packages``, but rather installs them in a temporary directory which it
|
|
||||||
adds to the user's ``sys.path`` for the duration of the build. This ensures
|
|
||||||
that build requirements are handled independently of the user's runtime
|
|
||||||
environment. For example, a project that needs a recent version of setuptools
|
|
||||||
to build can still be installed, even if the user has an older version
|
|
||||||
installed (and without silently replacing that version).
|
|
||||||
|
|
||||||
In certain cases, projects (or redistributors) may have workflows that
|
|
||||||
explicitly manage the build environment. For such workflows, build isolation
|
|
||||||
can be problematic. If this is the case, pip provides a
|
|
||||||
``--no-build-isolation`` flag to disable build isolation. Users supplying this
|
|
||||||
flag are responsible for ensuring the build environment is managed
|
|
||||||
appropriately (including ensuring that all required build dependencies are
|
|
||||||
installed).
|
|
||||||
|
|
||||||
By default, pip will continue to use the legacy (direct ``setup.py`` execution
|
|
||||||
based) build processing for projects that do not have a ``pyproject.toml`` file.
|
|
||||||
Projects with a ``pyproject.toml`` file will use a :pep:`517` backend. Projects
|
|
||||||
with a ``pyproject.toml`` file, but which don't have a ``build-system`` section,
|
|
||||||
will be assumed to have the following backend settings::
|
|
||||||
|
|
||||||
[build-system]
|
|
||||||
requires = ["setuptools>=40.8.0", "wheel"]
|
|
||||||
build-backend = "setuptools.build_meta:__legacy__"
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
``setuptools`` 40.8.0 is the first version of setuptools that offers a
|
|
||||||
:pep:`517` backend that closely mimics directly executing ``setup.py``.
|
|
||||||
|
|
||||||
If a project has ``[build-system]``, but no ``build-backend``, pip will also use
|
|
||||||
``setuptools.build_meta:__legacy__``, but will expect the project requirements
|
|
||||||
to include ``setuptools`` and ``wheel`` (and will report an error if the
|
|
||||||
installed version of ``setuptools`` is not recent enough).
|
|
||||||
|
|
||||||
If a user wants to explicitly request :pep:`517` handling even though a project
|
|
||||||
doesn't have a ``pyproject.toml`` file, this can be done using the
|
|
||||||
``--use-pep517`` command line option. Similarly, to request legacy processing
|
|
||||||
even though ``pyproject.toml`` is present, the ``--no-use-pep517`` option is
|
|
||||||
available (although obviously it is an error to choose ``--no-use-pep517`` if
|
|
||||||
the project has no ``setup.py``, or explicitly requests a build backend). As
|
|
||||||
with other command line flags, pip recognises the ``PIP_USE_PEP517``
|
|
||||||
environment veriable and a ``use-pep517`` config file option (set to true or
|
|
||||||
false) to set this option globally. Note that overriding pip's choice of
|
|
||||||
whether to use :pep:`517` processing in this way does *not* affect whether pip
|
|
||||||
will use an isolated build environment (which is controlled via
|
|
||||||
``--no-build-isolation`` as noted above).
|
|
||||||
|
|
||||||
Except in the case noted above (projects with no :pep:`518` ``[build-system]``
|
|
||||||
section in ``pyproject.toml``), pip will never implicitly install a build
|
|
||||||
system. Projects **must** ensure that the correct build system is listed in
|
|
||||||
their ``requires`` list (this applies even if pip assumes that the
|
|
||||||
``setuptools`` backend is being used, as noted above).
|
|
||||||
|
|
||||||
.. _pep-518-limitations:
|
|
||||||
|
|
||||||
**Historical Limitations**:
|
|
||||||
|
|
||||||
* ``pip<18.0``: only supports installing build requirements from wheels, and
|
|
||||||
does not support the use of environment markers and extras (only version
|
|
||||||
specifiers are respected).
|
|
||||||
|
|
||||||
* ``pip<18.1``: build dependencies using .pth files are not properly supported;
|
|
||||||
as a result namespace packages do not work under Python 3.2 and earlier.
|
|
||||||
|
|
||||||
Future Developments
|
|
||||||
~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
:pep:`426` notes that the intention is to add hooks to project metadata in
|
|
||||||
version 2.1 of the metadata spec, to explicitly define how to build a project
|
|
||||||
from its source. Once this version of the metadata spec is final, pip will
|
|
||||||
migrate to using that interface. At that point, the ``setup.py`` interface
|
|
||||||
documented here will be retained solely for legacy purposes, until projects
|
|
||||||
have migrated.
|
|
||||||
|
|
||||||
Specifically, applications should *not* expect to rely on there being any form
|
|
||||||
of backward compatibility guarantees around the ``setup.py`` interface.
|
|
||||||
|
|
||||||
|
|
||||||
Build Options
|
|
||||||
~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The ``--global-option`` and ``--build-option`` arguments to the ``pip install``
|
|
||||||
and ``pip wheel`` inject additional arguments into the ``setup.py`` command
|
|
||||||
(``--build-option`` is only available in ``pip wheel``). These arguments are
|
|
||||||
included in the command as follows:
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
python setup.py <global_options> BUILD COMMAND <build_options>
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py setup.py <global_options> BUILD COMMAND <build_options>
|
|
||||||
|
|
||||||
The options are passed unmodified, and presently offer direct access to the
|
|
||||||
distutils command line. Use of ``--global-option`` and ``--build-option``
|
|
||||||
should be considered as build system dependent, and may not be supported in the
|
|
||||||
current form if support for alternative build systems is added to pip.
|
|
||||||
|
|
||||||
|
|
||||||
.. _`General Options`:
|
|
||||||
|
|
||||||
General Options
|
|
||||||
***************
|
|
||||||
|
|
||||||
.. pip-general-options::
|
|
||||||
|
|
|
@ -1,27 +1,11 @@
|
||||||
|
:orphan:
|
||||||
|
|
||||||
.. _`pip cache`:
|
.. meta::
|
||||||
|
|
||||||
pip cache
|
:http-equiv=refresh: 3; url=../../cli/pip_cache/
|
||||||
---------
|
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
Usage
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
*****
|
work, here's a link: :doc:`../cli/pip_cache`
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: cache "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: cache "py -m pip"
|
|
||||||
|
|
||||||
Description
|
|
||||||
***********
|
|
||||||
|
|
||||||
.. pip-command-description:: cache
|
|
||||||
|
|
||||||
Options
|
|
||||||
*******
|
|
||||||
|
|
||||||
.. pip-command-options:: cache
|
|
||||||
|
|
|
@ -1,87 +1,11 @@
|
||||||
.. _`pip check`:
|
:orphan:
|
||||||
|
|
||||||
=========
|
.. meta::
|
||||||
pip check
|
|
||||||
=========
|
|
||||||
|
|
||||||
|
:http-equiv=refresh: 3; url=../../cli/pip_check/
|
||||||
|
|
||||||
Usage
|
This page has moved
|
||||||
=====
|
===================
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
|
work, here's a link: :doc:`../cli/pip_check`
|
||||||
.. pip-command-usage:: check "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: check "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: check
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
========
|
|
||||||
|
|
||||||
#. If all dependencies are compatible:
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip check
|
|
||||||
No broken requirements found.
|
|
||||||
$ echo $?
|
|
||||||
0
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip check
|
|
||||||
No broken requirements found.
|
|
||||||
C:\> echo %errorlevel%
|
|
||||||
0
|
|
||||||
|
|
||||||
#. If a package is missing:
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip check
|
|
||||||
pyramid 1.5.2 requires WebOb, which is not installed.
|
|
||||||
$ echo $?
|
|
||||||
1
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip check
|
|
||||||
pyramid 1.5.2 requires WebOb, which is not installed.
|
|
||||||
C:\> echo %errorlevel%
|
|
||||||
1
|
|
||||||
|
|
||||||
#. If a package has the wrong version:
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip check
|
|
||||||
pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
|
|
||||||
$ echo $?
|
|
||||||
1
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip check
|
|
||||||
pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
|
|
||||||
C:\> echo %errorlevel%
|
|
||||||
1
|
|
||||||
|
|
|
@ -1,30 +1,11 @@
|
||||||
|
:orphan:
|
||||||
|
|
||||||
.. _`pip config`:
|
.. meta::
|
||||||
|
|
||||||
==========
|
:http-equiv=refresh: 3; url=../../cli/pip_config/
|
||||||
pip config
|
|
||||||
==========
|
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
Usage
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
=====
|
work, here's a link: :doc:`../cli/pip_config`
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: config "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: config "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: config
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: config
|
|
||||||
|
|
|
@ -1,35 +1,11 @@
|
||||||
.. _`pip debug`:
|
:orphan:
|
||||||
|
|
||||||
=========
|
.. meta::
|
||||||
pip debug
|
|
||||||
=========
|
|
||||||
|
|
||||||
|
:http-equiv=refresh: 3; url=../../cli/pip_debug/
|
||||||
|
|
||||||
Usage
|
This page has moved
|
||||||
=====
|
===================
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
|
work, here's a link: :doc:`../cli/pip_debug`
|
||||||
.. pip-command-usage:: debug "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: debug "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
.. warning::
|
|
||||||
|
|
||||||
This command is only meant for debugging.
|
|
||||||
Its options and outputs are provisional and may change without notice.
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: debug
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: debug
|
|
||||||
|
|
|
@ -1,226 +1,11 @@
|
||||||
|
:orphan:
|
||||||
|
|
||||||
.. _`pip download`:
|
.. meta::
|
||||||
|
|
||||||
============
|
:http-equiv=refresh: 3; url=../../cli/pip_download/
|
||||||
pip download
|
|
||||||
============
|
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
Usage
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
=====
|
work, here's a link: :doc:`../cli/pip_download`
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: download "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: download "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: download
|
|
||||||
|
|
||||||
Overview
|
|
||||||
--------
|
|
||||||
|
|
||||||
``pip download`` does the same resolution and downloading as ``pip install``,
|
|
||||||
but instead of installing the dependencies, it collects the downloaded
|
|
||||||
distributions into the directory provided (defaulting to the current
|
|
||||||
directory). This directory can later be passed as the value to ``pip install
|
|
||||||
--find-links`` to facilitate offline or locked down package installation.
|
|
||||||
|
|
||||||
``pip download`` with the ``--platform``, ``--python-version``,
|
|
||||||
``--implementation``, and ``--abi`` options provides the ability to fetch
|
|
||||||
dependencies for an interpreter and system other than the ones that pip is
|
|
||||||
running on. ``--only-binary=:all:`` or ``--no-deps`` is required when using any
|
|
||||||
of these options. It is important to note that these options all default to the
|
|
||||||
current system/interpreter, and not to the most restrictive constraints (e.g.
|
|
||||||
platform any, abi none, etc). To avoid fetching dependencies that happen to
|
|
||||||
match the constraint of the current interpreter (but not your target one), it
|
|
||||||
is recommended to specify all of these options if you are specifying one of
|
|
||||||
them. Generic dependencies (e.g. universal wheels, or dependencies with no
|
|
||||||
platform, abi, or implementation constraints) will still match an over-
|
|
||||||
constrained download requirement.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: download
|
|
||||||
|
|
||||||
.. pip-index-options:: download
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
========
|
|
||||||
|
|
||||||
#. Download a package and all of its dependencies
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
python -m pip download SomePackage
|
|
||||||
python -m pip download -d . SomePackage # equivalent to above
|
|
||||||
python -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py -m pip download SomePackage
|
|
||||||
py -m pip download -d . SomePackage # equivalent to above
|
|
||||||
py -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
|
|
||||||
|
|
||||||
|
|
||||||
#. Download a package and all of its dependencies with OSX specific interpreter constraints.
|
|
||||||
This forces OSX 10.10 or lower compatibility. Since OSX deps are forward compatible,
|
|
||||||
this will also match ``macosx-10_9_x86_64``, ``macosx-10_8_x86_64``, ``macosx-10_8_intel``,
|
|
||||||
etc.
|
|
||||||
It will also match deps with platform ``any``. Also force the interpreter version to ``27``
|
|
||||||
(or more generic, i.e. ``2``) and implementation to ``cp`` (or more generic, i.e. ``py``).
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
python -m pip download \
|
|
||||||
--only-binary=:all: \
|
|
||||||
--platform macosx-10_10_x86_64 \
|
|
||||||
--python-version 27 \
|
|
||||||
--implementation cp \
|
|
||||||
SomePackage
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py -m pip download ^
|
|
||||||
--only-binary=:all: ^
|
|
||||||
--platform macosx-10_10_x86_64 ^
|
|
||||||
--python-version 27 ^
|
|
||||||
--implementation cp ^
|
|
||||||
SomePackage
|
|
||||||
|
|
||||||
#. Download a package and its dependencies with linux specific constraints.
|
|
||||||
Force the interpreter to be any minor version of py3k, and only accept
|
|
||||||
``cp34m`` or ``none`` as the abi.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
python -m pip download \
|
|
||||||
--only-binary=:all: \
|
|
||||||
--platform linux_x86_64 \
|
|
||||||
--python-version 3 \
|
|
||||||
--implementation cp \
|
|
||||||
--abi cp34m \
|
|
||||||
SomePackage
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py -m pip download ^
|
|
||||||
--only-binary=:all: ^
|
|
||||||
--platform linux_x86_64 ^
|
|
||||||
--python-version 3 ^
|
|
||||||
--implementation cp ^
|
|
||||||
--abi cp34m ^
|
|
||||||
SomePackage
|
|
||||||
|
|
||||||
#. Force platform, implementation, and abi agnostic deps.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
python -m pip download \
|
|
||||||
--only-binary=:all: \
|
|
||||||
--platform any \
|
|
||||||
--python-version 3 \
|
|
||||||
--implementation py \
|
|
||||||
--abi none \
|
|
||||||
SomePackage
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py -m pip download ^
|
|
||||||
--only-binary=:all: ^
|
|
||||||
--platform any ^
|
|
||||||
--python-version 3 ^
|
|
||||||
--implementation py ^
|
|
||||||
--abi none ^
|
|
||||||
SomePackage
|
|
||||||
|
|
||||||
#. Even when overconstrained, this will still correctly fetch the pip universal wheel.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip download \
|
|
||||||
--only-binary=:all: \
|
|
||||||
--platform linux_x86_64 \
|
|
||||||
--python-version 33 \
|
|
||||||
--implementation cp \
|
|
||||||
--abi cp34m \
|
|
||||||
pip>=8
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ ls pip-8.1.1-py2.py3-none-any.whl
|
|
||||||
pip-8.1.1-py2.py3-none-any.whl
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip download ^
|
|
||||||
--only-binary=:all: ^
|
|
||||||
--platform linux_x86_64 ^
|
|
||||||
--python-version 33 ^
|
|
||||||
--implementation cp ^
|
|
||||||
--abi cp34m ^
|
|
||||||
pip>=8
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> dir pip-8.1.1-py2.py3-none-any.whl
|
|
||||||
pip-8.1.1-py2.py3-none-any.whl
|
|
||||||
|
|
||||||
#. Download a package supporting one of several ABIs and platforms.
|
|
||||||
This is useful when fetching wheels for a well-defined interpreter, whose
|
|
||||||
supported ABIs and platforms are known and fixed, different than the one pip is
|
|
||||||
running under.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip download \
|
|
||||||
--only-binary=:all: \
|
|
||||||
--platform manylinux1_x86_64 --platform linux_x86_64 --platform any \
|
|
||||||
--python-version 36 \
|
|
||||||
--implementation cp \
|
|
||||||
--abi cp36m --abi cp36 --abi abi3 --abi none \
|
|
||||||
SomePackage
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:> py -m pip download ^
|
|
||||||
--only-binary=:all: ^
|
|
||||||
--platform manylinux1_x86_64 --platform linux_x86_64 --platform any ^
|
|
||||||
--python-version 36 ^
|
|
||||||
--implementation cp ^
|
|
||||||
--abi cp36m --abi cp36 --abi abi3 --abi none ^
|
|
||||||
SomePackage
|
|
||||||
|
|
|
@ -1,74 +1,11 @@
|
||||||
|
:orphan:
|
||||||
|
|
||||||
.. _`pip freeze`:
|
.. meta::
|
||||||
|
|
||||||
==========
|
:http-equiv=refresh: 3; url=../../cli/pip_freeze/
|
||||||
pip freeze
|
|
||||||
==========
|
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
Usage
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
=====
|
work, here's a link: :doc:`../cli/pip_freeze`
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: freeze "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: freeze "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: freeze
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: freeze
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
========
|
|
||||||
|
|
||||||
#. Generate output suitable for a requirements file.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip freeze
|
|
||||||
docutils==0.11
|
|
||||||
Jinja2==2.7.2
|
|
||||||
MarkupSafe==0.19
|
|
||||||
Pygments==1.6
|
|
||||||
Sphinx==1.2.2
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip freeze
|
|
||||||
docutils==0.11
|
|
||||||
Jinja2==2.7.2
|
|
||||||
MarkupSafe==0.19
|
|
||||||
Pygments==1.6
|
|
||||||
Sphinx==1.2.2
|
|
||||||
|
|
||||||
#. Generate a requirements file and then install from it in another environment.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
env1/bin/python -m pip freeze > requirements.txt
|
|
||||||
env2/bin/python -m pip install -r requirements.txt
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
env1\bin\python -m pip freeze > requirements.txt
|
|
||||||
env2\bin\python -m pip install -r requirements.txt
|
|
||||||
|
|
|
@ -1,72 +1,11 @@
|
||||||
.. _`pip hash`:
|
:orphan:
|
||||||
|
|
||||||
========
|
.. meta::
|
||||||
pip hash
|
|
||||||
========
|
|
||||||
|
|
||||||
|
:http-equiv=refresh: 3; url=../../cli/pip_hash/
|
||||||
|
|
||||||
Usage
|
This page has moved
|
||||||
=====
|
===================
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
|
work, here's a link: :doc:`../cli/pip_hash`
|
||||||
.. pip-command-usage:: hash "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: hash "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: hash
|
|
||||||
|
|
||||||
Overview
|
|
||||||
--------
|
|
||||||
|
|
||||||
``pip hash`` is a convenient way to get a hash digest for use with
|
|
||||||
:ref:`hash-checking mode`, especially for packages with multiple archives. The
|
|
||||||
error message from ``pip install --require-hashes ...`` will give you one
|
|
||||||
hash, but, if there are multiple archives (like source and binary ones), you
|
|
||||||
will need to manually download and compute a hash for the others. Otherwise, a
|
|
||||||
spurious hash mismatch could occur when :ref:`pip install` is passed a
|
|
||||||
different set of options, like :ref:`--no-binary <install_--no-binary>`.
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: hash
|
|
||||||
|
|
||||||
|
|
||||||
Example
|
|
||||||
=======
|
|
||||||
|
|
||||||
Compute the hash of a downloaded archive:
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip download SomePackage
|
|
||||||
Collecting SomePackage
|
|
||||||
Downloading SomePackage-2.2.tar.gz
|
|
||||||
Saved ./pip_downloads/SomePackage-2.2.tar.gz
|
|
||||||
Successfully downloaded SomePackage
|
|
||||||
$ python -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz
|
|
||||||
./pip_downloads/SomePackage-2.2.tar.gz:
|
|
||||||
--hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip download SomePackage
|
|
||||||
Collecting SomePackage
|
|
||||||
Downloading SomePackage-2.2.tar.gz
|
|
||||||
Saved ./pip_downloads/SomePackage-2.2.tar.gz
|
|
||||||
Successfully downloaded SomePackage
|
|
||||||
C:\> py -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz
|
|
||||||
./pip_downloads/SomePackage-2.2.tar.gz:
|
|
||||||
--hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,201 +1,11 @@
|
||||||
.. _`pip list`:
|
:orphan:
|
||||||
|
|
||||||
========
|
.. meta::
|
||||||
pip list
|
|
||||||
========
|
|
||||||
|
|
||||||
|
:http-equiv=refresh: 3; url=../../cli/pip_list/
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
Usage
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
=====
|
work, here's a link: :doc:`../cli/pip_list`
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: list "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: list "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: list
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: list
|
|
||||||
|
|
||||||
.. pip-index-options:: list
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
========
|
|
||||||
|
|
||||||
#. List installed packages.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip list
|
|
||||||
docutils (0.10)
|
|
||||||
Jinja2 (2.7.2)
|
|
||||||
MarkupSafe (0.18)
|
|
||||||
Pygments (1.6)
|
|
||||||
Sphinx (1.2.1)
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip list
|
|
||||||
docutils (0.10)
|
|
||||||
Jinja2 (2.7.2)
|
|
||||||
MarkupSafe (0.18)
|
|
||||||
Pygments (1.6)
|
|
||||||
Sphinx (1.2.1)
|
|
||||||
|
|
||||||
#. List outdated packages (excluding editables), and the latest version available.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip list --outdated
|
|
||||||
docutils (Current: 0.10 Latest: 0.11)
|
|
||||||
Sphinx (Current: 1.2.1 Latest: 1.2.2)
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip list --outdated
|
|
||||||
docutils (Current: 0.10 Latest: 0.11)
|
|
||||||
Sphinx (Current: 1.2.1 Latest: 1.2.2)
|
|
||||||
|
|
||||||
#. List installed packages with column formatting.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip list --format columns
|
|
||||||
Package Version
|
|
||||||
------- -------
|
|
||||||
docopt 0.6.2
|
|
||||||
idlex 1.13
|
|
||||||
jedi 0.9.0
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip list --format columns
|
|
||||||
Package Version
|
|
||||||
------- -------
|
|
||||||
docopt 0.6.2
|
|
||||||
idlex 1.13
|
|
||||||
jedi 0.9.0
|
|
||||||
|
|
||||||
#. List outdated packages with column formatting.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip list -o --format columns
|
|
||||||
Package Version Latest Type
|
|
||||||
---------- ------- ------ -----
|
|
||||||
retry 0.8.1 0.9.1 wheel
|
|
||||||
setuptools 20.6.7 21.0.0 wheel
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip list -o --format columns
|
|
||||||
Package Version Latest Type
|
|
||||||
---------- ------- ------ -----
|
|
||||||
retry 0.8.1 0.9.1 wheel
|
|
||||||
setuptools 20.6.7 21.0.0 wheel
|
|
||||||
|
|
||||||
#. List packages that are not dependencies of other packages. Can be combined with
|
|
||||||
other options.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip list --outdated --not-required
|
|
||||||
docutils (Current: 0.10 Latest: 0.11)
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip list --outdated --not-required
|
|
||||||
docutils (Current: 0.10 Latest: 0.11)
|
|
||||||
|
|
||||||
#. Use legacy formatting
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip list --format=legacy
|
|
||||||
colorama (0.3.7)
|
|
||||||
docopt (0.6.2)
|
|
||||||
idlex (1.13)
|
|
||||||
jedi (0.9.0)
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip list --format=legacy
|
|
||||||
colorama (0.3.7)
|
|
||||||
docopt (0.6.2)
|
|
||||||
idlex (1.13)
|
|
||||||
jedi (0.9.0)
|
|
||||||
|
|
||||||
#. Use json formatting
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip list --format=json
|
|
||||||
[{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip list --format=json
|
|
||||||
[{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
|
|
||||||
|
|
||||||
#. Use freeze formatting
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip list --format=freeze
|
|
||||||
colorama==0.3.7
|
|
||||||
docopt==0.6.2
|
|
||||||
idlex==1.13
|
|
||||||
jedi==0.9.0
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip list --format=freeze
|
|
||||||
colorama==0.3.7
|
|
||||||
docopt==0.6.2
|
|
||||||
idlex==1.13
|
|
||||||
jedi==0.9.0
|
|
||||||
|
|
|
@ -1,52 +1,11 @@
|
||||||
.. _`pip search`:
|
:orphan:
|
||||||
|
|
||||||
==========
|
.. meta::
|
||||||
pip search
|
|
||||||
==========
|
|
||||||
|
|
||||||
|
:http-equiv=refresh: 3; url=../../cli/pip_search/
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
Usage
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
=====
|
work, here's a link: :doc:`../cli/pip_search`
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: search "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: search "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: search
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: search
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
========
|
|
||||||
|
|
||||||
#. Search for "peppercorn"
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip search peppercorn
|
|
||||||
pepperedform - Helpers for using peppercorn with formprocess.
|
|
||||||
peppercorn - A library for converting a token stream into [...]
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip search peppercorn
|
|
||||||
pepperedform - Helpers for using peppercorn with formprocess.
|
|
||||||
peppercorn - A library for converting a token stream into [...]
|
|
||||||
|
|
|
@ -1,154 +1,11 @@
|
||||||
.. _`pip show`:
|
:orphan:
|
||||||
|
|
||||||
========
|
.. meta::
|
||||||
pip show
|
|
||||||
========
|
|
||||||
|
|
||||||
|
:http-equiv=refresh: 3; url=../../cli/pip_show/
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
Usage
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
=====
|
work, here's a link: :doc:`../cli/pip_show`
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: show "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: show "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: show
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: show
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
========
|
|
||||||
|
|
||||||
#. Show information about a package:
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip show sphinx
|
|
||||||
Name: Sphinx
|
|
||||||
Version: 1.4.5
|
|
||||||
Summary: Python documentation generator
|
|
||||||
Home-page: http://sphinx-doc.org/
|
|
||||||
Author: Georg Brandl
|
|
||||||
Author-email: georg@python.org
|
|
||||||
License: BSD
|
|
||||||
Location: /my/env/lib/python2.7/site-packages
|
|
||||||
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip show sphinx
|
|
||||||
Name: Sphinx
|
|
||||||
Version: 1.4.5
|
|
||||||
Summary: Python documentation generator
|
|
||||||
Home-page: http://sphinx-doc.org/
|
|
||||||
Author: Georg Brandl
|
|
||||||
Author-email: georg@python.org
|
|
||||||
License: BSD
|
|
||||||
Location: /my/env/lib/python2.7/site-packages
|
|
||||||
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
|
||||||
|
|
||||||
#. Show all information about a package
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip show --verbose sphinx
|
|
||||||
Name: Sphinx
|
|
||||||
Version: 1.4.5
|
|
||||||
Summary: Python documentation generator
|
|
||||||
Home-page: http://sphinx-doc.org/
|
|
||||||
Author: Georg Brandl
|
|
||||||
Author-email: georg@python.org
|
|
||||||
License: BSD
|
|
||||||
Location: /my/env/lib/python2.7/site-packages
|
|
||||||
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
|
||||||
Metadata-Version: 2.0
|
|
||||||
Installer:
|
|
||||||
Classifiers:
|
|
||||||
Development Status :: 5 - Production/Stable
|
|
||||||
Environment :: Console
|
|
||||||
Environment :: Web Environment
|
|
||||||
Intended Audience :: Developers
|
|
||||||
Intended Audience :: Education
|
|
||||||
License :: OSI Approved :: BSD License
|
|
||||||
Operating System :: OS Independent
|
|
||||||
Programming Language :: Python
|
|
||||||
Programming Language :: Python :: 2
|
|
||||||
Programming Language :: Python :: 3
|
|
||||||
Framework :: Sphinx
|
|
||||||
Framework :: Sphinx :: Extension
|
|
||||||
Framework :: Sphinx :: Theme
|
|
||||||
Topic :: Documentation
|
|
||||||
Topic :: Documentation :: Sphinx
|
|
||||||
Topic :: Text Processing
|
|
||||||
Topic :: Utilities
|
|
||||||
Entry-points:
|
|
||||||
[console_scripts]
|
|
||||||
sphinx-apidoc = sphinx.apidoc:main
|
|
||||||
sphinx-autogen = sphinx.ext.autosummary.generate:main
|
|
||||||
sphinx-build = sphinx:main
|
|
||||||
sphinx-quickstart = sphinx.quickstart:main
|
|
||||||
[distutils.commands]
|
|
||||||
build_sphinx = sphinx.setup_command:BuildDoc
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip show --verbose sphinx
|
|
||||||
Name: Sphinx
|
|
||||||
Version: 1.4.5
|
|
||||||
Summary: Python documentation generator
|
|
||||||
Home-page: http://sphinx-doc.org/
|
|
||||||
Author: Georg Brandl
|
|
||||||
Author-email: georg@python.org
|
|
||||||
License: BSD
|
|
||||||
Location: /my/env/lib/python2.7/site-packages
|
|
||||||
Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
|
|
||||||
Metadata-Version: 2.0
|
|
||||||
Installer:
|
|
||||||
Classifiers:
|
|
||||||
Development Status :: 5 - Production/Stable
|
|
||||||
Environment :: Console
|
|
||||||
Environment :: Web Environment
|
|
||||||
Intended Audience :: Developers
|
|
||||||
Intended Audience :: Education
|
|
||||||
License :: OSI Approved :: BSD License
|
|
||||||
Operating System :: OS Independent
|
|
||||||
Programming Language :: Python
|
|
||||||
Programming Language :: Python :: 2
|
|
||||||
Programming Language :: Python :: 3
|
|
||||||
Framework :: Sphinx
|
|
||||||
Framework :: Sphinx :: Extension
|
|
||||||
Framework :: Sphinx :: Theme
|
|
||||||
Topic :: Documentation
|
|
||||||
Topic :: Documentation :: Sphinx
|
|
||||||
Topic :: Text Processing
|
|
||||||
Topic :: Utilities
|
|
||||||
Entry-points:
|
|
||||||
[console_scripts]
|
|
||||||
sphinx-apidoc = sphinx.apidoc:main
|
|
||||||
sphinx-autogen = sphinx.ext.autosummary.generate:main
|
|
||||||
sphinx-build = sphinx:main
|
|
||||||
sphinx-quickstart = sphinx.quickstart:main
|
|
||||||
[distutils.commands]
|
|
||||||
build_sphinx = sphinx.setup_command:BuildDoc
|
|
||||||
|
|
|
@ -1,58 +1,11 @@
|
||||||
.. _`pip uninstall`:
|
:orphan:
|
||||||
|
|
||||||
=============
|
.. meta::
|
||||||
pip uninstall
|
|
||||||
=============
|
|
||||||
|
|
||||||
|
:http-equiv=refresh: 3; url=../../cli/pip_uninstall/
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
Usage
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
=====
|
work, here's a link: :doc:`../cli/pip_uninstall`
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: uninstall "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: uninstall "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: uninstall
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: uninstall
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
========
|
|
||||||
|
|
||||||
#. Uninstall a package.
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python -m pip uninstall simplejson
|
|
||||||
Uninstalling simplejson:
|
|
||||||
/home/me/env/lib/python3.9/site-packages/simplejson
|
|
||||||
/home/me/env/lib/python3.9/site-packages/simplejson-2.2.1-py3.9.egg-info
|
|
||||||
Proceed (y/n)? y
|
|
||||||
Successfully uninstalled simplejson
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
C:\> py -m pip uninstall simplejson
|
|
||||||
Uninstalling simplejson:
|
|
||||||
/home/me/env/lib/python3.9/site-packages/simplejson
|
|
||||||
/home/me/env/lib/python3.9/site-packages/simplejson-2.2.1-py3.9.egg-info
|
|
||||||
Proceed (y/n)? y
|
|
||||||
Successfully uninstalled simplejson
|
|
||||||
|
|
|
@ -1,125 +1,11 @@
|
||||||
|
:orphan:
|
||||||
|
|
||||||
.. _`pip wheel`:
|
.. meta::
|
||||||
|
|
||||||
=========
|
:http-equiv=refresh: 3; url=../../cli/pip_wheel/
|
||||||
pip wheel
|
|
||||||
=========
|
|
||||||
|
|
||||||
|
This page has moved
|
||||||
|
===================
|
||||||
|
|
||||||
|
You should be redirected automatically in 3 seconds. If that didn't
|
||||||
Usage
|
work, here's a link: :doc:`../cli/pip_wheel`
|
||||||
=====
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. pip-command-usage:: wheel "python -m pip"
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. pip-command-usage:: wheel "py -m pip"
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
===========
|
|
||||||
|
|
||||||
.. pip-command-description:: wheel
|
|
||||||
|
|
||||||
|
|
||||||
Build System Interface
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
In order for pip to build a wheel, ``setup.py`` must implement the
|
|
||||||
``bdist_wheel`` command with the following syntax:
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
python setup.py bdist_wheel -d TARGET
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py setup.py bdist_wheel -d TARGET
|
|
||||||
|
|
||||||
|
|
||||||
This command must create a wheel compatible with the invoking Python
|
|
||||||
interpreter, and save that wheel in the directory TARGET.
|
|
||||||
|
|
||||||
No other build system commands are invoked by the ``pip wheel`` command.
|
|
||||||
|
|
||||||
Customising the build
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
It is possible using ``--global-option`` to include additional build commands
|
|
||||||
with their arguments in the ``setup.py`` command. This is currently the only
|
|
||||||
way to influence the building of C extensions from the command line. For
|
|
||||||
example:
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
python -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
|
|
||||||
|
|
||||||
|
|
||||||
will result in a build command of
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
setup.py bdist_ext -DFOO bdist_wheel -d TARGET
|
|
||||||
|
|
||||||
which passes a preprocessor symbol to the extension build.
|
|
||||||
|
|
||||||
Such usage is considered highly build-system specific and more an accident of
|
|
||||||
the current implementation than a supported interface.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. pip-command-options:: wheel
|
|
||||||
|
|
||||||
.. pip-index-options:: wheel
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
========
|
|
||||||
|
|
||||||
#. Build wheels for a requirement (and all its dependencies), and then install
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
python -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
|
|
||||||
python -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
|
|
||||||
py -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
|
|
||||||
|
|
||||||
#. Build a wheel for a package from source
|
|
||||||
|
|
||||||
.. tab:: Unix/macOS
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
python -m pip wheel --no-binary SomePackage SomePackage
|
|
||||||
|
|
||||||
.. tab:: Windows
|
|
||||||
|
|
||||||
.. code-block:: shell
|
|
||||||
|
|
||||||
py -m pip wheel --no-binary SomePackage SomePackage
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ does not come with it included.
|
||||||
|
|
||||||
pip install keyring
|
pip install keyring
|
||||||
echo your-password | keyring set pypi.company.com your-username
|
echo your-password | keyring set pypi.company.com your-username
|
||||||
pip install your-package --extra-index-url https://pypi.company.com/
|
pip install your-package --index-url https://pypi.company.com/
|
||||||
|
|
||||||
.. _keyring: https://pypi.org/project/keyring/
|
.. _keyring: https://pypi.org/project/keyring/
|
||||||
|
|
||||||
|
@ -825,6 +825,21 @@ strategies supported:
|
||||||
The default strategy is ``only-if-needed``. This was changed in pip 10.0 due to
|
The default strategy is ``only-if-needed``. This was changed in pip 10.0 due to
|
||||||
the breaking nature of ``eager`` when upgrading conflicting dependencies.
|
the breaking nature of ``eager`` when upgrading conflicting dependencies.
|
||||||
|
|
||||||
|
It is important to note that ``--upgrade`` affects *direct requirements* (e.g.
|
||||||
|
those specified on the command-line or via a requirements file) while
|
||||||
|
``--upgrade-strategy`` affects *indirect requirements* (dependencies of direct
|
||||||
|
requirements).
|
||||||
|
|
||||||
|
As an example, say ``SomePackage`` has a dependency, ``SomeDependency``, and
|
||||||
|
both of them are already installed but are not the latest avaialable versions:
|
||||||
|
|
||||||
|
- ``pip install SomePackage``: will not upgrade the existing ``SomePackage`` or
|
||||||
|
``SomeDependency``.
|
||||||
|
- ``pip install --upgrade SomePackage``: will upgrade ``SomePackage``, but not
|
||||||
|
``SomeDependency`` (unless a minimum requirement is not met).
|
||||||
|
- ``pip install --upgrade SomePackage --upgrade-strategy=eager``: upgrades both
|
||||||
|
``SomePackage`` and ``SomeDependency``.
|
||||||
|
|
||||||
As an historic note, an earlier "fix" for getting the ``only-if-needed``
|
As an historic note, an earlier "fix" for getting the ``only-if-needed``
|
||||||
behaviour was:
|
behaviour was:
|
||||||
|
|
||||||
|
@ -1857,9 +1872,11 @@ We plan for the resolver changeover to proceed as follows, using
|
||||||
environments, pip defaults to the old resolver, and the new one is
|
environments, pip defaults to the old resolver, and the new one is
|
||||||
available using the flag ``--use-feature=2020-resolver``.
|
available using the flag ``--use-feature=2020-resolver``.
|
||||||
|
|
||||||
* pip 21.0: pip uses new resolver, and the old resolver is no longer
|
* pip 21.0: pip uses new resolver by default, and the old resolver is
|
||||||
available. Python 2 support is removed per our :ref:`Python 2
|
no longer supported. It will be removed after a currently undecided
|
||||||
Support` policy.
|
amount of time, as the removal is dependent on pip's volunteer
|
||||||
|
maintainers' availability. Python 2 support is removed per our
|
||||||
|
:ref:`Python 2 Support` policy.
|
||||||
|
|
||||||
Since this work will not change user-visible behavior described in the
|
Since this work will not change user-visible behavior described in the
|
||||||
pip documentation, this change is not covered by the :ref:`Deprecation
|
pip documentation, this change is not covered by the :ref:`Deprecation
|
||||||
|
@ -1885,6 +1902,6 @@ announcements on the `low-traffic packaging announcements list`_ and
|
||||||
.. _low-traffic packaging announcements list: https://mail.python.org/mailman3/lists/pypi-announce.python.org/
|
.. _low-traffic packaging announcements list: https://mail.python.org/mailman3/lists/pypi-announce.python.org/
|
||||||
.. _our survey on upgrades that create conflicts: https://docs.google.com/forms/d/e/1FAIpQLSeBkbhuIlSofXqCyhi3kGkLmtrpPOEBwr6iJA6SzHdxWKfqdA/viewform
|
.. _our survey on upgrades that create conflicts: https://docs.google.com/forms/d/e/1FAIpQLSeBkbhuIlSofXqCyhi3kGkLmtrpPOEBwr6iJA6SzHdxWKfqdA/viewform
|
||||||
.. _the official Python blog: https://blog.python.org/
|
.. _the official Python blog: https://blog.python.org/
|
||||||
.. _requests: https://requests.readthedocs.io/en/master/user/authentication/#netrc-authentication
|
.. _requests: https://requests.readthedocs.io/en/latest/user/authentication/#netrc-authentication
|
||||||
.. _Python standard library: https://docs.python.org/3/library/netrc.html
|
.. _Python standard library: https://docs.python.org/3/library/netrc.html
|
||||||
.. _Python Windows launcher: https://docs.python.org/3/using/windows.html#launcher
|
.. _Python Windows launcher: https://docs.python.org/3/using/windows.html#launcher
|
||||||
|
|
|
@ -1,32 +1,91 @@
|
||||||
"""pip sphinx extensions"""
|
"""pip sphinx extensions"""
|
||||||
|
|
||||||
import optparse
|
import optparse
|
||||||
|
import pathlib
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
from textwrap import dedent
|
from textwrap import dedent
|
||||||
|
from typing import Iterable, List, Optional
|
||||||
|
|
||||||
from docutils import nodes
|
from docutils import nodes, statemachine
|
||||||
from docutils.parsers import rst
|
from docutils.parsers import rst
|
||||||
from docutils.statemachine import ViewList
|
from docutils.statemachine import StringList, ViewList
|
||||||
|
from sphinx.application import Sphinx
|
||||||
|
|
||||||
from pip._internal.cli import cmdoptions
|
from pip._internal.cli import cmdoptions
|
||||||
from pip._internal.commands import commands_dict, create_command
|
from pip._internal.commands import commands_dict, create_command
|
||||||
from pip._internal.req.req_file import SUPPORTED_OPTIONS
|
from pip._internal.req.req_file import SUPPORTED_OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
class PipNewsInclude(rst.Directive):
|
||||||
|
required_arguments = 1
|
||||||
|
|
||||||
|
def _is_version_section_title_underline(self, prev, curr):
|
||||||
|
"""Find a ==== line that marks the version section title."""
|
||||||
|
if prev is None:
|
||||||
|
return False
|
||||||
|
if re.match(r"^=+$", curr) is None:
|
||||||
|
return False
|
||||||
|
if len(curr) < len(prev):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _iter_lines_with_refs(self, lines):
|
||||||
|
"""Transform the input lines to add a ref before each section title.
|
||||||
|
|
||||||
|
This is done by looking one line ahead and locate a title's underline,
|
||||||
|
and add a ref before the title text.
|
||||||
|
|
||||||
|
Dots in the version is converted into dash, and a ``v`` is prefixed.
|
||||||
|
This makes Sphinx use them as HTML ``id`` verbatim without generating
|
||||||
|
auto numbering (which would make the the anchors unstable).
|
||||||
|
"""
|
||||||
|
prev = None
|
||||||
|
for line in lines:
|
||||||
|
# Transform the previous line to include an explicit ref.
|
||||||
|
if self._is_version_section_title_underline(prev, line):
|
||||||
|
vref = prev.split(None, 1)[0].replace(".", "-")
|
||||||
|
yield f".. _`v{vref}`:"
|
||||||
|
yield "" # Empty line between ref and the title.
|
||||||
|
if prev is not None:
|
||||||
|
yield prev
|
||||||
|
prev = line
|
||||||
|
if prev is not None:
|
||||||
|
yield prev
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
source = self.state_machine.input_lines.source(
|
||||||
|
self.lineno - self.state_machine.input_offset - 1,
|
||||||
|
)
|
||||||
|
path = (
|
||||||
|
pathlib.Path(source)
|
||||||
|
.resolve()
|
||||||
|
.parent
|
||||||
|
.joinpath(self.arguments[0])
|
||||||
|
.resolve()
|
||||||
|
)
|
||||||
|
include_lines = statemachine.string2lines(
|
||||||
|
path.read_text(encoding="utf-8"),
|
||||||
|
self.state.document.settings.tab_width,
|
||||||
|
convert_whitespace=True,
|
||||||
|
)
|
||||||
|
include_lines = list(self._iter_lines_with_refs(include_lines))
|
||||||
|
self.state_machine.insert_input(include_lines, str(path))
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
class PipCommandUsage(rst.Directive):
|
class PipCommandUsage(rst.Directive):
|
||||||
required_arguments = 1
|
required_arguments = 1
|
||||||
optional_arguments = 3
|
optional_arguments = 3
|
||||||
|
|
||||||
def run(self):
|
def run(self) -> List[nodes.Node]:
|
||||||
cmd = create_command(self.arguments[0])
|
cmd = create_command(self.arguments[0])
|
||||||
cmd_prefix = 'python -m pip'
|
cmd_prefix = "python -m pip"
|
||||||
if len(self.arguments) > 1:
|
if len(self.arguments) > 1:
|
||||||
cmd_prefix = " ".join(self.arguments[1:])
|
cmd_prefix = " ".join(self.arguments[1:])
|
||||||
cmd_prefix = cmd_prefix.strip('"')
|
cmd_prefix = cmd_prefix.strip('"')
|
||||||
cmd_prefix = cmd_prefix.strip("'")
|
cmd_prefix = cmd_prefix.strip("'")
|
||||||
usage = dedent(
|
usage = dedent(cmd.usage.replace("%prog", f"{cmd_prefix} {cmd.name}")).strip()
|
||||||
cmd.usage.replace('%prog', f'{cmd_prefix} {cmd.name}')
|
|
||||||
).strip()
|
|
||||||
node = nodes.literal_block(usage, usage)
|
node = nodes.literal_block(usage, usage)
|
||||||
return [node]
|
return [node]
|
||||||
|
|
||||||
|
@ -34,26 +93,28 @@ class PipCommandUsage(rst.Directive):
|
||||||
class PipCommandDescription(rst.Directive):
|
class PipCommandDescription(rst.Directive):
|
||||||
required_arguments = 1
|
required_arguments = 1
|
||||||
|
|
||||||
def run(self):
|
def run(self) -> List[nodes.Node]:
|
||||||
node = nodes.paragraph()
|
node = nodes.paragraph()
|
||||||
node.document = self.state.document
|
node.document = self.state.document
|
||||||
desc = ViewList()
|
desc = ViewList()
|
||||||
cmd = create_command(self.arguments[0])
|
cmd = create_command(self.arguments[0])
|
||||||
|
assert cmd.__doc__ is not None
|
||||||
description = dedent(cmd.__doc__)
|
description = dedent(cmd.__doc__)
|
||||||
for line in description.split('\n'):
|
for line in description.split("\n"):
|
||||||
desc.append(line, "")
|
desc.append(line, "")
|
||||||
self.state.nested_parse(desc, 0, node)
|
self.state.nested_parse(desc, 0, node)
|
||||||
return [node]
|
return [node]
|
||||||
|
|
||||||
|
|
||||||
class PipOptions(rst.Directive):
|
class PipOptions(rst.Directive):
|
||||||
|
def _format_option(
|
||||||
def _format_option(self, option, cmd_name=None):
|
self, option: optparse.Option, cmd_name: Optional[str] = None
|
||||||
|
) -> List[str]:
|
||||||
bookmark_line = (
|
bookmark_line = (
|
||||||
".. _`{cmd_name}_{option._long_opts[0]}`:"
|
f".. _`{cmd_name}_{option._long_opts[0]}`:"
|
||||||
if cmd_name else
|
if cmd_name
|
||||||
".. _`{option._long_opts[0]}`:"
|
else f".. _`{option._long_opts[0]}`:"
|
||||||
).format(**locals())
|
)
|
||||||
line = ".. option:: "
|
line = ".. option:: "
|
||||||
if option._short_opts:
|
if option._short_opts:
|
||||||
line += option._short_opts[0]
|
line += option._short_opts[0]
|
||||||
|
@ -62,22 +123,27 @@ class PipOptions(rst.Directive):
|
||||||
elif option._long_opts:
|
elif option._long_opts:
|
||||||
line += option._long_opts[0]
|
line += option._long_opts[0]
|
||||||
if option.takes_value():
|
if option.takes_value():
|
||||||
metavar = option.metavar or option.dest.lower()
|
metavar = option.metavar or option.dest
|
||||||
|
assert metavar is not None
|
||||||
line += f" <{metavar.lower()}>"
|
line += f" <{metavar.lower()}>"
|
||||||
# fix defaults
|
# fix defaults
|
||||||
opt_help = option.help.replace('%default', str(option.default))
|
assert option.help is not None
|
||||||
|
# https://github.com/python/typeshed/pull/5080
|
||||||
|
opt_help = option.help.replace("%default", str(option.default)) # type: ignore
|
||||||
# fix paths with sys.prefix
|
# fix paths with sys.prefix
|
||||||
opt_help = opt_help.replace(sys.prefix, "<sys.prefix>")
|
opt_help = opt_help.replace(sys.prefix, "<sys.prefix>")
|
||||||
return [bookmark_line, "", line, "", " " + opt_help, ""]
|
return [bookmark_line, "", line, "", " " + opt_help, ""]
|
||||||
|
|
||||||
def _format_options(self, options, cmd_name=None):
|
def _format_options(
|
||||||
|
self, options: Iterable[optparse.Option], cmd_name: Optional[str] = None
|
||||||
|
) -> None:
|
||||||
for option in options:
|
for option in options:
|
||||||
if option.help == optparse.SUPPRESS_HELP:
|
if option.help == optparse.SUPPRESS_HELP:
|
||||||
continue
|
continue
|
||||||
for line in self._format_option(option, cmd_name):
|
for line in self._format_option(option, cmd_name):
|
||||||
self.view_list.append(line, "")
|
self.view_list.append(line, "")
|
||||||
|
|
||||||
def run(self):
|
def run(self) -> List[nodes.Node]:
|
||||||
node = nodes.paragraph()
|
node = nodes.paragraph()
|
||||||
node.document = self.state.document
|
node.document = self.state.document
|
||||||
self.view_list = ViewList()
|
self.view_list = ViewList()
|
||||||
|
@ -87,19 +153,17 @@ class PipOptions(rst.Directive):
|
||||||
|
|
||||||
|
|
||||||
class PipGeneralOptions(PipOptions):
|
class PipGeneralOptions(PipOptions):
|
||||||
def process_options(self):
|
def process_options(self) -> None:
|
||||||
self._format_options(
|
self._format_options([o() for o in cmdoptions.general_group["options"]])
|
||||||
[o() for o in cmdoptions.general_group['options']]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class PipIndexOptions(PipOptions):
|
class PipIndexOptions(PipOptions):
|
||||||
required_arguments = 1
|
required_arguments = 1
|
||||||
|
|
||||||
def process_options(self):
|
def process_options(self) -> None:
|
||||||
cmd_name = self.arguments[0]
|
cmd_name = self.arguments[0]
|
||||||
self._format_options(
|
self._format_options(
|
||||||
[o() for o in cmdoptions.index_group['options']],
|
[o() for o in cmdoptions.index_group["options"]],
|
||||||
cmd_name=cmd_name,
|
cmd_name=cmd_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -107,7 +171,7 @@ class PipIndexOptions(PipOptions):
|
||||||
class PipCommandOptions(PipOptions):
|
class PipCommandOptions(PipOptions):
|
||||||
required_arguments = 1
|
required_arguments = 1
|
||||||
|
|
||||||
def process_options(self):
|
def process_options(self) -> None:
|
||||||
cmd = create_command(self.arguments[0])
|
cmd = create_command(self.arguments[0])
|
||||||
self._format_options(
|
self._format_options(
|
||||||
cmd.parser.option_groups[0].option_list,
|
cmd.parser.option_groups[0].option_list,
|
||||||
|
@ -116,49 +180,128 @@ class PipCommandOptions(PipOptions):
|
||||||
|
|
||||||
|
|
||||||
class PipReqFileOptionsReference(PipOptions):
|
class PipReqFileOptionsReference(PipOptions):
|
||||||
|
def determine_opt_prefix(self, opt_name: str) -> str:
|
||||||
def determine_opt_prefix(self, opt_name):
|
|
||||||
for command in commands_dict:
|
for command in commands_dict:
|
||||||
cmd = create_command(command)
|
cmd = create_command(command)
|
||||||
if cmd.cmd_opts.has_option(opt_name):
|
if cmd.cmd_opts.has_option(opt_name):
|
||||||
return command
|
return command
|
||||||
|
|
||||||
raise KeyError(f'Could not identify prefix of opt {opt_name}')
|
raise KeyError(f"Could not identify prefix of opt {opt_name}")
|
||||||
|
|
||||||
def process_options(self):
|
def process_options(self) -> None:
|
||||||
for option in SUPPORTED_OPTIONS:
|
for option in SUPPORTED_OPTIONS:
|
||||||
if getattr(option, 'deprecated', False):
|
if getattr(option, "deprecated", False):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
opt = option()
|
opt = option()
|
||||||
opt_name = opt._long_opts[0]
|
opt_name = opt._long_opts[0]
|
||||||
if opt._short_opts:
|
if opt._short_opts:
|
||||||
short_opt_name = '{}, '.format(opt._short_opts[0])
|
short_opt_name = "{}, ".format(opt._short_opts[0])
|
||||||
else:
|
else:
|
||||||
short_opt_name = ''
|
short_opt_name = ""
|
||||||
|
|
||||||
if option in cmdoptions.general_group['options']:
|
if option in cmdoptions.general_group["options"]:
|
||||||
prefix = ''
|
prefix = ""
|
||||||
else:
|
else:
|
||||||
prefix = '{}_'.format(self.determine_opt_prefix(opt_name))
|
prefix = "{}_".format(self.determine_opt_prefix(opt_name))
|
||||||
|
|
||||||
self.view_list.append(
|
self.view_list.append(
|
||||||
'* :ref:`{short}{long}<{prefix}{opt_name}>`'.format(
|
"* :ref:`{short}{long}<{prefix}{opt_name}>`".format(
|
||||||
short=short_opt_name,
|
short=short_opt_name,
|
||||||
long=opt_name,
|
long=opt_name,
|
||||||
prefix=prefix,
|
prefix=prefix,
|
||||||
opt_name=opt_name
|
opt_name=opt_name,
|
||||||
),
|
),
|
||||||
"\n"
|
"\n",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def setup(app):
|
class PipCLIDirective(rst.Directive):
|
||||||
app.add_directive('pip-command-usage', PipCommandUsage)
|
"""
|
||||||
app.add_directive('pip-command-description', PipCommandDescription)
|
- Only works when used in a MyST document.
|
||||||
app.add_directive('pip-command-options', PipCommandOptions)
|
- Requires sphinx-inline-tabs' tab directive.
|
||||||
app.add_directive('pip-general-options', PipGeneralOptions)
|
"""
|
||||||
app.add_directive('pip-index-options', PipIndexOptions)
|
|
||||||
|
has_content = True
|
||||||
|
optional_arguments = 1
|
||||||
|
|
||||||
|
def run(self) -> List[nodes.Node]:
|
||||||
|
node = nodes.paragraph()
|
||||||
|
node.document = self.state.document
|
||||||
|
|
||||||
|
os_variants = {
|
||||||
|
"Linux": {
|
||||||
|
"highlighter": "console",
|
||||||
|
"executable": "python",
|
||||||
|
"prompt": "$",
|
||||||
|
},
|
||||||
|
"MacOS": {
|
||||||
|
"highlighter": "console",
|
||||||
|
"executable": "python",
|
||||||
|
"prompt": "$",
|
||||||
|
},
|
||||||
|
"Windows": {
|
||||||
|
"highlighter": "doscon",
|
||||||
|
"executable": "py",
|
||||||
|
"prompt": "C:>",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.arguments:
|
||||||
|
assert self.arguments == ["in-a-venv"]
|
||||||
|
in_virtual_environment = True
|
||||||
|
else:
|
||||||
|
in_virtual_environment = False
|
||||||
|
|
||||||
|
lines = []
|
||||||
|
# Create a tab for each OS
|
||||||
|
for os, variant in os_variants.items():
|
||||||
|
|
||||||
|
# Unpack the values
|
||||||
|
prompt = variant["prompt"]
|
||||||
|
highlighter = variant["highlighter"]
|
||||||
|
if in_virtual_environment:
|
||||||
|
executable = "python"
|
||||||
|
pip_spelling = "pip"
|
||||||
|
else:
|
||||||
|
executable = variant["executable"]
|
||||||
|
pip_spelling = f"{executable} -m pip"
|
||||||
|
|
||||||
|
# Substitute the various "prompts" into the correct variants
|
||||||
|
substitution_pipeline = [
|
||||||
|
(
|
||||||
|
r"(^|(?<=\n))\$ python",
|
||||||
|
f"{prompt} {executable}",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(^|(?<=\n))\$ pip",
|
||||||
|
f"{prompt} {pip_spelling}",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
content = self.block_text
|
||||||
|
for pattern, substitution in substitution_pipeline:
|
||||||
|
content = re.sub(pattern, substitution, content)
|
||||||
|
|
||||||
|
# Write the tab
|
||||||
|
lines.append(f"````{{tab}} {os}")
|
||||||
|
lines.append(f"```{highlighter}")
|
||||||
|
lines.append(f"{content}")
|
||||||
|
lines.append("```")
|
||||||
|
lines.append("````")
|
||||||
|
|
||||||
|
string_list = StringList(lines)
|
||||||
|
self.state.nested_parse(string_list, 0, node)
|
||||||
|
return [node]
|
||||||
|
|
||||||
|
|
||||||
|
def setup(app: Sphinx) -> None:
|
||||||
|
app.add_directive("pip-command-usage", PipCommandUsage)
|
||||||
|
app.add_directive("pip-command-description", PipCommandDescription)
|
||||||
|
app.add_directive("pip-command-options", PipCommandOptions)
|
||||||
|
app.add_directive("pip-general-options", PipGeneralOptions)
|
||||||
|
app.add_directive("pip-index-options", PipIndexOptions)
|
||||||
app.add_directive(
|
app.add_directive(
|
||||||
'pip-requirements-file-options-ref-list', PipReqFileOptionsReference
|
"pip-requirements-file-options-ref-list", PipReqFileOptionsReference
|
||||||
)
|
)
|
||||||
|
app.add_directive('pip-news-include', PipNewsInclude)
|
||||||
|
app.add_directive("pip-cli", PipCLIDirective)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fixed ``--target`` to work with ``--editable`` installs.
|
|
@ -0,0 +1,2 @@
|
||||||
|
Update "setuptools extras" link to match upstream.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Add a warning, discouraging the usage of pip as root, outside a virtual environment.
|
|
@ -0,0 +1 @@
|
||||||
|
Improve SSL Certificate Verification docs and ``--cert`` help text.
|
|
@ -0,0 +1,2 @@
|
||||||
|
Ignore ``.dist-info`` directories if the stem is not a valid Python distribution
|
||||||
|
name, so they don't show up in e.g. ``pip freeze``.
|
|
@ -0,0 +1 @@
|
||||||
|
Fix ``pip freeze`` permission denied error in order to display an understandable error message and offer solutions.
|
|
@ -0,0 +1 @@
|
||||||
|
Add a section in the documentation to suggest solutions to the ``pip freeze`` permission denied issue.
|
|
@ -0,0 +1 @@
|
||||||
|
Correctly uninstall script files (from setuptools' ``scripts`` argument), when installed with ``--user``.
|
|
@ -0,0 +1,4 @@
|
||||||
|
Add a feature ``--use-feature=in-tree-build`` to build local projects in-place
|
||||||
|
when installing. This is expected to become the default behavior in pip 21.3;
|
||||||
|
see `Installing from local packages <https://pip.pypa.io/en/stable/user_guide/#installing-from-local-packages>`_
|
||||||
|
for more information.
|
|
@ -0,0 +1 @@
|
||||||
|
Bring back the "(from versions: ...)" message, that was shown on resolution failures.
|
|
@ -0,0 +1,2 @@
|
||||||
|
New resolver: Show relevant entries from user-supplied constraint files in the
|
||||||
|
error message to improve debuggability.
|
|
@ -0,0 +1,2 @@
|
||||||
|
Avoid parsing version to make the version check more robust against lousily
|
||||||
|
debundled downstream distributions.
|
|
@ -0,0 +1 @@
|
||||||
|
Fix incorrect reporting on ``Requires-Python`` conflicts.
|
|
@ -0,0 +1 @@
|
||||||
|
Add support for editable installs for project with only setup.cfg files.
|
|
@ -0,0 +1 @@
|
||||||
|
Make wheel compatibility tag preferences more important than the build tag
|
|
@ -0,0 +1,3 @@
|
||||||
|
Start installation scheme migration from ``distutils`` to ``sysconfig``. A
|
||||||
|
warning is implemented to detect differences between the two implementations to
|
||||||
|
encourage user reports, so we can avoid breakages before they happen.
|
|
@ -0,0 +1 @@
|
||||||
|
Add warning about ``--extra-index-url`` and dependency confusion
|
|
@ -0,0 +1,2 @@
|
||||||
|
Describe ``--upgrade-strategy`` and direct requirements explicitly; add a brief
|
||||||
|
example.
|
|
@ -0,0 +1 @@
|
||||||
|
Improve performance when picking the best file from indexes during `pip install`.
|
|
@ -0,0 +1 @@
|
||||||
|
Update urllib3 to 1.26.4 to fix CVE-2021-28363
|
|
@ -0,0 +1 @@
|
||||||
|
Upgrade vendored resolvelib to 0.5.5.
|
60
noxfile.py
60
noxfile.py
|
@ -10,9 +10,11 @@ from typing import Iterator, List, Tuple
|
||||||
|
|
||||||
import nox
|
import nox
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
sys.path.append(".")
|
sys.path.append(".")
|
||||||
from tools.automation import release # isort:skip # noqa
|
from tools import release # isort:skip # noqa
|
||||||
sys.path.pop()
|
sys.path.pop()
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
nox.options.reuse_existing_virtualenvs = True
|
nox.options.reuse_existing_virtualenvs = True
|
||||||
nox.options.sessions = ["lint"]
|
nox.options.sessions = ["lint"]
|
||||||
|
@ -75,17 +77,16 @@ def test(session):
|
||||||
# type: (nox.Session) -> None
|
# type: (nox.Session) -> None
|
||||||
# Get the common wheels.
|
# Get the common wheels.
|
||||||
if should_update_common_wheels():
|
if should_update_common_wheels():
|
||||||
|
# fmt: off
|
||||||
run_with_protected_pip(
|
run_with_protected_pip(
|
||||||
session,
|
session,
|
||||||
"wheel",
|
"wheel",
|
||||||
"-w", LOCATIONS["common-wheels"],
|
"-w", LOCATIONS["common-wheels"],
|
||||||
"-r", REQUIREMENTS["common-wheels"],
|
"-r", REQUIREMENTS["common-wheels"],
|
||||||
)
|
)
|
||||||
|
# fmt: on
|
||||||
else:
|
else:
|
||||||
msg = (
|
msg = f"Re-using existing common-wheels at {LOCATIONS['common-wheels']}."
|
||||||
"Re-using existing common-wheels at {}."
|
|
||||||
.format(LOCATIONS["common-wheels"])
|
|
||||||
)
|
|
||||||
session.log(msg)
|
session.log(msg)
|
||||||
|
|
||||||
# Build source distribution
|
# Build source distribution
|
||||||
|
@ -93,11 +94,14 @@ def test(session):
|
||||||
sdist_dir = os.path.join(session.virtualenv.location, "sdist") # type: ignore
|
sdist_dir = os.path.join(session.virtualenv.location, "sdist") # type: ignore
|
||||||
if os.path.exists(sdist_dir):
|
if os.path.exists(sdist_dir):
|
||||||
shutil.rmtree(sdist_dir, ignore_errors=True)
|
shutil.rmtree(sdist_dir, ignore_errors=True)
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
session.run(
|
session.run(
|
||||||
"python", "setup.py", "sdist",
|
"python", "setup.py", "sdist", "--formats=zip", "--dist-dir", sdist_dir,
|
||||||
"--formats=zip", "--dist-dir", sdist_dir,
|
|
||||||
silent=True,
|
silent=True,
|
||||||
)
|
)
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
generated_files = os.listdir(sdist_dir)
|
generated_files = os.listdir(sdist_dir)
|
||||||
assert len(generated_files) == 1
|
assert len(generated_files) == 1
|
||||||
generated_sdist = os.path.join(sdist_dir, generated_files[0])
|
generated_sdist = os.path.join(sdist_dir, generated_files[0])
|
||||||
|
@ -129,6 +133,7 @@ def docs(session):
|
||||||
# can not use a different configuration directory vs source directory
|
# can not use a different configuration directory vs source directory
|
||||||
# on RTD currently. So, we'll pass "-c docs/html" here.
|
# on RTD currently. So, we'll pass "-c docs/html" here.
|
||||||
# See https://github.com/rtfd/readthedocs.org/issues/1543.
|
# See https://github.com/rtfd/readthedocs.org/issues/1543.
|
||||||
|
# fmt: off
|
||||||
return [
|
return [
|
||||||
"sphinx-build",
|
"sphinx-build",
|
||||||
"-W",
|
"-W",
|
||||||
|
@ -138,11 +143,28 @@ def docs(session):
|
||||||
"docs/" + kind,
|
"docs/" + kind,
|
||||||
"docs/build/" + kind,
|
"docs/build/" + kind,
|
||||||
]
|
]
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
session.run(*get_sphinx_build_command("html"))
|
session.run(*get_sphinx_build_command("html"))
|
||||||
session.run(*get_sphinx_build_command("man"))
|
session.run(*get_sphinx_build_command("man"))
|
||||||
|
|
||||||
|
|
||||||
|
@nox.session(name="docs-live")
|
||||||
|
def docs_live(session):
|
||||||
|
# type: (nox.Session) -> None
|
||||||
|
session.install("-e", ".")
|
||||||
|
session.install("-r", REQUIREMENTS["docs"], "sphinx-autobuild")
|
||||||
|
|
||||||
|
session.run(
|
||||||
|
"sphinx-autobuild",
|
||||||
|
"-d=docs/build/doctrees/livehtml",
|
||||||
|
"-b=dirhtml",
|
||||||
|
"docs/html",
|
||||||
|
"docs/build/livehtml",
|
||||||
|
*session.posargs,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@nox.session
|
@nox.session
|
||||||
def lint(session):
|
def lint(session):
|
||||||
# type: (nox.Session) -> None
|
# type: (nox.Session) -> None
|
||||||
|
@ -152,7 +174,6 @@ def lint(session):
|
||||||
args = session.posargs + ["--all-files"]
|
args = session.posargs + ["--all-files"]
|
||||||
else:
|
else:
|
||||||
args = ["--all-files", "--show-diff-on-failure"]
|
args = ["--all-files", "--show-diff-on-failure"]
|
||||||
args.append("--hook-stage=manual")
|
|
||||||
|
|
||||||
session.run("pre-commit", "run", *args)
|
session.run("pre-commit", "run", *args)
|
||||||
|
|
||||||
|
@ -168,11 +189,14 @@ def vendoring(session):
|
||||||
|
|
||||||
def pinned_requirements(path):
|
def pinned_requirements(path):
|
||||||
# type: (Path) -> Iterator[Tuple[str, str]]
|
# type: (Path) -> Iterator[Tuple[str, str]]
|
||||||
for line in path.read_text().splitlines():
|
for line in path.read_text().splitlines(keepends=False):
|
||||||
one, two = line.split("==", 1)
|
one, sep, two = line.partition("==")
|
||||||
|
if not sep:
|
||||||
|
continue
|
||||||
name = one.strip()
|
name = one.strip()
|
||||||
version = two.split("#")[0].strip()
|
version = two.split("#", 1)[0].strip()
|
||||||
yield name, version
|
if name and version:
|
||||||
|
yield name, version
|
||||||
|
|
||||||
vendor_txt = Path("src/pip/_vendor/vendor.txt")
|
vendor_txt = Path("src/pip/_vendor/vendor.txt")
|
||||||
for name, old_version in pinned_requirements(vendor_txt):
|
for name, old_version in pinned_requirements(vendor_txt):
|
||||||
|
@ -227,9 +251,7 @@ def prepare_release(session):
|
||||||
session.log(f"# Updating {AUTHORS_FILE}")
|
session.log(f"# Updating {AUTHORS_FILE}")
|
||||||
release.generate_authors(AUTHORS_FILE)
|
release.generate_authors(AUTHORS_FILE)
|
||||||
if release.modified_files_in_git():
|
if release.modified_files_in_git():
|
||||||
release.commit_file(
|
release.commit_file(session, AUTHORS_FILE, message=f"Update {AUTHORS_FILE}")
|
||||||
session, AUTHORS_FILE, message=f"Update {AUTHORS_FILE}",
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
session.log(f"# No changes to {AUTHORS_FILE}")
|
session.log(f"# No changes to {AUTHORS_FILE}")
|
||||||
|
|
||||||
|
@ -276,7 +298,7 @@ def build_release(session):
|
||||||
|
|
||||||
tmp_dist_paths = (build_dir / p for p in tmp_dists)
|
tmp_dist_paths = (build_dir / p for p in tmp_dists)
|
||||||
session.log(f"# Copying dists from {build_dir}")
|
session.log(f"# Copying dists from {build_dir}")
|
||||||
os.makedirs('dist', exist_ok=True)
|
os.makedirs("dist", exist_ok=True)
|
||||||
for dist, final in zip(tmp_dist_paths, tmp_dists):
|
for dist, final in zip(tmp_dist_paths, tmp_dists):
|
||||||
session.log(f"# Copying {dist} to {final}")
|
session.log(f"# Copying {dist} to {final}")
|
||||||
shutil.copy(dist, final)
|
shutil.copy(dist, final)
|
||||||
|
@ -291,7 +313,7 @@ def build_dists(session):
|
||||||
|
|
||||||
has_forbidden_git_untracked_files = any(
|
has_forbidden_git_untracked_files = any(
|
||||||
# Don't report the environment this session is running in
|
# Don't report the environment this session is running in
|
||||||
not untracked_file.startswith('.nox/build-release/')
|
not untracked_file.startswith(".nox/build-release/")
|
||||||
for untracked_file in release.get_git_untracked_files()
|
for untracked_file in release.get_git_untracked_files()
|
||||||
)
|
)
|
||||||
if has_forbidden_git_untracked_files:
|
if has_forbidden_git_untracked_files:
|
||||||
|
@ -337,9 +359,7 @@ def upload_release(session):
|
||||||
f"pip-{version}.tar.gz",
|
f"pip-{version}.tar.gz",
|
||||||
]
|
]
|
||||||
if sorted(distfile_names) != sorted(expected_distribution_files):
|
if sorted(distfile_names) != sorted(expected_distribution_files):
|
||||||
session.error(
|
session.error(f"Distribution files do not seem to be for {version} release.")
|
||||||
f"Distribution files do not seem to be for {version} release."
|
|
||||||
)
|
|
||||||
|
|
||||||
session.log("# Upload distributions")
|
session.log("# Upload distributions")
|
||||||
session.run("twine", "upload", *distribution_files)
|
session.run("twine", "upload", *distribution_files)
|
||||||
|
|
|
@ -9,7 +9,7 @@ filename = "NEWS.rst"
|
||||||
directory = "news/"
|
directory = "news/"
|
||||||
title_format = "{version} ({project_date})"
|
title_format = "{version} ({project_date})"
|
||||||
issue_format = "`#{issue} <https://github.com/pypa/pip/issues/{issue}>`_"
|
issue_format = "`#{issue} <https://github.com/pypa/pip/issues/{issue}>`_"
|
||||||
template = "tools/automation/news/template.rst"
|
template = "tools/news/template.rst"
|
||||||
type = [
|
type = [
|
||||||
{ name = "Process", directory = "process", showcontent = true },
|
{ name = "Process", directory = "process", showcontent = true },
|
||||||
{ name = "Deprecations and Removals", directory = "removal", showcontent = true },
|
{ name = "Deprecations and Removals", directory = "removal", showcontent = true },
|
||||||
|
@ -26,7 +26,7 @@ requirements = "src/pip/_vendor/vendor.txt"
|
||||||
namespace = "pip._vendor"
|
namespace = "pip._vendor"
|
||||||
|
|
||||||
protected-files = ["__init__.py", "README.rst", "vendor.txt"]
|
protected-files = ["__init__.py", "README.rst", "vendor.txt"]
|
||||||
patches-dir = "tools/automation/vendoring/patches"
|
patches-dir = "tools/vendoring/patches"
|
||||||
|
|
||||||
[tool.vendoring.transformations]
|
[tool.vendoring.transformations]
|
||||||
substitute = [
|
substitute = [
|
||||||
|
|
18
setup.cfg
18
setup.cfg
|
@ -36,10 +36,23 @@ disallow_untyped_defs = True
|
||||||
disallow_any_generics = True
|
disallow_any_generics = True
|
||||||
warn_unused_ignores = True
|
warn_unused_ignores = True
|
||||||
|
|
||||||
[mypy-pip/_vendor/*]
|
[mypy-pip._vendor.*]
|
||||||
follow_imports = skip
|
|
||||||
ignore_errors = True
|
ignore_errors = True
|
||||||
|
|
||||||
|
# These vendored libraries use runtime magic to populate things and don't sit
|
||||||
|
# well with static typing out of the box. Eventually we should provide correct
|
||||||
|
# typing information for their public interface and remove these configs.
|
||||||
|
[mypy-pip._vendor.colorama]
|
||||||
|
follow_imports = skip
|
||||||
|
[mypy-pip._vendor.pkg_resources]
|
||||||
|
follow_imports = skip
|
||||||
|
[mypy-pip._vendor.progress.*]
|
||||||
|
follow_imports = skip
|
||||||
|
[mypy-pip._vendor.requests.*]
|
||||||
|
follow_imports = skip
|
||||||
|
[mypy-pip._vendor.retrying]
|
||||||
|
follow_imports = skip
|
||||||
|
|
||||||
[tool:pytest]
|
[tool:pytest]
|
||||||
addopts = --ignore src/pip/_vendor --ignore tests/tests_cache -r aR
|
addopts = --ignore src/pip/_vendor --ignore tests/tests_cache -r aR
|
||||||
markers =
|
markers =
|
||||||
|
@ -53,7 +66,6 @@ markers =
|
||||||
svn: VCS: Subversion
|
svn: VCS: Subversion
|
||||||
mercurial: VCS: Mercurial
|
mercurial: VCS: Mercurial
|
||||||
git: VCS: git
|
git: VCS: git
|
||||||
yaml: yaml based tests
|
|
||||||
search: tests for 'pip search'
|
search: tests for 'pip search'
|
||||||
|
|
||||||
[coverage:run]
|
[coverage:run]
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue