Aller au contenu

Inspection et Débogage

Apprise inclut un petit ensemble d’utilitaires d’inspection qui permettent à votre application de découvrir ce qui est pris en charge à l’exécution et de capturer une sortie de diagnostic sans reprendre la configuration globale de journalisation. Les points d’entrée les plus importants sont Apprise.details() et Apprise.json(), conçus pour des outils dynamiques comme les générateurs d’URL, les assistants de configuration, les interfaces d’administration et les pipelines de validation.

Les deux méthodes renvoient les mêmes données : la version d’Apprise, la configuration AppriseAsset active (icônes, thèmes, masques) et tous les schémas (plugins) connus d’Apprise, y compris les modèles de construction d’URL et les métadonnées de jetons permettant de construire dynamiquement une URL Apprise correcte. La différence se situe au niveau du type de retour : details() renvoie un dictionnaire Python brut, tandis que json() renvoie une chaîne JSON sérialisée (ou écrit dans un fichier).

Apprise.details() renvoie un dictionnaire décrivant tous les services de notification pris en charge. Utilisez-le lorsque vous devez manipuler les données de manière programmatique en Python.

apobj.details(
lang=None, # Tag de langue BCP 47, ex. "fr" ou "de"
show_requirements=False, # Inclure les dépendances propres à chaque plugin
show_disabled=False, # Inclure les plugins actuellement indisponibles
)
import apprise
# Instancier Apprise
apobj = apprise.Apprise()
# Produire la liste des détails
info: dict = apobj.details()

Certains schémas peuvent être présents mais inutilisables parce que des dépendances optionnelles manquent. Si vous construisez une interface, vous voudrez généralement les afficher comme « disponibles, mais actuellement désactivés », avec la raison correspondante. Cette raison peut venir de paquets non installés, de l’environnement ou d’une désactivation manuelle par un administrateur. Par défaut show_disabled=False, donc pour voir cette liste il faut l’activer explicitement.

import apprise
apobj = apprise.Apprise()
# Inclure les services existants mais actuellement inutilisables
info: dict = apobj.details(show_disabled=True)

Vous pouvez vous attendre à trouver ces clés de premier niveau :

  • version : la version de la bibliothèque Apprise ;
  • asset : les paramètres AppriseAsset actifs ;
  • schemas : la liste de tous les schémas pris en charge, une entrée par plugin.

Le contenu de asset est produit par AppriseAsset.details() et contient actuellement :

  • app_id
  • app_desc
  • default_extension
  • theme
  • image_path_mask
  • image_url_mask
  • image_url_logo

Ces valeurs sont importantes pour les clients qui souhaitent afficher des icônes, montrer un en-tête personnalisé ou lier le bon logo et les bons assets de thème. Plus d’informations sont disponibles ici.

Chaque entrée de schéma décrit un plugin, comme discord, mailto, slack, etc. Une entrée contient généralement :

  • un nom lisible (service_name) ;
  • des informations de protocole (variantes sécurisées et non sécurisées) ;
  • des modèles de construction d’URL ;
  • des métadonnées de jetons pour les composants d’URL et les paramètres de requête ;
  • les dépendances nécessaires (paquets obligatoires ou recommandés).

La partie « construction d’URL » est générée par l’assistant d’inspection apprise.plugins.details(plugin), qui renvoie une structure avec les clés suivantes :

  • templates
  • tokens
  • args
  • kwargs

templates est une liste de modèles d’URL pris en charge par le plugin, exprimés avec des espaces réservés {token}. Ces modèles servent à l’affichage et aux outils, par exemple pour :

  • montrer des exemples dans votre interface ;
  • piloter un assistant qui ne demande que les jetons utiles au modèle choisi ;
  • valider qu’une URL construite correspond à au moins un modèle.

Les modèles proviennent directement de l’attribut templates de chaque plugin.

La partie la plus utile des détails de schéma réside dans les métadonnées des jetons. Apprise génère une structure cohérente et prévisible, même lorsque des plugins omettent des champs optionnels. Cette normalisation est gérée en interne pour que les outils clients puissent compter sur des clés stables.

Les jetons sont répartis en trois groupes :

  • tokens : chemin, hôte, authentification et autres éléments « cœur » servant à initialiser le plugin ;
  • args : arguments de chaîne de requête (options normales du plugin) ;
  • kwargs : arguments dynamiques clé/valeur, où l’utilisateur fournit à la fois le nom de l’argument et sa valeur.

Apprise injecte automatiquement un jeton schema, toujours requis. Ses valeurs proviennent des paramètres secure_protocol et protocol du plugin. C’est ainsi qu’un outil peut afficher par exemple les variantes http et https lorsqu’elles existent.

Après normalisation, vous pouvez généralement compter sur la présence des champs suivants :

