@@ -60,7 +60,7 @@ class PHP_CodeCoverage_Report_HTML
60
60
/**
61
61
* @var string
62
62
*/
63
- public static $ templatePath ;
63
+ protected $ templatePath ;
64
64
65
65
/**
66
66
* @var array
@@ -104,7 +104,7 @@ public function __construct(array $options = array())
104
104
105
105
$ this ->options = $ options ;
106
106
107
- self :: $ templatePath = sprintf (
107
+ $ this -> templatePath = sprintf (
108
108
'%s%sHTML%sTemplate%s ' ,
109
109
110
110
dirname (__FILE__ ),
@@ -120,187 +120,27 @@ public function __construct(array $options = array())
120
120
*/
121
121
public function process (PHP_CodeCoverage $ coverage , $ target )
122
122
{
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 );
130
126
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 ,
152
129
$ this ->options ['charset ' ],
153
- $ this ->options ['lowUpperBound ' ],
154
- $ this ->options ['highLowerBound ' ],
155
130
$ this ->options ['generator ' ]
156
131
);
157
132
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 ' ]
285
135
);
286
136
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 ' );
300
140
}
301
141
}
302
142
303
- return json_encode ( array_values ( $ data ) );
143
+ $ this -> copyFiles ( $ target );
304
144
}
305
145
306
146
/**
@@ -329,89 +169,7 @@ protected function copyFiles($target)
329
169
);
330
170
331
171
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 );
359
173
}
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 ;
416
174
}
417
175
}
0 commit comments