Files
scrap/CHANGELOG.md
Gilles Soulier 740c3d7516 before claude
2026-01-18 06:26:17 +01:00

12 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.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: exposition des champs Amazon enrichis (note, badge, stock texte, modele)
  • Web UI: carte produit analytique avec resume, historique plein format et actions compactes
  • Web UI: slider colonnes responsive + modal ajout produit scrollable avec footer sticky

Corrigé

  • Migration Alembic: down_revision aligne sur 20260114_02
  • Amazon: extraction images via data-a-dynamic-image + filtrage logos
  • API: suppression du calcul automatique des reductions (valeurs explicites uniquement)

[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