banker/RoboFile.php

327 lines
6.0 KiB
PHP
Raw Permalink Normal View History

2016-10-19 09:57:06 -04:00
<?php declare(strict_types=1);
2016-08-31 12:18:46 -04:00
if ( ! function_exists('glob_recursive'))
{
// Does not support flag GLOB_BRACE
function glob_recursive($pattern, $flags = 0)
{
$files = glob($pattern, $flags);
foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir)
{
$files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags));
}
return $files;
}
}
/**
* This is project's console commands configuration for Robo task runner.
*
* @see http://robo.li/
*/
class RoboFile extends \Robo\Tasks {
/**
* Directories used by analysis tools
*
* @var array
*/
protected $taskDirs = [
'build/logs',
'build/pdepend',
'build/phpdox',
];
/**
* Directories to remove with the clean task
*
* @var array
*/
protected $cleanDirs = [
'coverage',
'docs',
'phpdoc',
'build/logs',
'build/phpdox',
'build/pdepend'
];
/**
* Do static analysis tasks
*/
2020-05-07 17:17:03 -04:00
public function analyze(): void
2016-08-31 12:18:46 -04:00
{
$this->prepare();
$this->lint();
$this->phploc(TRUE);
$this->phpcs(TRUE);
$this->dependencyReport();
$this->phpcpdReport();
}
/**
* Run all tests, generate coverage, generate docs, generate code statistics
*/
2020-05-07 17:17:03 -04:00
public function build(): void
2016-08-31 12:18:46 -04:00
{
$this->analyze();
$this->coverage();
$this->docs();
}
/**
* Cleanup temporary files
*/
2020-05-07 17:17:03 -04:00
public function clean(): void
2016-08-31 12:18:46 -04:00
{
$cleanFiles = [
'build/humbug.json',
'build/humbug-log.txt',
];
2020-05-07 17:17:03 -04:00
array_map(static function ($file) {
2016-08-31 12:18:46 -04:00
@unlink($file);
}, $cleanFiles);
// So the task doesn't complain,
// make any 'missing' dirs to cleanup
2020-05-07 17:17:03 -04:00
array_map(static function ($dir) {
2016-08-31 12:18:46 -04:00
if ( ! is_dir($dir))
{
2020-05-07 17:17:03 -04:00
shell_exec("mkdir -p {$dir}");
2016-08-31 12:18:46 -04:00
}
}, $this->cleanDirs);
$this->_cleanDir($this->cleanDirs);
$this->_deleteDir($this->cleanDirs);
}
/**
* Run unit tests and generate coverage reports
*/
2020-05-07 17:17:03 -04:00
public function coverage(): void
2016-08-31 12:18:46 -04:00
{
2020-05-07 17:17:03 -04:00
$this->_run(['phpdbg -qrr -- vendor/bin/phpunit -c build']);
2016-08-31 12:18:46 -04:00
}
/**
* Generate documentation with phpdox
*/
2020-05-07 17:17:03 -04:00
public function docs(): void
2016-08-31 12:18:46 -04:00
{
$cmd_parts = [
'cd build',
'../vendor/bin/phpdox',
'cd ..'
];
$this->_run($cmd_parts, ' && ');
}
/**
* Verify that source files are valid
*/
2020-05-07 17:17:03 -04:00
public function lint(): void
2016-08-31 12:18:46 -04:00
{
$files = $this->getAllSourceFiles();
$chunks = array_chunk($files, 6);
foreach($chunks as $chunk)
{
$this->parallelLint($chunk);
}
}
/**
* Run mutation tests with humbug
*
* @param bool $stats - if true, generates stats rather than running mutation tests
*/
2020-05-07 17:17:03 -04:00
public function mutate($stats = FALSE): void
2016-08-31 12:18:46 -04:00
{
$test_parts = [
'vendor/bin/humbug'
];
$stat_parts = [
'vendor/bin/humbug',
'--skip-killed=yes',
'-v',
'./build/humbug.json'
];
$cmd_parts = ($stats) ? $stat_parts : $test_parts;
$this->_run($cmd_parts);
}
/**
* Run the phpcs tool
*
* @param bool $report - if true, generates reports instead of direct output
*/
2020-05-07 17:17:03 -04:00
public function phpcs($report = FALSE): void
2016-08-31 12:18:46 -04:00
{
$report_cmd_parts = [
'vendor/bin/phpcs',
'--standard=./build/phpcs.xml',
'--report-checkstyle=./build/logs/phpcs.xml',
];
$normal_cmd_parts = [
'vendor/bin/phpcs',
'--standard=./build/phpcs.xml',
];
$cmd_parts = ($report) ? $report_cmd_parts : $normal_cmd_parts;
$this->_run($cmd_parts);
}
/**
* Run the phploc tool
*
* @param bool $report - if true, generates reports instead of direct output
*/
2020-05-07 17:17:03 -04:00
public function phploc($report = FALSE): void
2016-08-31 12:18:46 -04:00
{
// Command for generating reports
$report_cmd_parts = [
'vendor/bin/phploc',
'--count-tests',
'--log-csv=build/logs/phploc.csv',
'--log-xml=build/logs/phploc.xml',
'src',
'tests'
];
// Command for generating direct output
$normal_cmd_parts = [
'vendor/bin/phploc',
'--count-tests',
'src',
'tests'
];
$cmd_parts = ($report) ? $report_cmd_parts : $normal_cmd_parts;
$this->_run($cmd_parts);
}
/**
* Create temporary directories
*/
2020-05-07 17:17:03 -04:00
public function prepare(): void
2016-08-31 12:18:46 -04:00
{
array_map([$this, '_mkdir'], $this->taskDirs);
}
/**
* Lint php files and run unit tests
*/
2020-05-07 17:17:03 -04:00
public function test(): void
2016-08-31 12:18:46 -04:00
{
$this->lint();
$this->taskPHPUnit()
->configFile('phpunit.xml')
->printed(true)
->run();
}
/**
* Watches for file updates, and automatically runs appropriate actions
*/
2020-05-07 17:17:03 -04:00
public function watch(): void
2016-08-31 12:18:46 -04:00
{
$this->taskWatch()
->monitor('composer.json', function() {
$this->taskComposerUpdate()->run();
})
->monitor('src', function () {
$this->taskExec('test')->run();
})
->monitor('tests', function () {
$this->taskExec('test')->run();
})
->run();
}
/**
* Create pdepend reports
*/
2020-05-07 17:17:03 -04:00
protected function dependencyReport(): void
2016-08-31 12:18:46 -04:00
{
$cmd_parts = [
'vendor/bin/pdepend',
'--jdepend-xml=build/logs/jdepend.xml',
'--jdepend-chart=build/pdepend/dependencies.svg',
'--overview-pyramid=build/pdepend/overview-pyramid.svg',
'src'
];
$this->_run($cmd_parts);
}
/**
* Get the total list of source files, including tests
*
* @return array
*/
2020-05-07 17:17:03 -04:00
protected function getAllSourceFiles(): array
2016-08-31 12:18:46 -04:00
{
2020-05-07 17:17:03 -04:00
$files = array_unique(array_merge(
2016-08-31 12:18:46 -04:00
glob_recursive('build/*.php'),
glob_recursive('src/*.php'),
glob_recursive('tests/*.php'),
glob('*.php')
2020-05-07 17:17:03 -04:00
));
2016-08-31 12:18:46 -04:00
sort($files);
return $files;
}
/**
* Run php's linter in one parallel task for the passed chunk
*
* @param array $chunk
*/
2020-05-07 17:17:03 -04:00
protected function parallelLint(array $chunk): void
2016-08-31 12:18:46 -04:00
{
$task = $this->taskParallelExec()
->timeout(5)
->printed(FALSE);
foreach($chunk as $file)
{
$task = $task->process("php -l {$file}");
}
$task->run();
}
/**
* Generate copy paste detector report
*/
2020-05-07 17:17:03 -04:00
protected function phpcpdReport(): void
2016-08-31 12:18:46 -04:00
{
$cmd_parts = [
'vendor/bin/phpcpd',
'--log-pmd build/logs/pmd-cpd.xml',
'src'
];
$this->_run($cmd_parts);
}
/**
* Shortcut for joining an array of command arguments
* and then running it
*
* @param array $cmd_parts - command arguments
* @param string $join_on - what to join the command arguments with
*/
2020-05-07 17:17:03 -04:00
protected function _run(array $cmd_parts, $join_on = ' '): void
2016-08-31 12:18:46 -04:00
{
$this->taskExec(implode($join_on, $cmd_parts))->run();
}
}