11 KiB
Executable File
11 KiB
Executable File
CHANGELOG - PriceWatch
Toutes les modifications notables du projet sont documentées ici.
Le format est basé sur Keep a Changelog.
[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.ymlPostgreSQL/Redis.env.exampleavec variables DB/Redis/app- Tests DB de base (models + connection)
- Repository
ProductRepository+ScrapingPipeline - Flag CLI
--save-db/--no-dbpour 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:
- Base de données PostgreSQL + Alembic
- Worker Redis/RQ pour scraping planifié
- API REST FastAPI
- 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 → JSONpricewatch detect: Détection store depuis URLpricewatch fetch: Test récupération HTTP/Playwrightpricewatch parse: Test parsing d'un fichier HTMLpricewatch 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
- HTTP prioritaire : Beaucoup plus rapide (~1s vs ~10s Playwright)
- Sélecteurs externalisés en YAML : Maintenance facile sans toucher au code
- Registry pattern : Extensibilité (ajouter stores sans modifier le core)
- ProductSnapshot canonique : Structure unifiée pour tous les stores
- Logging systématique : Observabilité cruciale face aux anti-bots
- 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