mirror of
https://github.com/pacnpal/pip-add.git
synced 2025-12-19 19:51:05 -05:00
83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
import os
|
|
from pathlib import Path
|
|
from typing import Optional, List, Tuple
|
|
|
|
def find_requirements(start_dir: Optional[str] = None) -> Tuple[str, List[str]]:
|
|
"""
|
|
Find requirements files by searching up through parent directories.
|
|
Returns tuple of (chosen_file, all_found_files).
|
|
"""
|
|
requirements_files = [
|
|
'requirements.txt',
|
|
'requirements/base.txt',
|
|
'requirements/dev.txt',
|
|
'requirements/development.txt',
|
|
'requirements/prod.txt',
|
|
'requirements/production.txt'
|
|
]
|
|
|
|
if start_dir is None:
|
|
start_dir = os.getcwd()
|
|
|
|
current_dir = Path(start_dir).resolve()
|
|
found_files = []
|
|
|
|
# Search up through parent directories
|
|
while True:
|
|
for req_file in requirements_files:
|
|
req_path = current_dir / req_file
|
|
if req_path.exists():
|
|
found_files.append(str(req_path))
|
|
|
|
# Stop if we found files or reached root
|
|
if found_files or current_dir.parent == current_dir:
|
|
break
|
|
|
|
current_dir = current_dir.parent
|
|
|
|
# If no files found, default to requirements.txt in current directory
|
|
if not found_files:
|
|
default_file = os.path.join(start_dir, 'requirements.txt')
|
|
# Create the requirements directory if needed
|
|
os.makedirs(os.path.dirname(default_file), exist_ok=True)
|
|
# Create an empty requirements file
|
|
if not os.path.exists(default_file):
|
|
with open(default_file, 'w') as f:
|
|
f.write('# Python dependencies\n')
|
|
return default_file, [default_file]
|
|
|
|
# Prefer requirements.txt in the closest directory
|
|
for f in found_files:
|
|
if os.path.basename(f) == 'requirements.txt':
|
|
return f, found_files
|
|
|
|
# Otherwise take the first found file
|
|
return found_files[0], found_files
|
|
|
|
def add_to_requirements(package_name: str, version: str, requirements_file: str) -> None:
|
|
"""Add or update package in requirements file"""
|
|
requirement_line = f"{package_name}=={version}\n"
|
|
|
|
try:
|
|
with open(requirements_file, 'r') as f:
|
|
requirements = f.readlines()
|
|
except FileNotFoundError:
|
|
requirements = []
|
|
|
|
# Check if package exists and update it
|
|
package_exists = False
|
|
for i, line in enumerate(requirements):
|
|
if line.strip() and package_name == line.split('==')[0].strip():
|
|
requirements[i] = requirement_line
|
|
package_exists = True
|
|
break
|
|
|
|
# Add package if it doesn't exist
|
|
if not package_exists:
|
|
requirements.append(requirement_line)
|
|
|
|
# Create directory if it doesn't exist
|
|
os.makedirs(os.path.dirname(os.path.abspath(requirements_file)), exist_ok=True)
|
|
|
|
with open(requirements_file, 'w') as f:
|
|
f.writelines(requirements) |