Hello tout le monde :-)
Salut Gontran :-)

Je partage les 2 limitations que tu rencontres mais je ne suis que partiellement d'accord sur la solution que tu apportes à la première limitation.
Je m'explique :

Ce qui semble poser problème c'est la présentation à l'écran des erreurs (l'indentation). Maintenant il faut faire attention à une chose : le contenu de l'erreur est différente de sa présentation à l'écran.

Pour moi les niveaux qu'on avait choisit au départ sont bons : QUIET, ERROR, WARNING, INFO, DETAIL, FULL. Un niveau 1,2,3,..., N n'a aucun sens du point de vue de l'utilisateur car il ne sait pas à l'avance ce qu'il va rencontrer comme message. Je ne vois pas comment un utilisateur peut utiliser Ncooker -v4 <command> plutôt que Ncooker -v3. Le seul sens que ça à c'est au niveau visuel : je veux 3 indentations ou 4 car je sais que j'aurais plus ou moins d'infos.

Pour moi ce qui intéresse l'utilisateur c'est le contenu de l'info. Après c'est à nous de faire en sorte qu'elle soit affichée correctement. Avec QUIET, ERROR, WARNING, DETAIL, FULL on couvre tous les besoins amha. C'est à nous de choisir pour chaque message dans quelle catégorie il est et comment l'afficher selon le context où il est utilisé.

Quand on regarde les exemples que tu donnes (ils sont très bons amha) on voit qu'une même indentation peut correspondre à 2 choses en fait :
soit c'est un message de verbosité supérieur comme ici :

Checking build file ...                         <-- Verbosité DETAIL
           Getting file content ...             <-- Verbosité FULL
           Checking syntax ...                 <-- Verbosité FULL    
           Checking do_preconfig function ...  <-- Verbosité FULL
            Checking do_config function ...     <-- Verbosité FULL



Soit c'est un message qui peut être de versbosité inférieure ou supérieure selon le context, comme tu l'as illustrée avec la fonction check qui peut-être appelée directement ou en tant que sous étape d'une autre étape (pack dans ton exemple).

Pour moi si un message est d'un niveau DETAIL il doit l'être dans tous les cas. C'est à dire qu'il est DETAIL même s'il est utilisé dans une sous étape de niveau DETAIL.

En revanche ce qu'il serait sympa c'est qu'il soit indenté car faisant partie d'une sous étape.

exemple (pas forcément en cohérence avec l'état actuel d'Ncooker mais peut importe) :

Ncooker -v INFO pack foobar

packing foobar.........    <-- Verbosité INFO
   checking foobar.....   <-- Verbosité INFO

Ncooker -v DETAIL pack foobar

packing foobar.........    <-- Verbosité INFO
   checking foobar.....   <-- Verbosité INFO
      checking build file   <-- Verbosité DETAIL


Ncooker -v INFO check foobar.nbuild

checking foobar.....   <-- Verbosité INFO

Ncooker -v DETAIL check foobar.nbuild

checking foobar.....   <-- Verbosité INFO
   checking build file   <-- Verbosité DETAIL


Voilà ce que je souhaiterai obtenir.
Sommes nous déjà d'accord sur ce point, avant de discuter technique ?

++
CHicha

Gontran wrote:


Comme solution à ce problème, je propose d'abandonner le nommage des niveaux INFO, DETAIL et FULL pour utiliser à la place des niveaux numérotés de 1 à N, "N" étant « théoriquement » infini, mais dans la pratique, il faudra se limiter à un nombre de niveaux raisonnable :-). Les développeurs utiliserait print_msg de cette manière :

print_msg 1 "ce message est affiché si le niveau de verbosité est au minimum 1" print_msg 2 "ce message est affiché si le niveau de verbosité est au minimum 2" print_msg 3 "ce message est affiché si le niveau de verbosité est au minimum 3" print_msg 4 "ce message est affiché si le niveau de verbosité est au minimum 4"
...

Le niveau de verbosité serait toujours sélectionné de la même façon, mais en indiquant un nombre :

Ncooker -v 1 <command>
Ncooker -v 2 <command>
Ncooker -v 3 <command>
Ncooker -v 4 <command>
...

(Les niveaux QUIET, ERROR et WARNING seraient néanmoins conservés, et la liste complète des niveaux de verbosité successifs serait QUIET, ERROR, WARNING, 1, 2, 3, 4, ... N)

Chaque niveau appliquerait à ses messages une indentation correspondant à son degré de détail.


* Autre problème rencontré : dans mon exemple précédent, j'utilise la commande pack. Mais tous les messages ne sont pas affichés uniquement par cette commande. En fait, le code de la commande pack se présente ainsi :

print_msg "INFO" "Creation of the ${dir} package ..."
run_command check ${dir}
print_msg "DETAIL" "Preparing packaging environment ..."
<...>

On voit que le premier message est affiché par la commande Pack, mais que ceux qui suivent sont affichés par la commande Check de Ncooker. Puis, lorsque la commande Check se termine, la commande Pack continue à afficher ses propres messages.

Pour que l'affichage des messages se présente correctement à l'écran, il faut que la commande Check commence au niveau "DETAIL" de verbosité :

print_msg "DETAIL" "Checking ${dir} directory content ..."
print_msg "FULL" "Checking infos file ..."
<...>

en procédant ainsi, l'enchevêtrement des messages des commandes Pack et Check passe inaperçu grâce à une indentation correcte.

Le problème est que la commande Check n'est pas utilisée que par la commande Pack. Elle peut également être lancée à partir de la ligne de commande. Et comme les messages affichés ne commencent qu'au niveau DETAIL, l'utilisateur qui fait :

$ NCooker -v INFO check <paquet>

ne verra aucun message s'afficher ! :-)

Pour bien faire, il faudrait que la commande Check commence l'affichage de ses messages au niveau INFO, mais dans ce cas, le problème se déplace au niveau de son utilisation par la commande Pack.

Cet exemple montre le cas particulier de la commande Check par Pack, mais ce problème peut se poser avec tout autre commande/module utilisé par une autre commande/module.

Je propose une solution qui repose sur la solution précédente (niveau de 1 N). L'idée est que les développeurs n'aient plus à se prendre la tête pour savoir à quel niveau de verbosité ils doivent commencer l'affichage de leurs messages selon que leur module est appelé en ligne de commande ou par un autre module : ce serait _toujours_ le niveau 1. Ensuite, je propose d'ajouter deux nouvelles fonctions au gestionnaire de messages : shiftMsgLevel() et unshiftMsgLevel(). Elles seraient utilisés pour appliquer et annuler un décalage dans les niveaux de verbosité des messages.

Par exemple :

Commande Pack :
print_msg 1 "Creation of the ${dir} package ..."
shiftMsgLevel
run_command check ${dir}
unshiftMsgLevel
print_msg 2 "Preparing packaging environment ..."
<...>

Commande Check :
print_msg 1 "Checking ${dir} directory content ..."
print_msg 2 "Checking infos file ..."
<...>

La commande Pack affiche son message de niveau 1. Puis elle appelle shiftMsgLevel() pour appliquer un décalage de niveau pour les prochains messages. La « quantité » de décalage correspondrait au niveau du dernier message affiché par print_msg, donc ici 1. Lorsque la commande Check va afficher son premier message de niveau 1, la fonction print_msg va appliquer ce décalage de « 1 », ce qui fait que le premier message de check va devenir un message de niveau 2, et donc avoir une indentation plus importante. Il va se passer la même chose pour le second message de Check, qui va passer du niveau 2 au niveau 3. Une fois que la commande Check est terminé, on revient dans la commande pack pour exécuter la fonction unshiftMsgLevel afin d'annuler le décalage demandé précédemment. Ainsi, les message suivants de Pack s'afficheront avec le niveau correct.

Les appels successifs de la fonction shiftMsgLevel permettrait d'accumuler les décalages, c'est-à-dire que que si la commande Check fait appel à un autre module et qu'un décalage à déjà lieu, le nouvel appel à shiftMsgLevel appliquera un nouveau décalage en tenant compte du décalage actuel. De la même manière, la fonction unshiftMsgLevel permettrait de revenir aux décalages précédents de manière successive.

Voilà le principe :-)
Je pense que ces solutions permettent de rendre le gestionnaire de messages plus souple et plus pratique. Dites-moi ce que vous en pensez.

++
Gontran


_______________________________________________
Nasgaia-dev mailing list
[email protected]
https://mail.gna.org/listinfo/nasgaia-dev



Répondre à