16 KiB
Pip Coverage Analysis Report
Branch: codeflash/optimize
Date: 2026-04-08
Test suite: tests/unit/ (1690 passed, 39 skipped, 4 xfailed)
Tool: coverage.py with --source=src/pip
1. Summary Statistics
| Metric | Value |
|---|---|
| Total files analyzed | 388 |
| Total statements | 42,496 |
| Covered lines | 20,725 |
| Uncovered lines | 21,771 |
| Overall coverage | 48.8% |
Breakdown by area
| Area | Statements | Covered | Missing | Coverage |
|---|---|---|---|---|
Vendored (_vendor/) |
27,551 | 10,462 | 17,089 | 38.0% |
Internal (_internal/) |
14,902 | 10,260 | 4,642 | 68.8% |
| Other (top-level) | 43 | 3 | 40 | 7.0% |
Over 78% of uncovered code is in vendored dependencies.
2. Completely Unused Files (0% Coverage)
Vendor (51 files, 5,411 lines total)
| Lines | Package | File |
|---|---|---|
| 586 | msgpack | src/pip/_vendor/msgpack/fallback.py |
| 488 | tomli | src/pip/_vendor/tomli/_parser.py |
| 421 | urllib3 | src/pip/_vendor/urllib3/contrib/securetransport.py |
| 419 | packaging | src/pip/_vendor/packaging/metadata.py |
| 346 | distro | src/pip/_vendor/distro/distro.py |
| 276 | urllib3 | src/pip/_vendor/urllib3/contrib/_securetransport/bindings.py |
| 261 | urllib3 | src/pip/_vendor/urllib3/contrib/pyopenssl.py |
| 212 | truststore | src/pip/_vendor/truststore/_windows.py |
| 200 | pyproject_hooks | src/pip/_vendor/pyproject_hooks/_in_process/_in_process.py |
| 172 | idna | src/pip/_vendor/idna/uts46data.py |
| 159 | urllib3 | src/pip/_vendor/urllib3/contrib/_securetransport/low_level.py |
| 147 | platformdirs | src/pip/_vendor/platformdirs/windows.py |
| 145 | platformdirs | src/pip/_vendor/platformdirs/android.py |
| 141 | platformdirs | src/pip/_vendor/platformdirs/unix.py |
| 137 | pygments | src/pip/_vendor/pygments/sphinxext.py |
| 109 | urllib3 | src/pip/_vendor/urllib3/contrib/appengine.py |
| 106 | pygments | src/pip/_vendor/pygments/lexers/python.py |
| 90 | urllib3 | src/pip/_vendor/urllib3/packages/backports/weakref_finalize.py |
| 84 | pygments | src/pip/_vendor/pygments/formatters/__init__.py |
| 81 | idna | src/pip/_vendor/idna/codec.py |
| 72 | msgpack | src/pip/_vendor/msgpack/ext.py |
| 71 | cachecontrol | src/pip/_vendor/cachecontrol/heuristics.py |
| 62 | urllib3 | src/pip/_vendor/urllib3/contrib/ntlmpool.py |
| 59 | packaging | src/pip/_vendor/packaging/licenses/__init__.py |
| 57 | requests | src/pip/_vendor/requests/help.py |
| 40 | pygments | src/pip/_vendor/pygments/scanner.py |
| 40 | pygments | src/pip/_vendor/pygments/unistring.py |
| 38 | dependency_groups | src/pip/_vendor/dependency_groups/_pip_wrapper.py |
| 38 | pygments | src/pip/_vendor/pygments/console.py |
| 35 | cachecontrol | src/pip/_vendor/cachecontrol/_cmd.py |
| 35 | urllib3 | src/pip/_vendor/urllib3/packages/backports/makefile.py |
| 34 | dependency_groups | src/pip/_vendor/dependency_groups/_lint_dependency_groups.py |
| 34 | tomli | src/pip/_vendor/tomli/_re.py |
| 30 | dependency_groups | src/pip/_vendor/dependency_groups/__main__.py |
| 30 | pygments | src/pip/_vendor/pygments/formatter.py |
| 26 | truststore | src/pip/_vendor/truststore/_openssl.py |
| 25 | platformdirs | src/pip/_vendor/platformdirs/__main__.py |
| 23 | msgpack | src/pip/_vendor/msgpack/__init__.py |
| 17 | msgpack | src/pip/_vendor/msgpack/exceptions.py |
| 11 | packaging | src/pip/_vendor/packaging/licenses/_spdx.py |
| 8 | certifi | src/pip/_vendor/certifi/__main__.py |
| 8 | idna | src/pip/_vendor/idna/compat.py |
| 8 | rich | src/pip/_vendor/rich/pager.py |
| 6 | dependency_groups | src/pip/_vendor/dependency_groups/_toml_compat.py |
| 6 | pygments | src/pip/_vendor/pygments/__main__.py |
| 4 | rich | src/pip/_vendor/rich/_export_format.py |
| 4 | tomli | src/pip/_vendor/tomli/_types.py |
| 3 | distro | src/pip/_vendor/distro/__init__.py |
| 3 | distro | src/pip/_vendor/distro/__main__.py |
| 3 | tomli | src/pip/_vendor/tomli/__init__.py |
| 1 | pygments | src/pip/_vendor/pygments/formatters/_mapping.py |
Internal (2 files, 79 lines total)
| Lines | Module | File |
|---|---|---|
| 75 | locations | src/pip/_internal/locations/_distutils.py |
| 4 | (root) | src/pip/_internal/main.py |
Other (2 files, 38 lines total)
| Lines | File |
|---|---|
| 21 | src/pip/__pip-runner__.py |
| 17 | src/pip/__main__.py |
3. Nearly Dead Files (<10% coverage)
No files fall in the 1-9% range. All partially-covered files have at least 10% coverage.
4. Top 30 Files by Uncovered Line Count
These files contain the most dead code by absolute count.
| Missing | Total | Cov% | Area | File |
|---|---|---|---|---|
| 1,022 | 1,272 | 19.7% | vendor | src/pip/_vendor/distlib/util.py |
| 888 | 1,561 | 43.1% | vendor | src/pip/_vendor/pkg_resources/__init__.py |
| 586 | 586 | 0.0% | vendor | src/pip/_vendor/msgpack/fallback.py |
| 488 | 488 | 0.0% | vendor | src/pip/_vendor/tomli/_parser.py |
| 480 | 996 | 51.8% | vendor | src/pip/_vendor/rich/console.py |
| 421 | 421 | 0.0% | vendor | src/pip/_vendor/urllib3/contrib/securetransport.py |
| 419 | 419 | 0.0% | vendor | src/pip/_vendor/packaging/metadata.py |
| 381 | 466 | 18.2% | vendor | src/pip/_vendor/pygments/lexer.py |
| 346 | 346 | 0.0% | vendor | src/pip/_vendor/distro/distro.py |
| 315 | 396 | 20.5% | vendor | src/pip/_vendor/rich/pretty.py |
| 310 | 481 | 35.6% | vendor | src/pip/_vendor/requests/utils.py |
| 310 | 622 | 50.2% | vendor | src/pip/_vendor/rich/progress.py |
| 276 | 276 | 0.0% | vendor | src/pip/_vendor/urllib3/contrib/_securetransport/bindings.py |
| 271 | 632 | 57.1% | vendor | src/pip/_vendor/packaging/specifiers.py |
| 261 | 344 | 24.1% | vendor | src/pip/_vendor/rich/syntax.py |
| 261 | 261 | 0.0% | vendor | src/pip/_vendor/urllib3/contrib/pyopenssl.py |
| 257 | 292 | 12.0% | vendor | src/pip/_vendor/idna/core.py |
| 234 | 606 | 61.4% | vendor | src/pip/_vendor/rich/text.py |
| 232 | 503 | 53.9% | vendor | src/pip/_vendor/urllib3/packages/six.py |
| 226 | 424 | 46.7% | vendor | src/pip/_vendor/urllib3/response.py |
| 225 | 424 | 46.9% | vendor | src/pip/_vendor/rich/style.py |
| 218 | 290 | 24.8% | vendor | src/pip/_vendor/rich/traceback.py |
| 216 | 397 | 45.6% | internal | src/pip/_internal/resolution/resolvelib/factory.py |
| 212 | 212 | 0.0% | vendor | src/pip/_vendor/truststore/_windows.py |
| 200 | 200 | 0.0% | vendor | src/pip/_vendor/pyproject_hooks/_in_process/_in_process.py |
| 197 | 455 | 56.7% | vendor | src/pip/_vendor/requests/models.py |
| 190 | 235 | 19.1% | vendor | src/pip/_vendor/cachecontrol/controller.py |
| 173 | 764 | 77.4% | internal | src/pip/_internal/index/package_finder.py |
| 172 | 172 | 0.0% | vendor | src/pip/_vendor/idna/uts46data.py |
| 171 | 288 | 40.6% | internal | src/pip/_internal/commands/install.py |
5. Vendored Package Breakdown
Sorted by uncovered (dead) lines, most dead code first.
| Package | Files | Total | Covered | Missing | Coverage |
|---|---|---|---|---|---|
| rich | 62 | 6,796 | 3,156 | 3,640 | 46.4% |
| urllib3 | 39 | 4,883 | 1,858 | 3,025 | 38.1% |
| pygments | 23 | 1,782 | 325 | 1,457 | 18.2% |
| packaging | 17 | 3,065 | 1,654 | 1,411 | 54.0% |
| distlib | 5 | 1,715 | 477 | 1,238 | 27.8% |
| requests | 18 | 2,176 | 1,136 | 1,040 | 52.2% |
| pkg_resources | 1 | 1,561 | 673 | 888 | 43.1% |
| msgpack | 4 | 698 | 0 | 698 | 0.0% |
| platformdirs | 8 | 787 | 233 | 554 | 29.6% |
| idna | 8 | 592 | 50 | 542 | 8.4% |
| tomli | 4 | 529 | 0 | 529 | 0.0% |
| cachecontrol | 12 | 678 | 175 | 503 | 25.8% |
| truststore | 6 | 715 | 233 | 482 | 32.6% |
| distro | 3 | 352 | 0 | 352 | 0.0% |
| pyproject_hooks | 4 | 323 | 80 | 243 | 24.8% |
| resolvelib | 9 | 457 | 285 | 172 | 62.4% |
| dependency_groups | 6 | 201 | 75 | 126 | 37.3% |
| tomli_w | 2 | 130 | 27 | 103 | 20.8% |
| certifi | 3 | 38 | 17 | 21 | 44.7% |
Bold = Entirely unused (0% coverage across all files in the package).
Totals: 27,551 vendor lines, 10,462 covered (38.0%), 17,089 uncovered.
6. Dead Code Hotspots in pip Internals
Internal module breakdown
| Module | Files | Total | Covered | Missing | Coverage |
|---|---|---|---|---|---|
| commands | 19 | 1,601 | 648 | 953 | 40.5% |
| resolution | 13 | 1,579 | 927 | 652 | 58.7% |
| cli | 13 | 1,268 | 828 | 440 | 65.3% |
| req | 8 | 1,384 | 1,015 | 369 | 73.3% |
| operations | 12 | 1,036 | 677 | 359 | 65.3% |
| utils | 28 | 1,729 | 1,409 | 320 | 81.5% |
| (root) | 9 | 1,194 | 887 | 307 | 74.3% |
| metadata | 8 | 958 | 672 | 286 | 70.1% |
| vcs | 6 | 829 | 563 | 266 | 67.9% |
| locations | 4 | 371 | 123 | 248 | 33.2% |
| index | 4 | 1,113 | 904 | 209 | 81.2% |
| network | 8 | 920 | 785 | 135 | 85.3% |
| models | 13 | 789 | 723 | 66 | 91.6% |
| distributions | 5 | 131 | 99 | 32 | 75.6% |
Large contiguous uncovered blocks in pip internals (>= 10 lines)
These are likely entire unused functions, methods, or code branches.
| Size | Lines | File |
|---|---|---|
| 16 | 212-227 | src/pip/_internal/commands/show.py |
| 16 | 1175-1190 | src/pip/_internal/index/package_finder.py |
| 16 | 475-490 | src/pip/_internal/metadata/base.py |
| 13 | 75-87 | src/pip/_internal/locations/_sysconfig.py |
| 13 | 423-435 | src/pip/_internal/models/link.py |
| 13 | 24-36 | src/pip/_internal/utils/pylock.py |
| 12 | 103-114 | src/pip/_internal/resolution/resolvelib/found_candidates.py |
| 12 | 142-153 | src/pip/_internal/vcs/subversion.py |
| 11 | 284-294 | src/pip/_internal/commands/list.py |
| 11 | 388-398 | src/pip/_internal/commands/list.py |
| 11 | 93-103 | src/pip/_internal/operations/install/wheel.py |
| 10 | 533-542 | src/pip/_internal/commands/install.py |
| 10 | 632-641 | src/pip/_internal/commands/install.py |
| 10 | 621-630 | src/pip/_internal/req/req_uninstall.py |
| 10 | 69-78 | src/pip/_internal/resolution/resolvelib/found_candidates.py |
| 10 | 97-106 | src/pip/_internal/utils/filesystem.py |
| 10 | 104-113 | src/pip/_internal/wheel_builder.py |
Total: 17 blocks, 204 lines of contiguous dead code in internals.
Note: The commands module has 953 uncovered lines (40.5% coverage). This is expected because unit tests do not exercise most CLI command handlers -- those are covered by functional tests (which were not included in this analysis). The unit tests primarily exercise library/utility code.
7. Never-Imported Modules During Typical Usage
Running pip install --dry-run requests imported 337 pip modules. The following were never imported during that operation.
Never-imported vendor modules (54 modules)
Entirely unused vendor packages:
pip._vendor.msgpack(all 4 modules) -- serialization library, not used at runtimepip._vendor.tomli(all 4 modules) -- TOML parser, not needed for installpip._vendor.distro(all 3 modules) -- Linux distribution detection, not needed on macOS/for installpip._vendor.tomli_w(2 modules) -- TOML writer
Unused vendor submodules (platform-specific / optional features):
pip._vendor.truststore._windows,pip._vendor.truststore._openssl-- platform-specific TLS backendspip._vendor.platformdirs.windows,pip._vendor.platformdirs.android,pip._vendor.platformdirs.unix-- wrong-platform dirspip._vendor.urllib3.contrib.*(securetransport, pyopenssl, appengine, ntlmpool, socks, backports) -- optional urllib3 extraspip._vendor.idna.codec,pip._vendor.idna.compat,pip._vendor.idna.uts46data-- IDNA codec/compat, rarely neededpip._vendor.cachecontrol._cmd,pip._vendor.cachecontrol.heuristics-- CLI/heuristic features unused by pippip._vendor.packaging.metadata,pip._vendor.packaging.licenses-- packaging metadata/license handlingpip._vendor.dependency_groups.*(all 5 modules) -- dependency group resolutionpip._vendor.requests.help-- requests debug infopip._vendor.richpartial:_export_format,_spinners,ansi,file_proxy,filesize,live,live_render,pager,progress,progress_bar,screen,spinnerpip._vendor.certifi.__main__-- certifi CLIpip._vendor.pygments(most submodules) -- syntax highlighting, not used in install path
Never-imported internal modules (26 modules)
Most are command modules not used during install:
pip._internal.commands.cachepip._internal.commands.checkpip._internal.commands.completionpip._internal.commands.configurationpip._internal.commands.debugpip._internal.commands.downloadpip._internal.commands.freezepip._internal.commands.hashpip._internal.commands.helppip._internal.commands.indexpip._internal.commands.inspectpip._internal.commands.listpip._internal.commands.lockpip._internal.commands.searchpip._internal.commands.showpip._internal.commands.uninstallpip._internal.commands.wheel
Other never-imported internals:
pip._internal.locations._distutils-- legacy distutils location supportpip._internal.main-- thin wrapper, bypassed in testspip._internal.metadata.pkg_resources-- legacy metadata backendpip._internal.network.xmlrpc-- XML-RPC client (forpip search)pip._internal.operations.freeze-- freeze operationpip._internal.resolution.legacy(2 modules) -- legacy resolverpip._internal.utils._jaraco_text-- text utility
8. Recommendations
High-impact: Entirely unused vendor packages
These packages have 0% coverage and were never imported during install. They are candidates for removal or lazy-loading.
| Package | Lines | Recommendation |
|---|---|---|
| msgpack | 698 | Already replaced by JSON caching (per commit 070099c01). Can likely be fully removed from vendor. |
| tomli | 529 | Python 3.11+ has tomllib in stdlib. If pip's minimum is 3.11+, this is dead weight. Otherwise needed for <3.11. |
| distro | 352 | Only used on Linux for distro detection. Already lazy-imported. Could be skipped entirely on macOS/Windows. |
Potential savings: ~1,579 lines of vendor code.
Medium-impact: Heavily unused vendor code
| Package | Missing Lines | Notes |
|---|---|---|
| rich | 3,640 | Pip uses a small fraction of rich. Consider vendoring only the needed subset. |
urllib3 contrib/ |
~1,289 | securetransport, pyopenssl, appengine, ntlmpool, socks, backports -- all 0% coverage. Platform-specific or optional. |
| pygments | 1,457 | 18.2% coverage. Pip only uses basic lexing. Most formatters, lexers, and utilities are unused. |
| distlib | 1,238 | util.py alone has 1,022 uncovered lines. Much of distlib is unused. |
| pkg_resources | 888 | Legacy metadata backend. 43.1% coverage. Being phased out. |
Low-impact: Internal pip dead code
The internal pip code is reasonably well-covered at 68.8%. The uncovered code is mostly:
- Command handlers (953 lines) -- Expected. These are tested by functional tests, not unit tests. Not actually dead.
- Legacy resolver (
resolution/legacy/) -- Never imported during install. Could be lazy-loaded or gated. - Platform-specific paths (distutils locations, Windows/Linux branches) -- Not dead, just not exercised on macOS.
- VCS backends (subversion, mercurial) -- Only used when installing from VCS URLs.
Lazy-loading opportunities
These modules are never imported during a standard pip install but are needed for other commands:
- All command modules except
install-- already lazy-loaded via command discovery pip._internal.resolution.legacy-- could gate behind a flag checkpip._internal.metadata.pkg_resources-- could lazy-importpip._internal.network.xmlrpc-- only used by deprecatedpip searchpip._vendor.pygments-- only needed for--verboseor rich output formatting
Summary of removable/reducible code
| Category | Estimated Removable Lines |
|---|---|
| Entirely unused vendor packages (msgpack, tomli, distro) | ~1,579 |
| Unused vendor submodules (urllib3 contrib, pygments extras, etc.) | ~2,500 |
| Never-imported vendor utility modules (main, CLI tools, etc.) | ~400 |
| Total potential reduction | ~4,500 lines |
This represents roughly 10.6% of all pip source code that could potentially be removed or lazy-loaded.