Code source de henrri_connect.utils
"""
Module utilitaire pour les clients Henrri Connect.
Fournit l'ensemble des fonctions utilitaires nécessaires au package ``henrri_connect``.
Functions:
----------
- raise_for_status: Levé une exception appropriée selon le code HTTP de la réponse.
- clean: Nettoie un dictionnaire en supprimant les clés dont la valeur est ``None``.
"""
from __future__ import annotations
import logging
import json
from typing import Any
import httpx
from .exc import (
HenrriAuthError,
HenrriForbiddenError,
HenrriHTTPError,
HenrriNotFoundError,
HenrriServerError,
HenrriValidationError,
)
logger = logging.getLogger(__name__)
[docs]
def raise_for_status(resp: httpx.Response) -> None:
"""Lève une exception appropriée selon le code HTTP de la réponse.
Correspondance des codes HTTP :
- 400 : ``HenrriValidationError``
- 401 : ``HenrriAuthError``
- 403 : ``HenrriForbiddenError``
- 404 : ``HenrriNotFoundError``
- 5xx : ``HenrriServerError``
- Autres : ``HenrriHTTPError``
Tente d'extraire un message d'erreur détaillé depuis la réponse JSON,
ou utilise le texte brut de la réponse si le JSON est invalide.
Args:
resp: La réponse HTTP httpx à analyser.
Raises:
HenrriValidationError: Si le code HTTP est 400.
HenrriAuthError: Si le code HTTP est 401.
HenrriForbiddenError: Si le code HTTP est 403.
HenrriNotFoundError: Si le code HTTP est 404.
HenrriServerError: Si le code HTTP est >= 500.
HenrriHTTPError: Pour tout autre code d'erreur.
"""
if resp.is_success:
return
body = None
try:
body = resp.json()
if isinstance(body, dict):
msg: str = (
body.get("detail")
or body.get("title")
or body.get("message")
or resp.text
)
else:
msg = resp.text or str(body) or f"Erreur HTTP {resp.status_code}"
except json.JSONDecodeError:
msg = resp.text or f"Erreur HTTP {resp.status_code}"
sc = resp.status_code
if sc == 400:
logger.error("Validation error: %s", msg)
raise HenrriValidationError(sc, str(msg), body)
if sc == 401:
logger.error("Authentication error: %s", msg)
raise HenrriAuthError(sc, str(msg), body)
if sc == 403:
logger.error("Forbidden error: %s", msg)
raise HenrriForbiddenError(sc, str(msg), body)
if sc == 404:
logger.error("Not found error: %s", msg)
raise HenrriNotFoundError(sc, str(msg), body)
if sc >= 500:
logger.error("Server error: %s", msg)
raise HenrriServerError(sc, str(msg), body)
logger.error("HTTP error: %s", msg)
raise HenrriHTTPError(sc, str(msg), body)
[docs]
def clean(params: dict[str, Any]) -> dict[str, Any]:
"""
Supprime les valeurs None d'un dictionnaire
Args:
params (dict[str, Any]) : Dictionnaire contenant des valeurs None
Returns:
dict[str, Any]: Dictionnaire sans valeurs None
"""
return {k: v for k, v in params.items() if v is not None}