From e5453413c2aa777eeb3b289a19d16f4f080fd0e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=A4u=C3=9Fler?= Date: Wed, 4 Dec 2024 12:15:27 +0100 Subject: [PATCH] [TASK] Migrate codebase to PHPStan level 10 --- phpstan.neon | 2 +- .../CompilerPass/EventListenerPass.php | 7 ++-- .../InvalidConfigurationException.php | 1 + src/Helper/ArrayHelper.php | 3 ++ src/Resource/Http/PhpApiClient.php | 3 +- src/Resource/Local/Git.php | 9 +++-- src/Template/Provider/BaseProvider.php | 4 ++- src/Twig/Renderer.php | 1 + .../Template/Provider/BaseProviderTest.php | 36 ++++++++++++++----- 9 files changed, 49 insertions(+), 17 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 65d38254..b47e44cd 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -2,7 +2,7 @@ includes: - .build/vendor/phpstan/phpstan/conf/bleedingEdge.neon parameters: - level: 9 + level: max paths: - src - tests/src diff --git a/src/DependencyInjection/CompilerPass/EventListenerPass.php b/src/DependencyInjection/CompilerPass/EventListenerPass.php index f51b1845..b6ff694b 100644 --- a/src/DependencyInjection/CompilerPass/EventListenerPass.php +++ b/src/DependencyInjection/CompilerPass/EventListenerPass.php @@ -62,13 +62,16 @@ public function process(DependencyInjection\ContainerBuilder $container): void continue; } - if (null === ($className = $service->getClass())) { + /** @var class-string|null $className */ + $className = $service->getClass(); + + if (null === $className) { throw Exception\ShouldNotHappenException::create(); } + /** @var array{method?: string, event?: class-string} $tag */ foreach ($tags as $tag) { $method = $tag['method'] ?? '__invoke'; - /** @var class-string $className */ $event = $tag['event'] ?? $this->determineEventFromClassMethod($className, $method); $dispatcher->addMethodCall( diff --git a/src/Exception/InvalidConfigurationException.php b/src/Exception/InvalidConfigurationException.php index af5d8a36..23496e2f 100644 --- a/src/Exception/InvalidConfigurationException.php +++ b/src/Exception/InvalidConfigurationException.php @@ -86,6 +86,7 @@ public static function forValidationErrors(?JsonSchema\Errors\ValidationError $e if (null !== $error) { $formatter = new JsonSchema\Errors\ErrorFormatter(); + /** @var array $formattedErrors */ $formattedErrors = $formatter->format($error, false); foreach ($formattedErrors as $path => $errorMessage) { diff --git a/src/Helper/ArrayHelper.php b/src/Helper/ArrayHelper.php index 510501ad..2b28ff59 100644 --- a/src/Helper/ArrayHelper.php +++ b/src/Helper/ArrayHelper.php @@ -96,6 +96,9 @@ public static function trimExplode(string $subject, string $delimiter = ','): ar ); } + /** + * @phpstan-assert-if-true array|ArrayObject $subject + */ private static function pathSegmentExists(mixed $subject, string $pathSegment): bool { if (!is_array($subject) && !($subject instanceof ArrayObject)) { diff --git a/src/Resource/Http/PhpApiClient.php b/src/Resource/Http/PhpApiClient.php index c712d26f..2b40e700 100644 --- a/src/Resource/Http/PhpApiClient.php +++ b/src/Resource/Http/PhpApiClient.php @@ -30,6 +30,7 @@ use Psr\Http\Message; use stdClass; +use function is_string; use function property_exists; /** @@ -65,7 +66,7 @@ public function getLatestStableVersion(string $branch): string $json = Utils::jsonDecode((string) $response->getBody()); // Fall back to .0 release if version cannot be determined via API - if (!($json instanceof stdClass) || !property_exists($json, 'version')) { + if (!($json instanceof stdClass) || !property_exists($json, 'version') || !is_string($json->version)) { return $branch.'.0'; } diff --git a/src/Resource/Local/Git.php b/src/Resource/Local/Git.php index edc1635e..b0da11e7 100644 --- a/src/Resource/Local/Git.php +++ b/src/Resource/Local/Git.php @@ -25,6 +25,7 @@ use SebastianFeldmann\Cli; +use function reset; use function trim; /** @@ -66,13 +67,15 @@ private function readConfig(string $configPath): ?string private function run(Cli\Command $command): ?string { $result = $this->runner->run($command); + /** @var list $output */ + $output = $result->getBufferedOutput(); - if (!$result->isSuccessful() || [] === $result->getBufferedOutput()) { + if (!$result->isSuccessful() || [] === $output) { return null; } - $output = $result->getBufferedOutput()[0]; + $output = reset($output); - return '' !== trim((string) $output) ? trim((string) $output) : null; + return '' !== trim($output) ? trim($output) : null; } } diff --git a/src/Template/Provider/BaseProvider.php b/src/Template/Provider/BaseProvider.php index 57464917..b2330502 100644 --- a/src/Template/Provider/BaseProvider.php +++ b/src/Template/Provider/BaseProvider.php @@ -244,8 +244,10 @@ protected function isPackageSupported(Package\BasePackage $package): bool return false; } + /** @var array $extra */ + $extra = $package->getExtra(); $excludeFromListing = (bool) Helper\ArrayHelper::getValueByPath( - $package->getExtra(), + $extra, 'cpsit/project-builder.exclude-from-listing', ); diff --git a/src/Twig/Renderer.php b/src/Twig/Renderer.php index 230e6132..5a5c8d3a 100644 --- a/src/Twig/Renderer.php +++ b/src/Twig/Renderer.php @@ -56,6 +56,7 @@ public function render( ?string $template = null, array $variables = [], ): string { + /** @var array $mergedVariables */ $mergedVariables = array_replace_recursive($instructions->getTemplateVariables(), $variables); $event = new Event\BeforeTemplateRenderedEvent($this->twig, $instructions, $mergedVariables); $template ??= $this->defaultTemplate; diff --git a/tests/src/Template/Provider/BaseProviderTest.php b/tests/src/Template/Provider/BaseProviderTest.php index 58b8502c..e0b65f19 100644 --- a/tests/src/Template/Provider/BaseProviderTest.php +++ b/tests/src/Template/Provider/BaseProviderTest.php @@ -39,6 +39,7 @@ use function array_map; use function array_reduce; use function dirname; +use function is_array; use function json_encode; use function reset; use function sprintf; @@ -276,24 +277,35 @@ public static function listTemplateSourcesListsAllAvailableTemplateSourcesDataPr ], [], ]; + + $package1 = self::createPackage('foo/baz-2'); + $package2 = self::createPackage('foo/baz-3'); + yield 'unsupported and supported packages' => [ [ self::createPackage('foo/baz-1', 'library'), - $package1 = self::createPackage('foo/baz-2'), - $package2 = self::createPackage('foo/baz-3'), + $package1, + $package2, ], [ $package1, $package2, ], ]; + + $abandonedPackage1 = self::createPackage(name: 'foo/baz-1', abandoned: true); + $abandonedPackage2 = self::createPackage(name: 'foo/baz-3', abandoned: 'foo/bar-3'); + $package1 = self::createPackage('foo/baz-2'); + $package2 = self::createPackage('foo/baz-4'); + $package3 = self::createPackage('foo/baz-5'); + yield 'abandoned packages after maintained' => [ [ - $abandonedPackage1 = self::createPackage(name: 'foo/baz-1', abandoned: true), - $package1 = self::createPackage('foo/baz-2'), - $abandonedPackage2 = self::createPackage(name: 'foo/baz-3', abandoned: 'foo/bar-3'), - $package2 = self::createPackage('foo/baz-4'), - $package3 = self::createPackage('foo/baz-5'), + $abandonedPackage1, + $package1, + $abandonedPackage2, + $package2, + $package3, ], [ $package1, @@ -385,8 +397,14 @@ private function mockPackagesServerResponse(array $packages): void [ 'packages' => array_reduce( $packages, - function (array $carry, Package\PackageInterface $package) use ($dumper): array { - $carry[$package->getName()][$package->getPrettyVersion()] = $dumper->dump($package); + static function (array $carry, Package\PackageInterface $package) use ($dumper): array { + $packageName = $package->getName(); + + if (!is_array($carry[$packageName] ?? null)) { + $carry[$packageName] = []; + } + + $carry[$packageName][$package->getPrettyVersion()] = $dumper->dump($package); return $carry; },