CléDescription
nameLibellé lisible (prend le nom du jeton par défaut s’il manque).
map_toArgument du plugin ciblé par ce jeton (prend le nom du jeton par défaut).
typeType de jeton (par défaut string). Prend aussi list:* et choice:*.
requiredVaut False par défaut si non précisé.
privateVaut False par défaut si non précisé.
defaultPeut être présent, y compris rempli automatiquement s’il n’existe qu’un choix.
valuesPour les jetons choice:* et certains autres champs contraints.
delimPour les jetons list:* (la valeur par défaut varie selon le contexte).
regexRegex de validation facultative, normalisée en paire (pattern, flags).
groupPour les alias de liste qui mappent plusieurs champs sous-jacents.

Apprise assigne des délimiteurs par défaut différents selon l’emplacement du jeton :

  • tokens (listes orientées chemin) utilisent / par défaut ;
  • args et kwargs (listes orientées requête) utilisent , et espace.

Cela compte lorsque votre interface doit expliquer comment saisir plusieurs destinataires, canaux ou cibles.

Si plusieurs noms de jetons pointent vers le même argument via map_to, Apprise peut exposer un champ group pour les types liste, afin qu’un outil puisse montrer qu’un jeton liste agit comme alias pour plusieurs entrées liées.

Dépendances et indices d’installation (requirements)

Section intitulée « Dépendances et indices d’installation (requirements) »

Apprise peut aussi renvoyer les détails de dépendance par plugin via apprise.plugins.requirements(plugin).

La structure inclut :

  • details : court message lisible, rempli automatiquement si le plugin n’en fournit pas ;
  • packages_required : liste des paquets obligatoires (chaînes de dépendance pip) ;
  • packages_recommended : liste des paquets recommandés.

C’est la partie à afficher lorsqu’un plugin apparaît dans details(show_disabled=True) mais ne peut pas être activé tant que ses dépendances ne sont pas installées.

Utiliser details() pour construire un assistant d’URL

Section intitulée « Utiliser details() pour construire un assistant d’URL »

Une approche pratique qui fonctionne bien :

  1. Laisser l’utilisateur choisir un service dans schemas via service_name.
  2. Afficher les templates disponibles pour ce service.
  3. Une fois un modèle choisi, identifier chaque {token} du modèle et demander les champs correspondants dans tokens.
  4. Proposer la configuration facultative via args (et kwargs seulement si présent).
  5. Respecter private=True en masquant les champs et sans jamais réafficher leur valeur en clair.
  6. Respecter type pour rendre les bons widgets :
    • bool : case à cocher
    • choice:* : liste déroulante basée sur values
    • int/float : champ numérique avec min/max si présents
    • list:* : saisie multiple avec aide sur le délimiteur tirée de delim

Pour le débogage programmatique, Apprise fournit LogCapture, un gestionnaire de contexte qui intercepte la sortie de journal pendant la durée d’un bloc. C’est souvent préférable à une modification globale des handlers de journalisation Python.

import apprise
apobj = apprise.Apprise()
apobj.add("mailto://user:pass@example.com")
# Capturer tous les logs (INFO et plus) en mémoire
with apprise.LogCapture(level=apprise.logging.INFO) as output:
apobj.notify(title="Bonjour", body="Monde")
# 'output' est un objet StringIO
print("Logs capturés :")
print(output.getvalue())

Vous pouvez aussi diriger les logs vers un fichier temporaire ou persistant.

import apprise
apobj = apprise.Apprise()
with apprise.LogCapture(path="/var/log/apprise.log", delete=False) as fp:
apobj.notify(title="Système", body="Crash détecté")

Vous pouvez injecter un format personnalisé dans le flux de log afin d’afficher directement les logs dans une page web.

import apprise
fmt = (
"<li>"
"<span class=\"time\">%(asctime)s</span> "
"<span class=\"lvl\">%(levelname)s</span> "
"<span class=\"msg\">%(message)s</span>"
"</li>"
)
apobj = apprise.Apprise()
with apprise.LogCapture(fmt=fmt) as logs:
apobj.notify(title="Test", body="Message")
# Récupérer la chaîne HTML
html: str = f"<ul>{logs.getvalue()}</ul>"

Si vous intégrez Apprise dans une autre bibliothèque ou un autre service :

  • préférez json() lorsque vous avez besoin d’une charge utile JSON (réponses API, dumps fichier) ;
  • préférez details() lorsque vous avez besoin du dictionnaire brut pour un traitement ultérieur, par exemple construire une interface ou inspecter des métadonnées de plugins ;
  • préférez LogCapture dans les tests et le diagnostic afin de montrer des erreurs utiles aux utilisateurs sans leur imposer de reconfigurer la journalisation globale.
Questions ou commentaires ?

Documentation

Vous avez repéré une faute de frappe ou une erreur ? Signalez-la ou proposez une correction .

Problèmes Techniques

Vous rencontrez un problème avec le code ? Ouvrez un ticket sur GitHub :

Conçu avec amour depuis le Canada