Development

Changeset 20067

You must first sign up to be able to contribute.

Changeset 20067

Show
Ignore:
Timestamp:
07/09/09 17:48:14 (7 months ago)
Author:
Dejan.Spasic
Message:

* Refactor using extract class to generate each graphviz schema
* Write unit tests for the new classes

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • plugins/sfDoctrineGraphvizPlugin/lib/task/doctrineGraphvizTask.class.php

    r20054 r20067  
    9494 
    9595  /** 
    96    * Provides a array of columns 
    97    * 
    98    * @param Doctrine_Table $table The current Doctrine_Table 
    99    * 
    100    * @return array 
    101    */ 
    102   private function listColumns(Doctrine_Table $table) 
    103   { 
    104     $ret = array(); 
    105     foreach ($table->getColumns() as $name => $column) 
    106     { 
    107       if (empty($column['primary'])) 
    108       { 
    109         $added = true; 
    110         foreach ($table->getRelations() as $relation) 
    111         { 
    112           if ($relation instanceof Doctrine_Relation_LocalKey && $relation->getLocal() === $name) 
    113           { 
    114             $added = false; 
    115             break; 
    116           } 
    117         } 
    118         if ($added) 
    119         { 
    120           $ret[] = sprintf("%s (%s)", $name, $column['type']); 
    121         } 
    122       } 
    123     } 
    124     return $ret; 
    125   } 
    126  
    127   /** 
    12896   * Generate the mcd schema 
    12997   * 
     
    132100  public function genMCD() 
    133101  { 
    134     $modelNames = $this->loadModels(); 
    135  
    136     $relations = array(); 
    137     foreach($modelNames as $modelName) 
    138     { 
    139       $table = Doctrine::getTable($modelName); 
    140       foreach ($table->getRelations() as $relation) 
    141       { 
    142         if ($relation->getType() === Doctrine_Relation::MANY && isset($relation['refTable'])) 
    143         { 
    144           $relations[] = $relation['refTable']->name; 
    145         } 
    146       } 
    147     } 
    148  
    149     $entites = array(); 
    150     $assocs  = array(); 
    151     $lines   = array(); 
    152     $gens    = array(); 
    153  
    154     foreach($modelNames as $modelName) 
    155     { 
    156       $table = Doctrine::getTable($modelName); 
    157       $entites[$modelName] = array(); 
    158       $entites[$modelName] = $this->listColumns($table); 
    159       if (count($entites[$modelName]) === 0) 
    160       { 
    161         unset($entites[$modelName]); 
    162         $relations[] = $modelName; 
    163       } 
    164     } 
    165  
    166     $relations = array_unique($relations); 
    167     foreach($relations as $relation) 
    168     { 
    169       unset($modelNames[array_search($relation, $modelNames)]); 
    170     } 
    171  
    172     foreach($relations as $modelName) 
    173     { 
    174       $table = Doctrine::getTable($modelName); 
    175       $assocs[$modelName] = array(); 
    176       $assocs[$modelName] = $this->listColumns($table); 
    177     } 
    178  
    179     foreach($relations as $modelName) 
    180     { 
    181       $table = Doctrine::getTable($modelName); 
    182       foreach ($table->getRelations() as $name => $relation) 
    183       { 
    184         if ($relation instanceof Doctrine_Relation_LocalKey) 
    185         { 
    186           $lines[] = array($modelName, $relation->getTable()->name, '0,n', $relation->getAlias()); 
    187         } 
    188       } 
    189     } 
    190  
    191     foreach($modelNames as $modelName) 
    192     { 
    193       $table = Doctrine::getTable($modelName); 
    194       foreach ($table->getRelations() as $name => $relation) 
    195       { 
    196         if (!in_array($relation->getTable()->getTableName(), $relations)) 
    197         { 
    198           if ($relation instanceof Doctrine_Relation_LocalKey) 
    199           { 
    200             if ($relation->getTable()->hasRelation($modelName) 
    201                 && !$relation->getTable()->getRelation($modelName)->isOneToOne()) 
    202             { 
    203               $assocName = $modelName . $relation->getTable()->name; 
    204               $lines[] = array($assocName, $relation->getTable()->name, '0,n', $relation->getAlias()); 
    205             } 
    206           } 
    207           else if ($relation instanceof Doctrine_Relation_ForeignKey) 
    208           { 
    209             if ($relation->isOneToOne()) 
    210             { 
    211               $gens[] = array($modelName, $relation->getTable()->name); 
    212             } 
    213             else 
    214             { 
    215               $assocName = $relation->getTable()->name . $modelName; 
    216               $lines[] = array($modelName, $relation->getTable()->name, '0,1', $relation->getAlias()); 
    217             } 
    218           } 
    219         } 
    220       } 
    221     } 
    222  
    223     foreach($lines as $line) 
    224     { 
    225       if (false === isset($assocs[$line[0]])) 
    226       { 
    227         $assocs[$line[0]] = array(); 
    228       } 
    229     } 
    230  
    231     $digraph="graph G {edge  [ len=2 labeldistance=2 ];overlap=false;splines=true;" . self::EOL; 
    232     foreach($entites as $entite => $champs) 
    233     { 
    234       $digraph .= sprintf("node%s [label=\"{<table>%s|<cols>%s}\", shape=record];" . self::EOL, 
    235         $entite, 
    236         $entite, 
    237         implode("\l", $champs)); 
    238     } 
    239     $digraph .= self::EOL; 
    240  
    241     foreach($assocs as $assoc => $champs) 
    242     { 
    243       $digraph .= sprintf("node%s [label=\"{<table>%s|<cols>%s}\", shape=Mrecord];" . self::EOL, 
    244         $assoc, 
    245         $assoc, 
    246         implode("\l", $champs)); 
    247     } 
    248     $digraph .= self::EOL; 
    249  
    250     foreach($lines as $line) 
    251     { 
    252       if ($line[3] == $line[1]) 
    253       { 
    254         $line[3] = ''; 
    255       } 
    256       else 
    257       { 
    258         $line[3] = "(" . $line[3] . ")"; 
    259       } 
    260  
    261       $digraph .= vsprintf("node%s -- node%s [headlabel=\"%s\",label=\"%s\",labeldistance=3];" . self::EOL, $line); 
    262     } 
    263     $digraph .= self::EOL; 
    264  
    265     foreach($gens as $gen) 
    266     { 
    267       $digraph .= sprintf("node%s -- node%s [arrowhead=normal];" . self::EOL, $gen[0], $gen[1]); 
    268     } 
    269     $digraph .= "}"; 
    270  
    271     return $digraph; 
     102    $mcdGenerator = new doctrineGraphvizMcdGenerator(); 
     103    return $mcdGenerator->generate($this->loadModels())->getBuffer(); 
    272104  } 
    273105 
     
    279111  public function genMLD() 
    280112  { 
    281     $moduleNames = $this->loadModels(); 
    282  
    283     $digraph = "digraph G {edge  [ len=2 labeldistance=2 ];overlap=false;splines=true;" . self::EOL; 
    284     foreach($moduleNames as $moduleName) 
    285     { 
    286       $table = Doctrine::getTable($moduleName); 
    287       $digraph .= sprintf("node%s [label=\"{<table>%s|<cols>", $table->name, $table->tableName); 
    288       foreach ($table->getColumns() as $name => $column) 
    289       { 
    290         $digraph .= sprintf("%s (%s)%s\l", 
    291           $name, 
    292           $column['type'], 
    293           (false === empty($column['primary']) ? ' [PK]' : '')); 
    294       } 
    295       $digraph .= "}\", shape=record];" . self::EOL; 
    296     } 
    297  
    298     $digraph .= self::EOL; 
    299  
    300     $rel = array(); 
    301     foreach($moduleNames as $moduleName) 
    302     { 
    303       $table = Doctrine::getTable($moduleName); 
    304       foreach ($table->getRelations() as $name => $relation) 
    305       { 
    306         if ($relation instanceof Doctrine_Relation_LocalKey) 
    307         { 
    308           $rel[] = sprintf("node%s:cols -> node%s:table [label=\"%s=%s\"];", 
    309             $table->name, 
    310             $relation->getTable()->name, 
    311             $relation->getLocal(), 
    312             $relation->getForeign()); 
    313         } 
    314       } 
    315     } 
    316     $rel = array_unique($rel); 
    317  
    318     return $digraph . implode(self::EOL, $rel) . self::EOL . "}"; 
     113    $mldGenerator = new doctrineGraphvizMldGenerator(); 
     114    return $mldGenerator->generate($this->loadModels())->getBuffer(); 
    319115  } 
    320116 
  • plugins/sfDoctrineGraphvizPlugin/package.xml

    r19204 r20067  
    3434          <file name="doctrineGraphvizTask.class.php" role="data" /> 
    3535        </dir> 
     36        <dir name="generator"> 
     37          <file name="doctrineGraphvizMcdGenerator.class.php" role="data" /> 
     38          <file name="doctrineGraphvizMldGenerator.class.php" role="data" /> 
     39          <file name="doctrineGraphvizGeneratorBase.class.php" role="data" /> 
     40        </dir> 
     41      </dir> 
     42      <dir name="test"> 
     43        <dir name="_files"> 
     44          <dir name="expected"> 
     45            <file name="mcd.schema.dot" role="data" /> 
     46            <file name="mld.schema.dot" role="data" /> 
     47          </dir> 
     48          <dir name="model" /> 
     49          <file name="schema.yml" role="data" /> 
     50        </dir> 
     51        <dir name="unit"> 
     52          <dir name="lib"> 
     53            <dir name="task"> 
     54              <file name="doctrineGraphvizTaskTest.php" role="data" /> 
     55            </dir> 
     56            <dir name="generator"> 
     57              <file name="doctrineGraphvizMldGeneratorTest.php" role="data" /> 
     58              <file name="doctrineGraphvizMcdGeneratorTest.php" role="data" /> 
     59            </dir> 
     60          </dir> 
     61        </dir> 
     62        <file name="bootstrap.php" role="data" /> 
     63        <file name="prove.php" role="data" /> 
    3664      </dir> 
    3765      <file name="LICENSE" role="data" /> 
  • plugins/sfDoctrineGraphvizPlugin/test/unit/lib/task/doctrineGraphvizTaskTest.php

    r20056 r20067  
    1111require_once dirname(__FILE__) . '/../../../bootstrap.php'; 
    1212require_once dirname(__FILE__) . '/../../../../lib/task/doctrineGraphvizTask.class.php'; 
     13require_once dirname(__FILE__) . '/../../../../lib/generator/doctrineGraphvizMldGenerator.class.php'; 
     14require_once dirname(__FILE__) . '/../../../../lib/generator/doctrineGraphvizMcdGenerator.class.php'; 
    1315 
    1416/** 
     
    7274 
    7375 
    74 $t = new lime_test(2, new lime_output_color()); 
     76$t = new lime_test(4, new lime_output_color()); 
    7577 
    7678$t->ok( 
     
    8688  file_get_contents(dirname(__FILE__) . '/../../../_files/expected/mld.schema.dot'), 
    8789  "Test MLD" 
     90); 
     91 
     92$t->ok( 
     93  file_exists(dirname(__FILE__) . '/../../../_files/' . doctrineGraphvizTaskTest::GRAPH_DIR . '/mld.schema.png'), 
     94  "Test if the mld image exists" 
     95); 
     96 
     97$t->ok( 
     98  file_exists(dirname(__FILE__) . '/../../../_files/' . doctrineGraphvizTaskTest::GRAPH_DIR . '/mcd.schema.png'), 
     99  "Test if the mcd image exists" 
    88100); 
    89101 

The Sensio Labs Network

Since 1998, Sensio Labs has been promoting the Open-Source software movement by providing quality web application development, training, consulting.
Sensio Labs also supports several large Open-Source projects.