Carnet Wiki

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

Version 24 — Mai 2019 JLuc

Les recommandations pour le code source de SPIP s’appuient sur PSR2 avec quelques modifications (voir doc SPIP.net)

Voici les fichiers de configuration pour :
-  CodeSniffer
-  PhpStorm

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 : 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 : les versions successives de b_b, kent1 et marcimat aboutissent actuellement à ce [-> 5157] [phpcs . xml ->https://gist.. github . com/marcimat/0e83a42334ecdb0b9e31d4dd7cb97963]
- voir aussi Évolutions de ce jeu de règle

-  Se mettre à la racine du dossier à vérifier et lancer la commande

 php phpcs.phar --standard=spipcs.xml chemin/vers/dossier/a/verifier</code >
 chemin/vers/dossier/a/verifier}} -   ou bien se mettre à la racine du spip et lancer <code> 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 html" class="spip_url spip_out auto" rel="nofollow external">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 (erreur « manque de sniff »).
Configurer html permet a priori d’intégrer le sniffer aux outils d’inspection de code de PhpStorm , mais pour l’instant ça ne marche pas ( 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 (mais je ne sais pas précisément lequel ) 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 < code>CTRL+</code > CTRL + ;  : l’analyse se fait

Paramétrage de l’éditeur

Autrement

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 Ce jeu de règle n’a pas le même format XML et le même usage .Comment s’utilise t il ?

- télécharger  : Voir 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é.

<code_scheme name="SPIP">
  <option name="OTHER_INDENT_OPTIONS">
    <value>
      <option name="INDENT_SIZE" value="2" />
        .......
  </codeStyleSettings>
</code_scheme>

Avec Sublime Text

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

<?xml version="1."?>
<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