Analyse statique du code

Hop,

Toujours en lien avec la qualité du code PHP, je propose d’ajouter phpstan dans les outils de développement de SPIP.

Dans Coding Standards il est fait mention de la page Outils pour tester la conformité d’un code php avec les PSR-12 où on trouve un ligne sur cette outil (que j’affectionne particulièrement)

L’outil est distribué de la même manière que PHPCode_Sniffer (plus loin désigné par phpcs), et s’installe donc en local avec la commande composer install. Son paramétrage est centralisé dans un fichier phpstan.neon.dist versionné dans git, surchargeable via un fichier phpstan.neon (comme le fichier xml de phpcs). On l’exécute via vendor/bin/phpstan : on n’est a priori pas dépaysé si on utilise déjà vendor/bin/phpcs

De manière simpliste, on peut dire que phpstan s’intéresse plus au fond du code alors que phpcs s’occupe plutôt de sa forme. Son rôle est donc de détecter des bugs de « logique » qu’on n’aurait découvert qu’à l’exécution, ou plus tard après l’avoir déployé sur un ou plusieurs site.

Pour cela, et pour rester progressif, on peut choisir le niveau d’exigence que l’on a. Ce niveau va de 0 à 8.

  • au niveau 8, phpstan déclare environ 6700 « erreurs » dans les répertoires ecrire/ et prive/ de SPIP
  • au niveau 0, il en annonce 133.

C’est pourquoi la configuration de base que je propose nous place au niveau 0.

De plus, la PR de démo qui va suivre embarque une baseline de ces 133 erreurs. Cette baseline permet d’écarter ces « erreurs pré-existantes » et les analyses suivantes ne remonterons que celles du code qu’on ajoute ou modifie.

Si nous adoptons cet outil, on pourra à l’avenir réduire la baseline à notre rythme et pourquoi pas passer progressivement aux niveau supérieur.

Les trucs importants à noter :

  • phpstan n’est qu’un outil d’analyse, il ne corrige pas le code (contrairement au compagnon de phpcs, phpcbf, qui peut autofixer une partie de la mise en forme du code sans danger).
  • s’il est dit dans la doc de l’outil qu’il est plus adapté à l’analyse de projet s’appuyant sur le programmation orientée objet et donc aux projet PHP s’appuyant sur un standard d’autoloading comme PSR-4 par exemple, on peut a minima exploiter les retours de l’outil pour éviter pas mal d’embuches sur du code procédural malgré tout.

La PR de démo : #4873 - feat(phpstan) : Mise en place de l'outil - spip - SPIP on GIT

Ok. Seems good.

1 « J'aime »

C’est une très bonne idée, ça peut marcher.

1 « J'aime »

Mergé :champagne:

Super, j’ai regardé rapidement pour tenter de corriger certains items listés dans la baseline, exemple spip/spip: Dépôt officiel du core SPIP * Anciennement présent sur svn://trac.rezo.net/spip * Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/SPIP/[nom du plugin dist] - phpstan-baseline.neon at master - spip - SPIP on GIT et au final cela semble vraiment un faux positif. Question : est-ce qu’il est possible d’insérer des commentaires dans ce fichier afin de marquer certaines erreurs pour les repérer et éviter qu’une autre personnes s’y penche à l’avenir ?

Edit : ha mais ce n’est peut-être pas un faux positif, l’outil attend peut-être que la fonction renvoie au moins une string vide si le test n’est pas validé ?

Oui pour les commentaires, neon, c’est du yaml en gros.

Oui aussi pour le cas que tu mentionnes, c’est exactement ça : le docblock indique qu’on retourne une chaine (@return string), la fonctione devrait retourner un chaine tout le temps, fusse-t-elle vide.

1 « J'aime »

En généralisant cette PR : #4807 - feat(dev-tools): Mise en place phpcs+phpstan - urls_etendues - SPIP on GIT à tous les plugins-dist, on peut déduire des fichiers « baseline », en récupérant les « erreurs » du type Function xxx not found , la liste des fonctions PHP du noyau de SPIP appelées dans les plugins.

Sans analyse plus poussée que ça, on obtient une liste de 333 fonctions (dont quelques cas rares de fonctiones non-spip), déclarées dans 64 fichiers du répertoire ecrire/. Ça mériterait un épluchage plus minutieux… mais ça nous donne une idée de ce qu’est l’api PHP de SPIP

