Source for file DeveloperList.php
Documentation is available at DeveloperList.php
require_once 'QA/Peardoc/Coverage/Renderer.php';
* Renders a list with developers, the number of packages
* they maintain and the documented/undocumented ratio
* @package QA_Peardoc_Coverage
* @author Christian Weiske <cweiske@php.net>
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: DeveloperList.php,v 1.10 2007/07/18 18:52:44 cweiske Exp $
* @link http://pear.php.net/package/QA_Peardoc_Coverage
implements QA_Peardoc_Coverage_Renderer
public static $colNotDocumented = '#F00';
public static $colDocumented = '#0F0';
public static $arLevels = array (
60 => 'Should be better',
* Returns the color code matching the number.
* @param float $flNumber Number (x/y), !no! percentage
* @return string HTML color #0AF
public static function getColor($flNumber)
} else if ($flNumber >= 0.9 ) {
} else if ($flNumber >= 0.6 ) {
} else if ($flNumber >= 0.3 ) {
}//public static function getColor($flNumber)
* Renders the given coverage array and
* @param array $arDoc Documentation coverage analysis results
* @param array $arOptions Options
public function render($arDoc, $arOptions = null )
$arMaintainer = self ::getMaintainers ($arDoc);
$out .= '<?xml version="1.0" encoding="utf-8" ?>' . $n
. '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '
. '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
$out .= '<html><head><title>PEAR Documentation coverage by developer</title></head><body>';
$out .= '<table border="1"><caption>'
. 'PEAR documentation coverage by developer '
. date('Y-m-d H:i:s', $arDoc['*date*'])
$arMaintainers = self ::getMaintainers ($arDoc);
uasort($arMaintainers, array ('self', 'compareMaintainers'));
. '<tr><th>Place</th><th>Developer</th><th>Docced</th><th>Packages</th><th>Percentage</th>'
. '<th>Undocumented Packages</th>'
foreach ($arMaintainers as $strUsername => $arMaintainer) {
if ($strUsername == '???' || $strUsername == '') {
$num = $arMaintainer['docced'] / $arMaintainer['packages'];
$glatt = intval ($num * 100 );
if ($glatt < $nNextNumber) {
$strLevel = current(self ::$arLevels);
$out .= '<tr><th colspan="6">' . $strLevel . '</th></tr>' . $n;
$nNextNumber = key (self ::$arLevels);
$arUndocumented = array ();
foreach ($arMaintainer['packagelist'] as $strPackageName => $arPackage) {
if ($arPackage['*docid*'] === null ) {
$arUndocumented[] = '<a href="http://pear.php.net/package/'
if (!isset ($arCounter[$strLevel])) {
$arCounter[$strLevel] = 0;
. '<td>' . ++ $nPlace . '</td>'
. '<td><a href="http://pear.php.net/user/' . $strUsername . '" name="' . $strUsername . '">' . $strUsername . '</a></td>'
. '<td>' . $arMaintainer['docced'] . '</td>'
. '<td>' . $arMaintainer['packages'] . '</td>'
. '<td style="background-color:' . self ::getColor ($num) . '">'
. '<td>' . implode(', ', $arUndocumented) . '</td>'
$out .= '<table border="1"><caption>Statistics</caption>' . $n
. '<thead><tr><th>Level</th><th># devs</th><th>Percent</th></tr></thead>'
. '<tfoot><tr><th>Sum</th><td>' . count($arMaintainers) . '</td><td>100%</td></tr></tfoot>'
foreach ($arCounter as $strLevel => $nDevs) {
. '<td>' . $strLevel . '</td>'
. '<td>' . $nDevs . '</td>'
$out .= '</tbody></table>' . $n;
$out .= '</body></html>';
}//public function render($arDoc)
* Returns an array of package maintainer usernames,
* their email address, real name and the packages
* maintained by them. Also lists which packages are
* not docced, and which are.
* @param array $arDoc Array as passed to render() method.
* @return array Array with the following data:
* [email] => Email address
* [docced] => # of documented packages
* [packages] => # of packages at all
* [packagelist] => array with package names (key)
* value is reference to doc array
$arMaintainers = array ();
foreach ($arDoc as $strCategory => &$arPackages) {
if ($strCategory[0 ] == '*') {
foreach ($arPackages as $strPackageName => &$arPackage) {
$strPath = $arPackage['*package*'];
$strV1 = $strPath . '/package.xml';
$strV2 = $strPath . '/package2.xml';
$strPackageXmlPath = $strV2;
$strPackageXmlPath = $strV1;
$arPackageMaintainers = self ::getPackageMaintainers (
foreach ($arPackageMaintainers as $strUsername => $arMaintainer) {
if (!isset ($arMaintainers[$strUsername])) {
$arMaintainers[$strUsername] = $arMaintainer;
$arMaintainers[$strUsername]['packages'] = 0;
$arMaintainers[$strUsername]['docced'] = 0;
$arMaintainers[$strUsername]['packagelist'] = array ();
++ $arMaintainers[$strUsername]['packages'];
$arMaintainers[$strUsername]['packagelist'][$strPackageName] = &$arPackage;
if ($arPackage['*docid*'] !== null ) {
++ $arMaintainers[$strUsername]['docced'];
}//public static function getMaintainers($arDoc)
* Reads the package maintainers from a package.xml (v1 and v2)
* @param string $strPackageXmlPath Path to a package.xml file
* @return array Array with maintainers of following structure:
* [email] => Email address
throw new Exception ('File does not exist: ' . $strPackageXmlPath);
$doc = new DOMDocument ();
if (!@$doc->load ($strPackageXmlPath)) {
throw new Exception ('Package xml is broken: ' . $strPackageXmlPath);
$xpath = new DOMXPath ($doc);
$arMaintainers = array ();
$pack = $doc->getElementsByTagName ('package')->item (0 );
$strVersion = $pack->getAttribute ('version');
if ($strVersion != '1.0' && $strVersion != '2.0') {
'Unsupported package.xml version ' . $strVersion
. ' in ' . $strPackageXmlPath
if ($strVersion == '1.0') {
$maintainers = $pack->getElementsByTagName ('maintainer');
foreach ($maintainers as $maintainer) {
$strUsername = strtolower($maintainer->getElementsByTagName ('user')->item (0 )->textContent );
$strRealname = $maintainer->getElementsByTagName ('name')->item (0 )->textContent;
$strEmail = $maintainer->getElementsByTagName ('email')->item (0 )->textContent;
$arMaintainers[$strUsername] = array (
'username' => $strUsername,
$maintainers = $pack->getElementsByTagName ('lead');
foreach ($maintainers as $maintainer) {
if ($maintainer->getElementsByTagName ('active')->item (0 )->textContent != 'yes') {
$strUsername = strtolower($maintainer->getElementsByTagName ('user')->item (0 )->textContent );
$strRealname = $maintainer->getElementsByTagName ('name')->item (0 )->textContent;
$strEmail = $maintainer->getElementsByTagName ('email')->item (0 )->textContent;
$arMaintainers[$strUsername] = array (
'username' => $strUsername,
$maintainers = $pack->getElementsByTagName ('developer');
foreach ($maintainers as $maintainer) {
if ($maintainer->getElementsByTagName ('active')->item (0 )->textContent != 'yes') {
$strUsername = strtolower($maintainer->getElementsByTagName ('user')->item (0 )->textContent );
$strRealname = $maintainer->getElementsByTagName ('name')->item (0 )->textContent;
$strEmail = $maintainer->getElementsByTagName ('email')->item (0 )->textContent;
$arMaintainers[$strUsername] = array (
'username' => $strUsername,
}//public static function getPackageMaintainers($strPackageXmlPath)
* Compares two maintainer arrays for sorting
* @param array $m1 Maintainer 1
* @param array $m2 Maintainer 2
* @return int -1,0,1 depending on sort results
$v1 = $m1['docced'] / $m1['packages'];
$v2 = $m2['docced'] / $m2['packages'];
return strcasecmp($m1['username'], $m2['username']);
return ($v1 > $v2) ? -1 : 1;
}//public static function compareMaintainers($m1, $m2)
}//class QA_Peardoc_Coverage_Renderer_DeveloperList
Documentation generated on Mon, 11 Mar 2019 15:10:40 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|