chore: sync project files
This commit is contained in:
173
CHANGELOG.md
Executable file
173
CHANGELOG.md
Executable file
@@ -0,0 +1,173 @@
|
||||
# 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é]
|
||||
|
||||
### En cours
|
||||
- Ajout de fixtures HTML réalistes pour tests pytest
|
||||
- Tests stores/cdiscount/
|
||||
- Tests scraping/ avec mocks
|
||||
|
||||
---
|
||||
|
||||
## [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
|
||||
Reference in New Issue
Block a user