Skip to main content

Dependency optimization and pruning made simple

Project description

⚡️ PipZap ⚡

image Ruff Python Versions Tests Coverage

Zap the mess out of the dependency jungles

Overview

PipZap is a command-line tool designed to optimize Python dependency management by pruning redundant dependencies, and easing the transition to the modern formats.

It processes a dependency file, such as requirements.txt, uv's or Poetry's pyproject.toml, and outputs a minimal list of direct dependencies, removing those satisfied transitively.

Leveraging uv for dependency resolution, PipZap ensures your dependency list is lean and functional, making it easier to maintain and integrate into modern workflows.

Why PipZap?

Python dependency management can be a mess, especially with scientific libraries where outdated practices persist. Projects (even recent ones) often ship with a requirements.txt generated by pip freeze, leaving you with a sprawling list of pinned dependencies, many of which are redundant.

Take the easy_ViTPose project as an example: its requirements.txt lists 50 packages, including transitive dependencies like certifi and numpy.

See below for a real example with easy_VitPose

PipZap can transform this into a concise, modern format such as poetry, uv, or even a good old requirements.txt with just the essential direct dependencies. This makes it much easier to adopt any package into a modern codebase.

Moreover, even in well-maintained codebases, accidental over-specification creeps in, and PipZap cuts through that noise, keeping your dependency list clean and intentional.

Features

  • Dependency Pruning: Eliminates redundant dependencies satisfied transitively.
  • Format Auto-Detection: Automatically recognizes requirements.txt, uv, Poetry, and conda environment files.
  • Flexible Output: Outputs in requirements, poetry, uv, or conda formats.
  • Python Version Handling: Extracts from pyproject.toml or accepts via CLI for requirements.txt.
  • Isolated Resolution: Resolves dependencies in a temporary, isolated environment to avoid impacting your project.
  • Dependency Discovery: Scan source files with --discover to find actually used packages.
  • Preserve All Mode: Use --preserve-all to ensure no transitive dependencies are lost after pruning.
  • Verbose Logging: Optional rich logging for detailed insights.

Installation

Install PipZap with pip:

pip install pipzap

Usage

Eliminate redundant dependencies from a file:

pipzap requirements.txt -p 3.11
pipzap pyproject.toml
pipzap pyproject.toml -o pruned.toml -f poetry -v
  • Use -p/--python-version to specify (recommended; defaults to the current environment for requirements.txt).
  • Python version is auto-detected from pyproject.toml when present.
  • Output format defaults to the input format unless specified with -f/--format (e.g., -f requirements).
  • Use -d/--discover to scan Python source files and keep only packages that are actually imported.
  • Use --preserve-all to re-verify the pruned output and add back any dependencies that would be missing.

Supported Formats

  • requirements.txt: Pip-style with --extra-index-url support.
  • UV pyproject.toml: Parses [project.dependencies] and [project.requires-python].
  • Poetry pyproject.toml: Handles [project.dependencies] (modern) and [tool.poetry.dependencies] (legacy).
  • Conda environment.yml: Extracts and processes pip dependencies, preserving conda-specific sections.

How It Works

  1. Parsing: Identifies the file format and extracts direct dependencies.
  2. Resolution: Uses uv to build the dependency graph in a temporary, isolated pyproject.toml.
  3. Pruning: Identifies and removes transitive redundancies.
  4. Formatting: Outputs the pruned dependencies in the specified format (requirements, poetry, or uv).

Examples

Pruning requirements.txt from easy_ViTPose

Input (requirements.txt from easy_ViTPose):

certifi==2023.7.22
charset-normalizer==3.2.0
coloredlogs==15.0.1
contourpy==1.1.1
cycler==0.11.0
ffmpeg==1.4
filelock==3.12.4
filterpy==1.4.5
flatbuffers==23.5.26
fonttools==4.43.0
humanfriendly==10.0
idna==3.4
imageio==2.31.3
importlib-resources==6.1.0
jinja2>=3.1.3
kiwisolver==1.4.5
lazy_loader==0.3
MarkupSafe==2.1.3
matplotlib==3.8.0
mpmath==1.3.0
networkx==3.1
numpy==1.26.0
onnx==1.14.1
onnxruntime==1.16.0
opencv-python==4.8.0.76
packaging==23.1
pandas==2.1.1
Pillow>=10.2.0
protobuf==4.24.3
psutil==5.9.5
py-cpuinfo==9.0.0
pycocotools==2.0.8
pyparsing==3.1.1
python-dateutil==2.8.2
pytz==2023.3.post1
PyWavelets==1.4.1
PyYAML==6.0.1
requests==2.31.0
scikit-image==0.21.0
scipy==1.11.2
seaborn==0.12.2
six==1.16.0
sympy==1.12
tifffile==2023.9.18
tqdm==4.66.1
typing_extensions==4.8.0
tzdata==2023.3
ultralytics==8.2.48
urllib3>=2.0.7
zipp==3.17.0

Command:

pipzap requirements.txt -p 3.11 -f poetry

Output (pruned to direct dependencies):

[tool.poetry.dependencies]
ffmpeg = "1.4"
filterpy = "1.4.5"
importlib-resources = "6.1.0"
lazy_loader = "0.3"
onnx = "1.14.1"
onnxruntime = "1.16.0"
pycocotools = "2.0.8"
scikit-image = "0.21.0"
typing_extensions = "4.8.0"
ultralytics = "8.2.48"
zipp = "3.17.0"

Contributing

Contributions are welcome! To get started:

  1. Fork the repository.
  2. Install dev dependencies: pip install -e .[dev].
  3. Run tests: pytest.
  4. Submit a pull request. Follow the Ruff linting rules and ensure type safety with mypy.

License

PipZap is licensed under the MIT License. See LICENSE for details.

Acknowledgments

  • Powered by uv for dependency resolution.
  • Born from the chaos of overgrown Python dependency lists.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pipzap-0.5.0.tar.gz (208.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pipzap-0.5.0-py3-none-any.whl (44.9 kB view details)

Uploaded Python 3

File details

Details for the file pipzap-0.5.0.tar.gz.

File metadata

  • Download URL: pipzap-0.5.0.tar.gz
  • Upload date:
  • Size: 208.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pipzap-0.5.0.tar.gz
Algorithm Hash digest
SHA256 c7d7a066c4883b95b54c8d06b619a90862c48a247609bac3bc26ae7ed2b2a0b6
MD5 0f6b31c3f37714ab6d8a45aa3505ea52
BLAKE2b-256 f6119193a11b4cffa592649ee0ec051e88d6d6d1a9614921ba771ca5c6dd7b35

See more details on using hashes here.

File details

Details for the file pipzap-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: pipzap-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 44.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pipzap-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dd9ce34459bba49b7686402947cc5868089a3aa592da634c93d99f8037aeeb21
MD5 cd2e0ec2718b33a7dd0e82185b47bad7
BLAKE2b-256 38148368fcac66a90e678093c53d8d8f8adb024b7d392a535675ff8e00185da5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page