From 8f8bcad46433d9cba5a3bdc2f98b9237f77e2460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zden=C4=9Bk=20Draho=C5=A1?= Date: Fri, 23 Dec 2016 10:22:17 +0100 Subject: [PATCH 1/4] Tools - extract loading versions --- src/CodeAnalysisTasks.php | 13 ++---------- src/Task/ToolVersions.php | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 src/Task/ToolVersions.php diff --git a/src/CodeAnalysisTasks.php b/src/CodeAnalysisTasks.php index ba36e7c2..43c38a8a 100644 --- a/src/CodeAnalysisTasks.php +++ b/src/CodeAnalysisTasks.php @@ -50,17 +50,8 @@ trait CodeAnalysisTasks */ public function tools() { - $this->yell("phpqa v" . PHPQA_VERSION); - foreach (array_keys($this->tools) as $tool) { - if ($tool == 'parallel-lint') { - $task = $this->taskExec(pathToBinary("{$tool}")) - ->printed(false) - ->run(); - $this->getOutput()->writeln(strtok($task->getMessage(), "\n")); - } else { - $this->_exec(pathToBinary("{$tool} --version")); - } - } + $tools = new Task\ToolVersions($this->getOutput()); + $tools(array_keys($this->tools)); } /** diff --git a/src/Task/ToolVersions.php b/src/Task/ToolVersions.php new file mode 100644 index 00000000..bd94c93e --- /dev/null +++ b/src/Task/ToolVersions.php @@ -0,0 +1,44 @@ +output = $p; + } + + public function __invoke(array $tools) + { + $this->output->writeln([ + 'phpqa ' . PHPQA_VERSION . '', + '', + ]); + + foreach ($tools as $tool) { + $versionCommand = $tool == 'parallel-lint' ? $tool : "{$tool} --version"; + $this->loadVersionFromConsoleCommand($versionCommand); + } + } + + private function loadVersionFromConsoleCommand($command) + { + $exec = new Exec(\Edge\QA\pathToBinary($command)); + $result = $exec + ->printed(false) + ->run() + ->getMessage(); + $this->output->writeln($this->getFirstLine($result)); + } + + private function getFirstLine($string) + { + return strtok($string, "\n"); + } +} From 51b8a5c2a62d8005a407df58452ecfd83d5616f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zden=C4=9Bk=20Draho=C5=A1?= Date: Fri, 23 Dec 2016 10:58:18 +0100 Subject: [PATCH 2/4] Tools - load version from composer installed.json https://github.com/composer/composer/issues/4410#issuecomment-166728514 --- src/CodeAnalysisTasks.php | 9 +++- src/Task/ToolVersions.php | 91 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 96 insertions(+), 4 deletions(-) diff --git a/src/CodeAnalysisTasks.php b/src/CodeAnalysisTasks.php index 43c38a8a..01666d82 100644 --- a/src/CodeAnalysisTasks.php +++ b/src/CodeAnalysisTasks.php @@ -8,34 +8,41 @@ trait CodeAnalysisTasks private $tools = array( 'phpmetrics' => array( 'optionSeparator' => ' ', + 'composer' => 'phpmetrics/phpmetrics', ), 'phploc' => array( 'optionSeparator' => ' ', 'xml' => ['phploc.xml'], + 'composer' => 'phploc/phploc', ), 'phpcs' => array( 'optionSeparator' => '=', 'xml' => ['checkstyle.xml'], 'errorsXPath' => '//checkstyle/file/error', + 'composer' => 'squizlabs/php_codesniffer', ), 'phpmd' => array( 'optionSeparator' => ' ', 'xml' => ['phpmd.xml'], 'errorsXPath' => '//pmd/file/violation', + 'composer' => 'phpmd/phpmd', ), 'pdepend' => array( 'optionSeparator' => '=', 'xml' => ['pdepend-jdepend.xml', 'pdepend-summary.xml', 'pdepend-dependencies.xml'], + 'composer' => 'pdepend/pdepend', ), 'phpcpd' => array( 'optionSeparator' => ' ', 'xml' => ['phpcpd.xml'], 'errorsXPath' => '//pmd-cpd/duplication', + 'composer' => 'sebastian/phpcpd', ), 'parallel-lint' => array( 'optionSeparator' => ' ', 'internalClass' => 'JakubOnderka\PhpParallelLint\ParallelLint', 'hasOnlyConsoleOutput' => true, + 'composer' => 'jakub-onderka/php-parallel-lint', ), ); /** @var Options */ @@ -51,7 +58,7 @@ trait CodeAnalysisTasks public function tools() { $tools = new Task\ToolVersions($this->getOutput()); - $tools(array_keys($this->tools)); + $tools($this->tools); } /** diff --git a/src/Task/ToolVersions.php b/src/Task/ToolVersions.php index bd94c93e..7c13f93f 100644 --- a/src/Task/ToolVersions.php +++ b/src/Task/ToolVersions.php @@ -2,19 +2,104 @@ namespace Edge\QA\Task; -use Symfony\Component\Console\Output\OutputInterface; use Robo\Task\Base\Exec; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Helper\Table; class ToolVersions { private $output; - + public function __construct(OutputInterface $p) { $this->output = $p; } - public function __invoke(array $tools) + public function __invoke(array $qaTools) + { + $composerPackages = $this->findComposerPackages(); + if ($composerPackages) { + $this->composerInfo($qaTools, $composerPackages); + } else { + $this->consoleInfo(array_keys($qaTools)); + } + } + + private function findComposerPackages() + { + $installedJson = COMPOSER_BINARY_DIR . '/../composer/installed.json'; + if (!is_file($installedJson)) { + return []; + } + + $installedTools = json_decode(file_get_contents($installedJson)); + if (!is_array($installedTools)) { + return []; + } + + $tools = array(); + foreach ($installedTools as $tool) { + $tools[$tool->name] = $tool; + } + + return $tools + [ + 'edgedesign/phpqa' => (object) [ + 'version_normalized' => PHPQA_VERSION, + 'authors' => [(object) ['name' => "Zdeněk Drahoš"]], + ] + ]; + } + + private function composerInfo(array $qaTools, array $composerPackages) + { + $table = new Table($this->output); + $table->setHeaders(['Tool', 'Version', 'Authors']); + $table->addRow($this->toolToTableRow('phpqa', 'edgedesign/phpqa', $composerPackages)); + foreach ($qaTools as $tool => $config) { + $table->addRow($this->toolToTableRow($tool, $config['composer'], $composerPackages)); + } + $table->render(); + } + + private function toolToTableRow($tool, $composerPackage, array $composerPackages) + { + $composerInfo = array_key_exists($composerPackage, $composerPackages) ? + get_object_vars($composerPackages[$composerPackage]) : + [ + 'version_normalized' => 'not installed', + 'authors' => [(object) ['name' => "composer require {$composerPackage}"]], + ]; + $composerInfo += [ + 'version_normalized' => '', + 'authors' => [(object) ['name' => '']], + ]; + + return array( + "{$tool}", + $this->stripTrailingZeroVersion($composerInfo['version_normalized']), + $this->groupAuthors($composerInfo['authors']) + ); + } + + private function stripTrailingZeroVersion($version) + { + return preg_replace('/\.0$/s', '', $version); + } + + private function groupAuthors(array $composerAuthors) + { + return implode( + ',', + array_map( + function ($author) { + return $author->name; + }, + $composerAuthors + ) + ); + } + + private function consoleInfo(array $tools) { $this->output->writeln([ 'phpqa ' . PHPQA_VERSION . '', From 599db49097466ab2b8a5f8eddbb22b187331f90e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zden=C4=9Bk=20Draho=C5=A1?= Date: Fri, 23 Dec 2016 11:00:53 +0100 Subject: [PATCH 3/4] Tools - "test" command in travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6b88f2be..22c523c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ install: - if [[ ${TRAVIS_PHP_VERSION:0:3} == "7.1" ]]; then composer update && composer require sebastian/phpcpd:dev-master && bin/suggested-tools.sh install; fi script: - vendor/phpunit/phpunit/phpunit + - ./phpqa tools - bin/ci.sh # http://blog.wyrihaximus.net/2015/07/composer-cache-on-travis/ cache: From 1d36cc18f5af876dc50c6baefb902f1c488aa2dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zden=C4=9Bk=20Draho=C5=A1?= Date: Fri, 23 Dec 2016 11:17:18 +0100 Subject: [PATCH 4/4] Tools - fix dev-master dependencies --- src/Task/ToolVersions.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Task/ToolVersions.php b/src/Task/ToolVersions.php index 7c13f93f..1e38f6bb 100644 --- a/src/Task/ToolVersions.php +++ b/src/Task/ToolVersions.php @@ -66,6 +66,7 @@ private function toolToTableRow($tool, $composerPackage, array $composerPackages $composerInfo = array_key_exists($composerPackage, $composerPackages) ? get_object_vars($composerPackages[$composerPackage]) : [ + 'version' => '', 'version_normalized' => 'not installed', 'authors' => [(object) ['name' => "composer require {$composerPackage}"]], ]; @@ -76,14 +77,17 @@ private function toolToTableRow($tool, $composerPackage, array $composerPackages return array( "{$tool}", - $this->stripTrailingZeroVersion($composerInfo['version_normalized']), + $this->normalizeVersion($composerInfo), $this->groupAuthors($composerInfo['authors']) ); } - private function stripTrailingZeroVersion($version) + private function normalizeVersion(array $composerInfo) { - return preg_replace('/\.0$/s', '', $version); + if ($composerInfo['version_normalized'] == '9999999-dev') { + return $composerInfo['version']; + } + return preg_replace('/\.0$/s', '', $composerInfo['version_normalized']); } private function groupAuthors(array $composerAuthors)