Scraper haute performance des données d'athlétisme de la FFA depuis athle.fr.
Ce module est la brique d'acquisition de données de l'écosystème MyPacer. Son rôle est de constituer un annuaire local indexable pour contourner les limitations de recherche du site officiel.
Il ne stocke pas les performances (qui sont récupérées en live par l'API), mais construit le référentiel d'identité (Nom, Club, ID FFA) nécessaire pour :
- Permettre une recherche instantanée (auto-complétion).
- Autoriser la recherche floue (trouver un athlète avec une orthographe approximative).
- Normaliser les données des licenciés.
- Python 3.12+
- PostgreSQL 16
- Docker (pour les tests)
# Production
pip install -r requirements.txt
# Développement (inclut tests + qualimétrie)
pip install -r requirements-dev.txtCréer un fichier .env à la racine :
POSTGRES_DEFAULT_DB=postgres
POSTGRES_DB=athle
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres./populate_database.sh./update_database.shpython3 -m tools.analyze_database# Lancer tous les tests
make test
# Tests avec coverage
make coverage
# Voir le rapport HTML
open htmlcov/index.htmlCouverture actuelle : ~54% (objectif : 80%)
Le projet utilise une stack moderne de qualimétrie :
# Formater le code automatiquement
make format
# Vérifier la qualité (linter + type checking)
make lint
# Simuler la CI en local
make ci- black : Formatage automatique du code
- ruff : Linter ultra-rapide (remplace flake8, isort, pylint)
- mypy : Type checking statique
- pytest + pytest-cov : Tests et coverage
- testcontainers : Tests d'intégration avec PostgreSQL
.
├── core/ # Configuration, DB, schéma
│ ├── config.py # Logging et configuration
│ ├── db.py # Connexions PostgreSQL
│ └── schema.sql # Schéma complet (tables, index, triggers)
├── scraper/ # Scrapers
│ ├── list_clubs.py # Scraper des clubs
│ └── list_athletes.py # Scraper des athlètes
├── tools/ # Outils d'analyse
│ └── analyze_database.py
├── tests/ # Tests unitaires (pytest + testcontainers)
└── logs/ # Logs d'exécution
make help # Liste toutes les commandes
make install # Installe les dépendances dev
make test # Lance les tests
make coverage # Tests + rapport coverage HTML
make lint # Vérifie la qualité (ruff + mypy)
make format # Formate le code (black + ruff)
make check # Lint + tests
make ci # Simule la CI en local
make clean # Nettoie les fichiers temporairesdocker-compose up -d postgresdocker-compose up scraperLes logs sont persistés dans ./logs/ sur l'host.
Le projet utilise GitHub Actions pour :
- ✅ Vérifier le formatage (black)
- ✅ Linter le code (ruff)
- ✅ Type checking (mypy)
- ✅ Lancer les tests avec PostgreSQL
- ✅ Générer un rapport de coverage
id: SERIAL PRIMARY KEY (auto-généré)ffa_id: TEXT NOT NULL UNIQUE (identifiant FFA)name: TEXT NOT NULLnormalized_name: TEXT NOT NULL (pour recherche floue)first_year,last_year: INTEGER (période d'activité)created_at,updated_at: TIMESTAMP
id: SERIAL PRIMARY KEY (auto-généré)ffa_id: TEXT NOT NULL UNIQUE (identifiant FFA)license_id: TEXT (numéro de licence, unique si valide)name: TEXT NOT NULLnormalized_name: TEXT NOT NULLbirth_date,sexe,nationality: TEXTcreated_at,updated_at: TIMESTAMP
- Triggers : Mise à jour automatique de
normalized_nameetupdated_at - Extensions :
pg_trgm(recherche floue),unaccent(normalisation) - Index GIN : Recherche trigram sur les noms
- Index partiel : Unicité conditionnelle sur
license_id
- REFACTORING.md - Historique et détails du refactoring du projet
- SETUP_SONARCLOUD.md - Guide de configuration de SonarCloud
- DOCKER_CRON.md - Automatisation avec Supercronic (tâches planifiées)
- Fork le projet
- Crée une branche (
git checkout -b feature/amazing-feature) - Formate ton code (
make format) - Vérifie la qualité (
make check) - Commit tes changements
- Push et ouvre une Pull Request
Ce projet est sous licence MIT.