An interactive pip requirements upgrader that also updates the version in your requirements.txt file
npx @tessl/cli install tessl/pypi-pip-upgrader@1.4.0An interactive command-line tool for upgrading pip requirements files. It automatically detects requirements files, queries PyPI for available updates, presents an interactive interface for selecting packages to upgrade, and updates both the installed packages and version numbers in requirements files.
pip install pip-upgraderpip-upgradeimport pip_upgrader
from pip_upgrader import __version__For programmatic usage:
from pip_upgrader.cli import main, get_options
from pip_upgrader.packages_detector import PackagesDetector
from pip_upgrader.requirements_detector import RequirementsDetector
from pip_upgrader.packages_status_detector import PackagesStatusDetector
from pip_upgrader.packages_interactive_selector import PackageInteractiveSelector, user_input
from pip_upgrader.packages_upgrader import PackagesUpgrader
from pip_upgrader.virtualenv_checker import check_for_virtualenv, is_virtualenv# Auto-discover requirements files and upgrade interactively
pip-upgrade
# Specify requirements files explicitly
pip-upgrade requirements.txt
pip-upgrade requirements/dev.txt requirements/production.txt
# Pre-select specific packages to upgrade
pip-upgrade requirements.txt -p django -p celery
# Upgrade all available packages without prompting
pip-upgrade requirements.txt -p all
# Dry run (simulate without actual changes)
pip-upgrade requirements.txt --dry-run
# Skip virtualenv check
pip-upgrade requirements.txt --skip-virtualenv-check
# Only update requirements files, don't install packages
pip-upgrade requirements.txt --skip-package-installation
# Include prerelease versions
pip-upgrade requirements.txt --prerelease
# Use default PyPI index instead of custom indexes
pip-upgrade requirements.txt --use-default-indexfrom pip_upgrader.cli import main
from pip_upgrader.requirements_detector import RequirementsDetector
from pip_upgrader.packages_detector import PackagesDetector
from pip_upgrader.packages_status_detector import PackagesStatusDetector
# Auto-detect requirements files
detector = RequirementsDetector(None) # None for auto-detection
filenames = detector.get_filenames()
# Parse packages from requirements files
packages_detector = PackagesDetector(filenames)
packages = packages_detector.get_packages()
# Check for available upgrades
status_detector = PackagesStatusDetector(packages)
options = {'--prerelease': False, '-p': []}
packages_status_map = status_detector.detect_available_upgrades(options)
# Run the complete upgrade process programmatically
main() # Uses command-line argumentsThe pip-upgrader follows a modular pipeline architecture with clear separation of concerns:
Main command-line interface providing the pip-upgrade console command with comprehensive options for interactive and automated requirements file upgrading.
def main(): ...
def get_options(): ...Automatic discovery and validation of requirements files in the current directory, with support for explicit file specification and recursive inclusion handling.
class RequirementsDetector:
def __init__(self, requirements_arg): ...
def get_filenames(self): ...
def autodetect_files(self): ...Extraction and parsing of package specifications from requirements files, handling various formats including extras, comments, and pip options.
class PackagesDetector:
def __init__(self, requirements_files): ...
def get_packages(self): ...
def detect_packages(self, requirements_files): ...PyPI API integration for checking package upgrade availability, supporting both JSON API and simple HTML formats, with custom index URL handling.
class PackagesStatusDetector:
def __init__(self, packages, use_default_index=False): ...
def detect_available_upgrades(self, options): ...User interface for selecting packages to upgrade, presenting upgrade information in formatted tables with interactive prompts and pre-selection options.
class PackageInteractiveSelector:
def __init__(self, packages_map, options): ...
def get_packages(self): ...
def ask_for_packages(self): ...Package installation via pip and atomic updating of version numbers in requirements files, with dry-run support and error handling.
class PackagesUpgrader:
def __init__(self, selected_packages, requirements_files, options): ...
def do_upgrade(self): ...Virtual environment detection and validation to ensure packages are installed in the appropriate environment.
def is_virtualenv(): ...
def check_for_virtualenv(options): ...# Package status dictionary returned by PackagesStatusDetector
PackageStatus = {
'name': str, # Package name
'current_version': Version, # Current version from requirements
'latest_version': Version, # Latest available version
'upgrade_available': bool, # Whether upgrade is available
'upload_time': str # Upload timestamp of latest version
}
# Options dictionary from command-line parsing
Options = {
'<requirements_file>': list, # List of requirements file paths
'--prerelease': bool, # Include prerelease versions
'-p': list, # Pre-selected packages
'--dry-run': bool, # Simulate without changes
'--skip-virtualenv-check': bool, # Skip environment validation
'--skip-package-installation': bool, # Only update files
'--use-default-index': bool # Use default PyPI index
}