From c35fba5f2b0f9cb9a0981350c8a193067f36a987 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 25 Jun 2025 14:38:09 +0300 Subject: [PATCH 01/18] Update dependencies (#195) * update dependencies * update sspat/reserved-words in order to use last thecodingmachine/safe * update cebe/php-openapi * remove usage of Safe/sprintf, Safe/substr * fixing phpstan errors * fixing phpstan errors * fixing psalm errors * tests * tests * tests * downgrade cebe/php-openapi * Revert "downgrade cebe/php-openapi" This reverts commit ca5992ad032e5a115eb676d3abf56f9f61a41b01. * Add PHP 8.3 and 8.4 support and update dependencies * add security scheme * Revert "add security scheme" This reverts commit a1772c9c5df14e466e1e414c8b96f9d28137c487. * update devizzent/cebe-php-openapi * csfix --------- Co-authored-by: innerfly --- .github/workflows/ci.yml | 14 ++++++----- composer.json | 24 +++++++------------ src/CodeGenerator/ApiServerCodeGenerator.php | 2 +- src/CodeGenerator/AttributeGenerator.php | 1 + .../Definitions/ClassDefinition.php | 7 +++++- .../Definitions/ComponentDefinition.php | 2 +- .../Definitions/ComponentReference.php | 8 ++++++- .../Definitions/DtoDefinition.php | 4 +++- src/CodeGenerator/FileGenerator.php | 1 + .../Filesystem/FilePutContentsFileWriter.php | 3 +++ src/CodeGenerator/GraphGenerator.php | 1 + src/CodeGenerator/NameGenerator.php | 1 + .../Naming/CannotCreateNamespace.php | 2 +- .../Naming/CannotCreatePropertyName.php | 2 +- .../Naming/DefaultNamingStrategy.php | 7 ++++++ .../PhpParserGenerators/CodeGenerator.php | 2 +- .../PhpParserGenerators/DtoCodeGenerator.php | 10 ++++---- .../PhpParserGenerators/FileBuilder.php | 3 ++- .../InterfaceCodeGenerator.php | 4 ++-- .../ServiceSubscriberCodeGenerator.php | 4 ++-- src/Command/DeleteGeneratedCodeCommand.php | 5 +++- src/Command/GenerateApiCodeCommand.php | 7 ++++-- src/Controller/ApiController.php | 2 +- src/DependencyInjection/CompilerPass.php | 2 ++ src/DependencyInjection/Configuration.php | 2 ++ .../OpenApiServerExtension.php | 2 ++ src/Exception/ApiCallFailed.php | 2 +- src/Exception/CannotParseOpenApi.php | 2 +- src/OpenApiServerBundle.php | 2 ++ src/Router/RouteLoader.php | 14 +++++++++-- src/Serializer/ArrayDtoSerializer.php | 3 +++ .../Definitions/ComponentArray.php | 2 +- .../Definitions/ObjectReference.php | 5 +++- .../Definitions/ObjectSchema.php | 3 +++ src/Specification/SpecificationLoader.php | 3 ++- src/Specification/SpecificationParser.php | 1 + src/Types/ArgumentResolver.php | 1 + src/Types/TypeSerializer.php | 2 +- .../LeaguePSR7RequestSchemaValidator.php | 2 ++ .../DeleteGeneratedCodeCommandTest.php | 2 +- .../Command/GenerateApiCodeCommandTest.php | 2 +- .../DependencyInjection/ConfigurationTest.php | 2 +- .../Specification/SpecificationLoaderTest.php | 2 +- test/functional/openapi_specification.yaml | 2 +- test/generation/GeneratedClassAsserter.php | 5 ++-- test/generation/GenerationTestCase.php | 3 ++- .../Naming/CannotCreateNamespaceTest.php | 2 +- .../Naming/CannotCreatePropertyNameTest.php | 2 +- .../PhpParserGenerators/FileBuilderTest.php | 6 ++--- .../InterfaceCodeGeneratorTest.php | 8 +++---- .../ServiceSubscriberCodeGeneratorTest.php | 6 ++--- test/unit/Exception/ApiCallFailedTest.php | 2 +- .../unit/Exception/CannotParseOpenApiTest.php | 2 +- 53 files changed, 136 insertions(+), 74 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e328ee76..90ad77a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,8 @@ jobs: php-version: - "8.1" - "8.2" + - "8.3" + - "8.4" dependencies: - "lowest" - "highest" @@ -53,7 +55,7 @@ jobs: operating-system: - "ubuntu-latest" php-version: - - "8.2" + - "8.4" steps: - name: "Checkout" uses: "actions/checkout@v2" @@ -81,7 +83,7 @@ jobs: operating-system: - "ubuntu-latest" php-version: - - "8.2" + - "8.4" steps: - name: "Checkout" uses: "actions/checkout@v2" @@ -109,7 +111,7 @@ jobs: operating-system: - "ubuntu-latest" php-version: - - "8.2" + - "8.4" steps: - name: "Checkout" uses: "actions/checkout@v2" @@ -137,7 +139,7 @@ jobs: operating-system: - "ubuntu-latest" php-version: - - "8.2" + - "8.4" steps: - name: "Checkout" uses: "actions/checkout@v2" @@ -170,7 +172,7 @@ jobs: operating-system: - "ubuntu-latest" php-version: - - "8.2" + - "8.4" steps: - name: "Checkout" uses: "actions/checkout@v2" @@ -201,7 +203,7 @@ jobs: operating-system: - "ubuntu-latest" php-version: - - "8.2" + - "8.4" steps: - name: "Checkout" uses: "actions/checkout@v2" diff --git a/composer.json b/composer.json index b1048150..edc81f4f 100644 --- a/composer.json +++ b/composer.json @@ -21,19 +21,13 @@ "email": "dk@csgo.com" } ], - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/onmoon/php-openapi" - } - ], "require": { "php": "^8.1", "ext-json": "*", - "cebe/php-openapi": "1.6.99", + "devizzent/cebe-php-openapi": "1.1.4", "league/openapi-psr7-validator": "^0.22.0", "lukasoppermann/http-status": "^4.0", - "nikic/php-parser": "^4.19", + "nikic/php-parser": "^v5.4", "nyholm/psr7": "^1.5", "phpdocumentor/reflection-docblock": "^5.3", "sspat/reserved-words": "^3.0", @@ -47,23 +41,23 @@ "symfony/psr-http-message-bridge": "^6.4|^7.0", "symfony/routing": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "thecodingmachine/safe": "^1.3|^2" + "thecodingmachine/safe": "^3.1" }, "require-dev": { "doctrine/coding-standard": "^12.0", "matthiasnoback/symfony-config-test": "^5.1", "matthiasnoback/symfony-dependency-injection-test": "^5.1", - "phpstan/phpstan": "^1.11", - "phpstan/phpstan-phpunit": "^1.4", - "phpstan/phpstan-strict-rules": "^1.6", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^10.5", - "roave/infection-static-analysis-plugin": "^1.35", + "roave/infection-static-analysis-plugin": "^1.37", "squizlabs/php_codesniffer": "^3.10", "symfony/browser-kit": "^6.4|^7.0", "symfony/dom-crawler": "^6.4|^7.0", "symfony/framework-bundle": "^6.4|^7.0", - "thecodingmachine/phpstan-safe-rule": "^1.2", - "vimeo/psalm": "^5.24" + "thecodingmachine/phpstan-safe-rule": "v1.4", + "vimeo/psalm": "^6.10" }, "minimum-stability": "stable", "prefer-stable": true, diff --git a/src/CodeGenerator/ApiServerCodeGenerator.php b/src/CodeGenerator/ApiServerCodeGenerator.php index 74c13859..df2f099e 100644 --- a/src/CodeGenerator/ApiServerCodeGenerator.php +++ b/src/CodeGenerator/ApiServerCodeGenerator.php @@ -11,7 +11,7 @@ use const DIRECTORY_SEPARATOR; -class ApiServerCodeGenerator +final class ApiServerCodeGenerator { private GraphGenerator $graphGenerator; private NameGenerator $nameGenerator; diff --git a/src/CodeGenerator/AttributeGenerator.php b/src/CodeGenerator/AttributeGenerator.php index 68216d31..f31502db 100644 --- a/src/CodeGenerator/AttributeGenerator.php +++ b/src/CodeGenerator/AttributeGenerator.php @@ -10,6 +10,7 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Definitions\PropertyDefinition; use OnMoon\OpenApiServerBundle\Specification\Definitions\Property; +/** @psalm-suppress ClassMustBeFinal */ class AttributeGenerator { public function setAllAttributes(GraphDefinition $graph): void diff --git a/src/CodeGenerator/Definitions/ClassDefinition.php b/src/CodeGenerator/Definitions/ClassDefinition.php index ee076112..6f226b52 100644 --- a/src/CodeGenerator/Definitions/ClassDefinition.php +++ b/src/CodeGenerator/Definitions/ClassDefinition.php @@ -4,14 +4,17 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; -use function Safe\substr; +use Override; + use function strrpos; +use function substr; class ClassDefinition implements ClassReference { private string $className; private string $namespace; + #[Override] final public function getClassName(): string { return $this->className; @@ -24,6 +27,7 @@ final public function setClassName(string $className): self return $this; } + #[Override] final public function getNamespace(): string { return $this->namespace; @@ -36,6 +40,7 @@ final public function setNamespace(string $namespace): self return $this; } + #[Override] final public function getFQCN(): string { return $this->namespace . '\\' . $this->className; diff --git a/src/CodeGenerator/Definitions/ComponentDefinition.php b/src/CodeGenerator/Definitions/ComponentDefinition.php index ab8956c5..c71be5d9 100644 --- a/src/CodeGenerator/Definitions/ComponentDefinition.php +++ b/src/CodeGenerator/Definitions/ComponentDefinition.php @@ -4,7 +4,7 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; -class ComponentDefinition +final class ComponentDefinition { private DtoDefinition $dto; diff --git a/src/CodeGenerator/Definitions/ComponentReference.php b/src/CodeGenerator/Definitions/ComponentReference.php index d4882019..d25b4f96 100644 --- a/src/CodeGenerator/Definitions/ComponentReference.php +++ b/src/CodeGenerator/Definitions/ComponentReference.php @@ -4,27 +4,33 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; -class ComponentReference implements DtoReference +use Override; + +final class ComponentReference implements DtoReference { public function __construct(private ComponentDefinition $referencedComponent) { } + #[Override] public function getClassName(): string { return $this->referencedComponent->getDto()->getClassName(); } + #[Override] public function getNamespace(): string { return $this->referencedComponent->getDto()->getNamespace(); } + #[Override] public function getFQCN(): string { return $this->referencedComponent->getDto()->getFQCN(); } + #[Override] public function isEmpty(): bool { return $this->referencedComponent->getDto()->isEmpty(); diff --git a/src/CodeGenerator/Definitions/DtoDefinition.php b/src/CodeGenerator/Definitions/DtoDefinition.php index 0c36486a..7c0bcb61 100644 --- a/src/CodeGenerator/Definitions/DtoDefinition.php +++ b/src/CodeGenerator/Definitions/DtoDefinition.php @@ -5,10 +5,11 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; use OnMoon\OpenApiServerBundle\Interfaces\Dto; +use Override; use function count; -class DtoDefinition extends GeneratedClassDefinition implements DtoReference +final class DtoDefinition extends GeneratedClassDefinition implements DtoReference { /** @var PropertyDefinition[] $properties; */ private array $properties; @@ -21,6 +22,7 @@ public function __construct(array $properties) $this->properties = $properties; } + #[Override] final public function isEmpty(): bool { return count($this->properties) === 0; diff --git a/src/CodeGenerator/FileGenerator.php b/src/CodeGenerator/FileGenerator.php index 7f3e966d..c1848287 100644 --- a/src/CodeGenerator/FileGenerator.php +++ b/src/CodeGenerator/FileGenerator.php @@ -14,6 +14,7 @@ use function array_push; +/** @psalm-suppress ClassMustBeFinal */ class FileGenerator { private DtoCodeGenerator $dtoGenerator; diff --git a/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php b/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php index beb97ba9..d10065a7 100644 --- a/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php +++ b/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php @@ -4,6 +4,8 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Filesystem; +use Override; + use function is_dir; use function Safe\file_put_contents; use function Safe\mkdir; @@ -19,6 +21,7 @@ public function __construct(int $dirPemissions) $this->dirPemissions = $dirPemissions; } + #[Override] public function write(string $path, string $filename, string $contents): void { if (! is_dir($path)) { diff --git a/src/CodeGenerator/GraphGenerator.php b/src/CodeGenerator/GraphGenerator.php index 2eee373a..4aa6af1a 100644 --- a/src/CodeGenerator/GraphGenerator.php +++ b/src/CodeGenerator/GraphGenerator.php @@ -25,6 +25,7 @@ use function array_map; use function count; +/** @psalm-suppress ClassMustBeFinal */ class GraphGenerator { private SpecificationLoader $loader; diff --git a/src/CodeGenerator/NameGenerator.php b/src/CodeGenerator/NameGenerator.php index 2ecade1e..658a3f9b 100644 --- a/src/CodeGenerator/NameGenerator.php +++ b/src/CodeGenerator/NameGenerator.php @@ -13,6 +13,7 @@ use function ucfirst; +/** @psalm-suppress ClassMustBeFinal */ class NameGenerator { private const DTO_NAMESPACE = 'Dto'; diff --git a/src/CodeGenerator/Naming/CannotCreateNamespace.php b/src/CodeGenerator/Naming/CannotCreateNamespace.php index 80da9856..93944013 100644 --- a/src/CodeGenerator/Naming/CannotCreateNamespace.php +++ b/src/CodeGenerator/Naming/CannotCreateNamespace.php @@ -6,7 +6,7 @@ use OnMoon\OpenApiServerBundle\Exception\OpenApiError; -use function Safe\sprintf; +use function sprintf; final class CannotCreateNamespace extends OpenApiError { diff --git a/src/CodeGenerator/Naming/CannotCreatePropertyName.php b/src/CodeGenerator/Naming/CannotCreatePropertyName.php index 22b8b875..2e15083c 100644 --- a/src/CodeGenerator/Naming/CannotCreatePropertyName.php +++ b/src/CodeGenerator/Naming/CannotCreatePropertyName.php @@ -6,7 +6,7 @@ use OnMoon\OpenApiServerBundle\Exception\OpenApiError; -use function Safe\sprintf; +use function sprintf; final class CannotCreatePropertyName extends OpenApiError { diff --git a/src/CodeGenerator/Naming/DefaultNamingStrategy.php b/src/CodeGenerator/Naming/DefaultNamingStrategy.php index 76b5b4a4..233b0b97 100644 --- a/src/CodeGenerator/Naming/DefaultNamingStrategy.php +++ b/src/CodeGenerator/Naming/DefaultNamingStrategy.php @@ -7,6 +7,7 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\NameGenerator; // phpcs:ignore SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse use OnMoon\OpenApiServerBundle\Interfaces\RequestHandler; +use Override; use sspat\ReservedWords\ReservedWords; use function array_map; @@ -37,11 +38,13 @@ public function __construct( $this->languageLevel = $languageLevel; } + #[Override] public function isAllowedPhpPropertyName(string $name): bool { return preg_match('/^\d/', $name) === 0 && preg_match('/^[A-Za-z0-9_]+$/', $name) === 1; } + #[Override] public function getInterfaceFQCN(string $apiNameSpace, string $operationId): string { /** @psalm-var class-string $interfaceNamespace */ @@ -56,6 +59,7 @@ public function getInterfaceFQCN(string $apiNameSpace, string $operationId): str return $interfaceNamespace; } + #[Override] public function stringToNamespace(string $text): string { $namespace = $this->padStringThatIsReservedNamespaceName( @@ -71,6 +75,7 @@ public function stringToNamespace(string $text): string return $namespace; } + #[Override] public function stringToMethodName(string $text): string { $propertyName = $this->padStringThatIsReservedMethodName( @@ -88,11 +93,13 @@ public function stringToMethodName(string $text): string return $propertyName; } + #[Override] public function buildNamespace(string ...$parts): string { return implode('\\', array_map(static fn (string $part): string => trim($part, '\\'), $parts)); } + #[Override] public function buildPath(string ...$parts): string { return implode( diff --git a/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php index be417a18..87e79760 100644 --- a/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php @@ -16,7 +16,7 @@ use function array_map; use function count; use function implode; -use function Safe\sprintf; +use function sprintf; use function trim; use const PHP_EOL; diff --git a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php index 04b4b3ef..2b479705 100644 --- a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php @@ -34,9 +34,9 @@ use function array_map; use function count; -use function Safe\sprintf; +use function sprintf; -class DtoCodeGenerator extends CodeGenerator +final class DtoCodeGenerator extends CodeGenerator { public function generate(DtoDefinition $definition): GeneratedFileDefinition { @@ -302,7 +302,7 @@ private function generateFromArray(FileBuilder $builder, DtoDefinition $definiti $statements = []; if (count($setters) > 0) { - $statements[] = new Assign($dto, $new); + $statements[] = new Expression(new Assign($dto, $new)); foreach ($setters as $setter) { $statements[] = $setter; } @@ -317,8 +317,8 @@ private function generateFromArray(FileBuilder $builder, DtoDefinition $definiti ->method('fromArray') ->makePublic() ->makeStatic() - ->setReturnType('self') - ->addParam(new Param_($source, null, 'array')) + ->setReturnType(new Name('self')) + ->addParam(new Param_($source, null, new Name('array'))) ->setDocComment($this->getDocComment(['@inheritDoc'])) ->addStmts($statements); } diff --git a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php index 6dedcadc..2dd9cf7a 100644 --- a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php +++ b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php @@ -15,8 +15,9 @@ use function in_array; use function Safe\preg_match; use function Safe\preg_replace; -use function Safe\substr; +use function substr; +/** @psalm-suppress ClassMustBeFinal */ class FileBuilder { private ClassDefinition $definition; diff --git a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php index 7312472c..68cc3403 100644 --- a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php @@ -11,9 +11,9 @@ use function array_map; use function count; use function implode; -use function Safe\sprintf; +use function sprintf; -class InterfaceCodeGenerator extends CodeGenerator +final class InterfaceCodeGenerator extends CodeGenerator { public function generate(RequestHandlerInterfaceDefinition $definition): GeneratedFileDefinition { diff --git a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php index cefe0a0c..fbcbeb7b 100644 --- a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php @@ -24,9 +24,9 @@ use PhpParser\Node\Stmt\Return_; use Psr\Container\ContainerInterface; -use function Safe\sprintf; +use function sprintf; -class ServiceSubscriberCodeGenerator extends CodeGenerator +final class ServiceSubscriberCodeGenerator extends CodeGenerator { public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinition { diff --git a/src/Command/DeleteGeneratedCodeCommand.php b/src/Command/DeleteGeneratedCodeCommand.php index 6001b1b5..23d1f2b4 100644 --- a/src/Command/DeleteGeneratedCodeCommand.php +++ b/src/Command/DeleteGeneratedCodeCommand.php @@ -4,6 +4,7 @@ namespace OnMoon\OpenApiServerBundle\Command; +use Override; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SplFileInfo; @@ -18,8 +19,8 @@ use function is_dir; use function Safe\rmdir; -use function Safe\sprintf; use function Safe\unlink; +use function sprintf; #[AsCommand(name: 'open-api:delete')] final class DeleteGeneratedCodeCommand extends Command @@ -42,6 +43,7 @@ public function __construct(string $rootPath, ?string $name = null) */ protected static $defaultName = self::COMMAND; + #[Override] protected function configure(): void { $this @@ -53,6 +55,7 @@ protected function configure(): void ); } + #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { if (! (bool) $input->getOption('yes')) { diff --git a/src/Command/GenerateApiCodeCommand.php b/src/Command/GenerateApiCodeCommand.php index 97e3e2b6..f32dbd00 100644 --- a/src/Command/GenerateApiCodeCommand.php +++ b/src/Command/GenerateApiCodeCommand.php @@ -7,6 +7,7 @@ use FilesystemIterator; use OnMoon\OpenApiServerBundle\CodeGenerator\ApiServerCodeGenerator; use OnMoon\OpenApiServerBundle\Specification\SpecificationLoader; +use Override; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SplFileInfo; @@ -21,8 +22,8 @@ use function is_dir; use function iterator_count; use function Safe\rmdir; -use function Safe\sprintf; use function Safe\unlink; +use function sprintf; #[AsCommand(name: 'open-api:generate')] final class GenerateApiCodeCommand extends Command @@ -46,6 +47,7 @@ public function __construct( parent::__construct($name); } + #[Override] protected function configure(): void { $this @@ -65,6 +67,7 @@ protected function configure(): void */ protected static $defaultName = self::COMMAND; + #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { $keep = (bool) $input->getOption('keep'); @@ -89,7 +92,6 @@ private function removeExtraFiles(string $root, array $generatedFiles): void return; } - /** @var SplFileInfo[] $iterator */ $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $root, @@ -98,6 +100,7 @@ private function removeExtraFiles(string $root, array $generatedFiles): void RecursiveIteratorIterator::CHILD_FIRST ); + /** @var SplFileInfo[] $iterator */ foreach ($iterator as $directoryOrFile) { if ($directoryOrFile->isDir() || in_array($directoryOrFile->getPathname(), $generatedFiles, true)) { continue; diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index 25362be3..e66df13d 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -39,7 +39,7 @@ use function intdiv; use function is_numeric; use function ltrim; -use function Safe\sprintf; +use function sprintf; use function strcasecmp; use const JSON_THROW_ON_ERROR; diff --git a/src/DependencyInjection/CompilerPass.php b/src/DependencyInjection/CompilerPass.php index a29636ac..0fa329a8 100644 --- a/src/DependencyInjection/CompilerPass.php +++ b/src/DependencyInjection/CompilerPass.php @@ -5,6 +5,7 @@ namespace OnMoon\OpenApiServerBundle\DependencyInjection; use OnMoon\OpenApiServerBundle\Controller\ApiController; +use Override; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; @@ -20,6 +21,7 @@ public function __construct(string $tag) $this->tag = $tag; } + #[Override] public function process(ContainerBuilder $container): void { if (! $container->has(ApiController::class)) { diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 148487eb..9424a6dc 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -4,11 +4,13 @@ namespace OnMoon\OpenApiServerBundle\DependencyInjection; +use Override; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; final class Configuration implements ConfigurationInterface { + #[Override] public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder('open_api_server'); diff --git a/src/DependencyInjection/OpenApiServerExtension.php b/src/DependencyInjection/OpenApiServerExtension.php index 416633db..23a7a571 100644 --- a/src/DependencyInjection/OpenApiServerExtension.php +++ b/src/DependencyInjection/OpenApiServerExtension.php @@ -6,6 +6,7 @@ use Exception; use OnMoon\OpenApiServerBundle\Specification\SpecificationLoader; +use Override; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; @@ -19,6 +20,7 @@ final class OpenApiServerExtension extends Extension implements ExtensionInterface { /** @param mixed[] $configs */ + #[Override] public function load(array $configs, ContainerBuilder $container): void { $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); diff --git a/src/Exception/ApiCallFailed.php b/src/Exception/ApiCallFailed.php index 4898bec3..bee70ef2 100644 --- a/src/Exception/ApiCallFailed.php +++ b/src/Exception/ApiCallFailed.php @@ -5,7 +5,7 @@ namespace OnMoon\OpenApiServerBundle\Exception; use function implode; -use function Safe\sprintf; +use function sprintf; final class ApiCallFailed extends OpenApiError { diff --git a/src/Exception/CannotParseOpenApi.php b/src/Exception/CannotParseOpenApi.php index 4e08891c..d2036e13 100644 --- a/src/Exception/CannotParseOpenApi.php +++ b/src/Exception/CannotParseOpenApi.php @@ -4,7 +4,7 @@ namespace OnMoon\OpenApiServerBundle\Exception; -use function Safe\sprintf; +use function sprintf; final class CannotParseOpenApi extends OpenApiError { diff --git a/src/OpenApiServerBundle.php b/src/OpenApiServerBundle.php index 7a9839bf..0cbc82ae 100644 --- a/src/OpenApiServerBundle.php +++ b/src/OpenApiServerBundle.php @@ -6,6 +6,7 @@ use OnMoon\OpenApiServerBundle\DependencyInjection\CompilerPass; use OnMoon\OpenApiServerBundle\Interfaces\ApiLoader; +use Override; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -13,6 +14,7 @@ final class OpenApiServerBundle extends Bundle { public const API_LOADER_TAG = 'openapi.api_loader'; + #[Override] public function build(ContainerBuilder $container): void { $container->registerForAutoconfiguration(ApiLoader::class)->addTag(self::API_LOADER_TAG); diff --git a/src/Router/RouteLoader.php b/src/Router/RouteLoader.php index 2eb6df24..b33a9284 100644 --- a/src/Router/RouteLoader.php +++ b/src/Router/RouteLoader.php @@ -7,6 +7,7 @@ use OnMoon\OpenApiServerBundle\Controller\ApiController; use OnMoon\OpenApiServerBundle\Specification\SpecificationLoader; use OnMoon\OpenApiServerBundle\Types\ArgumentResolver; +use Override; use Stringable; use Symfony\Component\Config\Loader\Loader; use Symfony\Component\Routing\Route; @@ -14,6 +15,7 @@ use function array_key_exists; +/** @psalm-suppress ClassMustBeFinal */ class RouteLoader extends Loader { private SpecificationLoader $loader; @@ -28,6 +30,7 @@ public function __construct(SpecificationLoader $loader, ArgumentResolver $argum $this->argumentResolver = $argumentResolver; } + #[Override] public function load(mixed $resource, ?string $type = null): RouteCollection { $specName = (string) $resource; @@ -41,8 +44,14 @@ public function load(mixed $resource, ?string $type = null): RouteCollection $parameters = $operation->getRequestParameters(); if (array_key_exists('path', $parameters)) { - /** @psalm-var array<(string|Stringable)> $requirements */ - $requirements = $this->argumentResolver->resolveArgumentPatterns($parameters['path']); + $argumentPatterns = $this->argumentResolver->resolveArgumentPatterns($parameters['path']); + foreach ($argumentPatterns as $name => $pattern) { + if ($pattern === null) { + continue; + } + + $requirements[$name] = $pattern; + } } $defaults = [ @@ -61,6 +70,7 @@ public function load(mixed $resource, ?string $type = null): RouteCollection } /** @inheritDoc */ + #[Override] public function supports($resource, ?string $type = null): bool { return $type === self::OPENAPI_TYPE; diff --git a/src/Serializer/ArrayDtoSerializer.php b/src/Serializer/ArrayDtoSerializer.php index 474dcb7e..789db2ef 100644 --- a/src/Serializer/ArrayDtoSerializer.php +++ b/src/Serializer/ArrayDtoSerializer.php @@ -9,6 +9,7 @@ use OnMoon\OpenApiServerBundle\Specification\Definitions\ObjectSchema; use OnMoon\OpenApiServerBundle\Specification\Definitions\Operation; use OnMoon\OpenApiServerBundle\Types\ScalarTypesResolver; +use Override; use Symfony\Component\HttpFoundation\Request; use function array_key_exists; @@ -27,6 +28,7 @@ public function __construct(ScalarTypesResolver $resolver, bool $sendNulls) $this->sendNotRequiredNullableNulls = $sendNulls; } + #[Override] public function createRequestDto( Request $request, Operation $operation, @@ -67,6 +69,7 @@ public function createRequestDto( } /** @inheritDoc */ + #[Override] public function createResponseFromDto(Dto $responseDto, ObjectSchema $definition): array { return $this->convert(false, $responseDto->toArray(), $definition); diff --git a/src/Specification/Definitions/ComponentArray.php b/src/Specification/Definitions/ComponentArray.php index 242c88c9..d7b1385d 100644 --- a/src/Specification/Definitions/ComponentArray.php +++ b/src/Specification/Definitions/ComponentArray.php @@ -7,6 +7,6 @@ use ArrayObject; /** @extends ArrayObject */ -class ComponentArray extends ArrayObject +final class ComponentArray extends ArrayObject { } diff --git a/src/Specification/Definitions/ObjectReference.php b/src/Specification/Definitions/ObjectReference.php index 630ad7e4..c3f6cada 100644 --- a/src/Specification/Definitions/ObjectReference.php +++ b/src/Specification/Definitions/ObjectReference.php @@ -4,7 +4,9 @@ namespace OnMoon\OpenApiServerBundle\Specification\Definitions; -class ObjectReference implements GetSchema +use Override; + +final class ObjectReference implements GetSchema { public function __construct(private string $schemaName, private ObjectSchema $referencedObject) { @@ -20,6 +22,7 @@ public function getReferencedObject(): ObjectSchema return $this->referencedObject; } + #[Override] public function getSchema(): ObjectSchema { return $this->getReferencedObject(); diff --git a/src/Specification/Definitions/ObjectSchema.php b/src/Specification/Definitions/ObjectSchema.php index e642b4f6..bbfba6ae 100644 --- a/src/Specification/Definitions/ObjectSchema.php +++ b/src/Specification/Definitions/ObjectSchema.php @@ -4,6 +4,8 @@ namespace OnMoon\OpenApiServerBundle\Specification\Definitions; +use Override; + final class ObjectSchema implements GetSchema { /** @var Property[] $properties; */ @@ -21,6 +23,7 @@ public function getProperties(): array return $this->properties; } + #[Override] public function getSchema(): ObjectSchema { return $this; diff --git a/src/Specification/SpecificationLoader.php b/src/Specification/SpecificationLoader.php index 5fcc3458..5376d029 100644 --- a/src/Specification/SpecificationLoader.php +++ b/src/Specification/SpecificationLoader.php @@ -17,11 +17,12 @@ use function file_exists; use function implode; use function pathinfo; -use function Safe\sprintf; +use function sprintf; use function stream_is_local; use const PATHINFO_EXTENSION; +/** @psalm-suppress ClassMustBeFinal */ class SpecificationLoader { public const CACHE_TAG = 'openapi.server.bundle.specifications'; diff --git a/src/Specification/SpecificationParser.php b/src/Specification/SpecificationParser.php index fea367a6..329cdabf 100644 --- a/src/Specification/SpecificationParser.php +++ b/src/Specification/SpecificationParser.php @@ -42,6 +42,7 @@ use function strcasecmp; use function substr; +/** @psalm-suppress ClassMustBeFinal */ class SpecificationParser { private ScalarTypesResolver $typeResolver; diff --git a/src/Types/ArgumentResolver.php b/src/Types/ArgumentResolver.php index 947309ef..61fd5eee 100644 --- a/src/Types/ArgumentResolver.php +++ b/src/Types/ArgumentResolver.php @@ -9,6 +9,7 @@ use function Safe\preg_match; +/** @psalm-suppress ClassMustBeFinal */ class ArgumentResolver { private ScalarTypesResolver $typesResolver; diff --git a/src/Types/TypeSerializer.php b/src/Types/TypeSerializer.php index a78f7029..6f94a681 100644 --- a/src/Types/TypeSerializer.php +++ b/src/Types/TypeSerializer.php @@ -15,7 +15,7 @@ use function Safe\base64_decode; use function sprintf; -class TypeSerializer +final class TypeSerializer { private const DATE_FORMAT = 'Y-m-d'; private const DATETIME_FORMAT = 'c'; diff --git a/src/Validator/LeaguePSR7RequestSchemaValidator.php b/src/Validator/LeaguePSR7RequestSchemaValidator.php index aaefffab..c002046e 100644 --- a/src/Validator/LeaguePSR7RequestSchemaValidator.php +++ b/src/Validator/LeaguePSR7RequestSchemaValidator.php @@ -7,6 +7,7 @@ use League\OpenAPIValidation\PSR7\OperationAddress; use League\OpenAPIValidation\PSR7\ValidatorBuilder; use OnMoon\OpenApiServerBundle\Specification\Definitions\Specification; +use Override; use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory; use Symfony\Component\HttpFoundation\Request; @@ -23,6 +24,7 @@ public function __construct( $this->httpFactory = $httpFactory; } + #[Override] public function validate( Request $request, Specification $specification, diff --git a/test/functional/Command/DeleteGeneratedCodeCommandTest.php b/test/functional/Command/DeleteGeneratedCodeCommandTest.php index 3f30b673..a638d689 100644 --- a/test/functional/Command/DeleteGeneratedCodeCommandTest.php +++ b/test/functional/Command/DeleteGeneratedCodeCommandTest.php @@ -12,7 +12,7 @@ use function rtrim; use function Safe\file_put_contents; use function Safe\mkdir; -use function Safe\sprintf; +use function sprintf; /** @covers \OnMoon\OpenApiServerBundle\Command\DeleteGeneratedCodeCommand */ class DeleteGeneratedCodeCommandTest extends CommandTestCase diff --git a/test/functional/Command/GenerateApiCodeCommandTest.php b/test/functional/Command/GenerateApiCodeCommandTest.php index 081ab9d8..4c14b39d 100644 --- a/test/functional/Command/GenerateApiCodeCommandTest.php +++ b/test/functional/Command/GenerateApiCodeCommandTest.php @@ -10,7 +10,7 @@ use Symfony\Component\Console\Tester\CommandTester; use function rtrim; -use function Safe\sprintf; +use function sprintf; use function ucfirst; use const DIRECTORY_SEPARATOR; diff --git a/test/functional/DependencyInjection/ConfigurationTest.php b/test/functional/DependencyInjection/ConfigurationTest.php index b8612521..f700e80a 100644 --- a/test/functional/DependencyInjection/ConfigurationTest.php +++ b/test/functional/DependencyInjection/ConfigurationTest.php @@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\HttpKernel\Kernel; -use function Safe\sprintf; +use function sprintf; use function version_compare; /** @covers \OnMoon\OpenApiServerBundle\DependencyInjection\Configuration */ diff --git a/test/functional/Specification/SpecificationLoaderTest.php b/test/functional/Specification/SpecificationLoaderTest.php index e6289e96..408ea05c 100644 --- a/test/functional/Specification/SpecificationLoaderTest.php +++ b/test/functional/Specification/SpecificationLoaderTest.php @@ -22,7 +22,7 @@ use Symfony\Contracts\Cache\TagAwareCacheInterface; use function array_pop; -use function Safe\sprintf; +use function sprintf; /** @covers \OnMoon\OpenApiServerBundle\Specification\SpecificationLoader */ class SpecificationLoaderTest extends TestCase diff --git a/test/functional/openapi_specification.yaml b/test/functional/openapi_specification.yaml index 680a4b3e..4aedfe00 100644 --- a/test/functional/openapi_specification.yaml +++ b/test/functional/openapi_specification.yaml @@ -3,7 +3,7 @@ info: title: 'Test Goods API' version: '1.0' paths: - '/goods/{goodId}': + /goods/{goodId}: get: operationId: "getGood" parameters: diff --git a/test/generation/GeneratedClassAsserter.php b/test/generation/GeneratedClassAsserter.php index 174a5589..780b47e3 100644 --- a/test/generation/GeneratedClassAsserter.php +++ b/test/generation/GeneratedClassAsserter.php @@ -22,12 +22,13 @@ use PhpParser\Node\Stmt\UseUse; use PhpParser\NodeFinder; use PhpParser\ParserFactory; +use PhpParser\PhpVersion; use PHPUnit\Framework\Assert; use function array_pop; use function explode; use function is_array; -use function Safe\sprintf; +use function sprintf; use function strpos; final class GeneratedClassAsserter @@ -39,7 +40,7 @@ final class GeneratedClassAsserter public function __construct(InMemoryFileWriter $fileWriter, string $path) { $this->nodeFinder = new NodeFinder(); - $phpParser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7); + $phpParser = (new ParserFactory())->createForVersion(PhpVersion::fromString('7.0')); $phpCode = $fileWriter->getContentsByFullPath($path); $statements = $phpParser->parse($phpCode); if ($statements === null) { diff --git a/test/generation/GenerationTestCase.php b/test/generation/GenerationTestCase.php index 3b5c79df..69cbf284 100644 --- a/test/generation/GenerationTestCase.php +++ b/test/generation/GenerationTestCase.php @@ -9,6 +9,7 @@ use PhpParser\NodeFinder; use PhpParser\Parser; use PhpParser\ParserFactory; +use PhpParser\PhpVersion; use PHPUnit\Framework\TestCase; abstract class GenerationTestCase extends TestCase @@ -18,7 +19,7 @@ abstract class GenerationTestCase extends TestCase public function setUp(): void { - $this->phpParser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7); + $this->phpParser = (new ParserFactory())->createForVersion(PhpVersion::fromString('7.0')); $this->nodeFinder = new NodeFinder(); } diff --git a/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php b/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php index 3993cf10..cf12839e 100644 --- a/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php +++ b/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php @@ -7,7 +7,7 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreateNamespace; use PHPUnit\Framework\TestCase; -use function Safe\sprintf; +use function sprintf; /** @covers \OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreateNamespace */ final class CannotCreateNamespaceTest extends TestCase diff --git a/test/unit/CodeGenerator/Naming/CannotCreatePropertyNameTest.php b/test/unit/CodeGenerator/Naming/CannotCreatePropertyNameTest.php index 45b0ee58..0dfae5f4 100644 --- a/test/unit/CodeGenerator/Naming/CannotCreatePropertyNameTest.php +++ b/test/unit/CodeGenerator/Naming/CannotCreatePropertyNameTest.php @@ -7,7 +7,7 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreatePropertyName; use PHPUnit\Framework\TestCase; -use function Safe\sprintf; +use function sprintf; /** @covers \OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreatePropertyName */ final class CannotCreatePropertyNameTest extends TestCase diff --git a/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php b/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php index dd674991..0798d403 100644 --- a/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php +++ b/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php @@ -32,7 +32,7 @@ public function testAddStmt(): void /** @var \PhpParser\Node\Stmt\Use_ $statementToCheck */ $statementToCheck = $this->fileBuilder->getNamespace()->getNode()->stmts[0]; - Assert::assertEquals('test', $statementToCheck->uses[0]->name->parts[0]); + Assert::assertEquals('test', $statementToCheck->uses[0]->name->name); } public function testReferenceWithNotMatching(): void @@ -63,9 +63,7 @@ public function testReferenceWithSameDefinition(): void /** @var Name $nodeName */ $nodeName = $namespace->getNode()->name; - Assert::assertEquals('NamespaceOne', $nodeName->parts[0]); - Assert::assertEquals('NamespaceTwo', $nodeName->parts[1]); - + Assert::assertEquals('NamespaceOne\NamespaceTwo', $nodeName->name); Assert::assertEquals('ClassDefinition', $reference); } diff --git a/test/unit/CodeGenerator/PhpParserGenerators/InterfaceCodeGeneratorTest.php b/test/unit/CodeGenerator/PhpParserGenerators/InterfaceCodeGeneratorTest.php index 6523fdd3..6ac43943 100644 --- a/test/unit/CodeGenerator/PhpParserGenerators/InterfaceCodeGeneratorTest.php +++ b/test/unit/CodeGenerator/PhpParserGenerators/InterfaceCodeGeneratorTest.php @@ -62,7 +62,7 @@ public function testGenerateWithRequestHandlerInterfaceDefinition(): void */ interface TestClass extends RequestHandler { - public function test() : void; + public function test(): void; } EOD; $expectedGeneratedFileDefinition = new GeneratedFileDefinition( @@ -102,7 +102,7 @@ public function testGenerateWithRequestHandlerInterfaceDefinitionAndRequestedTyp interface TestClass extends RequestHandler { /** @param TestClass_ $request */ - public function test(TestClass_ $request) : void; + public function test(TestClass_ $request): void; } EOD; $expectedGeneratedFileDefinition = new GeneratedFileDefinition( @@ -139,7 +139,7 @@ public function testGenerateWithRequestHandlerInterfaceDefinitionAndResponseType interface TestClass extends RequestHandler { /** @return TestClass_ */ - public function test() : TestClass_; + public function test(): TestClass_; } EOD; $expectedGeneratedFileDefinition = new GeneratedFileDefinition( @@ -175,7 +175,7 @@ public function testGenerateWithRequestHandlerInterfaceDefinitionAndDescription( interface TestClass extends RequestHandler { /** method description */ - public function test() : void; + public function test(): void; } EOD; $expectedGeneratedFileDefinition = new GeneratedFileDefinition( diff --git a/test/unit/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGeneratorTest.php b/test/unit/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGeneratorTest.php index 7f418ec6..cee4328e 100644 --- a/test/unit/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGeneratorTest.php +++ b/test/unit/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGeneratorTest.php @@ -122,11 +122,11 @@ public function __construct(ContainerInterface $locator) /** * @inheritDoc */ - public static function getSubscribedServices() : array + public static function getSubscribedServices(): array { return ['test' => '?' . ClassName::class]; } - public function get(string $interface) : ?RequestHandler + public function get(string $interface): ?RequestHandler { if (!$this->locator->has($interface)) { return null; @@ -134,7 +134,7 @@ public function get(string $interface) : ?RequestHandler return $this->locator->get($interface); } /** @return string[] */ - public function getAllowedCodes(string $apiClass, string $dtoClass) : array + public function getAllowedCodes(string $apiClass, string $dtoClass): array { return self::HTTP_CODES[$apiClass][$dtoClass]; } diff --git a/test/unit/Exception/ApiCallFailedTest.php b/test/unit/Exception/ApiCallFailedTest.php index 761fcd3c..061dd337 100644 --- a/test/unit/Exception/ApiCallFailedTest.php +++ b/test/unit/Exception/ApiCallFailedTest.php @@ -7,7 +7,7 @@ use OnMoon\OpenApiServerBundle\Exception\ApiCallFailed; use PHPUnit\Framework\TestCase; -use function Safe\sprintf; +use function sprintf; /** @covers \OnMoon\OpenApiServerBundle\Exception\ApiCallFailed */ final class ApiCallFailedTest extends TestCase diff --git a/test/unit/Exception/CannotParseOpenApiTest.php b/test/unit/Exception/CannotParseOpenApiTest.php index 8ffa9027..b82eaf44 100644 --- a/test/unit/Exception/CannotParseOpenApiTest.php +++ b/test/unit/Exception/CannotParseOpenApiTest.php @@ -7,7 +7,7 @@ use OnMoon\OpenApiServerBundle\Exception\CannotParseOpenApi; use PHPUnit\Framework\TestCase; -use function Safe\sprintf; +use function sprintf; /** @covers \OnMoon\OpenApiServerBundle\Exception\CannotParseOpenApi */ final class CannotParseOpenApiTest extends TestCase From 3c334141cf1670e1335a4ddaf7195a8abd81852b Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 14:48:51 +0300 Subject: [PATCH 02/18] fix --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index edc81f4f..697060c3 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "require": { "php": "^8.1", "ext-json": "*", - "devizzent/cebe-php-openapi": "1.1.4", + "cebe/php-openapi": "^1.8", "league/openapi-psr7-validator": "^0.22.0", "lukasoppermann/http-status": "^4.0", "nikic/php-parser": "^v5.4", @@ -41,7 +41,7 @@ "symfony/psr-http-message-bridge": "^6.4|^7.0", "symfony/routing": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "thecodingmachine/safe": "^3.1" + "thecodingmachine/safe": "^1.3|^2|^3.1" }, "require-dev": { "doctrine/coding-standard": "^12.0", From 88f95b88044d8588d09d94ff334069fec9a878af Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 15:44:17 +0300 Subject: [PATCH 03/18] fix errors --- composer.json | 2 +- phpstan.neon | 4 ---- psalm.xml | 17 ----------------- .../PhpParserGenerators/DtoCodeGenerator.php | 5 +++-- src/Command/DeleteGeneratedCodeCommand.php | 5 +++-- src/Command/GenerateApiCodeCommand.php | 2 +- src/Exception/CannotParseOpenApi.php | 15 +++++++++++++++ src/Serializer/ArrayDtoSerializer.php | 6 ------ src/Specification/SpecificationParser.php | 15 +++++++++++---- .../Command/DeleteGeneratedCodeCommandTest.php | 6 +++++- 10 files changed, 39 insertions(+), 38 deletions(-) diff --git a/composer.json b/composer.json index 697060c3..dd99f74e 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "require": { "php": "^8.1", "ext-json": "*", - "cebe/php-openapi": "^1.8", + "devizzent/cebe-php-openapi": "^1.1.4", "league/openapi-psr7-validator": "^0.22.0", "lukasoppermann/http-status": "^4.0", "nikic/php-parser": "^v5.4", diff --git a/phpstan.neon b/phpstan.neon index 2cc69f04..0045c6ba 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -30,10 +30,6 @@ parameters: message: '#Method OnMoon\\OpenApiServerBundle\\Specification\\SpecificationParser::getResponseDtoDefinitions\(\) has parameter \$responses with no value type specified in iterable type array\.#' paths: - %currentWorkingDirectory%/src/Specification/SpecificationParser.php - - - message: '#Parameter \#1 \$json of function Safe\\json_decode expects string, resource\|string given\.#' - paths: - - %currentWorkingDirectory%/src/Serializer/ArrayDtoSerializer.php includes: - vendor/thecodingmachine/phpstan-safe-rule/phpstan-safe-rule.neon - vendor/phpstan/phpstan-phpunit/extension.neon diff --git a/psalm.xml b/psalm.xml index 970e1147..7b1cf170 100644 --- a/psalm.xml +++ b/psalm.xml @@ -19,25 +19,8 @@ - - - - - - - - - - - - - - - - - diff --git a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php index 2b479705..6903afba 100644 --- a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php @@ -160,9 +160,10 @@ private function generateClassProperty(FileBuilder $builder, PropertyDefinition $property->setType($this->getTypePhp($builder, $definition)); $docCommentLines = []; + $description = $definition->getDescription(); - if ($definition->getDescription() !== null) { - $docCommentLines[] = sprintf('%s', $definition->getDescription()); + if ($description !== null) { + $docCommentLines[] = sprintf('%s', $description); $docCommentLines[] = ''; } diff --git a/src/Command/DeleteGeneratedCodeCommand.php b/src/Command/DeleteGeneratedCodeCommand.php index 23d1f2b4..523ab683 100644 --- a/src/Command/DeleteGeneratedCodeCommand.php +++ b/src/Command/DeleteGeneratedCodeCommand.php @@ -4,6 +4,7 @@ namespace OnMoon\OpenApiServerBundle\Command; +use FilesystemIterator; use Override; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; @@ -86,15 +87,15 @@ private function recursiveDelete(string $directoryPath): void return; } - /** @var SplFileInfo[] $iterator */ $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $directoryPath, - RecursiveDirectoryIterator::SKIP_DOTS + FilesystemIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST ); + /** @var SplFileInfo $directoryOrFile */ foreach ($iterator as $directoryOrFile) { if ($directoryOrFile->isDir()) { rmdir($directoryOrFile->getPathname()); diff --git a/src/Command/GenerateApiCodeCommand.php b/src/Command/GenerateApiCodeCommand.php index f32dbd00..b42c3a94 100644 --- a/src/Command/GenerateApiCodeCommand.php +++ b/src/Command/GenerateApiCodeCommand.php @@ -100,7 +100,7 @@ private function removeExtraFiles(string $root, array $generatedFiles): void RecursiveIteratorIterator::CHILD_FIRST ); - /** @var SplFileInfo[] $iterator */ + /** @var SplFileInfo $directoryOrFile */ foreach ($iterator as $directoryOrFile) { if ($directoryOrFile->isDir() || in_array($directoryOrFile->getPathname(), $generatedFiles, true)) { continue; diff --git a/src/Exception/CannotParseOpenApi.php b/src/Exception/CannotParseOpenApi.php index d2036e13..fd2c6267 100644 --- a/src/Exception/CannotParseOpenApi.php +++ b/src/Exception/CannotParseOpenApi.php @@ -82,6 +82,21 @@ public static function becauseOnlyScalarAreAllowed(string $propertyName, array $ ); } + /** @param array{location:string,method:string,url:string,path:string} $context */ + public static function becauseOpenapi31TypesNotSupported(string $propertyName, array $context): self + { + return new self( + sprintf( + 'Cannot generate property for DTO class, property "%s" has multiple types in %s for operation: "%s" of path: "%s" in specification file: "%s".', + $propertyName, + $context['location'], + $context['method'], + $context['url'], + $context['path'] + ) + ); + } + /** @param array{location:string,method:string,url:string,path:string} $context */ public static function becauseArrayIsNotDescribed(string $propertyName, array $context): self { diff --git a/src/Serializer/ArrayDtoSerializer.php b/src/Serializer/ArrayDtoSerializer.php index 789db2ef..d33cb5f0 100644 --- a/src/Serializer/ArrayDtoSerializer.php +++ b/src/Serializer/ArrayDtoSerializer.php @@ -4,7 +4,6 @@ namespace OnMoon\OpenApiServerBundle\Serializer; -use Exception; use OnMoon\OpenApiServerBundle\Interfaces\Dto; use OnMoon\OpenApiServerBundle\Specification\Definitions\ObjectSchema; use OnMoon\OpenApiServerBundle\Specification\Definitions\Operation; @@ -14,7 +13,6 @@ use function array_key_exists; use function array_map; -use function is_resource; use function Safe\json_decode; final class ArrayDtoSerializer implements DtoSerializer @@ -51,11 +49,7 @@ public function createRequestDto( $bodyType = $operation->getRequestBody(); if ($bodyType !== null) { - /** @var resource|string $source */ $source = $request->getContent(); - if (is_resource($source)) { - throw new Exception('Expecting string as contents, resource received'); - } /** @var mixed[] $rawBody */ $rawBody = json_decode($source, true); diff --git a/src/Specification/SpecificationParser.php b/src/Specification/SpecificationParser.php index 329cdabf..6ab2e263 100644 --- a/src/Specification/SpecificationParser.php +++ b/src/Specification/SpecificationParser.php @@ -37,6 +37,7 @@ use function is_a; use function is_array; use function is_int; +use function is_string; use function Safe\preg_match; use function str_ends_with; use function strcasecmp; @@ -375,8 +376,14 @@ private function getProperty( $itemProperty = $property; } - if (Type::isScalar($itemProperty->type)) { - $scalarTypeId = $this->typeResolver->findScalarType($itemProperty->type, $itemProperty->format); + $propertyType = $itemProperty->type; + + if (is_array($propertyType)) { + throw CannotParseOpenApi::becauseOpenapi31TypesNotSupported($propertyName, $exceptionContext); + } + + if (Type::isScalar($propertyType)) { + $scalarTypeId = $this->typeResolver->findScalarType($propertyType, $itemProperty->format); $propertyDefinition->setScalarTypeId($scalarTypeId); if ($this->typeResolver->isDateTime($scalarTypeId) && $this->dateTimeClass !== null) { @@ -398,7 +405,7 @@ private function getProperty( $propertyDefinition->setOutputType($this->dateTimeClass); } - } elseif ($itemProperty->type === Type::OBJECT) { + } elseif ($propertyType === Type::OBJECT) { $objectType = $this->getObjectSchema( $itemProperty, $isRequest, @@ -408,7 +415,7 @@ private function getProperty( $propertyDefinition->setObjectTypeDefinition($objectType); $isScalar = false; } else { - throw CannotParseOpenApi::becauseTypeNotSupported($propertyName, $itemProperty->type, $exceptionContext); + throw CannotParseOpenApi::becauseTypeNotSupported($propertyName, $propertyType, $exceptionContext); } /** @var string|int|float|bool|null $schemaDefaultValue */ diff --git a/test/functional/Command/DeleteGeneratedCodeCommandTest.php b/test/functional/Command/DeleteGeneratedCodeCommandTest.php index a638d689..db5ad3a5 100644 --- a/test/functional/Command/DeleteGeneratedCodeCommandTest.php +++ b/test/functional/Command/DeleteGeneratedCodeCommandTest.php @@ -9,6 +9,7 @@ use PHPUnit\Framework\Assert; use Symfony\Component\Console\Tester\CommandTester; +use function is_dir; use function rtrim; use function Safe\file_put_contents; use function Safe\mkdir; @@ -24,7 +25,10 @@ public function setUp(): void $command = $this->application->find(DeleteGeneratedCodeCommand::COMMAND); $this->commandTester = new CommandTester($command); - mkdir(TestKernel::$bundleRootPath); + if (! is_dir(TestKernel::$bundleRootPath)) { + mkdir(TestKernel::$bundleRootPath); + } + file_put_contents(TestKernel::$bundleRootPath . '/test.txt', ''); } From 1a75af59248ed8520f3e1498c77018a7584fba88 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 15:55:45 +0300 Subject: [PATCH 04/18] fix cs --- src/Specification/SpecificationParser.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Specification/SpecificationParser.php b/src/Specification/SpecificationParser.php index 6ab2e263..87bbac6a 100644 --- a/src/Specification/SpecificationParser.php +++ b/src/Specification/SpecificationParser.php @@ -37,7 +37,6 @@ use function is_a; use function is_array; use function is_int; -use function is_string; use function Safe\preg_match; use function str_ends_with; use function strcasecmp; From d57933b4a2c57e971206efe0d56669fe8b680a92 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 15:58:01 +0300 Subject: [PATCH 05/18] fix package min version --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index dd99f74e..f536610a 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^10.5", - "roave/infection-static-analysis-plugin": "^1.37", + "roave/infection-static-analysis-plugin": "^1.35", "squizlabs/php_codesniffer": "^3.10", "symfony/browser-kit": "^6.4|^7.0", "symfony/dom-crawler": "^6.4|^7.0", From b8331f5584a818bbbee8d890b8b3c49639f75810 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 15:59:15 +0300 Subject: [PATCH 06/18] fix min package version --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f536610a..3fbaee53 100644 --- a/composer.json +++ b/composer.json @@ -57,7 +57,7 @@ "symfony/dom-crawler": "^6.4|^7.0", "symfony/framework-bundle": "^6.4|^7.0", "thecodingmachine/phpstan-safe-rule": "v1.4", - "vimeo/psalm": "^6.10" + "vimeo/psalm": "^5.15|^6.10" }, "minimum-stability": "stable", "prefer-stable": true, From 5012b438bbeb3020521e10588560d616fbedc5ed Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 16:02:05 +0300 Subject: [PATCH 07/18] fix min ver --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 3fbaee53..031b2e2c 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,7 @@ "devizzent/cebe-php-openapi": "^1.1.4", "league/openapi-psr7-validator": "^0.22.0", "lukasoppermann/http-status": "^4.0", - "nikic/php-parser": "^v5.4", + "nikic/php-parser": "^4.19|^v5.4", "nyholm/psr7": "^1.5", "phpdocumentor/reflection-docblock": "^5.3", "sspat/reserved-words": "^3.0", @@ -57,7 +57,7 @@ "symfony/dom-crawler": "^6.4|^7.0", "symfony/framework-bundle": "^6.4|^7.0", "thecodingmachine/phpstan-safe-rule": "v1.4", - "vimeo/psalm": "^5.15|^6.10" + "vimeo/psalm": "^5.24|^6.10" }, "minimum-stability": "stable", "prefer-stable": true, From 72e56185ca2f9e56e278c809805915e86cac1f29 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 16:04:12 +0300 Subject: [PATCH 08/18] fix --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 031b2e2c..96378b95 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ "symfony/browser-kit": "^6.4|^7.0", "symfony/dom-crawler": "^6.4|^7.0", "symfony/framework-bundle": "^6.4|^7.0", - "thecodingmachine/phpstan-safe-rule": "v1.4", + "thecodingmachine/phpstan-safe-rule": "^1.2|v1.4", "vimeo/psalm": "^5.24|^6.10" }, "minimum-stability": "stable", From 02ff41a238deb0dd6177cfecac969de4d7f89933 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 18:33:30 +0300 Subject: [PATCH 09/18] fix --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 96378b95..1d1069a0 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,7 @@ "devizzent/cebe-php-openapi": "^1.1.4", "league/openapi-psr7-validator": "^0.22.0", "lukasoppermann/http-status": "^4.0", - "nikic/php-parser": "^4.19|^v5.4", + "nikic/php-parser": "^4.19|^v5.0", "nyholm/psr7": "^1.5", "phpdocumentor/reflection-docblock": "^5.3", "sspat/reserved-words": "^3.0", From 35c0c1a30e361ba871812473dc7e7ff41bd81f71 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 18:36:55 +0300 Subject: [PATCH 10/18] fix --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 1d1069a0..b6be179c 100644 --- a/composer.json +++ b/composer.json @@ -47,8 +47,8 @@ "doctrine/coding-standard": "^12.0", "matthiasnoback/symfony-config-test": "^5.1", "matthiasnoback/symfony-dependency-injection-test": "^5.1", - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan": "^1.11|^2.1", + "phpstan/phpstan-phpunit": "^1.4|^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^10.5", "roave/infection-static-analysis-plugin": "^1.35", From 5d3727a9fe8ba171ebaadb68cc91ad7320a15250 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 18:38:15 +0300 Subject: [PATCH 11/18] fix --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index b6be179c..cb3dca3c 100644 --- a/composer.json +++ b/composer.json @@ -49,7 +49,7 @@ "matthiasnoback/symfony-dependency-injection-test": "^5.1", "phpstan/phpstan": "^1.11|^2.1", "phpstan/phpstan-phpunit": "^1.4|^2.0", - "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-strict-rules": "^1.6|^2.0", "phpunit/phpunit": "^10.5", "roave/infection-static-analysis-plugin": "^1.35", "squizlabs/php_codesniffer": "^3.10", From 43dc6caa03fd2611f78272270e447a41ad5c1dd1 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 18:46:17 +0300 Subject: [PATCH 12/18] fix --- test/generation/GenerationTestCase.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/generation/GenerationTestCase.php b/test/generation/GenerationTestCase.php index 69cbf284..593bcf24 100644 --- a/test/generation/GenerationTestCase.php +++ b/test/generation/GenerationTestCase.php @@ -9,8 +9,8 @@ use PhpParser\NodeFinder; use PhpParser\Parser; use PhpParser\ParserFactory; -use PhpParser\PhpVersion; use PHPUnit\Framework\TestCase; +use ReflectionClass; abstract class GenerationTestCase extends TestCase { @@ -19,7 +19,12 @@ abstract class GenerationTestCase extends TestCase public function setUp(): void { - $this->phpParser = (new ParserFactory())->createForVersion(PhpVersion::fromString('7.0')); + if ((new ReflectionClass(ParserFactory::class))->hasMethod('create')) { + $this->phpParser = (new ParserFactory())->create(1); + } else { + $this->phpParser = (new ParserFactory())->createForHostVersion(); + } + $this->nodeFinder = new NodeFinder(); } From b5277c1e8a1ecfce40ce2e3462d1a644df5204d2 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 18:48:05 +0300 Subject: [PATCH 13/18] fix --- test/generation/GeneratedClassAsserter.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/generation/GeneratedClassAsserter.php b/test/generation/GeneratedClassAsserter.php index 780b47e3..52b67708 100644 --- a/test/generation/GeneratedClassAsserter.php +++ b/test/generation/GeneratedClassAsserter.php @@ -22,8 +22,8 @@ use PhpParser\Node\Stmt\UseUse; use PhpParser\NodeFinder; use PhpParser\ParserFactory; -use PhpParser\PhpVersion; use PHPUnit\Framework\Assert; +use ReflectionClass; use function array_pop; use function explode; @@ -40,9 +40,14 @@ final class GeneratedClassAsserter public function __construct(InMemoryFileWriter $fileWriter, string $path) { $this->nodeFinder = new NodeFinder(); - $phpParser = (new ParserFactory())->createForVersion(PhpVersion::fromString('7.0')); - $phpCode = $fileWriter->getContentsByFullPath($path); - $statements = $phpParser->parse($phpCode); + if ((new ReflectionClass(ParserFactory::class))->hasMethod('create')) { + $phpParser = (new ParserFactory())->create(1); + } else { + $phpParser = (new ParserFactory())->createForHostVersion(); + } + + $phpCode = $fileWriter->getContentsByFullPath($path); + $statements = $phpParser->parse($phpCode); if ($statements === null) { throw new InvalidArgumentException('No statements found in provided PHP code'); } From ccc3e28f3a9a26d4340f073c867fe768d0af1d63 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 18:54:37 +0300 Subject: [PATCH 14/18] fix --- .../PhpParserGenerators/FileBuilderTest.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php b/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php index 0798d403..7671af18 100644 --- a/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php +++ b/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\UseUse; use PHPUnit\Framework\Assert; use PHPUnit\Framework\TestCase; +use ReflectionClass; /** @covers \OnMoon\OpenApiServerBundle\CodeGenerator\PhpParserGenerators\FileBuilder */ class FileBuilderTest extends TestCase @@ -32,7 +33,13 @@ public function testAddStmt(): void /** @var \PhpParser\Node\Stmt\Use_ $statementToCheck */ $statementToCheck = $this->fileBuilder->getNamespace()->getNode()->stmts[0]; - Assert::assertEquals('test', $statementToCheck->uses[0]->name->name); + if ((new ReflectionClass(Name::class))->hasProperty('name')) { + $nameSpaceName = $statementToCheck->uses[0]->name->name; + } else { + $nameSpaceName = $statementToCheck->uses[0]->name->parts[0]; + } + + Assert::assertEquals('test', $nameSpaceName); } public function testReferenceWithNotMatching(): void From 5d8a126bd74b4dd96816bc2951923c4393629ada Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 18:57:14 +0300 Subject: [PATCH 15/18] fix --- .../PhpParserGenerators/FileBuilderTest.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php b/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php index 7671af18..14a19488 100644 --- a/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php +++ b/test/unit/CodeGenerator/PhpParserGenerators/FileBuilderTest.php @@ -34,12 +34,10 @@ public function testAddStmt(): void $statementToCheck = $this->fileBuilder->getNamespace()->getNode()->stmts[0]; if ((new ReflectionClass(Name::class))->hasProperty('name')) { - $nameSpaceName = $statementToCheck->uses[0]->name->name; + Assert::assertEquals('test', $statementToCheck->uses[0]->name->name); } else { - $nameSpaceName = $statementToCheck->uses[0]->name->parts[0]; + Assert::assertEquals('test', $statementToCheck->uses[0]->name->parts[0]); } - - Assert::assertEquals('test', $nameSpaceName); } public function testReferenceWithNotMatching(): void @@ -70,7 +68,13 @@ public function testReferenceWithSameDefinition(): void /** @var Name $nodeName */ $nodeName = $namespace->getNode()->name; - Assert::assertEquals('NamespaceOne\NamespaceTwo', $nodeName->name); + if ((new ReflectionClass(Name::class))->hasProperty('name')) { + Assert::assertEquals('NamespaceOne\NamespaceTwo', $nodeName->name); + } else { + Assert::assertEquals('NamespaceOne', $nodeName->parts[0]); + Assert::assertEquals('NamespaceTwo', $nodeName->parts[1]); + } + Assert::assertEquals('ClassDefinition', $reference); } From 73cc0f912ba4c2d087b9d65d0be4361784c867ec Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 19:08:57 +0300 Subject: [PATCH 16/18] fix --- .../InterfaceCodeGeneratorTest.php | 42 +++++++++++++++++-- .../ServiceSubscriberCodeGeneratorTest.php | 12 +++++- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/test/unit/CodeGenerator/PhpParserGenerators/InterfaceCodeGeneratorTest.php b/test/unit/CodeGenerator/PhpParserGenerators/InterfaceCodeGeneratorTest.php index 6ac43943..bc3f2550 100644 --- a/test/unit/CodeGenerator/PhpParserGenerators/InterfaceCodeGeneratorTest.php +++ b/test/unit/CodeGenerator/PhpParserGenerators/InterfaceCodeGeneratorTest.php @@ -14,6 +14,8 @@ use PHPUnit\Framework\Assert; use PHPUnit\Framework\TestCase; +use function str_replace; + /** @covers \OnMoon\OpenApiServerBundle\CodeGenerator\PhpParserGenerators\InterfaceCodeGenerator */ class InterfaceCodeGeneratorTest extends TestCase { @@ -71,7 +73,15 @@ public function test(): void; ); $generatedFileDefinition = $this->interfaceCodeGenerator->generate($generatedInterfaceDefinition); - Assert::assertEquals($expectedGeneratedFileDefinition, $generatedFileDefinition); + Assert::assertEquals( + $expectedGeneratedFileDefinition->getClass(), + $generatedFileDefinition->getClass() + ); + Assert::assertEquals( + $expectedGeneratedFileDefinition->getFileContents(), + // to support both versions of nikic/php-parser:"^4.19|^v5.0" + str_replace(') : void', '): void', $generatedFileDefinition->getFileContents()) + ); } public function testGenerateWithRequestHandlerInterfaceDefinitionAndRequestedType(): void @@ -111,7 +121,15 @@ public function test(TestClass_ $request): void; ); $generatedFileDefinition = $this->interfaceCodeGenerator->generate($generatedInterfaceDefinition); - Assert::assertEquals($expectedGeneratedFileDefinition, $generatedFileDefinition); + Assert::assertEquals( + $expectedGeneratedFileDefinition->getClass(), + $generatedFileDefinition->getClass() + ); + Assert::assertEquals( + $expectedGeneratedFileDefinition->getFileContents(), + // to support both versions of nikic/php-parser:"^4.19|^v5.0" + str_replace(') : void', '): void', $generatedFileDefinition->getFileContents()) + ); } public function testGenerateWithRequestHandlerInterfaceDefinitionAndResponseType(): void @@ -148,7 +166,15 @@ public function test(): TestClass_; ); $generatedFileDefinition = $this->interfaceCodeGenerator->generate($generatedInterfaceDefinition); - Assert::assertEquals($expectedGeneratedFileDefinition, $generatedFileDefinition); + Assert::assertEquals( + $expectedGeneratedFileDefinition->getClass(), + $generatedFileDefinition->getClass() + ); + Assert::assertEquals( + $expectedGeneratedFileDefinition->getFileContents(), + // to support both versions of nikic/php-parser:"^4.19|^v5.0" + str_replace(') : TestClass_', '): TestClass_', $generatedFileDefinition->getFileContents()) + ); } public function testGenerateWithRequestHandlerInterfaceDefinitionAndDescription(): void @@ -184,6 +210,14 @@ public function test(): void; ); $generatedFileDefinition = $this->interfaceCodeGenerator->generate($generatedInterfaceDefinition); - Assert::assertEquals($expectedGeneratedFileDefinition, $generatedFileDefinition); + Assert::assertEquals( + $expectedGeneratedFileDefinition->getClass(), + $generatedFileDefinition->getClass() + ); + Assert::assertEquals( + $expectedGeneratedFileDefinition->getFileContents(), + // to support both versions of nikic/php-parser:"^4.19|^v5.0" + str_replace(') : void', '): void', $generatedFileDefinition->getFileContents()) + ); } } diff --git a/test/unit/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGeneratorTest.php b/test/unit/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGeneratorTest.php index cee4328e..932f893f 100644 --- a/test/unit/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGeneratorTest.php +++ b/test/unit/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGeneratorTest.php @@ -21,6 +21,8 @@ use PhpParser\BuilderFactory; use PHPUnit\Framework\TestCase; +use function str_replace; + /** @covers \OnMoon\OpenApiServerBundle\CodeGenerator\PhpParserGenerators\ServiceSubscriberCodeGenerator */ final class ServiceSubscriberCodeGeneratorTest extends TestCase { @@ -141,6 +143,14 @@ public function getAllowedCodes(string $apiClass, string $dtoClass): array } EOD; - self::assertEquals($expectedFileContent, $result->getFileContents()); + self::assertEquals( + $expectedFileContent, + // to support both versions of nikic/php-parser:"^4.19|^v5.0" + str_replace( + [') : array', ') : ?RequestHandler'], + ['): array', '): ?RequestHandler'], + $result->getFileContents() + ) + ); } } From 90ce8070dabd74d4e88f20eb66372e5df90adea5 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 19:27:59 +0300 Subject: [PATCH 17/18] remove override attr --- psalm.xml | 1 + src/CodeGenerator/Definitions/ClassDefinition.php | 5 ----- src/CodeGenerator/Definitions/ComponentReference.php | 6 ------ src/CodeGenerator/Definitions/DtoDefinition.php | 2 -- src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php | 3 --- src/CodeGenerator/Naming/DefaultNamingStrategy.php | 7 ------- src/Command/DeleteGeneratedCodeCommand.php | 3 --- src/Command/GenerateApiCodeCommand.php | 3 --- src/DependencyInjection/CompilerPass.php | 2 -- src/DependencyInjection/Configuration.php | 2 -- src/DependencyInjection/OpenApiServerExtension.php | 2 -- src/OpenApiServerBundle.php | 2 -- src/Router/RouteLoader.php | 3 --- src/Serializer/ArrayDtoSerializer.php | 3 --- src/Specification/Definitions/ObjectReference.php | 3 --- src/Specification/Definitions/ObjectSchema.php | 3 --- src/Validator/LeaguePSR7RequestSchemaValidator.php | 2 -- 17 files changed, 1 insertion(+), 51 deletions(-) diff --git a/psalm.xml b/psalm.xml index 7b1cf170..e9a4f81c 100644 --- a/psalm.xml +++ b/psalm.xml @@ -7,6 +7,7 @@ findUnusedVariablesAndParams="true" ensureArrayStringOffsetsExist="true" findUnusedBaselineEntry="true" + ensureOverrideAttribute="false" findUnusedCode="false" phpVersion="8.1" > diff --git a/src/CodeGenerator/Definitions/ClassDefinition.php b/src/CodeGenerator/Definitions/ClassDefinition.php index 6f226b52..775fe0ec 100644 --- a/src/CodeGenerator/Definitions/ClassDefinition.php +++ b/src/CodeGenerator/Definitions/ClassDefinition.php @@ -4,8 +4,6 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; -use Override; - use function strrpos; use function substr; @@ -14,7 +12,6 @@ class ClassDefinition implements ClassReference private string $className; private string $namespace; - #[Override] final public function getClassName(): string { return $this->className; @@ -27,7 +24,6 @@ final public function setClassName(string $className): self return $this; } - #[Override] final public function getNamespace(): string { return $this->namespace; @@ -40,7 +36,6 @@ final public function setNamespace(string $namespace): self return $this; } - #[Override] final public function getFQCN(): string { return $this->namespace . '\\' . $this->className; diff --git a/src/CodeGenerator/Definitions/ComponentReference.php b/src/CodeGenerator/Definitions/ComponentReference.php index d25b4f96..01619428 100644 --- a/src/CodeGenerator/Definitions/ComponentReference.php +++ b/src/CodeGenerator/Definitions/ComponentReference.php @@ -4,33 +4,27 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; -use Override; - final class ComponentReference implements DtoReference { public function __construct(private ComponentDefinition $referencedComponent) { } - #[Override] public function getClassName(): string { return $this->referencedComponent->getDto()->getClassName(); } - #[Override] public function getNamespace(): string { return $this->referencedComponent->getDto()->getNamespace(); } - #[Override] public function getFQCN(): string { return $this->referencedComponent->getDto()->getFQCN(); } - #[Override] public function isEmpty(): bool { return $this->referencedComponent->getDto()->isEmpty(); diff --git a/src/CodeGenerator/Definitions/DtoDefinition.php b/src/CodeGenerator/Definitions/DtoDefinition.php index 7c0bcb61..9fe087a4 100644 --- a/src/CodeGenerator/Definitions/DtoDefinition.php +++ b/src/CodeGenerator/Definitions/DtoDefinition.php @@ -5,7 +5,6 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; use OnMoon\OpenApiServerBundle\Interfaces\Dto; -use Override; use function count; @@ -22,7 +21,6 @@ public function __construct(array $properties) $this->properties = $properties; } - #[Override] final public function isEmpty(): bool { return count($this->properties) === 0; diff --git a/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php b/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php index d10065a7..beb97ba9 100644 --- a/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php +++ b/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php @@ -4,8 +4,6 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Filesystem; -use Override; - use function is_dir; use function Safe\file_put_contents; use function Safe\mkdir; @@ -21,7 +19,6 @@ public function __construct(int $dirPemissions) $this->dirPemissions = $dirPemissions; } - #[Override] public function write(string $path, string $filename, string $contents): void { if (! is_dir($path)) { diff --git a/src/CodeGenerator/Naming/DefaultNamingStrategy.php b/src/CodeGenerator/Naming/DefaultNamingStrategy.php index 233b0b97..76b5b4a4 100644 --- a/src/CodeGenerator/Naming/DefaultNamingStrategy.php +++ b/src/CodeGenerator/Naming/DefaultNamingStrategy.php @@ -7,7 +7,6 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\NameGenerator; // phpcs:ignore SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse use OnMoon\OpenApiServerBundle\Interfaces\RequestHandler; -use Override; use sspat\ReservedWords\ReservedWords; use function array_map; @@ -38,13 +37,11 @@ public function __construct( $this->languageLevel = $languageLevel; } - #[Override] public function isAllowedPhpPropertyName(string $name): bool { return preg_match('/^\d/', $name) === 0 && preg_match('/^[A-Za-z0-9_]+$/', $name) === 1; } - #[Override] public function getInterfaceFQCN(string $apiNameSpace, string $operationId): string { /** @psalm-var class-string $interfaceNamespace */ @@ -59,7 +56,6 @@ public function getInterfaceFQCN(string $apiNameSpace, string $operationId): str return $interfaceNamespace; } - #[Override] public function stringToNamespace(string $text): string { $namespace = $this->padStringThatIsReservedNamespaceName( @@ -75,7 +71,6 @@ public function stringToNamespace(string $text): string return $namespace; } - #[Override] public function stringToMethodName(string $text): string { $propertyName = $this->padStringThatIsReservedMethodName( @@ -93,13 +88,11 @@ public function stringToMethodName(string $text): string return $propertyName; } - #[Override] public function buildNamespace(string ...$parts): string { return implode('\\', array_map(static fn (string $part): string => trim($part, '\\'), $parts)); } - #[Override] public function buildPath(string ...$parts): string { return implode( diff --git a/src/Command/DeleteGeneratedCodeCommand.php b/src/Command/DeleteGeneratedCodeCommand.php index 523ab683..05fac36e 100644 --- a/src/Command/DeleteGeneratedCodeCommand.php +++ b/src/Command/DeleteGeneratedCodeCommand.php @@ -5,7 +5,6 @@ namespace OnMoon\OpenApiServerBundle\Command; use FilesystemIterator; -use Override; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SplFileInfo; @@ -44,7 +43,6 @@ public function __construct(string $rootPath, ?string $name = null) */ protected static $defaultName = self::COMMAND; - #[Override] protected function configure(): void { $this @@ -56,7 +54,6 @@ protected function configure(): void ); } - #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { if (! (bool) $input->getOption('yes')) { diff --git a/src/Command/GenerateApiCodeCommand.php b/src/Command/GenerateApiCodeCommand.php index b42c3a94..d0db4f0f 100644 --- a/src/Command/GenerateApiCodeCommand.php +++ b/src/Command/GenerateApiCodeCommand.php @@ -7,7 +7,6 @@ use FilesystemIterator; use OnMoon\OpenApiServerBundle\CodeGenerator\ApiServerCodeGenerator; use OnMoon\OpenApiServerBundle\Specification\SpecificationLoader; -use Override; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SplFileInfo; @@ -47,7 +46,6 @@ public function __construct( parent::__construct($name); } - #[Override] protected function configure(): void { $this @@ -67,7 +65,6 @@ protected function configure(): void */ protected static $defaultName = self::COMMAND; - #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { $keep = (bool) $input->getOption('keep'); diff --git a/src/DependencyInjection/CompilerPass.php b/src/DependencyInjection/CompilerPass.php index 0fa329a8..a29636ac 100644 --- a/src/DependencyInjection/CompilerPass.php +++ b/src/DependencyInjection/CompilerPass.php @@ -5,7 +5,6 @@ namespace OnMoon\OpenApiServerBundle\DependencyInjection; use OnMoon\OpenApiServerBundle\Controller\ApiController; -use Override; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; @@ -21,7 +20,6 @@ public function __construct(string $tag) $this->tag = $tag; } - #[Override] public function process(ContainerBuilder $container): void { if (! $container->has(ApiController::class)) { diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 9424a6dc..148487eb 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -4,13 +4,11 @@ namespace OnMoon\OpenApiServerBundle\DependencyInjection; -use Override; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; final class Configuration implements ConfigurationInterface { - #[Override] public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder('open_api_server'); diff --git a/src/DependencyInjection/OpenApiServerExtension.php b/src/DependencyInjection/OpenApiServerExtension.php index 23a7a571..416633db 100644 --- a/src/DependencyInjection/OpenApiServerExtension.php +++ b/src/DependencyInjection/OpenApiServerExtension.php @@ -6,7 +6,6 @@ use Exception; use OnMoon\OpenApiServerBundle\Specification\SpecificationLoader; -use Override; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; @@ -20,7 +19,6 @@ final class OpenApiServerExtension extends Extension implements ExtensionInterface { /** @param mixed[] $configs */ - #[Override] public function load(array $configs, ContainerBuilder $container): void { $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); diff --git a/src/OpenApiServerBundle.php b/src/OpenApiServerBundle.php index 0cbc82ae..7a9839bf 100644 --- a/src/OpenApiServerBundle.php +++ b/src/OpenApiServerBundle.php @@ -6,7 +6,6 @@ use OnMoon\OpenApiServerBundle\DependencyInjection\CompilerPass; use OnMoon\OpenApiServerBundle\Interfaces\ApiLoader; -use Override; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -14,7 +13,6 @@ final class OpenApiServerBundle extends Bundle { public const API_LOADER_TAG = 'openapi.api_loader'; - #[Override] public function build(ContainerBuilder $container): void { $container->registerForAutoconfiguration(ApiLoader::class)->addTag(self::API_LOADER_TAG); diff --git a/src/Router/RouteLoader.php b/src/Router/RouteLoader.php index b33a9284..62293329 100644 --- a/src/Router/RouteLoader.php +++ b/src/Router/RouteLoader.php @@ -7,7 +7,6 @@ use OnMoon\OpenApiServerBundle\Controller\ApiController; use OnMoon\OpenApiServerBundle\Specification\SpecificationLoader; use OnMoon\OpenApiServerBundle\Types\ArgumentResolver; -use Override; use Stringable; use Symfony\Component\Config\Loader\Loader; use Symfony\Component\Routing\Route; @@ -30,7 +29,6 @@ public function __construct(SpecificationLoader $loader, ArgumentResolver $argum $this->argumentResolver = $argumentResolver; } - #[Override] public function load(mixed $resource, ?string $type = null): RouteCollection { $specName = (string) $resource; @@ -70,7 +68,6 @@ public function load(mixed $resource, ?string $type = null): RouteCollection } /** @inheritDoc */ - #[Override] public function supports($resource, ?string $type = null): bool { return $type === self::OPENAPI_TYPE; diff --git a/src/Serializer/ArrayDtoSerializer.php b/src/Serializer/ArrayDtoSerializer.php index d33cb5f0..51ba0d81 100644 --- a/src/Serializer/ArrayDtoSerializer.php +++ b/src/Serializer/ArrayDtoSerializer.php @@ -8,7 +8,6 @@ use OnMoon\OpenApiServerBundle\Specification\Definitions\ObjectSchema; use OnMoon\OpenApiServerBundle\Specification\Definitions\Operation; use OnMoon\OpenApiServerBundle\Types\ScalarTypesResolver; -use Override; use Symfony\Component\HttpFoundation\Request; use function array_key_exists; @@ -26,7 +25,6 @@ public function __construct(ScalarTypesResolver $resolver, bool $sendNulls) $this->sendNotRequiredNullableNulls = $sendNulls; } - #[Override] public function createRequestDto( Request $request, Operation $operation, @@ -63,7 +61,6 @@ public function createRequestDto( } /** @inheritDoc */ - #[Override] public function createResponseFromDto(Dto $responseDto, ObjectSchema $definition): array { return $this->convert(false, $responseDto->toArray(), $definition); diff --git a/src/Specification/Definitions/ObjectReference.php b/src/Specification/Definitions/ObjectReference.php index c3f6cada..8fde388e 100644 --- a/src/Specification/Definitions/ObjectReference.php +++ b/src/Specification/Definitions/ObjectReference.php @@ -4,8 +4,6 @@ namespace OnMoon\OpenApiServerBundle\Specification\Definitions; -use Override; - final class ObjectReference implements GetSchema { public function __construct(private string $schemaName, private ObjectSchema $referencedObject) @@ -22,7 +20,6 @@ public function getReferencedObject(): ObjectSchema return $this->referencedObject; } - #[Override] public function getSchema(): ObjectSchema { return $this->getReferencedObject(); diff --git a/src/Specification/Definitions/ObjectSchema.php b/src/Specification/Definitions/ObjectSchema.php index bbfba6ae..e642b4f6 100644 --- a/src/Specification/Definitions/ObjectSchema.php +++ b/src/Specification/Definitions/ObjectSchema.php @@ -4,8 +4,6 @@ namespace OnMoon\OpenApiServerBundle\Specification\Definitions; -use Override; - final class ObjectSchema implements GetSchema { /** @var Property[] $properties; */ @@ -23,7 +21,6 @@ public function getProperties(): array return $this->properties; } - #[Override] public function getSchema(): ObjectSchema { return $this; diff --git a/src/Validator/LeaguePSR7RequestSchemaValidator.php b/src/Validator/LeaguePSR7RequestSchemaValidator.php index c002046e..aaefffab 100644 --- a/src/Validator/LeaguePSR7RequestSchemaValidator.php +++ b/src/Validator/LeaguePSR7RequestSchemaValidator.php @@ -7,7 +7,6 @@ use League\OpenAPIValidation\PSR7\OperationAddress; use League\OpenAPIValidation\PSR7\ValidatorBuilder; use OnMoon\OpenApiServerBundle\Specification\Definitions\Specification; -use Override; use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory; use Symfony\Component\HttpFoundation\Request; @@ -24,7 +23,6 @@ public function __construct( $this->httpFactory = $httpFactory; } - #[Override] public function validate( Request $request, Specification $specification, From d3588a0e57c2133e9653c10be6eeb21b79397a32 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Wed, 25 Jun 2025 23:57:05 +0300 Subject: [PATCH 18/18] fix --- .../ServiceSubscriberCodeGenerator.php | 8 ++++++++ src/Router/RouteLoader.php | 9 +-------- src/Types/ArgumentResolver.php | 5 ++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php index fbcbeb7b..4119ef5b 100644 --- a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php @@ -69,7 +69,9 @@ public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinit } else { foreach ($operation->getResponses() as $response) { $responseTypes[] = new ArrayItem( + // @codeCoverageIgnoreStart new Array_([new ArrayItem(new String_($response->getStatusCode()))], ['kind' => Array_::KIND_SHORT]), + // @codeCoverageIgnoreEnd new ClassConstFetch( new Name($fileBuilder->getReference($response->getResponseBody())), 'class' @@ -79,7 +81,9 @@ public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinit } $responseCodeMapper[] = new ArrayItem( + // @codeCoverageIgnoreStart new Array_($responseTypes, ['kind' => Array_::KIND_SHORT]), + // @codeCoverageIgnoreEnd new ClassConstFetch( new Name($fileBuilder->getReference($operation->getRequestHandlerInterface())), 'class' @@ -90,7 +94,9 @@ public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinit $httpCodeMapper = $this ->factory + // @codeCoverageIgnoreStart ->classConst('HTTP_CODES', new Array_($responseCodeMapper, ['kind' => Array_::KIND_SHORT])) + // @codeCoverageIgnoreEnd ->makePrivate(); $property = $this @@ -125,6 +131,7 @@ public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinit ->setDocComment('/** * @inheritDoc */') + // @codeCoverageIgnoreStart ->addStmt( new Return_( new Array_( @@ -133,6 +140,7 @@ public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinit ) ) ); + // @codeCoverageIgnoreEnd $getRequestHandler = $this ->factory diff --git a/src/Router/RouteLoader.php b/src/Router/RouteLoader.php index 62293329..9b30a7a4 100644 --- a/src/Router/RouteLoader.php +++ b/src/Router/RouteLoader.php @@ -42,14 +42,7 @@ public function load(mixed $resource, ?string $type = null): RouteCollection $parameters = $operation->getRequestParameters(); if (array_key_exists('path', $parameters)) { - $argumentPatterns = $this->argumentResolver->resolveArgumentPatterns($parameters['path']); - foreach ($argumentPatterns as $name => $pattern) { - if ($pattern === null) { - continue; - } - - $requirements[$name] = $pattern; - } + $requirements = $this->argumentResolver->resolveArgumentPatterns($parameters['path']); } $defaults = [ diff --git a/src/Types/ArgumentResolver.php b/src/Types/ArgumentResolver.php index 61fd5eee..4974861e 100644 --- a/src/Types/ArgumentResolver.php +++ b/src/Types/ArgumentResolver.php @@ -21,7 +21,9 @@ public function __construct(ScalarTypesResolver $typesResolver) /** * @return string[] - * @psalm-return array + * @psalm-return array + * + * @psalm-suppress InvalidReturnType */ public function resolveArgumentPatterns(ObjectSchema $pathParameters): array { @@ -47,6 +49,7 @@ public function resolveArgumentPatterns(ObjectSchema $pathParameters): array } } + /** @psalm-suppress InvalidReturnStatement */ return $patterns; } }