[spip-dev] Boucle avec resultat mais sans affichage

Salut,

Sur la dernière SVN, j'ai une perte de compatibilité sur mes squelettes.

=> J'utilise beaucoup la technique de la «boucle de test», qui me permet de faire des tests en utilisant une ou plusieurs boucles. Par exemple:

<B_test_theme>
  OUI
<BOUCLE_test_theme(ARTICLES){id_mot}{branche}{4,1}>
</BOUCLE_test_theme>

La boucle regarde s'il y a un quatrième article avec un certain mot-clé. S'il y a effectivement un article, je n'affiche rien _dans_ la boucle, mais je balance une tripotée de choses dans la partie conditionnelle de la boucle. J'ai une tripotée de choses plus ou moins complexes qui s'imbriquent ainsi.

=> Sauf qu'avec la SVN actuelle, et c'est tout récent, ça ne marche plus: tant que je n'ai rien à l'intérieur de la boucle, même si la boucle a un résultat, ça n'affiche plus la partie conditionnelle de la boucle. Le seul moyen, c'est d'ajouter un machin bidon à l'intérieur de la boucle.

A*

Tu as essayé avec une ligne vide ?

<B_test_theme>
    OUI
<BOUCLE_test_theme(ARTICLES){id_mot}{branche}{4,1}>

</BOUCLE_test_theme>

<B_test_theme>
  OUI
<BOUCLE_test_theme(ARTICLES){id_mot}{branche}{4,1}>
</BOUCLE_test_theme>

avec la SVN actuelle, et c'est tout récent, ça ne marche plus: tant que je n'ai rien à l'intérieur de la boucle, même si la boucle a un résultat, ça n'affiche plus la partie conditionnelle de la boucle. Le seul moyen, c'est d'ajouter un machin bidon à l'intérieur de la boucle.

L'explication est dans cette différence de type de résultat par MySQL, c'est assez surprenant:

SELECT count(*) FROM spip_articles AS `articles` INNER JOIN

spip_mots_articles AS L1 ON ( L1.id_article = articles.id_article ) WHERE (articles.statut = 'publie') AND (articles.date <= NOW()) AND (L1.id_mot = 0) ;

Un LIMIT sur un COUNT ca a un sens ?

Committo,Ergo:sum a écrit :

L'explication est dans cette différence de type de résultat par MySQL, c'est assez surprenant:

encore pire que ce que je viens de dire:

SELECT count(*)

     -> FROM spipnet_articles AS `articles`
     -> WHERE (articles.statut = 'publie')
     -> AND (articles.date <= NOW())
     -> LIMIT 4,1 ;
Empty set (0.00 sec)

SELECT titre FROM spipnet_articles AS `articles` WHERE

(articles.statut = 'publie') AND (articles.date <= NOW()) LIMIT 4,1;

Un LIMIT sur un COUNT ca a un sens ?

Oui c'est ça le problème le LIMIT s'applique au COUNT(*) [1 résultat,
partir du 4ème => vide] et pas aux résultats eux-mêmes.

-- Fil

Je ne vois pas bien ce que tu testes: il faut passer un id_mot qui contient des articles dans cet exemple (genre: {id_mot=3}).

Pour être plus précis, avant, je faisais ceci (en admettant que je suis dans un id_mot qui contient 4 articles ou plus):

<B_test_theme>
  OUI
<BOUCLE_test_theme(ARTICLES){id_mot}{branche}{4,1}>
</BOUCLE_test_theme>

Ce me répondait bien OUI. Avec la dernière SVN, ça ne répond plus rien. Je suppose que ça me balancerait le conditionnel alternatif s'il y en avait un.

Pour corriger, j'ai bien essayé d'ajouter une ligne vide à l'intérieur de la boucle, mais ça ne fonctionne pas non plus.

Pour que ça refonctionne, j'ai fait:

<B_test_theme>
  OUI
<BOUCLE_test_theme(ARTICLES){id_mot}{branche}{4,1}>
  <!-- #TITRE -->
</BOUCLE_test_theme>

Ce qui est particulièrement crado. Et, surtout, ça interdirait d'utiliser ta syntaxe raccourcie.

A*

<B_test_theme>
       OUI
<BOUCLE_test_theme(ARTICLES){id_mot}{branche}{4,1}>
</BOUCLE_test_theme>

Ce me répondait bien OUI. Avec la dernière SVN, ça ne répond plus rien. Je
suppose que ça me balancerait le conditionnel alternatif s'il y en avait un.

Pour corriger, j'ai bien essayé d'ajouter une ligne vide à l'intérieur de la
boucle, mais ça ne fonctionne pas non plus.

Non mais attends, ne touche pas à tes squelettes !

C'est le compilo qu'il faut corriger : il buggue dans ce cas précis
parce qu'Emmanuel a introduit une optimisation pour les boucles qui
n'ont besoin que du COUNT(*), sans penser que le LIMIT n'allait pas
suivre.

Par contre c'est probablement une boucle test qui mérite d'entrer dans
les tests unitaires, de manière à ne pas se faire optimiser
sauvagement la prochaine fois -- car tout le monde vérifie les tests
unitaires avant de commit, n'est-ce pas :wink:

