- Frontend v4 accessible sur réseau local (192.168.1.40) - Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard) - Ollama GPU fonctionnel - Self-healing interactif - Dashboard confiance Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
145 lines
4.2 KiB
Bash
Executable File
145 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# Script de validation des imports pour la CI.
|
||
#
|
||
# Valide que:
|
||
# 1. Aucun import circulaire n'existe
|
||
# 2. Les interfaces abstraites sont correctes
|
||
# 3. Les lazy imports fonctionnent
|
||
# 4. Les composants critiques sont importables
|
||
#
|
||
# Auteur: Dom, Alice Kiro
|
||
# Date: 20 décembre 2024
|
||
|
||
set -e # Arrêter en cas d'erreur
|
||
|
||
echo "🔍 Validation des imports RPA Vision V3..."
|
||
|
||
# Couleurs pour l'affichage
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Fonction pour afficher les erreurs
|
||
error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
exit 1
|
||
}
|
||
|
||
# Fonction pour afficher les succès
|
||
success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
# Fonction pour afficher les infos
|
||
info() {
|
||
echo -e "${YELLOW}ℹ️ $1${NC}"
|
||
}
|
||
|
||
# Vérifier que nous sommes dans le bon répertoire
|
||
if [ ! -f "validate_circular_imports.py" ]; then
|
||
error "Script validate_circular_imports.py non trouvé. Exécuter depuis la racine du projet."
|
||
fi
|
||
|
||
# 1. Validation des imports circulaires
|
||
info "Étape 1: Validation des imports circulaires..."
|
||
python3 validate_circular_imports.py || error "Imports circulaires détectés"
|
||
success "Aucun import circulaire détecté"
|
||
|
||
# 2. Tests unitaires des imports
|
||
info "Étape 2: Tests unitaires des imports..."
|
||
python3 -m pytest tests/unit/test_circular_imports.py -v -q || error "Tests unitaires des imports échoués"
|
||
success "Tests unitaires des imports réussis"
|
||
|
||
# 3. Tests de propriété
|
||
info "Étape 3: Tests de propriété des imports..."
|
||
python3 -m pytest tests/property/test_circular_imports_property.py -v -q || error "Tests de propriété échoués"
|
||
success "Tests de propriété réussis"
|
||
|
||
# 4. Validation de la structure des imports
|
||
info "Étape 4: Validation de la structure des imports..."
|
||
python3 -c "
|
||
import sys
|
||
sys.path.insert(0, '.')
|
||
|
||
# Test des imports de base
|
||
from core.models import RawSession, ScreenState, UIElement
|
||
from core.models import get_workflow, get_action, get_target_spec
|
||
from core.interfaces import ITargetResolver, IActionExecutor, IErrorHandler
|
||
|
||
# Test des lazy imports
|
||
Workflow = get_workflow()
|
||
Action = get_action()
|
||
TargetSpec = get_target_spec()
|
||
|
||
# Vérifier que les interfaces sont abstraites
|
||
import inspect
|
||
assert inspect.isabstract(ITargetResolver)
|
||
assert inspect.isabstract(IActionExecutor)
|
||
assert inspect.isabstract(IErrorHandler)
|
||
|
||
print('Structure des imports validée')
|
||
" || error "Structure des imports invalide"
|
||
success "Structure des imports validée"
|
||
|
||
# 5. Validation que TYPE_CHECKING fonctionne
|
||
info "Étape 5: Validation TYPE_CHECKING..."
|
||
python3 -c "
|
||
from typing import TYPE_CHECKING
|
||
import core.models as models
|
||
|
||
# Vérifier que les imports conditionnels ne sont pas disponibles à l'exécution
|
||
assert not hasattr(models, 'Workflow')
|
||
assert not hasattr(models, 'Action')
|
||
|
||
# Mais que les lazy imports sont disponibles
|
||
assert hasattr(models, 'get_workflow')
|
||
assert hasattr(models, 'get_action')
|
||
|
||
print('TYPE_CHECKING fonctionne correctement')
|
||
" || error "TYPE_CHECKING ne fonctionne pas correctement"
|
||
success "TYPE_CHECKING validé"
|
||
|
||
# 6. Test de performance des imports
|
||
info "Étape 6: Test de performance des imports..."
|
||
python3 -c "
|
||
import time
|
||
import sys
|
||
sys.path.insert(0, '.')
|
||
|
||
start_time = time.time()
|
||
|
||
# Importer les modules de base
|
||
from core.models import RawSession, ScreenState, UIElement
|
||
from core.interfaces import ITargetResolver, IActionExecutor, IErrorHandler
|
||
|
||
# Utiliser les lazy imports
|
||
from core.models import get_workflow, get_action
|
||
Workflow = get_workflow()
|
||
Action = get_action()
|
||
|
||
end_time = time.time()
|
||
import_time = end_time - start_time
|
||
|
||
print(f'Temps d\'import: {import_time:.3f}s')
|
||
|
||
# Vérifier que les imports sont rapides (< 1 seconde)
|
||
if import_time > 1.0:
|
||
print(f'ATTENTION: Imports lents ({import_time:.3f}s)')
|
||
exit(1)
|
||
else:
|
||
print('Performance des imports acceptable')
|
||
" || error "Imports trop lents"
|
||
success "Performance des imports acceptable"
|
||
|
||
echo ""
|
||
echo -e "${GREEN}🎉 Validation des imports complète!${NC}"
|
||
echo ""
|
||
echo "Résumé:"
|
||
echo " ✅ Aucun import circulaire"
|
||
echo " ✅ Interfaces abstraites correctes"
|
||
echo " ✅ Lazy imports fonctionnels"
|
||
echo " ✅ TYPE_CHECKING configuré"
|
||
echo " ✅ Performance acceptable"
|
||
echo ""
|
||
echo -e "${GREEN}Le système respecte les bonnes pratiques d'imports Python.${NC}" |