# CHANGELOG - PriceWatch Toutes les modifications notables du projet sont documentées ici. Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/). --- ## [Non publié] **Dernière mise à jour**: 2026-01-15 ### En cours - Phase 3 : API REST FastAPI (filtres/exports/webhooks) - Phase 4 : Web UI ### Ajouté - Configuration Alembic (env.py, script.py.mako, alembic.ini) - Migration initiale SQLAlchemy (5 tables + indexes) - Commandes CLI DB: `init-db`, `migrate`, `upgrade`, `downgrade` - `docker-compose.yml` PostgreSQL/Redis - `.env.example` avec variables DB/Redis/app - Tests DB de base (models + connection) - Repository `ProductRepository` + `ScrapingPipeline` - Flag CLI `--save-db/--no-db` pour la persistence - Tests repository/pipeline (SQLite) - Test end-to-end CLI + DB (SQLite) - Worker RQ + scheduler (tasks + CLI) - Tests worker/scheduler (SQLite + mocks) - Tests CLI worker/enqueue/schedule + erreur DB (SQLite) - Gestion erreurs Redis (RedisUnavailableError, check_redis_connection) - Messages d'erreur clairs pour Redis down dans CLI (worker, enqueue, schedule) - 7 nouveaux tests pour la gestion des erreurs Redis - Logs d'observabilité pour jobs planifiés (JOB START/OK/FAILED, FETCH, PARSE) - Tests end-to-end worker + DB (Redis/SQLite, skip si Redis down) - Test end-to-end CLI -> DB -> worker (Redis, skip si Redis down) - Guide de migration JSON -> DB - API FastAPI (health/products/prices/logs/enqueue/schedule) + auth token - Docker API + uvicorn - Tests API de base - Docker Compose API: port 8001 et hosts postgres/redis - CRUD API (products/prices/logs) - Filtres avances API (prix, dates, stock, status) - Exports API CSV/JSON (products, prices, logs) - Webhooks API (CRUD + test) - Tests compatibilite `--no-db` (CLI) - Test charge legere 100 snapshots (SQLite) - Nettoyage warnings (Pydantic ConfigDict, datetime UTC, selectors SoupSieve) - Web UI Vue 3 (layout dense, themes, settings) + Docker compose frontend - Web UI: integration API (list produits, edition, enqueue, settings API) - API: endpoints preview/commit scraping pour ajout produit depuis l UI - Web UI: ajout produit par URL avec preview scraping et sauvegarde en base - Web UI: popup ajout produit central + favicon - API: logs Uvicorn exposes pour l UI - Parsing prix: gestion des separateurs de milliers (espace, NBSP, point) - API/DB: description + msrp + images/specs exposes, reduction calculee ### Corrigé - Migration Alembic: down_revision aligne sur 20260114_02 - Amazon: extraction images via data-a-dynamic-image + filtrage logos --- ## [0.3.0] - 2026-01-14 🎉 PHASE 1 TERMINÉE ### ✅ Phase 1 CLI complétée à 100% **Résultat final**: - **295 tests passent** (100% de réussite) - **76% code coverage global** - **4 stores opérationnels** (Amazon, Cdiscount, Backmarket, AliExpress) ### Ajouté #### Corrections et améliorations - **Amazon Store**: Correction extraction images avec fallback générique - **Amazon Store**: Support prix séparés en 2 spans (a-price-whole + a-price-fraction) #### Tests complets ajoutés (177 nouveaux tests) - **tests/core/test_registry.py**: 40 tests (100% coverage) - 24 tests unitaires avec mocks - 16 tests d'intégration avec les 4 stores réels - Tests de détection automatique multi-stores - **tests/core/test_registry_integration.py**: Tests d'intégration stores - Vérification détection correcte pour Amazon, Cdiscount, Backmarket, AliExpress - Tests de priorité et exclusivité des matches - **tests/core/test_io.py**: 36 tests (97% coverage) - Tests ScrapingConfig/ScrapingOptions Pydantic - Tests read_yaml_config avec validation erreurs - Tests write_json_results et read_json_results - Tests save_debug_html et save_debug_screenshot - **tests/scraping/test_http_fetch.py**: 21 tests (100% coverage) - Tests fetch_http avec mocks requests - Tests codes HTTP (200, 403, 404, 429, 500+) - Tests timeout et exceptions réseau - Tests User-Agent rotation et headers personnalisés - **tests/scraping/test_pw_fetch.py**: 21 tests (91% coverage) - Tests fetch_playwright avec mocks Playwright - Tests modes headless/headful - Tests screenshot et wait_for_selector - Tests fetch_with_fallback (stratégie HTTP → Playwright) - Tests cleanup des ressources ### Statistiques détaillées **Coverage par module**: | Module | Coverage | Tests | |--------|----------|-------| | core/schema.py | 100% | 29 | | core/registry.py | 100% | 40 | | core/io.py | 97% | 36 | | scraping/http_fetch.py | 100% | 21 | | scraping/pw_fetch.py | 91% | 21 | | stores/amazon/store.py | 89% | 33 | | stores/aliexpress/store.py | 85% | 32 | | stores/backmarket/store.py | 85% | 25 | | stores/cdiscount/store.py | 72% | 30 | | **TOTAL** | **76%** | **295** | ### Améliorations techniques - Architecture complètement testée avec mocks et fixtures - Tests d'intégration validant le fonctionnement end-to-end - Couverture de code élevée sur tous les modules critiques - Détection automatique de stores validée avec URLs réelles ### Prochaines étapes (Phase 2) Phase 1 CLI est maintenant **production-ready**. La Phase 2 peut démarrer: 1. Base de données PostgreSQL + Alembic 2. Worker Redis/RQ pour scraping planifié 3. API REST FastAPI 4. Web UI responsive avec dark theme Gruvbox --- ## [0.2.0] - 2026-01-13 ### Ajouté #### Tests pytest (Étape 9) - **tests/core/test_schema.py** : 29 tests pour ProductSnapshot - Validation Pydantic (URL, source, prix, shipping) - Serialization/deserialization JSON - Méthodes helper (is_complete, add_error, add_note) - Tests des enums (StockStatus, FetchMethod, DebugStatus) - **tests/core/test_registry.py** : 24 tests pour StoreRegistry - Enregistrement/désenregistrement de stores - Détection automatique avec scores - Gestion des doublons et erreurs - Tests des fonctions globales (singleton) - **tests/stores/test_amazon.py** : 33 tests pour AmazonStore - Tests de match() avec différents domaines Amazon - Tests de canonicalize() (normalisation URL) - Tests de extract_reference() (extraction ASIN) - Tests de parse() avec HTML simplifiés (27/33 passent) #### Validation en production - Test réussi avec URL Amazon réelle (UGREEN Chargeur) - Extraction complète : titre, prix, ASIN, catégorie, images, specs - Pipeline HTTP → Parsing → JSON fonctionnel - 39.98 EUR, 5 images, 14 caractéristiques techniques extraites ### Statistiques - **80 tests passent / 86 tests totaux (93%)** - Configuration pytest complète avec couverture - Tests unitaires pour core et stores - 6 tests nécessitent fixtures HTML réalistes (priorité basse) ### Infrastructure de test - pytest + pytest-cov + pytest-mock configurés - Fixtures et mock stores pour tests unitaires - Configuration dans pyproject.toml - Tests organisés par module ### Prochaines étapes - Fixtures HTML réalistes Amazon/Cdiscount - Tests stores/cdiscount/ - Tests scraping/ avec mocks HTTP/Playwright - Phase 2 : Base de données PostgreSQL --- ## [0.1.0] - 2026-01-13 ### Ajouté #### Documentation - README.md : documentation complète du projet, usage CLI, architecture - TODO.md : liste des tâches priorisées par phase - CHANGELOG.md : ce fichier de suivi des modifications - CLAUDE.md : guide pour futures instances de Claude Code - PROJECT_SPEC.md : spécifications détaillées du projet (français) - .gitignore : configuration pour ignorer fichiers temporaires - scrap_url.yaml : fichier exemple de configuration #### Structure du projet - Architecture modulaire complète : `pricewatch/app/{core,scraping,stores,cli}` - Dossiers pour Amazon et Cdiscount avec fixtures - Dossier `scraped/` pour HTML et screenshots de debug - Configuration pyproject.toml avec toutes les dépendances #### Core (pricewatch/app/core/) - **schema.py** : Modèle Pydantic ProductSnapshot avec validation complète - Enums: StockStatus, FetchMethod, DebugStatus - DebugInfo pour traçabilité - Méthodes: to_dict(), to_json(), is_complete() - **logging.py** : Système de logging coloré avec niveaux configurables - **io.py** : Fonctions lecture YAML et écriture JSON - ScrapingConfig et ScrapingOptions (Pydantic) - Sauvegarde HTML et screenshots de debug - **registry.py** : Registry pour détection automatique des stores - Enregistrement dynamique - Méthode detect_store() avec scores #### Scraping (pricewatch/app/scraping/) - **http_fetch.py** : Récupération HTTP avec requests - Rotation User-Agent - Gestion erreurs (403, 404, 429, timeout) - Logging détaillé (durée, taille, status) - **pw_fetch.py** : Récupération Playwright (fallback anti-bot) - Mode headless/headful - Screenshot optionnel - Timeout configurable - Fonction fetch_with_fallback() (HTTP → Playwright) #### Stores (pricewatch/app/stores/) - **base.py** : Classe abstraite BaseStore - Méthodes: match(), canonicalize(), extract_reference(), parse() - Chargement automatique des sélecteurs depuis YAML - **amazon/store.py** : Implémentation complète AmazonStore - Détection Amazon.fr/Amazon.com - Extraction ASIN - Parsing avec BeautifulSoup - Détection captcha - **amazon/selectors.yml** : Sélecteurs CSS/XPath pour Amazon - **cdiscount/store.py** : Implémentation complète CdiscountStore - Détection Cdiscount.com - Extraction SKU - Support schema.org - **cdiscount/selectors.yml** : Sélecteurs CSS/XPath pour Cdiscount #### CLI (pricewatch/app/cli/) - **main.py** : Application Typer complète avec 5 commandes - `pricewatch run` : Pipeline YAML → JSON - `pricewatch detect` : Détection store depuis URL - `pricewatch fetch` : Test récupération HTTP/Playwright - `pricewatch parse` : Test parsing d'un fichier HTML - `pricewatch doctor` : Vérification installation - Flag --debug global - Affichage avec Rich (tables, couleurs) ### Fonctionnalités - Pipeline complet : lecture YAML → scraping → parsing → écriture JSON - Stratégie fallback automatique : HTTP d'abord, puis Playwright si échec - Détection automatique du store depuis l'URL - Normalisation des URLs vers forme canonique - Extraction des données produit : titre, prix, stock, images, specs - Sauvegarde HTML et screenshots pour debug - Logs détaillés avec timestamps et couleurs - Gestion robuste des erreurs (anti-bot, timeout, parsing) ### Contexte technique - Python 3.12 - Typer + Rich pour le CLI - Pydantic pour validation données - requests + Playwright pour scraping - BeautifulSoup4 + lxml pour parsing HTML - PyYAML pour configuration - pytest pour tests (à venir) ### Justifications techniques principales 1. **HTTP prioritaire** : Beaucoup plus rapide (~1s vs ~10s Playwright) 2. **Sélecteurs externalisés en YAML** : Maintenance facile sans toucher au code 3. **Registry pattern** : Extensibilité (ajouter stores sans modifier le core) 4. **ProductSnapshot canonique** : Structure unifiée pour tous les stores 5. **Logging systématique** : Observabilité cruciale face aux anti-bots 6. **Pas d'optimisation prématurée** : Code simple et lisible ### Prochaines étapes (Phase 2) - Tests pytest avec fixtures HTML - Base de données PostgreSQL + Alembic - Worker et planification (Redis + RQ/Celery) - Web UI responsive avec dark theme Gruvbox - Système d'alertes (baisse prix, retour stock) --- **Format des versions** : [MAJOR.MINOR.PATCH] - MAJOR : changements incompatibles de l'API - MINOR : nouvelles fonctionnalités compatibles - PATCH : corrections de bugs compatibles