<?xml version="1.0"?>
<ruleset name="Atelier Steel Art - PHPMD"
         xmlns="http://pmd.sf.net/ruleset/2.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sf.net/ruleset/2.0.0
                             http://pmd.sf.net/ruleset_xml_schema.xsd"
         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">

    <description>
        Règles PHPMD (équivalent direct de PMD/Java) adaptées à un projet Laravel 12.
        Couvre la complexité, le code mort, les problèmes de design et de nommage,
        en relâchant les contraintes hostiles aux conventions Laravel.
    </description>

    <!-- ============================================================
         CODE SIZE : complexité cyclomatique, NPath, longueur des
         méthodes/classes, nombre de paramètres, champs publics...
         ============================================================ -->
    <rule ref="rulesets/codesize.xml">
        <!-- Les contrôleurs/services Laravel ont parfois de nombreuses
             méthodes publiques (resourceful controllers). -->
        <exclude name="ExcessivePublicCount" />
        <exclude name="TooManyPublicMethods" />
    </rule>
    <!-- Seuil de complexité cyclomatique laissé à la valeur par défaut (10),
         équivalent au seuil usuel de PMD/Java. -->


    <!-- ============================================================
         DESIGN : couplage, profondeur d'imbrication, exit(), eval(),
         golden hammer, accès BD direct...
         ============================================================ -->
    <rule ref="rulesets/design.xml">
        <!-- Les contrôleurs orchestrent plusieurs modèles/services :
             le couplage par défaut (13) génère trop de bruit ici. -->
        <exclude name="CouplingBetweenObjects" />
    </rule>
    <rule ref="rulesets/design.xml/CouplingBetweenObjects">
        <properties>
            <property name="maximum" value="20" />
        </properties>
    </rule>

    <!-- ============================================================
         UNUSED CODE : variables, paramètres, méthodes privées et
         champs jamais utilisés.
         ============================================================ -->
    <rule ref="rulesets/unusedcode.xml" />

    <!-- ============================================================
         NAMING : noms de variables/méthodes/classes trop courts ou
         trop longs.
         ============================================================ -->
    <rule ref="rulesets/naming.xml">
        <exclude name="ShortVariable" />
        <exclude name="LongVariable" />
    </rule>
    <rule ref="rulesets/naming.xml/ShortVariable">
        <properties>
            <!-- Tolère les noms courts idiomatiques. -->
            <property name="minimum" value="2" />
            <property name="exceptions" value="id,e,db,to,up,q,i,j,k,fn" />
        </properties>
    </rule>
    <rule ref="rulesets/naming.xml/LongVariable">
        <properties>
            <property name="maximum" value="35" />
        </properties>
    </rule>

</ruleset>
