Skip to content

Commit 10c9365

Browse files
Initial work on the HTML report refactoring.
1 parent dd33b69 commit 10c9365

File tree

8 files changed

+290
-2268
lines changed

8 files changed

+290
-2268
lines changed

PHP/CodeCoverage/Autoload.php

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,21 @@ function php_codecoverage_autoload($class) {
5353

5454
if ($classes === NULL) {
5555
$classes = array(
56+
'php_codecoverage' => '/CodeCoverage.php',
57+
'php_codecoverage_driver' => '/CodeCoverage/Driver.php',
5658
'php_codecoverage_driver_xdebug' => '/CodeCoverage/Driver/Xdebug.php',
57-
'php_codecoverage_textui_command' => '/CodeCoverage/TextUI/Command.php',
59+
'php_codecoverage_filter' => '/CodeCoverage/Filter.php',
5860
'php_codecoverage_report_clover' => '/CodeCoverage/Report/Clover.php',
5961
'php_codecoverage_report_factory' => '/CodeCoverage/Report/Factory.php',
60-
'php_codecoverage_report_php' => '/CodeCoverage/Report/PHP.php',
61-
'php_codecoverage_report_html_node' => '/CodeCoverage/Report/HTML/Node.php',
62-
'php_codecoverage_report_html_node_file' => '/CodeCoverage/Report/HTML/Node/File.php',
63-
'php_codecoverage_report_html_node_iterator' => '/CodeCoverage/Report/HTML/Node/Iterator.php',
64-
'php_codecoverage_report_html_node_directory' => '/CodeCoverage/Report/HTML/Node/Directory.php',
6562
'php_codecoverage_report_html' => '/CodeCoverage/Report/HTML.php',
63+
'php_codecoverage_report_html_dashboard' => '/CodeCoverage/Report/HTML/Dashboard.php',
6664
'php_codecoverage_report_node' => '/CodeCoverage/Report/Node.php',
65+
'php_codecoverage_report_node_directory' => '/CodeCoverage/Report/Node/Directory.php',
6766
'php_codecoverage_report_node_file' => '/CodeCoverage/Report/Node/File.php',
6867
'php_codecoverage_report_node_iterator' => '/CodeCoverage/Report/Node/Iterator.php',
69-
'php_codecoverage_report_node_directory' => '/CodeCoverage/Report/Node/Directory.php',
70-
'php_codecoverage_util' => '/CodeCoverage/Util.php',
71-
'php_codecoverage_filter' => '/CodeCoverage/Filter.php',
72-
'php_codecoverage_driver' => '/CodeCoverage/Driver.php',
73-
'php_codecoverage' => '/CodeCoverage.php'
68+
'php_codecoverage_report_php' => '/CodeCoverage/Report/PHP.php',
69+
'php_codecoverage_textui_command' => '/CodeCoverage/TextUI/Command.php',
70+
'php_codecoverage_util' => '/CodeCoverage/Util.php'
7471
);
7572

7673
$path = dirname(dirname(__FILE__));

PHP/CodeCoverage/Report/HTML.php

Lines changed: 14 additions & 256 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class PHP_CodeCoverage_Report_HTML
6060
/**
6161
* @var string
6262
*/
63-
public static $templatePath;
63+
protected $templatePath;
6464

6565
/**
6666
* @var array
@@ -104,7 +104,7 @@ public function __construct(array $options = array())
104104

105105
$this->options = $options;
106106

107-
self::$templatePath = sprintf(
107+
$this->templatePath = sprintf(
108108
'%s%sHTML%sTemplate%s',
109109

110110
dirname(__FILE__),
@@ -120,187 +120,27 @@ public function __construct(array $options = array())
120120
*/
121121
public function process(PHP_CodeCoverage $coverage, $target)
122122
{
123-
$target = PHP_CodeCoverage_Util::getDirectory($target);
124-
$files = $coverage->getData();
125-
$commonPath = PHP_CodeCoverage_Util::reducePaths($files);
126-
$items = PHP_CodeCoverage_Util::buildDirectoryStructure($files);
127-
$root = new PHP_CodeCoverage_Report_HTML_Node_Directory(
128-
$commonPath, NULL
129-
);
123+
$target = PHP_CodeCoverage_Util::getDirectory($target);
124+
$report = $coverage->getReport();
125+
unset($coverage);
130126

131-
$this->addItems($root, $items, $coverage->getTests());
132-
133-
$this->renderDashboard(
134-
$root, $target . 'index.dashboard.html', $this->options['title']
135-
);
136-
137-
foreach ($root as $node) {
138-
if ($node instanceof PHP_CodeCoverage_Report_HTML_Node_Directory) {
139-
$this->renderDashboard(
140-
$node,
141-
$target . PHP_CodeCoverage_Util::getSafeFilename(
142-
$node->getId()
143-
) . '.dashboard.html',
144-
$node->getName(TRUE)
145-
);
146-
}
147-
}
148-
149-
$root->render(
150-
$target,
151-
$this->options['title'],
127+
$dashboard = new PHP_CodeCoverage_Report_HTML_Dashboard(
128+
$this->templatePath,
152129
$this->options['charset'],
153-
$this->options['lowUpperBound'],
154-
$this->options['highLowerBound'],
155130
$this->options['generator']
156131
);
157132

158-
$this->copyFiles($target);
159-
}
160-
161-
/**
162-
* @param PHP_CodeCoverage_Report_HTML_Node_Directory $root
163-
* @param string $file
164-
* @param string $title
165-
*/
166-
protected function renderDashboard(PHP_CodeCoverage_Report_HTML_Node_Directory $root, $file, $title)
167-
{
168-
$classes = $this->classes($root);
169-
$template = new Text_Template(
170-
PHP_CodeCoverage_Report_HTML::$templatePath . 'dashboard.html'
171-
);
172-
173-
$template->setVar(
174-
array(
175-
'title' => $title,
176-
'charset' => $this->options['charset'],
177-
'date' => date(
178-
'D M j G:i:s T Y',
179-
$_SERVER['REQUEST_TIME']
180-
),
181-
'version' => '@package_version@',
182-
'php_version' => PHP_VERSION,
183-
'generator' => $this->options['generator'],
184-
'least_tested_methods' => $this->leastTestedMethods($classes),
185-
'top_project_risks' => $this->topProjectRisks($classes),
186-
'cc_values' => $this->classComplexity($classes),
187-
'ccd_values' => $this->classCoverageDistribution($classes),
188-
'backlink' => basename(str_replace('.dashboard', '', $file))
189-
)
190-
);
191-
192-
$template->renderTo($file);
193-
}
194-
195-
/**
196-
* @param PHP_CodeCoverage_Report_HTML_Node_Directory $root
197-
* @param array $items
198-
* @param array $tests
199-
*/
200-
protected function addItems(PHP_CodeCoverage_Report_HTML_Node_Directory $root, array $items, array $tests)
201-
{
202-
foreach ($items as $key => $value) {
203-
if (substr($key, -2) == '/f') {
204-
try {
205-
$root->addFile(
206-
substr($key, 0, -2),
207-
$value,
208-
$tests,
209-
$this->options['yui'],
210-
$this->options['highlight']
211-
);
212-
}
213-
214-
catch (RuntimeException $e) {
215-
continue;
216-
}
217-
} else {
218-
$child = $root->addDirectory($key);
219-
$this->addItems($child, $value, $tests);
220-
}
221-
}
222-
}
223-
224-
/**
225-
* Returns the classes.
226-
*
227-
* @param PHP_CodeCoverage_Report_HTML_Node_Directory $root
228-
* @return array
229-
*/
230-
protected function classes(PHP_CodeCoverage_Report_HTML_Node_Directory $root)
231-
{
232-
$classes = array();
233-
234-
foreach ($root as $node) {
235-
if ($node instanceof PHP_CodeCoverage_Report_HTML_Node_File) {
236-
$classes = array_merge($classes, $node->getClasses());
237-
}
238-
}
239-
240-
if (isset($classes['*'])) {
241-
unset($classes['*']);
242-
}
243-
244-
return $classes;
245-
}
246-
247-
/**
248-
* Returns the data for the Class Complexity chart.
249-
*
250-
* @param array $classes
251-
* @return string
252-
*/
253-
protected function classComplexity(array $classes)
254-
{
255-
$data = array();
256-
257-
foreach ($classes as $name => $class) {
258-
$data[] = array($class['coverage'], $class['ccn'], 'blue', $name);
259-
}
260-
261-
return json_encode($data);
262-
}
263-
264-
/**
265-
* Returns the data for the Class Coverage Distribution chart.
266-
*
267-
* @param array $classes
268-
* @return string
269-
*/
270-
protected function classCoverageDistribution(array $classes)
271-
{
272-
$data = array(
273-
'0%' => 0,
274-
'0-10%' => 0,
275-
'10-20%' => 0,
276-
'20-30%' => 0,
277-
'30-40%' => 0,
278-
'40-50%' => 0,
279-
'50-60%' => 0,
280-
'60-70%' => 0,
281-
'70-80%' => 0,
282-
'80-90%' => 0,
283-
'90-100%' => 0,
284-
'100%' => 0
133+
$dashboard->render(
134+
$report, $target . 'index.dashboard.html', $this->options['title']
285135
);
286136

287-
foreach ($classes as $class) {
288-
if ($class['coverage'] == 0) {
289-
$data['0%']++;
290-
}
291-
292-
else if ($class['coverage'] == 100) {
293-
$data['100%']++;
294-
}
295-
296-
else {
297-
$key = floor($class['coverage']/10)*10;
298-
$key = $key . '-' . ($key + 10) . '%';
299-
$data[$key]++;
137+
foreach ($report as $node) {
138+
if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
139+
$dashboard->render($node, $target . PHP_CodeCoverage_Util::nodeToId($node) . '.html');
300140
}
301141
}
302142

303-
return json_encode(array_values($data));
143+
$this->copyFiles($target);
304144
}
305145

306146
/**
@@ -329,89 +169,7 @@ protected function copyFiles($target)
329169
);
330170

331171
foreach ($files as $file) {
332-
copy(self::$templatePath . $file, $target . $file);
333-
}
334-
}
335-
336-
/**
337-
* Returns the least tested methods.
338-
*
339-
* @param array $classes
340-
* @param integer $max
341-
* @return string
342-
*/
343-
protected function leastTestedMethods(array $classes, $max = 10)
344-
{
345-
$methods = array();
346-
347-
foreach ($classes as $className => $class) {
348-
foreach ($class['methods'] as $methodName => $method) {
349-
if ($method['coverage'] < 100) {
350-
if ($className != '*') {
351-
$key = $className . '::' . $methodName;
352-
} else {
353-
$key = $methodName;
354-
}
355-
356-
$methods[$key] = $method['coverage'];
357-
}
358-
}
172+
copy($this->templatePath . $file, $target . $file);
359173
}
360-
361-
asort($methods);
362-
363-
$methods = array_slice($methods, 0, min($max, count($methods)));
364-
$buffer = '';
365-
366-
foreach ($methods as $name => $coverage) {
367-
list($class, $method) = explode('::', $name);
368-
369-
$buffer .= sprintf(
370-
' <li><a href="%s">%s</a> (%d%%)</li>' . "\n",
371-
$classes[$class]['methods'][$method]['file'],
372-
$name,
373-
$coverage
374-
);
375-
}
376-
377-
return $buffer;
378-
}
379-
380-
/**
381-
* Returns the top project risks according to the CRAP index.
382-
*
383-
* @param array $classes
384-
* @param integer $max
385-
* @return string
386-
*/
387-
protected function topProjectRisks(array $classes, $max = 10)
388-
{
389-
$risks = array();
390-
391-
foreach ($classes as $className => $class) {
392-
if ($class['coverage'] < 100 &&
393-
$class['ccn'] > count($class['methods'])) {
394-
$risks[$className] = $class['crap'];
395-
}
396-
}
397-
398-
asort($risks);
399-
400-
$risks = array_reverse(
401-
array_slice($risks, 0, min($max, count($risks)))
402-
);
403-
404-
$buffer = '';
405-
406-
foreach ($risks as $name => $crap) {
407-
$buffer .= sprintf(
408-
' <li><a href="%s">%s</a> (%d)</li>' . "\n",
409-
$classes[$name]['file'],
410-
$name,
411-
$crap
412-
);
413-
}
414-
415-
return $buffer;
416174
}
417175
}

0 commit comments

Comments
 (0)