Carnet Wiki

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

Version 19 — 15 May 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

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


-  ? Télécharger et installer phpcs https://github.com/squizlabs/PHP_CodeSniffer
-  Créer le fichier de config spipcs.xml en y recopiant les paramètres plus bas
-  Se mettre à la racine du dossier à vérifier et lancer la commande php phpcs.phar --standard=spipcs.xml
-  ou bien se mettre à la racine du spip et lancer php phpcs.phar --standard=spipcs.xml chemin/vers/dossier/a/verifier

Jeu de règles phpcs.xml pour SPIP

-  télécharger : https://gist.github.com/brunob/c92c9b7bfec67aadc149
-  une fois créé localement, codesniffer peut l’utiliser :
php phpcs.phar --standard=spipcs.xml /chemin/vers/source/php

-  pour mémoire, version au 8 décembre :

<?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</description>
 
 
<exclude-pattern>config/*</exclude-pattern>
	<exclude-pattern>IMG/*</exclude-pattern>
	<exclude-pattern>lib/*</exclude-pattern>
	<exclude-pattern>local/*</exclude-pattern>
	<exclude-pattern>plugins/*</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 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>

CodeStyle SPIP pour PhpStorm

Voir https://www.jetbrains.com/help/phpstorm/using-php-code-sniffer.html

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

- activer php : Settings > Langages and frameworks > PHP (car a priori ya besoin de php pour Composer)
-  activer composer : 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
-  créer un fichier SPIP_style.xml de jeu de 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.- 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

Ou bien alors : via Composer, 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 spécifier.

A priori, les réglages précédents permettent 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.

Continuons donc les réglages (avec PSR2R)

- 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

-  ç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.4.2"
  }

Remplacez par

  "require": {
    "squizlabs/php_codesniffer": "3.*"
},
  "scripts": {
    "phpcs": "phpcs --standard=/chemin/vers/SPIP_style.xml"
  }

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

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

<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>

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