Carnet Wiki

Outils pour tester Tester la conformité d’un code php avec les PSR SPIP

Version 27 — Juin 2019 JLuc

Les outils utilisent des fichiers de configuration : voir Jeux de règles PSR_SPIP

Outils

Yen a 2 sorte : les sniffer (détectent) et les fixers (corrigent).

codesniffer
-  phpcs présente tous les avertissements possibles, corrigibles automatiquement ou non
-  dispose d’un fixer en complément : phpcbf

PHP CS fixer
-  https://github.com/FriendsOfPHP/PHP-CS-Fixer
-  seulement des corrections certaines, pas d’avertissements non correctibles car incertains

Différence entre les 2 :
-  https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/3459

Autres
-  phpstan : https://github.com/phpstan/phpstan (about : https://medium.com/@ondrejmirtes/phpstan-2939cd0ad0e3)
-  mess
-  codestyle dans phpStorm et autres IDE

Avec CodeSniffer

codesniffer parse et teste le source selon des jeux de règles. Ces jeux de règles peuvent être les PSR par défaut, ou des jeux de règles fournis.

-  Installer la version de base : https://github.com/squizlabs/PHP_CodeSniffer
-  Utiliser : https://github.com/squizlabs/PHP_CodeSniffer/wiki

-  Télécharger et installer phpcs
-  Récupérer le fichier de règle (xml) choisi
-  exécuter

Exemple : Jeu de régle « compatibilité PHP7 »

Ce jeu de règle permet de tester la compatibilité d’un code avec PHP7 et 7.2
-  téléchargement : https://github.com/PHPCompatibility/PHPCompatibility
-  paramétrage de codesniffer avec le jeu de règle phpcompatibility :
php phpcs.phar --config-set installed_paths /chemin/vers/phpcompatibility
-  usage :
php phpcs.phar /chemin/vers/source/php
-  ou bien alors en spécifiant à chaque fois sur la LC :
php phpcs.phar --standard=spipcs.xml /chemin/vers/source/php

Pour SPIP

-  télécharger le jeu de règles spipcs.xml : voir Jeux de règles PSR_SPIP.

-  Se mettre à la racine du dossier à vérifier et lancer la commande php phpcs.phar --standard=spipcs.xml chemin/vers/dossier/a/verifier
-  ou bien se mettre à la racine du spip et lancer php phpcs.phar --standard=spipcs.xml .

Dans PhpStorm

