From 9c76f792c8d4e356fe3f98cad51cd670a46f5ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Thu, 13 May 2021 06:24:14 +0200 Subject: [PATCH 1/5] Versions - get regex for normalizing composer version under test --- src/Tools/Analyzer/Phpcpd.php | 2 -- src/Tools/Analyzer/Phpstan.php | 1 - src/Tools/GetVersions.php | 7 ++++++- tests/GetVersionsTest.php | 21 +++++++++++++++++++++ 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 tests/GetVersionsTest.php diff --git a/src/Tools/Analyzer/Phpcpd.php b/src/Tools/Analyzer/Phpcpd.php index 53e3ee27..e7888032 100644 --- a/src/Tools/Analyzer/Phpcpd.php +++ b/src/Tools/Analyzer/Phpcpd.php @@ -2,8 +2,6 @@ namespace Edge\QA\Tools\Analyzer; -use Edge\QA\Tools\GetVersions; - class Phpcpd extends \Edge\QA\Tools\Tool { public static $SETTINGS = array( diff --git a/src/Tools/Analyzer/Phpstan.php b/src/Tools/Analyzer/Phpstan.php index 9e36c234..b17f6c6c 100644 --- a/src/Tools/Analyzer/Phpstan.php +++ b/src/Tools/Analyzer/Phpstan.php @@ -3,7 +3,6 @@ namespace Edge\QA\Tools\Analyzer; use Edge\QA\OutputMode; -use Edge\QA\Tools\GetVersions; class Phpstan extends \Edge\QA\Tools\Tool { diff --git a/src/Tools/GetVersions.php b/src/Tools/GetVersions.php index 31089bfe..2af28517 100644 --- a/src/Tools/GetVersions.php +++ b/src/Tools/GetVersions.php @@ -114,7 +114,7 @@ private function normalizeVersion(array $composerInfo) if ($composerInfo['version_normalized'] == '9999999-dev') { return $composerInfo['version']; } - return preg_replace('/\.0$/s', '', $composerInfo['version_normalized']); + return self::normalizeSemver($composerInfo['version_normalized']); } private function groupAuthors(array $composerAuthors) @@ -163,4 +163,9 @@ private function extractVersion($text) $text ); } + + public static function normalizeSemver($semver) + { + return preg_replace('/\.0$/s', '', $semver); + } } diff --git a/tests/GetVersionsTest.php b/tests/GetVersionsTest.php new file mode 100644 index 00000000..436d285d --- /dev/null +++ b/tests/GetVersionsTest.php @@ -0,0 +1,21 @@ + ['2.7.4', '2.7.4'], + 'minor release' => ['2.7.0', '2.7'], + 'major release' => ['2.0.0', '2.0'], + ]; + } +} From 3e107f415dd98ba7773bfa6fa474ccba95ccbcb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Thu, 13 May 2021 06:36:13 +0200 Subject: [PATCH 2/5] Versions - spike parsing version from console text extractVersion worked only for phpunit, but every tool can define custom binary (e.g. phar) --- src/Tools/GetVersions.php | 30 ++++++++++++++---------------- tests/GetVersionsTest.php | 21 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/Tools/GetVersions.php b/src/Tools/GetVersions.php index 2af28517..9b43149e 100644 --- a/src/Tools/GetVersions.php +++ b/src/Tools/GetVersions.php @@ -134,8 +134,7 @@ private function loadVersionFromConsoleCommand($command) { $process = $this->createSymfonyProcess($command); $process->run(); - $firstLine = $this->getFirstLine($process->getOutput()); - return $this->extractVersion($firstLine); + return self::extractVersionFromConsole($process->getOutput()); } private function createSymfonyProcess($command) @@ -147,21 +146,20 @@ private function createSymfonyProcess($command) } } - private function getFirstLine($string) + public static function extractVersionFromConsole($text) { - return strtok($string, "\n"); - } - - private function extractVersion($text) - { - return str_replace( - array( - ' by Sebastian Bergmann and contributors.', - 'PHPUnit ' - ), - '', - $text - ); + $regexes = [ + 'semver' => '(\d+\.\d+(\.\d+)?)', + 'dev version' => '(\d+\.x)', + ]; + foreach ($regexes as $regex) { + $match = []; + preg_match($regex, $text, $match); + if ($match) { + return self::normalizeSemver($match[0]); + } + } + return $text; } public static function normalizeSemver($semver) diff --git a/tests/GetVersionsTest.php b/tests/GetVersionsTest.php index 436d285d..f3444992 100644 --- a/tests/GetVersionsTest.php +++ b/tests/GetVersionsTest.php @@ -18,4 +18,25 @@ public function provideComposerVersion() 'major release' => ['2.0.0', '2.0'], ]; } + + /** @dataProvider provideCliVersion */ + public function testCliVersion($cliOutput, $expectedVersion) + { + assertThat(GetVersions::extractVersionFromConsole($cliOutput), is($expectedVersion)); + } + + public function provideCliVersion() + { + return [ + 'semver at the end' => ['irrelevant 0.12.86', '0.12.86'], + 'semver at the start' => ['0.12.86 irrelevant', '0.12.86'], + 'semver at 2nd line' => ["first\nirrele 4.8.36 vant\nsecond", '4.8.36'], + 'custom format' => ['irrelevant v1.10', '1.10'], + 'no space' => ['v1.13.7irrelevant', '1.13.7'], + 'dev version' => ['irrelevant 4.x-dev@', '4.x'], + 'prefer semver (semver + dev)' => ['v1.13.7 4.x-dev@', '1.13.7'], + 'prefer semver (dev + semver)' => ['4.x-dev@ v1.13.7', '1.13.7'], + 'no version' => ['irrelevant text', 'irrelevant text'], + ]; + } } From e9256b203726cf50a2d03806df6dec16e5697350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Thu, 13 May 2021 06:52:26 +0200 Subject: [PATCH 3/5] Versions - get comparing versions under test --- src/Tools/GetVersions.php | 10 ++++++++-- src/Tools/Tool.php | 3 +-- tests/GetVersionsTest.php | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Tools/GetVersions.php b/src/Tools/GetVersions.php index 9b43149e..d7e6168e 100644 --- a/src/Tools/GetVersions.php +++ b/src/Tools/GetVersions.php @@ -6,10 +6,11 @@ class GetVersions { - public function getToolVersion(array $toolSettings) + public function hasToolVersion(array $toolSettings, $operator, $version) { $versions = $this->__invoke(['tool' => $toolSettings + ['customBinary' => null]]); - return $versions['tool']['version_normalized']; + $toolVersion = $versions['tool']['version_normalized']; + return self::compareVersions($toolVersion, $operator, $version); } public function __invoke(array $tools) @@ -166,4 +167,9 @@ public static function normalizeSemver($semver) { return preg_replace('/\.0$/s', '', $semver); } + + public static function compareVersions($toolVersion, $operator, $version) + { + return $toolVersion && version_compare($toolVersion, $version, $operator); + } } diff --git a/src/Tools/Tool.php b/src/Tools/Tool.php index df9b0ab7..4abd9a77 100644 --- a/src/Tools/Tool.php +++ b/src/Tools/Tool.php @@ -38,8 +38,7 @@ protected function saveDynamicConfig($config, $fileExtension) protected function toolVersionIs($operator, $version) { $versions = new GetVersions(); - $composerVersion = $versions->getToolVersion(static::$SETTINGS); - return $composerVersion && version_compare($composerVersion, $version, $operator); + return $versions->hasToolVersion(static::$SETTINGS, $operator, $version); } protected function writeln($text) diff --git a/tests/GetVersionsTest.php b/tests/GetVersionsTest.php index f3444992..ed18f0d4 100644 --- a/tests/GetVersionsTest.php +++ b/tests/GetVersionsTest.php @@ -39,4 +39,21 @@ public function provideCliVersion() 'no version' => ['irrelevant text', 'irrelevant text'], ]; } + + /** @dataProvider provideComparedVersions */ + public function testCompareVersions($toolVersion, $operator, $version, $expectedResult) + { + assertThat(GetVersions::compareVersions($toolVersion, $operator, $version), is($expectedResult)); + } + + public function provideComparedVersions() + { + return [ + 'no version' => ['', '>', '1', false], + 'is lower?' => ['7', '<', '6', false], + 'is greater than dev version' => ['4', '>=', '4.x', true], + 'semver is greater than' => ['4.1', '>=', '4', true], + 'dev version is greater than' => ['4.x', '>=', '4', false], // TODO: true + ]; + } } From cf75cff0a704fe4f9037ce607d4016b8adc688d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Thu, 13 May 2021 06:58:02 +0200 Subject: [PATCH 4/5] Versions - hotfix comparing psalm version from custom binary --- src/Tools/GetVersions.php | 4 ++-- src/Tools/Tool.php | 5 ++++- tests/GetVersionsTest.php | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Tools/GetVersions.php b/src/Tools/GetVersions.php index d7e6168e..84a616eb 100644 --- a/src/Tools/GetVersions.php +++ b/src/Tools/GetVersions.php @@ -8,7 +8,7 @@ class GetVersions { public function hasToolVersion(array $toolSettings, $operator, $version) { - $versions = $this->__invoke(['tool' => $toolSettings + ['customBinary' => null]]); + $versions = $this->__invoke(['tool' => $toolSettings]); $toolVersion = $versions['tool']['version_normalized']; return self::compareVersions($toolVersion, $operator, $version); } @@ -170,6 +170,6 @@ public static function normalizeSemver($semver) public static function compareVersions($toolVersion, $operator, $version) { - return $toolVersion && version_compare($toolVersion, $version, $operator); + return $toolVersion && version_compare(str_replace(".x", "", $toolVersion), $version, $operator); } } diff --git a/src/Tools/Tool.php b/src/Tools/Tool.php index 4abd9a77..a3c07fc7 100644 --- a/src/Tools/Tool.php +++ b/src/Tools/Tool.php @@ -38,7 +38,10 @@ protected function saveDynamicConfig($config, $fileExtension) protected function toolVersionIs($operator, $version) { $versions = new GetVersions(); - return $versions->hasToolVersion(static::$SETTINGS, $operator, $version); + $settings = static::$SETTINGS + [ + 'customBinary' => $this->config->getCustomBinary((string) $this->tool), + ]; + return $versions->hasToolVersion($settings, $operator, $version); } protected function writeln($text) diff --git a/tests/GetVersionsTest.php b/tests/GetVersionsTest.php index ed18f0d4..4b73b1a9 100644 --- a/tests/GetVersionsTest.php +++ b/tests/GetVersionsTest.php @@ -53,7 +53,7 @@ public function provideComparedVersions() 'is lower?' => ['7', '<', '6', false], 'is greater than dev version' => ['4', '>=', '4.x', true], 'semver is greater than' => ['4.1', '>=', '4', true], - 'dev version is greater than' => ['4.x', '>=', '4', false], // TODO: true + 'dev version is greater than' => ['4.x', '>=', '4', true], ]; } } From 8ca38042ed5a68b6053a037836c5e36e364b6f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Thu, 13 May 2021 07:22:10 +0200 Subject: [PATCH 5/5] Versions - show error if version is not detected from custom binary $ chmod -x phars/*.phar $ phpqa tools --config tests/.ci/ +------------------+------------------------------------------------------------------+----------------------------------------------------------------+ | Tool | Version | Authors / Info | +------------------+------------------------------------------------------------------+----------------------------------------------------------------+ | phpmetrics | sh: /phpqa/phars/phpmetrics.phar: Permission denied | "/phpqa/phars/phpmetrics.phar" --version | | psalm | sh: /phpqa/phars/psalm.phar: Permission denied | "/phpqa/phars/psalm.phar" --version | --- src/Tools/GetVersions.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Tools/GetVersions.php b/src/Tools/GetVersions.php index 84a616eb..894d2d7a 100644 --- a/src/Tools/GetVersions.php +++ b/src/Tools/GetVersions.php @@ -135,7 +135,12 @@ private function loadVersionFromConsoleCommand($command) { $process = $this->createSymfonyProcess($command); $process->run(); - return self::extractVersionFromConsole($process->getOutput()); + if ($process->getOutput()) { + return self::extractVersionFromConsole($process->getOutput()); + } elseif ($process->getErrorOutput()) { + return trim($process->getErrorOutput()); + } + return "{$process->getExitCode()} {$process->getExitCodeText()}"; } private function createSymfonyProcess($command)