PHP Tree Match, ou PHPTM de son petit nom, est un nouvel outil "basique" (dans la série des phpcpd, phpmd...) qui permet de vérifier que l'arborescence de votre/vos projets respectent bien une norme que vous vous donnez. Par exemple, vous avez l'habitude mettre une arborescence du type :

/
    application/
        default/
            controllers/
            models/
            views/
    config/
         application.ini
    html/
        index.php
        .htaccess
    ...

Vous devez gérer 1, 5, 10 ... projets similaires et vous voulez vérifier d'un seul coup que tous vos projets respectent bien vos conventions, que le fichier config/application.ini contient bien la section "production", que le fichier .project n'existe pas en prod...

Installation

à partir du Channel PEAR

$ pear channel-discover pear.phppro.fr
$ pear install phppro/phptm

mise à jour

$ pear upgrade phppro/phptm

à partir du package compatible PEAR en téléchargement sur Google Code

$ wget http://phptreematch.googlecode.com/files/phptm-0.1.0.tgz
$ pear install phptm-0.1.0.tgz

Usage

Avant d'utiliser phptm vous devez "décrire" votre arborescence projet dans un fichier de description au format xml. Voici un exemple :

<?xml version="1.0" encoding="UTF-8"?>
<tree>
    <item name=".project" present="false"/>
    <item name="bin/phptm.bat" hash="8c8d25cde4142e4b945792c2ca9a31cc"/>
    <item name="bin/phptm.php" hash="635f67483f575310a904c02a2068d0dd"/>
    <item name="build/package.xml" hash="ca34d98facbc5ff461976d5f18910cbe"/>
    <item name="build.xml" hash="a25ebe507f99623d266aeee4d1ed4463"/>
    <item name="config/build.properties">
        <contains>version=</contains>
        <contains>name=</contains>
    </item>
    <item name="config/package.xml"/>
    <item name="docs/README.markdown"/>
    <item name="library/PHPTM/Analyzer.php"/>
    <item name="library/PHPTM/Log/XML/XML.php"/>
    <item name="library/PHPTM/Log/XML.php"/>
    <item name="library/PHPTM/TextUI/Command.php"/>
    <item name="library/PHPTM/TextUI/Getopt.php"/>
    <item name="library/PHPTM/TextUI/ResultPrinter.php"/>
    <item name="library/PHPTM/Util/FilterIterator.php"/>
</tree>

Le fichier ci-dessus permet notamment de vérifier que certains fichier sont bien absent(present=false), que certains fichiers existent et ont un contenu précis (calculé à partir de "hash"), que certains fichiers existent et contiennent une chaîne de caractère précise ("contains", mais vous pouvez aussi utiliser "notcontains")...

Inspirez vous de l'exemple ci-dessus pour construire votre fichier de description, ou bien exécutez la commande suivante sur une arborescence type :

$ phptm --build-tree my-typical-directory > typical-tree.xml

Pour "passer" ensuite phptm sur votre application, exécutez :

$ phptm --expected-tree=typical-tree.xml my-directory

ou bien pour exporter aussi le résultat sous forme xml :

$ phptm --log-xml=phptm-report.xml --expected-tree=typical-tree.xml my-directory

Description du rapport calculé

Le rapport en ligne de commande ou bien le rapport xml vous indique alors si des erreurs de cohérences sont détectées et si oui, lesquelles :

  • missing : absence de fichier listé
  • present : présence de fichier listé comme devant être absent
  • hash : contenu de fichier non identique à celui attendu
  • contains : fichier contenant une chaîne marquée comme devant ne pas être dans le fichier
  • not-contains : fichier ne contenant pas une chaîne attendue

Limitations

PHPTM est loin d'être un outil parfait et exhaustif, n'hésitez pas à remonter des éventuels bugs et des demandes d'évolutions sur l'espace du projet sur Google Code http://code.google.com/p/phptreematch/issues/list ! ou à partir la documentation sur http://code.google.com/p/phptreematch


Bonne utilisation !