134 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			134 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) |