#!/bin/bash # lib/steps/python_env.sh — venv + pip install editable step_python_env() { print_section "Python Environment" log_step "Virtual environment + dependencies" 3 $TOTAL_STEPS _create_venv _pip_install } _create_venv() { if [ -d "$HV_VENV" ]; then log_warn "venv ya existe: ${HV_VENV}" if ask_confirm "Recrear venv?"; then rm -rf "$HV_VENV" else log_skip "venv existente conservado" source "$HV_VENV/bin/activate" return 0 fi fi start_spinner "Creando virtual environment (${PYTHON_BIN})..." "$PYTHON_BIN" -m venv "$HV_VENV" stop_spinner "venv creado → ${HV_VENV}" source "$HV_VENV/bin/activate" start_spinner "Actualizando pip..." pip install --quiet --upgrade pip stop_spinner "pip actualizado" } _pip_install() { source "$HV_VENV/bin/activate" # Fix: la GUI puede pedir core==2.3.4 pero core puede ser 2.3.x if [ -f "$HV_GUI/pyproject.toml" ]; then sed -i 's/sp-hydra-veil-core == [0-9.]*/sp-hydra-veil-core >= 2.3.0/' \ "$HV_GUI/pyproject.toml" 2>/dev/null || true fi # Orden de instalación: dependencias primero for name in essentials core cli gui; do local dir case "$name" in essentials) dir="$HV_ESSENTIALS" ;; core) dir="$HV_CORE" ;; cli) dir="$HV_CLI" ;; gui) dir="$HV_GUI" ;; esac if [ ! -d "$dir" ]; then log_warn "${name} no encontrado en ${dir} — omitiendo" continue fi start_spinner "Instalando ${name} (editable)..." if pip install --quiet -e "$dir" 2>/tmp/pip_err_${name}; then stop_spinner "${name} instalado" else stop_spinner log_error "pip install falló para ${name}:" tail -5 /tmp/pip_err_${name} exit 1 fi done }