Carnet Wiki

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

Version 23 — May 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 phpcs.xml
-  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}}
- ou bien se mettre à la racine du spip et lancer <code> php phpcs.phar --standard=spipcs.xml .

Dans CodeStyle SPIP pour 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 Ou bien ( mieux ) alors : via Composer, installez installer 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 spécifier .
Celui ci installe le code_sniffer d’origine plus et des règles spécifiques.

Configurer le code inspector (pas ok)

La doc https://www.jetbrains.com/help/phpstorm/using-php-code-sniffer - installer codesniffer : Tools > Composer > Manage Dependencies : chercher et installer squizlabs/php_codesniffer
-  
créer un fichier SPIP_style .html permet a priori d’intégrer le sniffer aux outils d’inspection xml de code jeu de PhpStorm , mais pour l’instant ça ne marche pas ( erreur manque de sniff ”) : règles à partir du fichier plus loin
-  
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.

- ça ne sert peut être à rien ; editer composer.json, que l’installation de composer a du créer. Normalement, il doit contenir :
"require": {    "squizlabs/php_codesniffer": "3.
2"   }
Remplacez par

  "require": {    "squizlabs/php_codesniffer": "3.Quelque  part  dans  un  des  fichiers  des  config  json  de  composer  ( mais  je  ne  sais  pas  lequel )  on  peut  ajouter  : 
&lt; code>"scripts *"  },   "scripts ": {    "phpcs": "phpcs --standard=/chemin/vers/SPIP_style.xml "  &lt;/code > 4 . xml"  }

puis mettez à jour avec le lien “Update” apparu en haut à droite de cette fenêtre d’édition.

Intégrer codesniffer aux Inspections de Code

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 ça ne marche pas (erreur “manque de sniff”). Par contre, les indications qui suivent marchent bien.

Activer le codesniffing à la demande ( OK ) demande

Ç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, CTRL+; : l’analyse se fait

Autrement

-  Voir https://gist.github.com/Cerdic/efdb1d5c9318670d19fe

Ce jeu de règle n’a pas le même format et le même usage. C’est un fichier de paramétrage de PhpStorm ? Comment s’utilise t il ?

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

<code_scheme name="SPIP">
  <option name="OTHER_INDENT_OPTIONS">
    <value>
      <option name="INDENT_SIZE" value="2" />
      <option name="CONTINUATION_INDENT_SIZE" value="8" />
      <option name="TAB_SIZE" value="2" />
      <option name="USE_TAB_CHARACTER" value="true" />
      <option name="SMART_TABS" value="false" />
      <option name="LABEL_INDENT_SIZE" value="0" />
      <option name="LABEL_INDENT_ABSOLUTE" value="false" />
      <option name="USE_RELATIVE_INDENTS" value="false" />
    </value>
  </option>
  <option name="SPACE_AROUND_EQUALITY_OPERATORS" value="false" />
  <option name="SPACE_AROUND_RELATIONAL_OPERATORS" value="false" />
  <option name="SPACE_AROUND_ADDITIVE_OPERATORS" value="false" />
  <option name="SPACE_AROUND_MULTIPLICATIVE_OPERATORS" value="false" />
  <option name="SPACE_BEFORE_METHOD_LBRACE" value="false" />
  <option name="SPACE_BEFORE_IF_LBRACE" value="false" />
  <option name="SPACE_BEFORE_WHILE_LBRACE" value="false" />
  <option name="SPACE_BEFORE_FOR_LBRACE" value="false" />
  <PHPCodeStyleSettings>
    <option name="PHPDOC_BLANK_LINE_BEFORE_TAGS" value="true" />
    <option name="LOWER_CASE_BOOLEAN_CONST" value="true" />
    <option name="LOWER_CASE_NULL_CONST" value="true" />
    <option name="BLANK_LINE_BEFORE_RETURN_STATEMENT" value="true" />
    <option name="KEEP_RPAREN_AND_LBRACE_ON_ONE_LINE" value="true" />
  </PHPCodeStyleSettings>
  <XML>
    <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
  </XML>
  <codeStyleSettings language="CSS">
    <indentOptions>
      <option name="INDENT_SIZE" value="2" />
      <option name="TAB_SIZE" value="2" />
      <option name="USE_TAB_CHARACTER" value="true" />
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="CoffeeScript">
    <option name="SPACE_AROUND_EQUALITY_OPERATORS" value="false" />
    <option name="SPACE_AROUND_RELATIONAL_OPERATORS" value="false" />
    <option name="SPACE_AROUND_ADDITIVE_OPERATORS" value="false" />
    <option name="SPACE_AROUND_MULTIPLICATIVE_OPERATORS" value="false" />
    <option name="PARENT_SETTINGS_INSTALLED" value="true" />
  </codeStyleSettings>
  <codeStyleSettings language="HTML">
    <indentOptions>
      <option name="INDENT_SIZE" value="2" />
      <option name="CONTINUATION_INDENT_SIZE" value="2" />
      <option name="TAB_SIZE" value="2" />
      <option name="USE_TAB_CHARACTER" value="true" />
      <option name="SMART_TABS" value="true" />
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="JavaScript">
    <option name="SPACE_AROUND_EQUALITY_OPERATORS" value="false" />
    <option name="SPACE_AROUND_RELATIONAL_OPERATORS" value="false" />
    <option name="SPACE_AROUND_ADDITIVE_OPERATORS" value="false" />
    <option name="SPACE_AROUND_MULTIPLICATIVE_OPERATORS" value="false" />
    <option name="SPACE_BEFORE_METHOD_LBRACE" value="false" />
    <option name="SPACE_BEFORE_IF_LBRACE" value="false" />
    <option name="SPACE_BEFORE_WHILE_LBRACE" value="false" />
    <option name="SPACE_BEFORE_FOR_LBRACE" value="false" />
    <option name="PARENT_SETTINGS_INSTALLED" value="true" />
    <indentOptions>
      <option name="INDENT_SIZE" value="2" />
      <option name="CONTINUATION_INDENT_SIZE" value="2" />
      <option name="TAB_SIZE" value="2" />
      <option name="USE_TAB_CHARACTER" value="true" />
      <option name="SMART_TABS" value="true" />
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="LESS">
    <indentOptions>
      <option name="TAB_SIZE" value="2" />
      <option name="USE_TAB_CHARACTER" value="true" />
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="PHP">
    <option name="BLANK_LINES_AFTER_PACKAGE" value="1" />
    <option name="CLASS_BRACE_STYLE" value="1" />
    <option name="METHOD_BRACE_STYLE" value="1" />
    <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
    <option name="SPACE_AROUND_ADDITIVE_OPERATORS" value="false" />
    <option name="SPACE_AROUND_MULTIPLICATIVE_OPERATORS" value="false" />
    <option name="CALL_PARAMETERS_WRAP" value="1" />
    <option name="METHOD_PARAMETERS_WRAP" value="5" />
    <option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" />
    <option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" />
    <option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="true" />
    <option name="ARRAY_INITIALIZER_WRAP" value="5" />
    <option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="true" />
    <option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="true" />
    <option name="IF_BRACE_FORCE" value="3" />
    <option name="DOWHILE_BRACE_FORCE" value="3" />
    <option name="WHILE_BRACE_FORCE" value="3" />
    <option name="FOR_BRACE_FORCE" value="3" />
    <indentOptions>
      <option name="INDENT_SIZE" value="2" />
      <option name="CONTINUATION_INDENT_SIZE" value="2" />
      <option name="TAB_SIZE" value="2" />
      <option name="USE_TAB_CHARACTER" value="true" />
      <option name="SMART_TABS" value="true" />
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="SASS">
    <indentOptions>
      <option name="TAB_SIZE" value="2" />
      <option name="USE_TAB_CHARACTER" value="true" />
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="TypeScript">
    <option name="SPACE_AROUND_EQUALITY_OPERATORS" value="false" />
    <option name="SPACE_AROUND_RELATIONAL_OPERATORS" value="false" />
    <option name="SPACE_AROUND_ADDITIVE_OPERATORS" value="false" />
    <option name="SPACE_AROUND_MULTIPLICATIVE_OPERATORS" value="false" />
    <option name="SPACE_BEFORE_METHOD_LBRACE" value="false" />
    <option name="SPACE_BEFORE_IF_LBRACE" value="false" />
    <option name="SPACE_BEFORE_WHILE_LBRACE" value="false" />
    <option name="SPACE_BEFORE_FOR_LBRACE" value="false" />
    <option name="PARENT_SETTINGS_INSTALLED" value="true" />
  </codeStyleSettings>
  <codeStyleSettings language="XML">
    <indentOptions>
      <option name="INDENT_SIZE" value="2" />
      <option name="CONTINUATION_INDENT_SIZE" value="2" />
      <option name="TAB_SIZE" value="2" />
      <option name="USE_TAB_CHARACTER" value="true" />
    </indentOptions>
  </codeStyleSettings>
  <codeStyleSettings language="yaml">
    <indentOptions>
      <option name="TAB_SIZE" value="2" />
    </indentOptions>
  </codeStyleSettings>
</code_scheme>

Avec CodeStyle SPIP pour 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