-- Fil

Je ne vois pas bien ce que tu testes: il faut passer un id_mot qui contient des articles dans cet exemple (genre: {id_mot=3}).

Le pb n'est pas là et a bien été résumé par Fil, c'est LIMIT+COUNT qui ne va pas.

Pour corriger, j'ai bien essayé d'ajouter une ligne vide à l'intérieur de la
boucle, mais ça ne fonctionne pas non plus.

Non mais attends, ne touche pas à tes squelettes !
C'est le compilo qu'il faut corriger

oui, et c'est fait avec la 12160.

car tout le monde vérifie les tests
unitaires avant de commit, n'est-ce pas :wink:

J'ai toujours mon casse-noisettes de l'époque de mon premier compilateur comme test.
Mais les tests de la zone, c'est une belle animation mais je n'arrive pas à comprendre ce qu'il faut regarder.
Pour moi c'est au niveau de Trac/SVN qu'il faudrait agir: je mets dans le message du dépot les tests qui montrent les différences, c'est très important de pouvoir relier un test avec le code qui a été conçu pour lui.

Committo,Ergo:Sum

Mais les tests de la zone, c'est une belle animation mais je n'arrive pas à
comprendre ce qu'il faut regarder.

Comment ça ? Il y a un fichier par test, qui répond :
- OK => et c'est vert
- NA => non applicable
- autre chose => et c'est rouge

il a des petites subtilités complémentaires mais ce sont des détails
négligeables dans une première approche.

Un test hello_world, pour vérifier si "spip fonctionne", se résume à ça :
<BOUCLE_hello_world(ARTICLES){0,1}>OK</BOUCLE_hello_world>

Pour moi c'est au niveau de Trac/SVN qu'il faudrait agir: je mets dans le
message du dépot les tests qui montrent les différences, c'est très
important de pouvoir relier un test avec le code qui a été conçu pour lui.

On peut aussi faire des tests qui ne sont pas liés à des dépots... et
l'autre avantage c'est que tests/ fonctionne dès aujourd'hui ... si on
veut bien se donner la peine d'y déposer les squelettes qui vont bien.
Mais je ne dis pas que ce serait forcément à toi de le faire : chacun
peut participer, plus on a de tests mieux on se porte. A chacun de
voir ce qu'il peut faire. Ca a aussi un côté ludique d'essayer de
deviner ce qui peut piéger SPIP.

-- Fil

Et bien moi, quand je fais tourner spip/tests TOUT est en rouge avec marqué "erreur" et quand je clique sur une ligne rouge il y a une ligne noire qui apparait avec marqué "ok". Alors je dis que c'est incompréhensible.

J'ai sans doute eu un pb d'installation, mais en l'état ça m'est nettement moins utile que la bardée de tests que j'a construit progressivement en développant le compilateur.

Committo,Ergo:Sum

Et bien moi, quand je fais tourner spip/tests TOUT est en rouge avec marqué
"erreur" et quand je clique sur une ligne rouge il y a une ligne noire qui
apparait avec marqué "ok". Alors je dis que c'est incompréhensible.

En effet c'est pas comme ça que c'est censé marcher :slight_smile:

J'ai sans doute eu un pb d'installation, mais en l'état ça m'est nettement
moins utile

ben oui comme un vélo cassé... ça marche pas

que la bardée de tests que j'a construit progressivement en
développant le compilateur.

mais qui ne sont pas partagés

-- Fil

Et bien moi, quand je fais tourner spip/tests TOUT est en rouge avec marqué
"erreur" et quand je clique sur une ligne rouge il y a une ligne noire qui
apparait avec marqué "ok". Alors je dis que c'est incompréhensible.

En effet c'est pas comme ça que c'est censé marcher :slight_smile:

sans blague ?

la bardée de tests que j'a construit progressivement en
développant le compilateur.

mais qui ne sont pas partagés

Je les avais déposés à l'époque du CVS, ils doivent être quelque part, avec les limitations du compilateur du moment évidemment.

Mais ces 2 exemples montrent que si ce n'est pas intégré à l'acte de dépot, ça périclite et on remet à plus tard la réparation. C'est en ça que je dis qu'il faut plutot qqch de fondé sur l'analyse automatique des dépots.

Committo,Ergo:Sum

En effet c'est pas comme ça que c'est censé marcher :slight_smile:

sans blague ?

ben je sais pas pourquoi ça buggue chez toi, c'est la première fois
qu'on remonte un tel problème

qu'il faut plutot qqch de fondé sur l'analyse automatique des dépots.

vazy si tu veux ! mais là on a déjà développé un truc qui marche
(sauf chez toi, certes), ça paraît plus simple d'essayer de le faire
marcher chez toi que de développer tout un système compliqué autour de
svn.

-- Fil

ça pourrait être un mixte : si on couple le site de test à un répertoire du svn spip , il suffirait d’ajouter / modifier le squelette de test lie au commit comme ça on garde le couplage,
avec un cron pour mettre à jour régulièrement

mais faut garder aussi la possibiliter d’envoyer des tests depuis la zone pour ne pas limiter aux seuls commiteurs de spipdev.

zzzzz+