#!/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}"