CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-pip-upgrader

An interactive pip requirements upgrader that also updates the version in your requirements.txt file

Pending
Overview
Eval results
Files

requirements-detection.mddocs/

Requirements Detection

Automatic discovery and validation of requirements files in the current directory, with support for explicit file specification and recursive inclusion handling.

Capabilities

Requirements File Discovery

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
        """

Auto-Detection

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).
    """

Explicit File Detection

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
    """

File Validation

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
    """

Recursive Inclusions

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
    """

Auto-Detection Patterns

Current Directory Files

requirements.txt      # Primary pattern
requirements.pip      # Alternative extension

Requirements Directory

requirements/
├── base.txt          # Detected
├── dev.txt           # Detected  
├── production.txt    # Detected
├── test.pip          # Detected
└── README.md         # Ignored (wrong extension)

Recursive Inclusions

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.0

When requirements/dev.txt is detected, the detector will automatically include requirements/base.txt as well.

Usage Examples

Auto-Detection

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', ...]

Explicit Files

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 found

File Validation

from 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

Error Handling

  • Invalid files: Prints error message "Invalid requirements file: {filename}" for files that fail validation
  • Missing inclusions: Silently skips -r inclusions that point to non-existent files
  • Circular inclusions: Prevents infinite loops by checking for duplicates before adding files
  • Permission errors: File reading errors are handled gracefully during validation

File Format Support

Supported Extensions

  • .txt files
  • .pip files

Supported Content

  • Standard pip requirements format
  • Comments (lines starting with #)
  • Recursive inclusions (-r filename)
  • Package extras (package[extra1,extra2]==1.0.0)
  • Various pip options (filtered out during parsing)

Unsupported Content

  • Binary files
  • Files with unsupported MIME types
  • Directory paths (only files are accepted)

Install with Tessl CLI

npx tessl i tessl/pypi-pip-upgrader

docs

cli-interface.md

environment-validation.md

index.md

interactive-selection.md

package-parsing.md

package-upgrading.md

requirements-detection.md

status-detection.md

tile.json