QA_Peardoc_Coverage
[ class tree: QA_Peardoc_Coverage ] [ index: QA_Peardoc_Coverage ] [ all elements ]

Source for file DeveloperList.php

Documentation is available at DeveloperList.php

  1. <?php
  2. require_once 'QA/Peardoc/Coverage/Renderer.php';
  3.  
  4. /**
  5. * Renders a list with developers, the number of packages
  6. * they maintain and the documented/undocumented ratio
  7. *
  8. @category QA
  9. @package  QA_Peardoc_Coverage
  10. @author   Christian Weiske <cweiske@php.net>
  11. @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
  12. @version  CVS: $Id: DeveloperList.php,v 1.10 2007/07/18 18:52:44 cweiske Exp $
  13. @link     http://pear.php.net/package/QA_Peardoc_Coverage
  14. */
  15.     implements QA_Peardoc_Coverage_Renderer
  16. {
  17.     public static $colNotDocumented '#F00';
  18.     public static $colDocumented    '#0F0';
  19.     public static $arLevels = array(
  20.         100 => 'Well done',
  21.          90 => 'Not bad',
  22.          60 => 'Should be better',
  23.          30 => 'Shame on you'
  24.     );
  25.  
  26.  
  27.  
  28.     /**
  29.     * Returns the color code matching the number.
  30.     *
  31.     * @param float $flNumber Number (x/y), !no! percentage
  32.     *
  33.     * @return string HTML color #0AF
  34.     */
  35.     public static function getColor($flNumber)
  36.     {
  37.         if ($flNumber == 1{
  38.             return '#0F0';
  39.         else if ($flNumber >= 0.9{
  40.             return '#dfff00';
  41.         else if ($flNumber >= 0.6{
  42.             return '#FF0';
  43.         else if ($flNumber >= 0.3{
  44.             return '#F70';
  45.         else {
  46.             return '#F00';
  47.         }
  48.     }//public static function getColor($flNumber)
  49.  
  50.  
  51.  
  52.     /**
  53.     * Renders the given coverage array and
  54.     * returns the HTML.
  55.     *
  56.     * @param array $arDoc     Documentation coverage analysis results
  57.     * @param array $arOptions Options
  58.     *
  59.     * @return string HTML
  60.     */
  61.     public function render($arDoc$arOptions = null)
  62.     {
  63.         $arMaintainer = self::getMaintainers($arDoc);
  64.  
  65.         $n    "\n";
  66.         $out  '';
  67.         $out .= '<?xml version="1.0" encoding="utf-8" ?>' $n
  68.             . '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '
  69.             . '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
  70.  
  71.         $out .= '<html><head><title>PEAR Documentation coverage by developer</title></head><body>';
  72.         $out .= '<table border="1"><caption>'
  73.             . 'PEAR documentation coverage by developer '
  74.             . date('Y-m-d H:i:s'$arDoc['*date*'])
  75.             . '</caption>' $n;
  76.  
  77.  
  78.         $arMaintainers = self::getMaintainers($arDoc);
  79.         uasort($arMaintainersarray('self''compareMaintainers'));
  80.  
  81.         $out .= '<thead>'
  82.             . '<tr><th>Place</th><th>Developer</th><th>Docced</th><th>Packages</th><th>Percentage</th>'
  83.             . '<th>Undocumented Packages</th>'
  84.             . '</tr>'
  85.             . '</thead>' $n;
  86.  
  87.         $nPlace      = 0;
  88.         $nNextNumber = 101;
  89.         $arCounter   = array();
  90.         reset(self::$arLevels);
  91.  
  92.         foreach ($arMaintainers as $strUsername => $arMaintainer{
  93.             if ($strUsername == '???' || $strUsername == ''{
  94.                 continue;
  95.             }
  96.  
  97.             $num $arMaintainer['docced'$arMaintainer['packages'];
  98.             $glatt = intval($num * 100);
  99.  
  100.             if ($glatt $nNextNumber{
  101.                 $strLevel current(self::$arLevels);
  102.                 $out .= '<tr><th colspan="6">' $strLevel '</th></tr>' $n;
  103.                 next(self::$arLevels);
  104.                 $nNextNumber = key(self::$arLevels);
  105.             }
  106.  
  107.             $arUndocumented = array();
  108.             if ($glatt != 100{
  109.                 foreach ($arMaintainer['packagelist'as $strPackageName => $arPackage{
  110.                     if ($arPackage['*docid*'=== null{
  111.                         $arUndocumented['<a href="http://pear.php.net/package/'
  112.                             . $strPackageName '">'
  113.                             . $strPackageName
  114.                             . '</a>';
  115.                     }
  116.                 }
  117.             }
  118.  
  119.             if (!isset($arCounter[$strLevel])) {
  120.                 $arCounter[$strLevel= 0;
  121.             else {
  122.                 $arCounter[$strLevel]++;
  123.             }
  124.  
  125.             $out .= '<tr>'
  126.                 . '<td>' . ++$nPlace '</td>'
  127.                 . '<td><a href="http://pear.php.net/user/' $strUsername '" name="' $strUsername '">' $strUsername '</a></td>'
  128.                 . '<td>' $arMaintainer['docced''</td>'
  129.                 . '<td>' $arMaintainer['packages''</td>'
  130.                 . '<td style="background-color:' . self::getColor($num'">'
  131.                 . number_format($num * 1002'%</td>'
  132.                 . '<td>' implode(', '$arUndocumented'</td>'
  133.                 . '</tr>' $n
  134.             ;
  135.         }
  136.  
  137.         $out .= '</table>' $n;
  138.  
  139.         //now statistics
  140.         $out .= '<table border="1"><caption>Statistics</caption>' $n
  141.             . '<thead><tr><th>Level</th><th># devs</th><th>Percent</th></tr></thead>'
  142.             . '<tfoot><tr><th>Sum</th><td>' count($arMaintainers'</td><td>100%</td></tr></tfoot>'
  143.             . '<tbody>';
  144.         foreach ($arCounter as $strLevel => $nDevs{
  145.             $out .= '<tr>'
  146.                 . '<td>' $strLevel '</td>'
  147.                 . '<td>' $nDevs '</td>'
  148.                 . '<td>' number_format(100 / count($arMaintainers$nDevs2'%</td>'
  149.                 . '</tr>' $n;
  150.         }
  151.         $out .= '</tbody></table>' $n;
  152.  
  153.  
  154.         $out .= '</body></html>';
  155.  
  156.         return $out;
  157.     }//public function render($arDoc)
  158.  
  159.  
  160.  
  161.     /**
  162.     * Returns an array of package maintainer usernames,
  163.     * their email address, real name and the packages
  164.     * maintained by them. Also lists which packages are
  165.     * not docced, and which are.
  166.     *
  167.     * @param array $arDoc Array as passed to render() method.
  168.     *
  169.     * @return array   Array with the following data:
  170.     *  [username] => array(
  171.     *      [name]      => Real name
  172.     *      [email]     => Email address
  173.     *      [docced]    => # of documented packages
  174.     *      [packages]  => # of packages at all
  175.     *      [packagelist]   => array with package names (key)
  176.     *                      value is reference to doc array
  177.     *  )
  178.     */
  179.     public static function getMaintainers($arDoc)
  180.     {
  181.         $arMaintainers = array();
  182.         foreach ($arDoc as $strCategory => &$arPackages{
  183.             if ($strCategory[0== '*'{
  184.                 continue;
  185.             }
  186.  
  187.             foreach ($arPackages as $strPackageName => &$arPackage{
  188.                 $strPath $arPackage['*package*'];
  189.                 $strV1 $strPath '/package.xml';
  190.                 $strV2 $strPath '/package2.xml';
  191.  
  192.                 if (file_exists($strV2)) {
  193.                     $strPackageXmlPath $strV2;
  194.                 else {
  195.                     $strPackageXmlPath $strV1;
  196.                 }
  197.  
  198.                 $arPackageMaintainers = self::getPackageMaintainers(
  199.                     $strPackageXmlPath
  200.                 );
  201.  
  202.                 foreach ($arPackageMaintainers as $strUsername => $arMaintainer{
  203.                     if (!isset($arMaintainers[$strUsername])) {
  204.                         $arMaintainers[$strUsername$arMaintainer;
  205.                         $arMaintainers[$strUsername]['packages'= 0;
  206.                         $arMaintainers[$strUsername]['docced']   = 0;
  207.                         $arMaintainers[$strUsername]['packagelist'= array();
  208.                     }
  209.                     ++$arMaintainers[$strUsername]['packages'];
  210.                     $arMaintainers[$strUsername]['packagelist'][$strPackageName&$arPackage;
  211.                     if ($arPackage['*docid*'!== null{
  212.                         ++$arMaintainers[$strUsername]['docced'];
  213.                     }
  214.                 }
  215.  
  216.             }
  217.         }
  218.  
  219.         return $arMaintainers;
  220.     }//public static function getMaintainers($arDoc)
  221.  
  222.  
  223.  
  224.     /**
  225.     * Reads the package maintainers from a package.xml (v1 and v2)
  226.     * file.
  227.     *
  228.     * @param string $strPackageXmlPath Path to a package.xml file
  229.     *
  230.     * @return array Array with maintainers of following structure:
  231.     *  [username] => array(
  232.     *      [name]      => Real name
  233.     *      [email]     => Email address
  234.     *  )
  235.     */
  236.     public static function getPackageMaintainers($strPackageXmlPath)
  237.     {
  238.         if (!file_exists($strPackageXmlPath)) {
  239.             throw new Exception('File does not exist: ' $strPackageXmlPath);
  240.         }
  241.  
  242.         $doc = new DOMDocument();
  243.         if (!@$doc->load($strPackageXmlPath)) {
  244.             return array();
  245.             throw new Exception('Package xml is broken: ' $strPackageXmlPath);
  246.         }
  247.         $xpath = new DOMXPath($doc);
  248.  
  249.         $arMaintainers = array();
  250.  
  251.         $pack       $doc->getElementsByTagName('package')->item(0);
  252.         $strVersion $pack->getAttribute('version');
  253.  
  254.         if ($strVersion == ''{
  255.             $strVersion '1.0';
  256.         }
  257.  
  258.         if ($strVersion != '1.0' && $strVersion != '2.0'{
  259.             throw new Exception(
  260.                 'Unsupported package.xml version ' $strVersion
  261.                 . ' in ' $strPackageXmlPath
  262.             );
  263.         }
  264.  
  265.         if ($strVersion == '1.0'{
  266.             //get maintainers
  267.             $maintainers $pack->getElementsByTagName('maintainer');
  268.             foreach ($maintainers as $maintainer{
  269.                 $strUsername strtolower($maintainer->getElementsByTagName('user')->item(0)->textContent);
  270.                 $strRealname $maintainer->getElementsByTagName('name')->item(0)->textContent;
  271.                 $strEmail    $maintainer->getElementsByTagName('email')->item(0)->textContent;
  272.                 $arMaintainers[$strUsername= array(
  273.                     'username'  => $strUsername,
  274.                     'name'      => $strRealname,
  275.                     'email'     => $strEmail
  276.                 );
  277.             }
  278.         else {
  279.             //v2
  280.             $maintainers $pack->getElementsByTagName('lead');
  281.             foreach ($maintainers as $maintainer{
  282.                 if ($maintainer->getElementsByTagName('active')->item(0)->textContent != 'yes'{
  283.                     continue;
  284.                 }
  285.                 $strUsername strtolower($maintainer->getElementsByTagName('user')->item(0)->textContent);
  286.                 $strRealname $maintainer->getElementsByTagName('name')->item(0)->textContent;
  287.                 $strEmail    $maintainer->getElementsByTagName('email')->item(0)->textContent;
  288.                 $arMaintainers[$strUsername= array(
  289.                     'username'  => $strUsername,
  290.                     'name'      => $strRealname,
  291.                     'email'     => $strEmail
  292.                 );
  293.             }
  294.             $maintainers $pack->getElementsByTagName('developer');
  295.             foreach ($maintainers as $maintainer{
  296.                 if ($maintainer->getElementsByTagName('active')->item(0)->textContent != 'yes'{
  297.                     continue;
  298.                 }
  299.                 $strUsername strtolower($maintainer->getElementsByTagName('user')->item(0)->textContent);
  300.                 $strRealname $maintainer->getElementsByTagName('name')->item(0)->textContent;
  301.                 $strEmail    $maintainer->getElementsByTagName('email')->item(0)->textContent;
  302.                 $arMaintainers[$strUsername= array(
  303.                     'username'  => $strUsername,
  304.                     'name'      => $strRealname,
  305.                     'email'     => $strEmail
  306.                 );
  307.             }
  308.         }
  309.  
  310.         return $arMaintainers;
  311.     }//public static function getPackageMaintainers($strPackageXmlPath)
  312.  
  313.  
  314.  
  315.     /**
  316.     * Compares two maintainer arrays for sorting
  317.     *
  318.     * @param array $m1 Maintainer 1
  319.     * @param array $m2 Maintainer 2
  320.     *
  321.     * @return int -1,0,1 depending on sort results
  322.     */
  323.     public static function compareMaintainers($m1$m2)
  324.     {
  325.         $v1 $m1['docced'$m1['packages'];
  326.         $v2 $m2['docced'$m2['packages'];
  327.         if ($v1 == $v2{
  328.             return strcasecmp($m1['username']$m2['username']);
  329.         }
  330.         return ($v1 $v2? -1 : 1;
  331.     }//public static function compareMaintainers($m1, $m2)
  332.  
  333. }//class QA_Peardoc_Coverage_Renderer_DeveloperList
  334. ?>

Documentation generated on Mon, 11 Mar 2019 15:10:40 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.