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)
|