291 lines
11 KiB
Markdown
Executable File
291 lines
11 KiB
Markdown
Executable File
# 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
|