An interactive pip requirements upgrader that also updates the version in your requirements.txt file
—
Automatic discovery and validation of requirements files in the current directory, with support for explicit file specification and recursive inclusion handling.
Discovers and validates requirements files either through auto-detection in the current directory or from explicit file arguments.
class RequirementsDetector:
def __init__(self, requirements_arg):
"""
Initialize requirements detector.
Args:
requirements_arg (list or None): List of explicit requirements file paths,
or None for auto-detection
"""
def get_filenames(self):
"""
Returns a list of all detected valid requirements files.
Returns:
list: List of requirements file paths that were validated
"""Automatically discovers requirements files in the current working directory using common naming patterns.
def autodetect_files(self):
"""
Attempt to detect requirements files in the current working directory.
Detection patterns:
- requirements.txt in current directory
- requirements.pip in current directory
- All .txt and .pip files in requirements/ subdirectory
Also processes recursive inclusions (-r statements).
"""Validates explicitly provided requirements file paths and processes them for inclusions.
def detect_files(self, requirements_arg):
"""
Validate and process explicitly provided requirements files.
Args:
requirements_arg (list): List of requirements file paths to validate
Side effects:
Prints error messages for invalid files
Populates self.filenames with valid files
"""Static method to validate whether a file is a proper requirements file.
@staticmethod
def _is_valid_requirements_file(filename):
"""
Check if a file is a valid requirements file.
Args:
filename (str): Path to file to validate
Returns:
bool: True if file is valid requirements file
Validation criteria:
- File extension is .txt or .pip
- File exists and is readable
- MIME type is text/plain or None
"""The detector handles recursive -r inclusions commonly used in requirements files:
def _check_inclusions_recursively(self):
"""
Check all detected files for -r inclusions and add them recursively.
"""
def _detect_inclusion(self, filename):
"""
Detect -r inclusions in a specific requirements file.
Args:
filename (str): Requirements file to scan for inclusions
Processing:
- Parses lines starting with '-r '
- Resolves relative paths based on including file's directory
- Recursively processes included files for further inclusions
- Avoids duplicate inclusions
"""requirements.txt # Primary pattern
requirements.pip # Alternative extensionrequirements/
├── base.txt # Detected
├── dev.txt # Detected
├── production.txt # Detected
├── test.pip # Detected
└── README.md # Ignored (wrong extension)Requirements files can include other files using -r statements:
# requirements/base.txt
django==3.2.0
requests==2.25.1
# requirements/dev.txt
-r base.txt
pytest==6.2.4
black==21.5.4
# requirements/production.txt
-r base.txt
gunicorn==20.1.0When requirements/dev.txt is detected, the detector will automatically include requirements/base.txt as well.
from pip_upgrader.requirements_detector import RequirementsDetector
# Auto-detect requirements files in current directory
detector = RequirementsDetector(None)
filenames = detector.get_filenames()
print(filenames) # ['requirements.txt', 'requirements/dev.txt', ...]from pip_upgrader.requirements_detector import RequirementsDetector
# Specify explicit requirements files
files = ['requirements.txt', 'requirements/production.txt']
detector = RequirementsDetector(files)
filenames = detector.get_filenames()
print(filenames) # Includes any -r inclusions foundfrom pip_upgrader.requirements_detector import RequirementsDetector
# Check if a file is a valid requirements file
is_valid = RequirementsDetector._is_valid_requirements_file('requirements.txt')
print(is_valid) # True if valid-r inclusions that point to non-existent files.txt files.pip filesInstall with Tessl CLI
npx tessl i tessl/pypi-pip-upgrader