PtoBR,ecrire/inc/filtres.php
_T,ecrire/inc/utils.php
_couleur_dec_to_hex,ecrire/inc/filtres_images_lib_mini.php
_couleur_hex_to_dec,ecrire/inc/filtres_images_lib_mini.php
_couleur_hsl_to_rgb,ecrire/inc/filtres_images_lib_mini.php
_couleur_rgb_to_hsl,ecrire/inc/filtres_images_lib_mini.php
_image_ecrire_tag,ecrire/inc/filtres_images_lib_mini.php
_image_gd_output,ecrire/inc/filtres_images_lib_mini.php
_image_tag_changer_taille,ecrire/inc/filtres_images_lib_mini.php
_image_valeurs_trans,ecrire/inc/filtres_images_lib_mini.php
_q,ecrire/base/connect_sql.php
_request,ecrire/inc/utils.php
actualise_plugins_actifs,ecrire/inc/plugin.php
affdate,ecrire/inc/filtres_dates.php
affdate_heure,ecrire/inc/filtres_dates.php
afficher_enclosures,ecrire/inc/filtres.php
afficher_plus_info,ecrire/inc/filtres_ecrire.php
aide_lang_dir,ecrire/inc/lang.php
alterner,ecrire/inc/filtres.php
appliquer_modifs_config,ecrire/inc/config.php
appliquer_traitement_champ,ecrire/inc/filtres.php
attribut_html,ecrire/inc/filtres.php
autoriser,ecrire/inc/autoriser.php
autoriser_exception,ecrire/inc/autoriser.php
balise_INCLURE,
balise_INCLURE_dist,ecrire/public/balises.php
base_copier_tables,ecrire/base/dump.php
base_dump_meta_name,ecrire/base/dump.php
base_liste_table_for_dump,ecrire/base/dump.php
base_lister_toutes_tables,ecrire/base/dump.php
base_prefixe_tables,ecrire/base/dump.php
base_saisie_tables,ecrire/base/dump.php
bouton_block_depliable,ecrire/inc/layer.php
cache_get,ecrire/iterateur/data.php
cache_set,ecrire/iterateur/data.php
calculer_action_auteur,ecrire/inc/securiser_action.php
calculer_argument_precedent,ecrire/public/references.php
calculer_balise_dynamique,ecrire/public/references.php
calculer_boucle,ecrire/public/compiler.php
calculer_cle_action,ecrire/inc/securiser_action.php
calculer_critere_externe_init,ecrire/public/criteres.php
calculer_liste,ecrire/public/compiler.php
calculer_notes,ecrire/public/fonctions.php
calculer_rubriques_if,ecrire/inc/rubriques.php
champ_sql,ecrire/public/references.php
changer_langue,ecrire/inc/lang.php
charger_filtre,ecrire/inc/filtres.php
charger_fonction,ecrire/inc/utils.php
charset2unicode,ecrire/inc/charsets.php
chemin_image,ecrire/inc/utils.php
chercher_filtre,ecrire/inc/filtres.php
code_echappement,ecrire/inc/texte_mini.php
collecter_requests,ecrire/inc/modifier.php
copie_locale,ecrire/inc/distant.php
copier_document,ecrire/inc/documents.php
corriger_caracteres,ecrire/inc/filtres.php
corriger_extension,
couleur_eclaircir,ecrire/inc/filtres_images_mini.php
couleur_foncer,ecrire/inc/filtres_images_mini.php
couleur_html_to_hex,ecrire/inc/filtres_images_mini.php
couper,ecrire/inc/texte_mini.php
creer_chemin,ecrire/inc/utils.php
creer_repertoire_documents,ecrire/inc/documents.php
date_interface,ecrire/inc/filtres_dates.php
debut_block_depliable,ecrire/inc/layer.php
debut_droite,ecrire/inc/presentation_mini.php
debut_gauche,ecrire/inc/presentation_mini.php
decoder_contexte_ajax,ecrire/inc/filtres.php
definir_puce,ecrire/inc/texte_mini.php
deplacer_fichier_upload,ecrire/inc/documents.php
depublier_branche_rubrique_if,ecrire/inc/rubriques.php
determine_upload,ecrire/inc/documents.php
direction_css,ecrire/inc/filtres.php
document_spip_externe,ecrire/public/quete.php
echappe_html,ecrire/inc/texte_mini.php
echappe_retour,ecrire/inc/texte_mini.php
echappe_retour_modeles,ecrire/inc/texte_mini.php
echapper_faux_tags,ecrire/inc/texte_mini.php
echapper_html_suspect,ecrire/inc/texte_mini.php
ecrire_config,ecrire/inc/config.php
ecrire_fichier,ecrire/inc/flock.php
ecrire_fichier_calcule_si_modifie,ecrire/inc/flock.php
ecrire_meta,ecrire/inc/meta.php
ecrire_plugin_actifs,ecrire/inc/plugin.php
effacer_config,ecrire/inc/config.php
effacer_meta,ecrire/inc/meta.php
effacer_repertoire_temporaire,ecrire/inc/documents.php
email_valide,ecrire/inc/filtres.php
encoder_contexte_ajax,ecrire/inc/filtres.php
entites_html,ecrire/inc/filtres.php
erreur_squelette,ecrire/inc/utils.php
extraire_attribut,ecrire/inc/filtres.php
extraire_balise,ecrire/inc/filtres.php
extraire_balises,ecrire/inc/filtres.php
extraire_idiome,ecrire/inc/filtres.php
extraire_multi,ecrire/inc/filtres.php
extraire_trads,ecrire/inc/filtres.php
filtrer,ecrire/inc/filtres.php
filtrer_entites,ecrire/inc/filtres.php
fin_block,ecrire/inc/layer.php
fin_gauche,ecrire/inc/presentation_mini.php
fin_page,ecrire/inc/presentation_mini.php
find_all_in_path,ecrire/inc/utils.php
find_in_path,ecrire/inc/utils.php
fixer_extension_document,
formats_image_acceptables,ecrire/inc/utils.php
formulaires_editer_objet_charger,ecrire/inc/editer.php
formulaires_editer_objet_traiter,ecrire/inc/editer.php
formulaires_editer_objet_verifier,ecrire/inc/editer.php
generer_action_auteur,ecrire/inc/actions.php
generer_info_entite,ecrire/inc/filtres.php
generer_url_action,ecrire/inc/utils.php
generer_url_ecrire,ecrire/inc/utils.php
generer_url_entite,ecrire/inc/utils.php
generer_url_entite_absolue,ecrire/inc/utils.php
generer_url_forum,
generer_url_public,ecrire/inc/utils.php
get_spip_doc,ecrire/inc/documents.php
get_spip_script,ecrire/inc/utils.php
gros_titre,ecrire/inc/presentation.php
hauteur,ecrire/inc/filtres.php
html2unicode,ecrire/inc/charsets.php
html5_permis,ecrire/inc/utils.php
http_img_pack,ecrire/inc/filtres.php
http_script,ecrire/inc/utils.php
http_status,ecrire/inc/headers.php
icone_horizontale,ecrire/inc/presentation.php
icone_verticale,ecrire/inc/presentation.php
id_table_objet,ecrire/base/objets.php
image_reduire,ecrire/inc/filtres_images_mini.php
imagick_isopaqueimage,
imagick_readimage,
imagick_rotate,
imagick_setfillcolor,
imagick_writeimage,
importer_charset,ecrire/inc/charsets.php
include_spip,ecrire/inc/utils.php
inclure_balise_dynamique,ecrire/public/assembler.php
inclure_modele,ecrire/public/assembler.php
index_pile,ecrire/public/references.php
init_mb_string,ecrire/inc/charsets.php
inserer_attribut,ecrire/inc/filtres.php
install_debut_html,ecrire/inc/minipres.php
install_fin_html,ecrire/inc/minipres.php
interdire_scripts,ecrire/inc/texte.php
interprete_argument_balise,ecrire/public/balises.php
is_utf8,ecrire/inc/charsets.php
jeune_fichier,ecrire/inc/flock.php
job_queue_add,ecrire/inc/utils.php
joli_repertoire,ecrire/inc/utils.php
kwote,ecrire/public/criteres.php
lang_dir,ecrire/inc/lang.php
lang_select,ecrire/inc/utils.php
lang_typo,ecrire/inc/lang.php
largeur,ecrire/inc/filtres.php
lien_article_virtuel,ecrire/inc/filtres_ecrire.php
liens_absolus,ecrire/inc/filtres_mini.php
lire_config,ecrire/inc/config.php
lire_fichier,ecrire/inc/flock.php
lire_metas,ecrire/inc/meta.php
liste_des_champs,ecrire/inc/rechercher.php
liste_plugin_actifs,ecrire/plugins/installer.php
liste_plugin_files,ecrire/inc/plugin.php
lister_tables_noerase,ecrire/base/dump.php
lister_tables_noexport,ecrire/base/dump.php
lister_tables_objets_sql,ecrire/base/objets.php
logo_migrer_en_base,ecrire/action/editer_logo.php
logo_modifier,ecrire/action/editer_logo.php
maj_plugin,ecrire/base/upgrade.php
match_langue,ecrire/inc/lang.php
medias_inigetoctets,
message_alerte,ecrire/inc/filtres_alertes.php
message_alerte_fermer,ecrire/inc/filtres_alertes.php
message_alerte_ouvrir,ecrire/inc/filtres_alertes.php
minipres,ecrire/inc/minipres.php
mot_associer,
nettoyer_url_page,ecrire/inc/urls.php
notifications_envoyer_mails,ecrire/inc/notifications.php
notifications_nettoyer_emails,ecrire/inc/notifications.php
objet_afficher_nb,ecrire/inc/filtres.php
objet_associable,ecrire/action/editer_liens.php
objet_associer,ecrire/action/editer_liens.php
objet_dissocier,ecrire/action/editer_liens.php
objet_info,ecrire/inc/filtres.php
objet_instituer,ecrire/action/editer_objet.php
objet_modifier,ecrire/action/editer_objet.php
objet_modifier_champs,ecrire/inc/modifier.php
objet_optimiser_liens,ecrire/action/editer_liens.php
objet_qualifier,
objet_qualifier_liens,ecrire/action/editer_liens.php
objet_test_si_publie,ecrire/base/objets.php
objet_trouver_liens,ecrire/action/editer_liens.php
objet_type,ecrire/base/objets.php
optimiser_sansref,ecrire/genie/optimiser.php
param_low_sec,ecrire/inc/acces.php
parametre_url,ecrire/inc/utils.php
pipeline,ecrire/inc/utils.php
plage_punct_unicode,ecrire/inc/charsets.php
plugin_donne_erreurs,ecrire/inc/plugin.php
plugin_etat_en_clair,ecrire/plugins/afficher_plugin.php
plugin_installes_meta,ecrire/inc/plugin.php
plugin_version_compatible,ecrire/inc/plugin.php
preg_files,ecrire/inc/flock.php
produire_fond_statique,ecrire/inc/filtres.php
propre,ecrire/inc/texte.php
protege_js_modeles,ecrire/inc/texte_mini.php
protocole_implicite,ecrire/inc/filtres_mini.php
puce_statut_changement_rapide,ecrire/inc/puce_statut.php
purger_repertoire,ecrire/inc/invalideur.php
queue_schedule,ecrire/inc/queue.php
quote_amp,ecrire/inc/utils.php
recherche_en_base,ecrire/inc/rechercher.php
recup_date,ecrire/inc/filtres_dates.php
recuperer_fond,ecrire/inc/utils.php
recuperer_infos_distantes,ecrire/inc/distant.php
recuperer_url,ecrire/inc/distant.php
redirige_formulaire,ecrire/inc/headers.php
redirige_par_entete,ecrire/inc/headers.php
redirige_url_ecrire,ecrire/inc/headers.php
refuser_traiter_formulaire_ajax,ecrire/public/aiguiller.php
rindex_pile,ecrire/public/references.php
rubrique_inserer,ecrire/action/editer_rubrique.php
rubrique_modifier,ecrire/action/editer_rubrique.php
safehtml,ecrire/inc/texte_mini.php
secret_du_site,ecrire/inc/securiser_action.php
self,ecrire/inc/utils.php
session_get,ecrire/inc/session.php
session_set,ecrire/inc/session.php
set_request,ecrire/inc/utils.php
set_spip_doc,ecrire/inc/documents.php
singulier_ou_pluriel,ecrire/inc/filtres.php
sinon,ecrire/inc/filtres.php
sous_repertoire,ecrire/inc/flock.php
spip_attend_invalidation_opcode_cache,ecrire/inc/flock.php
spip_connect,ecrire/base/connect_sql.php
spip_file_get_contents,ecrire/inc/flock.php
spip_getimagesize,ecrire/inc/utils.php
spip_htmlspecialchars,ecrire/inc/filtres_mini.php
spip_log,ecrire/inc/utils.php
spip_query,ecrire/base/connect_sql.php
spip_strlen,ecrire/inc/charsets.php
spip_substr,ecrire/inc/charsets.php
spip_timer,ecrire/inc/utils.php
spip_touch,ecrire/inc/utils.php
spip_unlink,ecrire/inc/flock.php
spip_version_compare,ecrire/inc/utils.php
spip_versions_sqlite3,ecrire/req/sqlite3.php
spip_xml_aplatit,ecrire/inc/xml.php
spip_xml_decompose_tag,ecrire/inc/xml.php
spip_xml_parse,ecrire/inc/xml.php
sql_allfetsel,ecrire/base/abstract_sql.php
sql_alter,ecrire/base/abstract_sql.php
sql_countsel,ecrire/base/abstract_sql.php
sql_create,ecrire/base/abstract_sql.php
sql_date_proche,ecrire/base/abstract_sql.php
sql_delete,ecrire/base/abstract_sql.php
sql_demarrer_transaction,ecrire/base/abstract_sql.php
sql_drop_table,ecrire/base/abstract_sql.php
sql_fetch,ecrire/base/abstract_sql.php
sql_fetsel,ecrire/base/abstract_sql.php
sql_free,ecrire/base/abstract_sql.php
sql_get_select,ecrire/base/abstract_sql.php
sql_getfetsel,ecrire/base/abstract_sql.php
sql_in,ecrire/base/abstract_sql.php
sql_insertq,ecrire/base/abstract_sql.php
sql_insertq_multi,ecrire/base/abstract_sql.php
sql_optimize,ecrire/base/abstract_sql.php
sql_preferer_transaction,ecrire/base/abstract_sql.php
sql_quote,ecrire/base/abstract_sql.php
sql_replace,ecrire/base/abstract_sql.php
sql_select,ecrire/base/abstract_sql.php
sql_serveur,ecrire/base/abstract_sql.php
sql_showtable,ecrire/base/abstract_sql.php
sql_terminer_transaction,ecrire/base/abstract_sql.php
sql_update,ecrire/base/abstract_sql.php
sql_updateq,ecrire/base/abstract_sql.php
statut_image,ecrire/inc/puce_statut.php
statut_titre,ecrire/inc/puce_statut.php
statuts_articles_visibles,ecrire/inc/filtres_ecrire.php
suivre_invalideur,ecrire/inc/invalideur.php
suivre_lien,ecrire/inc/filtres_mini.php
supprimer_fichier,ecrire/inc/flock.php
supprimer_numero,ecrire/inc/filtres.php
supprimer_repertoire,ecrire/inc/flock.php
supprimer_tags,ecrire/inc/filtres.php
supprimer_timestamp,ecrire/inc/filtres.php
svg_ajouter_background,ecrire/inc/svg.php
svg_ajouter_voile,ecrire/inc/svg.php
svg_charger,ecrire/inc/svg.php
svg_extract_couleurs,ecrire/inc/svg.php
svg_filter_blur,ecrire/inc/svg.php
svg_filter_grayscale,ecrire/inc/svg.php
svg_filter_sepia,ecrire/inc/svg.php
svg_flip,ecrire/inc/svg.php
svg_force_viewBox_px,ecrire/inc/svg.php
svg_recadrer,ecrire/inc/svg.php
svg_rotate,ecrire/inc/svg.php
svg_transformer,ecrire/inc/svg.php
table_objet,ecrire/base/objets.php
table_objet_sql,ecrire/base/objets.php
table_valeur,ecrire/inc/filtres.php
taille_en_octets,ecrire/inc/filtres.php
taille_image,ecrire/inc/filtres.php
test_espace_prive,ecrire/inc/utils.php
test_pcre_unicode,ecrire/inc/charsets.php
tester_url_absolue,ecrire/inc/utils.php
textebrut,ecrire/inc/filtres.php
timestamp,ecrire/inc/filtres.php
titre_automatique,ecrire/inc/editer.php
traduire_nom_langue,ecrire/inc/lang.php
traiter_math,ecrire/inc/math.php
traiter_modeles,ecrire/inc/lien.php
translitteration,ecrire/inc/charsets.php
trouve_modele,ecrire/inc/utils.php
trouver_fond,ecrire/inc/utils.php
trouver_objet_exec,ecrire/inc/pipelines_ecrire.php
typo,ecrire/inc/texte.php
unicode2charset,ecrire/inc/charsets.php
unicode_to_utf_8,ecrire/inc/charsets.php
unique,ecrire/inc/filtres.php
url_absolue,ecrire/inc/filtres_mini.php
url_absolue_css,ecrire/inc/filtres.php
url_de_base,ecrire/inc/utils.php
urls_liste_objets,ecrire/inc/urls.php
utiliser_langue_visiteur,ecrire/inc/lang.php
valider_url_distante,ecrire/inc/distant.php
verifier_action_auteur,ecrire/inc/securiser_action.php
verifier_cle_action,ecrire/inc/securiser_action.php
verifier_table_non_vide,ecrire/inc/autoriser.php
vider_attribut,ecrire/inc/filtres.php
vider_url,ecrire/inc/filtres.php
wrap,ecrire/inc/filtres.php
yaml_decode,