Installer le codesniffer
-  activer php : Settings > Langages and frameworks > PHP (car a priori ya besoin de php pour Composer)
-  installer et activer composer dans phpstorm : Tools > Composer > Install (cf https://www.jetbrains.com/help/phpstorm/using-the-composer-dependency-manager.html)

-  installer codesniffer : Tools > Composer > Manage Dependencies : chercher et installer squizlabs/php_codesniffer, puis récupérez sur votre disque le fichier SPIP_style.xml de jeu de règles (voir Jeux de règles PSR_SPIP)

-  ou bien (mieux) : via Composer, installez le jeu de règle PSR2-rectified qui est beaucoup plus proche des règles SPIP. C’est le jeu de règle vendor/fig-r/psr2r-sniffer/PSR2R/ruleset.xml qu’il faut alors rechercher et installer.
Celui ci installe le code_sniffer d’origine plus des règles spécifiques.

Configurer le code inspector (pas ok)

La doc https://www.jetbrains.com/help/phpstorm/using-php-code-sniffer.html permet a priori d’intégrer le sniffer aux outils d’inspection de code de PhpStorm, mais pour l’instant j’ai pas réussi comme ça (erreur « manque de sniff »).
Configurer codesniffer pour utiliser ce jeu de règles : Settings > Editor > Inspections > Quality tools > PHP code sniffer validation > Coding standard > Custom puis « ... » pour choisir le fichier SPIP_style.xml. Le petit bouton « raffraichir » permet de vérifier que les règles sont bien comprises.

Quelque part dans un des fichiers des config json de composer (dans composer.json a priori, mais je ne sais pas où précisément, je l’ai mis dans une nouvelle section) on peut ajouter :
"scripts": {    "phpcs": "phpcs --standard=/chemin/vers/SPIP_style.xml"

Activer le codesniffing à la demande (OK)

Ça ça marche :

-  Settings > Tools > External tools : déclarer les outils phpcodesniffer (phpcs) et phpcbf.
Pour phpcs :
* programme : /mon/chemin/vendor/squizlabs/php_codesniffer/bin/phpcs
* arguments : —standard=$ProjectFileDir$/vendor/fig-r/psr2r-sniffer/PSR2R/ruleset.xml -p $FilePath$
* working directory : $ProjectFileDir$
-  Settings > Keymap >External tools : déclarer 2 raccourcis
* CTRL+; pour phpcs
* CTRL+SHIFT+; pour fixer
-  Ouvrir un fichier php ou sélectionner un dossier dans l’arborescence, puis CTRL+ : l’analyse se fait

On peut simultanément installer les autres paramétrages de phpcs, avec d’autres raccourcis :
-  PSR2R : CTRL+; et CTRL+.
-  PHPcompatibility : CTRL+: et CTRL+/
-  PSR2 : CTRL+, et CTRL+?

Paramétrage de l’éditeur

C’est un fichier de paramétrage pour la visualisation et l’édition dans l’éditeur de PhpStorm. Il ne corrige pas le code existant mais aide à l’écrire de la bonne manière. N’étant pas destiné à phpcs il n’a pas le même format XML.

-  télécharger : https://gist.github.com/Cerdic/efdb1d5c9318670d19fe
Rq : cette version définit des tabulations de 2 espaces ce qui est différent des 4 espaces habituels.

Pour l’installer : allez dans Settings -> Editor -> Code Style > PHP cliquez sur la roue dentée puis Import scheme > Intellij IDEA codestyle XML et importez le fichier de paramétrage téléchargé.

Cela active aussi les inspections de code sur la base de PSR2, modifiées selon les instructions du fichier de paramétrage du codestyle.

Avec Sublime Text

-  origine : https://gist.github.com/magikcypress/200f2d2491ba5cc57051fdf6d9412fbd
-  version au 12 mai 2016 :

<?xml version="1.0"?>
<ruleset name="SPIP">
<!--
	Liens utiles
                documentation : http://contrib.spip.net/style-code-php
		https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards
		https://github.com/ucfcdl/fuelphp-phpcs/tree/master/Standards/FuelPHP
		https://github.com/vanilla/addons/tree/master/standards/Vanilla
-->

	<description>Coding rules for SPIP with Sublime text</description>

	<exclude-pattern>config/*</exclude-pattern>
	<exclude-pattern>IMG/*</exclude-pattern>
	<exclude-pattern>lib/*</exclude-pattern>
	<exclude-pattern>local/*</exclude-pattern>
	<exclude-pattern>plugins-dist/*</exclude-pattern>
	<exclude-pattern>squelettes/*</exclude-pattern>
	<exclude-pattern>tmp/*</exclude-pattern>

	<!-- Appliquer PSR-2 moins nos exceptions -->
	<rule ref="PSR2" >
		<!-- Désactiver la vérification sur les noms de classes/fonctions -->
		<exclude name="Squiz.Classes.ValidClassName" />
		<!-- Désactiver la vérification sur l'indentation -->
		<exclude name="Generic.WhiteSpace.ScopeIndent" />
		<exclude name="Generic.WhiteSpace.DisallowTabIndent" />
		<!-- Désactiver les camel caps sur les fonctions -->
		<exclude name="Generic.NamingConventions.CamelCapsFunctionName" />
		<!-- Désactiver la vérification sur les accolades -->
		<exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine" />
		<exclude name="PSR2.Classes.ClassDeclaration.OpenBraceNewLine" />
		<exclude name="PSR2.Classes.PropertyDeclaration" />
	</rule>

	<!-- Tabulations pour l'indentation -->
	<arg name="tab-width" value="4"/>
	<rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
	<rule ref="Generic.WhiteSpace.ScopeIndent">
		<properties>
			<property name="indent" value="4"/>
			<property name="tabIndent" value="true"/>
		</properties>
	</rule>

	<!-- Accolades -->
	<rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie"/>
	<rule ref="Generic.ControlStructures.InlineControlStructure" />
	<rule ref="Squiz.ControlStructures.ControlSignature" />
	<rule ref="Squiz.ControlStructures.ControlSignature.NewlineAfterOpenBrace">
		<severity>0</severity>
	</rule>

	<!-- Guillemets doubles -->
	<rule ref="Squiz.Strings.DoubleQuoteUsage"/>
	<rule ref="Squiz.Strings.DoubleQuoteUsage.ContainsVar">
		<severity>0</severity>
	</rule>
	
	<!-- Constantes en majuscules -->
	<rule ref="Generic.NamingConventions.UpperCaseConstantName"/>

</ruleset>

Rq à vérifier : phpcs ne permet pas de corriger les tabulations en 2016