mirror of
https://github.com/codeflash-ai/codeflash-agent.git
synced 2026-05-04 18:25:19 +00:00
342 lines
16 KiB
Markdown
342 lines
16 KiB
Markdown
# 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 runtime
|
|
- `pip._vendor.tomli` (all 4 modules) -- TOML parser, not needed for install
|
|
- `pip._vendor.distro` (all 3 modules) -- Linux distribution detection, not needed on macOS/for install
|
|
- `pip._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 backends
|
|
- `pip._vendor.platformdirs.windows`, `pip._vendor.platformdirs.android`, `pip._vendor.platformdirs.unix` -- wrong-platform dirs
|
|
- `pip._vendor.urllib3.contrib.*` (securetransport, pyopenssl, appengine, ntlmpool, socks, backports) -- optional urllib3 extras
|
|
- `pip._vendor.idna.codec`, `pip._vendor.idna.compat`, `pip._vendor.idna.uts46data` -- IDNA codec/compat, rarely needed
|
|
- `pip._vendor.cachecontrol._cmd`, `pip._vendor.cachecontrol.heuristics` -- CLI/heuristic features unused by pip
|
|
- `pip._vendor.packaging.metadata`, `pip._vendor.packaging.licenses` -- packaging metadata/license handling
|
|
- `pip._vendor.dependency_groups.*` (all 5 modules) -- dependency group resolution
|
|
- `pip._vendor.requests.help` -- requests debug info
|
|
- `pip._vendor.rich` partial: `_export_format`, `_spinners`, `ansi`, `file_proxy`, `filesize`, `live`, `live_render`, `pager`, `progress`, `progress_bar`, `screen`, `spinner`
|
|
- `pip._vendor.certifi.__main__` -- certifi CLI
|
|
- `pip._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.cache`
|
|
- `pip._internal.commands.check`
|
|
- `pip._internal.commands.completion`
|
|
- `pip._internal.commands.configuration`
|
|
- `pip._internal.commands.debug`
|
|
- `pip._internal.commands.download`
|
|
- `pip._internal.commands.freeze`
|
|
- `pip._internal.commands.hash`
|
|
- `pip._internal.commands.help`
|
|
- `pip._internal.commands.index`
|
|
- `pip._internal.commands.inspect`
|
|
- `pip._internal.commands.list`
|
|
- `pip._internal.commands.lock`
|
|
- `pip._internal.commands.search`
|
|
- `pip._internal.commands.show`
|
|
- `pip._internal.commands.uninstall`
|
|
- `pip._internal.commands.wheel`
|
|
|
|
Other never-imported internals:
|
|
- `pip._internal.locations._distutils` -- legacy distutils location support
|
|
- `pip._internal.main` -- thin wrapper, bypassed in tests
|
|
- `pip._internal.metadata.pkg_resources` -- legacy metadata backend
|
|
- `pip._internal.network.xmlrpc` -- XML-RPC client (for `pip search`)
|
|
- `pip._internal.operations.freeze` -- freeze operation
|
|
- `pip._internal.resolution.legacy` (2 modules) -- legacy resolver
|
|
- `pip._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:
|
|
|
|
1. **Command handlers** (953 lines) -- Expected. These are tested by functional tests, not unit tests. Not actually dead.
|
|
2. **Legacy resolver** (`resolution/legacy/`) -- Never imported during install. Could be lazy-loaded or gated.
|
|
3. **Platform-specific paths** (distutils locations, Windows/Linux branches) -- Not dead, just not exercised on macOS.
|
|
4. **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 check
|
|
- `pip._internal.metadata.pkg_resources` -- could lazy-import
|
|
- `pip._internal.network.xmlrpc` -- only used by deprecated `pip search`
|
|
- `pip._vendor.pygments` -- only needed for `--verbose` or 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.
|