Et donc, les 64 fichiers :

ecrire/action/editer_liens.php
ecrire/action/editer_logo.php
ecrire/action/editer_objet.php
ecrire/action/editer_rubrique.php
ecrire/base/abstract_sql.php
ecrire/base/connect_sql.php
ecrire/base/dump.php
ecrire/base/objets.php
ecrire/base/upgrade.php
ecrire/genie/optimiser.php
ecrire/inc/acces.php
ecrire/inc/actions.php
ecrire/inc/autoriser.php
ecrire/inc/charsets.php
ecrire/inc/config.php
ecrire/inc/distant.php
ecrire/inc/documents.php
ecrire/inc/editer.php
ecrire/inc/filtres.php
ecrire/inc/filtres_alertes.php
ecrire/inc/filtres_dates.php
ecrire/inc/filtres_ecrire.php
ecrire/inc/filtres_images_lib_mini.php
ecrire/inc/filtres_images_mini.php
ecrire/inc/filtres_mini.php
ecrire/inc/flock.php
ecrire/inc/headers.php
ecrire/inc/invalideur.php
ecrire/inc/lang.php
ecrire/inc/layer.php
ecrire/inc/lien.php
ecrire/inc/math.php
ecrire/inc/meta.php
ecrire/inc/minipres.php
ecrire/inc/modifier.php
ecrire/inc/notifications.php
ecrire/inc/pipelines_ecrire.php
ecrire/inc/plugin.php
ecrire/inc/presentation.php
ecrire/inc/presentation_mini.php
ecrire/inc/puce_statut.php
ecrire/inc/queue.php
ecrire/inc/rechercher.php
ecrire/inc/rubriques.php
ecrire/inc/securiser_action.php
ecrire/inc/session.php
ecrire/inc/svg.php
ecrire/inc/texte.php
ecrire/inc/texte_mini.php
ecrire/inc/urls.php
ecrire/inc/utils.php
ecrire/inc/xml.php
ecrire/iterateur/data.php
ecrire/plugins/afficher_plugin.php
ecrire/plugins/installer.php
ecrire/public/aiguiller.php
ecrire/public/assembler.php
ecrire/public/balises.php
ecrire/public/compiler.php
ecrire/public/criteres.php
ecrire/public/fonctions.php
ecrire/public/quete.php
ecrire/public/references.php
ecrire/req/sqlite3.php

Pour info, une discussion à propos du niveau utilisé par les gens avec phpstan par ici https://www.reddit.com/r/PHP/comments/tc0da2/what_level_of_phpstan_are_you_running_andor/

Et un commentaire de l’auteur du logiciel, malheureusement dispo que sous forme d’image par ici :

Il y recommande le niveau 5 mini, et indique qu’il pense revoir la répartition des rapports VS niveaux.

C’est pour ça qu’on est actuellement au niveau 0 :slight_smile:
Et les « typehints » (le niveau 6) serait un sacré plus pour être un peu plus tranquille en PHP8 et plus, donc surtout pour les versions 4.1 et 4.2 de SPIP.

Mais l’analyse à ces niveaux remonte des milliers d’erreurs qui mettent en évidence que ce ne sont pas des « bugs » à corriger à la marge, mais plutôt une évolution de notre manière de coder à mettre en oeuvre.

À titre d’exemple, le plugin archiviste est au niveau 8.

C’est pour ça que j’ai proposé l’intégration de l’outil : pas pour qu’il soit juste présent, mais pour qu’il soit utilisé quand on développe, pas a posteriori.

1 « J'aime »