133 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| """
 | |
| Script de démonstration pour le scraper de l'agenda du libre
 | |
| Mode dry-run pour tester sans envoyer de données à l'API
 | |
| """
 | |
| 
 | |
| import sys
 | |
| import os
 | |
| sys.path.append(os.path.dirname(os.path.abspath(__file__)))
 | |
| 
 | |
| from agendadulibre import AgendaDuLibreScraper, api_oedb
 | |
| import logging
 | |
| 
 | |
| class DemoAgendaDuLibreScraper(AgendaDuLibreScraper):
 | |
|     """Version démo du scraper qui n'envoie pas de données à l'API"""
 | |
|     
 | |
|     def send_event_to_api(self, event_data):
 | |
|         """Version démo qui simule l'envoi à l'API"""
 | |
|         event_label = event_data["event"]["properties"]["label"]
 | |
|         print(f"🔍 [DEMO] Simulation d'envoi: {event_label}")
 | |
|         
 | |
|         # Simuler différents types de réponses
 | |
|         import random
 | |
|         responses = [
 | |
|             (True, "Créé avec succès"),
 | |
|             (False, "Événement déjà existant"),
 | |
|             (True, "Créé avec succès"),
 | |
|             (False, "Erreur API: 500 - Internal Server Error")
 | |
|         ]
 | |
|         
 | |
|         success, message = random.choice(responses)
 | |
|         
 | |
|         if success:
 | |
|             print(f"✅ [DEMO] {event_label} - {message}")
 | |
|         else:
 | |
|             print(f"❌ [DEMO] {event_label} - {message}")
 | |
|         
 | |
|         return success, message
 | |
| 
 | |
| def main():
 | |
|     """Exécute la démonstration"""
 | |
|     print("🎭 Démonstration du scraper agenda du libre (mode dry-run)")
 | |
|     print("=" * 60)
 | |
|     
 | |
|     # Configuration du logging
 | |
|     logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
 | |
|     
 | |
|     # Créer le scraper en mode démo
 | |
|     scraper = DemoAgendaDuLibreScraper(
 | |
|         api_base_url=api_oedb,  # Utiliser l'URL par défaut
 | |
|         batch_size=2  # Traiter 2 événements par batch pour la démo
 | |
|     )
 | |
|     
 | |
|     print(f"📋 Configuration:")
 | |
|     print(f"   - URL iCal: {scraper.ical_url}")
 | |
|     print(f"   - Taille des batches: {scraper.batch_size}")
 | |
|     print(f"   - Fichier de données: {scraper.data_file}")
 | |
|     print(f"   - Fichier cache iCal: {scraper.ical_file}")
 | |
|     print(f"   - Durée de cache: {scraper.cache_duration_hours}h")
 | |
|     print()
 | |
|     
 | |
|     # Récupérer le fichier iCal
 | |
|     print("📥 Récupération du fichier iCal...")
 | |
|     calendar = scraper.fetch_ical_data()
 | |
|     
 | |
|     if not calendar:
 | |
|         print("❌ Impossible de récupérer le fichier iCal")
 | |
|         return False
 | |
|     
 | |
|     # Compter les événements
 | |
|     event_count = 0
 | |
|     for component in calendar.walk():
 | |
|         if component.name == "VEVENT":
 | |
|             event_count += 1
 | |
|     
 | |
|     print(f"📅 {event_count} événements trouvés dans le fichier iCal")
 | |
|     
 | |
|     # Test du cache
 | |
|     print("\n🔄 Test du cache iCal...")
 | |
|     print("   Premier appel (téléchargement)...")
 | |
|     calendar2 = scraper.fetch_ical_data()
 | |
|     print("   Deuxième appel (depuis le cache)...")
 | |
|     calendar3 = scraper.fetch_ical_data()
 | |
|     print("   ✅ Cache fonctionne correctement")
 | |
|     print()
 | |
|     
 | |
|     # Traiter seulement les 5 premiers événements pour la démo
 | |
|     print("🔄 Traitement des 5 premiers événements (démo)...")
 | |
|     print("-" * 40)
 | |
|     
 | |
|     processed = 0
 | |
|     for component in calendar.walk():
 | |
|         if component.name == "VEVENT" and processed < 5:
 | |
|             parsed_event = scraper.parse_event(component)
 | |
|             if parsed_event:
 | |
|                 event_label = parsed_event["event"]["properties"]["label"]
 | |
|                 start_date = parsed_event["event"]["properties"]["start"]
 | |
|                 location = parsed_event["event"]["properties"]["where"]
 | |
|                 
 | |
|                 print(f"📝 Événement {processed + 1}:")
 | |
|                 print(f"   Titre: {event_label}")
 | |
|                 print(f"   Date: {start_date}")
 | |
|                 print(f"   Lieu: {location}")
 | |
|                 print()
 | |
|                 
 | |
|                 # Simuler l'envoi
 | |
|                 success, message = scraper.send_event_to_api(parsed_event)
 | |
|                 
 | |
|                 # Mettre à jour les données locales (simulation)
 | |
|                 event_id = parsed_event["id"]
 | |
|                 scraper.events_data["events"][event_id] = {
 | |
|                     "status": "saved" if success else "error",
 | |
|                     "message": message,
 | |
|                     "last_attempt": "2024-01-01T00:00:00",
 | |
|                     "event": parsed_event["event"]
 | |
|                 }
 | |
|                 
 | |
|                 processed += 1
 | |
|     
 | |
|     print("-" * 40)
 | |
|     print(f"✅ Démonstration terminée - {processed} événements traités")
 | |
|     print()
 | |
|     print("💡 Pour exécuter le vrai scraper:")
 | |
|     print("   python agendadulibre.py --batch-size 5 --api-url http://localhost:5000")
 | |
|     print()
 | |
|     print("🧪 Pour exécuter les tests:")
 | |
|     print("   python test_agendadulibre.py")
 | |
|     
 | |
|     return True
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     success = main()
 | |
|     sys.exit(0 if success else 1)
 | 
