DownloadYii2 Code Statistic
Based on phploc/phploc
Installation
Either run
composer require --dev insolita/yii2-codestat:~2.0
or add
"insolita/yii2-codestat": "~2.0"
in require-dev section of your composer.json file.
Basic Usage
Add in console configuration file, in section modules
php
'modules'=>[
....
'codestat'=>[
'class'=>\insolita\codestat\CodeStatModule::class,
'scanTargets' => ['@backend/','@common/','@frontend/','@console/'],
'exceptTargets' => ['config','vendor','web/','runtime/','views/','*tests/'],
]
],
scanTargets - array of path, or path aliases that will be scanned recursively
exceptTargets - array of path patterns for excluding
For checking whole list of files that will be processed, run ./yii codestat/default/list-files
For statistic summary output run ./yii codestat
For statistic summary output with show bad resolved files ./yii codestat 1
Show full phploc report per each defined group
./yii codestat/default/advanced
./yii codestat/default/advanced WebControllers
./yii codestat/default/advanced WebControllers,RestControllers,ConsoleControllers
Show full phploc report for all matched files
./yii codestat/default/common
Show full phploc report for custom directory
./yii codestat/default/directory @common/models
Show full phploc report for custom file
./yii codestat/default/file @common/lib/MySuperClass.php
List available metrics with codes ./yii codestat/default/list-metrics
Advanced Usage
Custom Class Grouping Rules
You can extend or overwrite property 'groupRules', with supported formats
'Group Name' => 'BaseParentClass'
where 'BaseParentClass' should by verified with (\ReflectionClass)->isSubclassOf()
or
'Group Name' => function(\ReflectionClass $reflection){
//Should return true if class valid for this group, otherwise false;
}
Final example
php
'modules'=>[
....
'codestat'=>[
'class'=>\insolita\codestat\CodeStatModule::class,
'groupRules' => [
'Jobs' => 'yii\queue\JobInterface',
'Handlers' => 'trntv\bus\interfaces\Handler::class',
'DTO' => function (\ReflectionClass $reflection) {
return mb_strpos($reflection->getFileName(), 'Dto')!==false;
},
'All Tests' => function (\ReflectionClass $reflection) {
return $reflection->isSubclassOf('\Codeception\Test\Unit')
|| StringHelper::endsWith($reflection->getName(), 'Cest');
},
] + CodeStatModule::defaultRules(),
],
]
],
Important! The order of the rules in the list matters, the base classes (\yii\base\Component and \yii\base\Object) should be at the end of the list!
Custom code metrics
Code metrics provided by https://github.com/sebastianbergmann/phploc, has lot of variants, you can define own combination
For actions advanced/common/directory/file you should set metrics property with array of necessary metric names
php
'modules'=>[
....
'codestat'=>[
'class'=>\insolita\codestat\CodeStatModule::class,
'metrics'=>['loc','lloc','classCcnAvg', 'classLlocAvg', 'methodCcnAvg']
]
]
For summary action you should provide property 'analyseCallback' in module like as 'analyseCallback = function($group){
/@var insolita\codestat\lib\collection\Group $group/
$metrics=$customAnalyzer->analyze($group->getFiles());
return ['totalFiles'=>count($group->getFiles()), 'metric1'=>$metrics[some], ...etc];
}
It should return associative array with 'metric name' => 'metric value' data and will replace internal https://github
.com/Insolita/yii2-codestat/blob/7d0fc3351718b2052624ea091ff8f154fe471aeb/src/lib/CodestatService.php#L154
And also table summary convention - if metric name contains slash "/", for summary row will be counted average value, otherwise sum
|