From 5c98dad6e75e298b2f9628e0fe57dca586ad41ea Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Tue, 7 Jan 2025 18:45:23 +1100 Subject: [PATCH] Updated PHPStan and Rector to v2. --- .github/workflows/test-php.yml | 30 +++++++++++++++++-- composer.json | 11 ++++--- phpmd.xml | 15 ---------- src/Commands/ArtifactCommand.php | 7 ----- src/Git/ArtifactGitRepository.php | 10 ++----- src/Traits/FilesystemTrait.php | 5 +--- .../phpunit/Functional/ForcePushModeTest.php | 2 -- tests/phpunit/Traits/ConsoleTrait.php | 4 +-- tests/phpunit/Traits/MockTrait.php | 15 +++++----- 9 files changed, 46 insertions(+), 53 deletions(-) delete mode 100644 phpmd.xml diff --git a/.github/workflows/test-php.yml b/.github/workflows/test-php.yml index aed8c4f..d4bd331 100644 --- a/.github/workflows/test-php.yml +++ b/.github/workflows/test-php.yml @@ -8,6 +8,13 @@ on: branches: - main - 'feature/**' + workflow_dispatch: + inputs: + enable_terminal: + type: boolean + description: 'Enable terminal session.' + required: false + default: false jobs: test-php: @@ -15,7 +22,7 @@ jobs: strategy: matrix: - php-versions: ['8.2', '8.3'] + php-versions: ['8.2', '8.3', '8.4'] steps: - name: Checkout code @@ -33,6 +40,8 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} + coverage: pcov + ini-values: pcov.directory=. - name: Setup SSH private key uses: webfactory/ssh-agent@v0.9.0 @@ -47,24 +56,41 @@ jobs: - name: Install dependencies run: composer install + - name: Validate composer.json + run: | + composer --verbose validate + composer normalize --dry-run + - name: Check coding standards run: composer lint + continue-on-error: ${{ vars.CI_LINT_IGNORE_FAILURE == '1' }} - name: Run tests - run: XDEBUG_MODE=coverage composer test + run: composer test-coverage + continue-on-error: ${{ vars.CI_TEST_IGNORE_FAILURE == '1' }} - name: Upload coverage report as an artifact uses: actions/upload-artifact@v4 with: name: ${{github.job}}-code-coverage-report-${{ matrix.php-versions }} path: ./.coverage-html + include-hidden-files: true + if-no-files-found: error - name: Upload coverage report to Codecov uses: codecov/codecov-action@v5 + if: ${{ env.CODECOV_TOKEN != '' }} with: files: ./cobertura.xml fail_ci_if_error: true token: ${{ secrets.CODECOV_TOKEN }} + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + - name: Setup tmate session + if: ${{ !cancelled() && github.event.inputs.enable_terminal }} + uses: mxschmitt/action-tmate@v3 + timeout-minutes: 5 build-php: runs-on: ubuntu-latest diff --git a/composer.json b/composer.json index 5cfbd6c..51a40e1 100644 --- a/composer.json +++ b/composer.json @@ -29,10 +29,9 @@ "dealerdirect/phpcodesniffer-composer-installer": "^1.0", "drupal/coder": "^8.3", "ergebnis/composer-normalize": "^2.43", - "phpmd/phpmd": "^2.15", - "phpstan/phpstan": "^1.10", + "phpstan/phpstan": "^2", "phpunit/phpunit": "^11", - "rector/rector": "^1.0.0" + "rector/rector": "^2" }, "autoload": { "psr-4": { @@ -63,14 +62,14 @@ "lint": [ "phpcs", "phpstan --memory-limit=-1", - "phpmd --exclude vendor,vendor-bin,node_modules,TokenTest.php . text phpmd.xml", "rector --clear-cache --dry-run" ], "lint-fix": [ "rector --clear-cache", "phpcbf" ], - "reset": "rm -rf vendor vendor-bin composer.lock", - "test": "phpunit" + "reset": "rm -Rf vendor vendor-bin composer.lock", + "test": "phpunit --no-coverage", + "test-coverage": "phpunit" } } diff --git a/phpmd.xml b/phpmd.xml deleted file mode 100644 index 7d3cedb..0000000 --- a/phpmd.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/src/Commands/ArtifactCommand.php b/src/Commands/ArtifactCommand.php index e56415a..435d2cf 100644 --- a/src/Commands/ArtifactCommand.php +++ b/src/Commands/ArtifactCommand.php @@ -18,11 +18,6 @@ /** * Artifact Command. - * - * @SuppressWarnings(PHPMD.TooManyMethods) - * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) - * @SuppressWarnings(PHPMD.TooManyFields) - * @SuppressWarnings(PHPMD.ExcessiveClassLength) */ class ArtifactCommand extends Command { @@ -219,8 +214,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int /** * Assemble a code artifact from your codebase. - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ protected function doExecute(): void { $error = NULL; diff --git a/src/Git/ArtifactGitRepository.php b/src/Git/ArtifactGitRepository.php index 1a4e535..d35c807 100644 --- a/src/Git/ArtifactGitRepository.php +++ b/src/Git/ArtifactGitRepository.php @@ -15,8 +15,6 @@ /** * Artifact git repository. - * - * @SuppressWarnings(PHPMD.TooManyPublicMethods) */ class ArtifactGitRepository extends GitRepository { @@ -321,11 +319,9 @@ public function removeSubRepositories(): static { $dirs = iterator_to_array($dirs->directories()); foreach ($dirs as $dir) { - if ($dir instanceof \SplFileInfo) { - $dir = $dir->getPathname(); - $this->fs->remove($dir); - $this->logger->debug(sprintf('Removing sub-repository "%s"', $this->fsGetAbsolutePath((string) $dir))); - } + $dir = $dir->getPathname(); + $this->fs->remove($dir); + $this->logger->debug(sprintf('Removing sub-repository "%s"', $this->fsGetAbsolutePath((string) $dir))); } // After removing sub-repositories, the files that were previously tracked diff --git a/src/Traits/FilesystemTrait.php b/src/Traits/FilesystemTrait.php index 9887695..a11c135 100644 --- a/src/Traits/FilesystemTrait.php +++ b/src/Traits/FilesystemTrait.php @@ -62,7 +62,7 @@ protected function fsGetRootDir(): string { return $this->fsRootDir; } - if (isset($_SERVER['PWD'])) { + if (isset($_SERVER['PWD']) && is_string($_SERVER['PWD']) && !empty($_SERVER['PWD'])) { return $_SERVER['PWD']; } @@ -191,9 +191,6 @@ protected function fsAssertPathsExist($paths, bool $strict = TRUE): bool { * Resolved path. * * @see https://stackoverflow.com/a/29372360/712666 - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.NPathComplexity) */ protected function fsRealpath(string $path): string { // Whether $path is unix or not. diff --git a/tests/phpunit/Functional/ForcePushModeTest.php b/tests/phpunit/Functional/ForcePushModeTest.php index 6a1912b..514eece 100644 --- a/tests/phpunit/Functional/ForcePushModeTest.php +++ b/tests/phpunit/Functional/ForcePushModeTest.php @@ -10,8 +10,6 @@ /** * Class ForcePushTest. - * - * @SuppressWarnings(PHPMD.TooManyPublicMethods) */ #[CoversClass(ArtifactCommand::class)] #[CoversClass(ArtifactGitRepository::class)] diff --git a/tests/phpunit/Traits/ConsoleTrait.php b/tests/phpunit/Traits/ConsoleTrait.php index 905a14e..3b4f808 100644 --- a/tests/phpunit/Traits/ConsoleTrait.php +++ b/tests/phpunit/Traits/ConsoleTrait.php @@ -52,9 +52,6 @@ protected function consoleInitApplicationTester(string|object $object_or_class, $application->setAutoExit(FALSE); $application->setCatchExceptions(FALSE); - if (method_exists($application, 'setCatchErrors')) { - $application->setCatchErrors(FALSE); - } $this->appTester = new ApplicationTester($application); } @@ -75,6 +72,7 @@ protected function consoleInitApplicationTester(string|object $object_or_class, protected function consoleApplicationRun(array $input = [], array $options = [], bool $expect_fail = FALSE): string { $options += ['capture_stderr_separately' => TRUE]; + $output = ''; try { $this->appTester->run($input, $options); $output = $this->appTester->getDisplay(); diff --git a/tests/phpunit/Traits/MockTrait.php b/tests/phpunit/Traits/MockTrait.php index 67df8d0..a6c452c 100644 --- a/tests/phpunit/Traits/MockTrait.php +++ b/tests/phpunit/Traits/MockTrait.php @@ -10,6 +10,8 @@ * Trait MockTrait. * * This trait provides a method to prepare class mock. + * + * @phpstan-ignore trait.unused */ trait MockTrait { @@ -28,13 +30,9 @@ trait MockTrait { * * @return \PHPUnit\Framework\MockObject\MockObject * Mocked class. - * - * @throws \ReflectionException - * - * @SuppressWarnings(CyclomaticComplexity) */ protected function prepareMock(string $class, array $methods = [], array|bool $args = []): MockObject { - $methods = array_filter($methods, fn($value, $key): bool => is_string($key), ARRAY_FILTER_USE_BOTH); + $methods = array_filter($methods, fn($value, $key): bool => !is_numeric($key), ARRAY_FILTER_USE_BOTH); if (!class_exists($class)) { throw new \InvalidArgumentException(sprintf('Class %s does not exist', $class)); @@ -49,8 +47,11 @@ protected function prepareMock(string $class, array $methods = [], array|bool $a $builder->disableOriginalConstructor(); } - $method_names = array_filter(array_keys($methods), fn($method): bool => is_string($method) && !empty($method)); - $mock = $builder->onlyMethods($method_names)->getMock(); + $method_names = array_values(array_filter(array_keys($methods), fn($method): bool => !empty($method))); + if (!empty($method_names)) { + $builder->onlyMethods($method_names); + } + $mock = $builder->getMock(); foreach ($methods as $method => $value) { // Handle callback value differently based on its type.