This commit is contained in:
Gilles Soulier
2026-01-14 21:54:55 +01:00
parent c91c0f1fc9
commit d0b73b9319
140 changed files with 5822 additions and 161 deletions

View File

@@ -9,7 +9,7 @@ from datetime import datetime
from enum import Enum
from typing import Optional
from pydantic import BaseModel, Field, HttpUrl, field_validator
from pydantic import BaseModel, ConfigDict, Field, HttpUrl, field_validator
class StockStatus(str, Enum):
@@ -38,6 +38,8 @@ class DebugStatus(str, Enum):
class DebugInfo(BaseModel):
"""Informations de debug pour tracer les problèmes de scraping."""
model_config = ConfigDict(use_enum_values=True)
method: FetchMethod = Field(
description="Méthode utilisée pour la récupération (http ou playwright)"
)
@@ -55,9 +57,6 @@ class DebugInfo(BaseModel):
default=None, description="Taille du HTML récupéré en octets"
)
class Config:
use_enum_values = True
class ProductSnapshot(BaseModel):
"""
@@ -81,6 +80,7 @@ class ProductSnapshot(BaseModel):
# Données produit principales
title: Optional[str] = Field(default=None, description="Nom du produit")
price: Optional[float] = Field(default=None, description="Prix du produit", ge=0)
msrp: Optional[float] = Field(default=None, description="Prix conseille", ge=0)
currency: str = Field(default="EUR", description="Devise (EUR, USD, etc.)")
shipping_cost: Optional[float] = Field(
default=None, description="Frais de port", ge=0
@@ -94,6 +94,7 @@ class ProductSnapshot(BaseModel):
default=None, description="Référence produit (ASIN, SKU, etc.)"
)
category: Optional[str] = Field(default=None, description="Catégorie du produit")
description: Optional[str] = Field(default=None, description="Description produit")
# Médias
images: list[str] = Field(
@@ -133,20 +134,22 @@ class ProductSnapshot(BaseModel):
"""Filtre les URLs d'images vides."""
return [url.strip() for url in v if url and url.strip()]
class Config:
use_enum_values = True
json_schema_extra = {
model_config = ConfigDict(
use_enum_values=True,
json_schema_extra={
"example": {
"source": "amazon",
"url": "https://www.amazon.fr/dp/B08N5WRWNW",
"fetched_at": "2026-01-13T10:30:00Z",
"title": "Exemple de produit",
"price": 299.99,
"msrp": 349.99,
"currency": "EUR",
"shipping_cost": 0.0,
"stock_status": "in_stock",
"reference": "B08N5WRWNW",
"category": "Electronics",
"description": "Chargeur USB-C multi-ports.",
"images": [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
@@ -165,7 +168,8 @@ class ProductSnapshot(BaseModel):
"html_size_bytes": 145000,
},
}
}
},
)
def to_dict(self) -> dict:
"""Serialize vers un dictionnaire Python natif."""