However, it is incomplete and inaccurate regarding how those tags are matched by pip. The described algorithm is:
This example list is for an installer running under CPython 3.3 on a linux_x86_64 system. It is in order from most-preferred (a distribution with a compiled extension module, built for the current version of Python) to least-preferred (a pure-Python distribution built with an older version of Python):
cp33-cp33m-linux_x86_64
cp33-abi3-linux_x86_64
cp3-abi3-linux_x86_64
cp33-none-linux_x86_64*
cp3-none-linux_x86_64*
py33-none-linux_x86_64*
py3-none-linux_x86_64*
cp33-none-any
cp3-none-any
py33-none-any
py3-none-any
py32-none-any
py31-none-any
py30-none-any
This is modified by "Compressed Tag Sets" but that's not relevant to this issue.
From this we can surmise, for a CPython version X.Y:
It can match if python is cpXY and abi is cpXY*.
It can match if python is in cpXY, cpX and abi is abi3
It can match if python is in cpXY, cpX, pyXY, pyX and abi is none
It can also match any pyXZ-none-any for Z < Y
This is not the actual algorithm used by pip.
In particular I'm aware of these rules obeyed by pip in practice (but I haven't found a spec):
It can also match any cpXZ-abi3 for Z < Y
It can also match any pyXZ-none-manylinux* for Z < Y
Given these are valid, they must be in the ordering somewhere, and it should be documented where.
Some examples illustrating these rules (pip 24.3.1, python 3.13):
$ .venv/bin/pip --version
pip 24.3.1 from /home/mauve/dev/demo/.venv/lib/python3.13/site-packages/pip (python 3.13)
$ .venv/bin/pip install --dry-run solace_pubsubplus --no-deps --no-cache
Looking in indexes: https://artifactory/pypi/simple/
Collecting solace_pubsubplus
Downloading https://artifactory/pypi/packages/packages/5e/33/e5923f962b89b5a63eac2c0f7493abb53e7a1054a1da580c0037fd51713f/solace_pubsubplus-1.9.0-py36-none-manylinux_2_12_x86_64.whl (4.4 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.4/4.4 MB 549.6 MB/s eta 0:00:00
Would install solace-pubsubplus-1.9.0
$ .venv/bin/pip install --dry-run argon2_cffi_bindings --no-deps --no-cache
Looking in indexes: https://artifactory/pypi/simple/
Collecting argon2_cffi_bindings
Downloading https://artifactory/pypi/packages/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (86 kB)
Would install argon2-cffi-bindings-21.2.0
Given also that Compressed Tag Sets modify the whole algorithm, making it about set intersection, it would also be better to incorporate them into a description of the algorithm too.
Code of Conduct
I am aware that participants in this repository must follow the PSF Code of Conduct.
Activity