From 2dd881cf0298add8de25338c6de889b40ca289b0 Mon Sep 17 00:00:00 2001 From: innerfly Date: Tue, 13 May 2025 11:47:31 +0300 Subject: [PATCH 01/17] update dependencies --- composer.json | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index b104815..6fecc9a 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,9 @@ "cebe/php-openapi": "1.6.99", "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", "symfony/cache": "^6.4|^7.0", "symfony/cache-contracts": "^3.5", "symfony/config": "^6.4|^7.0", @@ -47,23 +46,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, From e029d6bc551b89e38ec634a62e91c99d4c5b0d49 Mon Sep 17 00:00:00 2001 From: innerfly Date: Tue, 13 May 2025 13:14:21 +0300 Subject: [PATCH 02/17] update sspat/reserved-words in order to use last thecodingmachine/safe --- composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/composer.json b/composer.json index 6fecc9a..a75ac42 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,10 @@ { "type": "vcs", "url": "https://github.com/onmoon/php-openapi" + }, + { + "type": "vcs", + "url": "https://github.com/innerfly/reserved-words" } ], "require": { @@ -36,6 +40,7 @@ "nikic/php-parser": "^v5.4", "nyholm/psr7": "^1.5", "phpdocumentor/reflection-docblock": "^5.3", + "sspat/reserved-words": "dev-master", "symfony/cache": "^6.4|^7.0", "symfony/cache-contracts": "^3.5", "symfony/config": "^6.4|^7.0", From 71b1c600f2d360acfb3c6a5d750947280edc03df Mon Sep 17 00:00:00 2001 From: innerfly Date: Wed, 14 May 2025 12:08:00 +0300 Subject: [PATCH 03/17] update cebe/php-openapi --- composer.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/composer.json b/composer.json index a75ac42..7851233 100644 --- a/composer.json +++ b/composer.json @@ -22,10 +22,6 @@ } ], "repositories": [ - { - "type": "vcs", - "url": "https://github.com/onmoon/php-openapi" - }, { "type": "vcs", "url": "https://github.com/innerfly/reserved-words" @@ -34,7 +30,7 @@ "require": { "php": "^8.1", "ext-json": "*", - "cebe/php-openapi": "1.6.99", + "cebe/php-openapi": "^1.8", "league/openapi-psr7-validator": "^0.22.0", "lukasoppermann/http-status": "^4.0", "nikic/php-parser": "^v5.4", From 22ed43148212ea81ed42d38d23fcb26a36d51b4e Mon Sep 17 00:00:00 2001 From: innerfly Date: Wed, 14 May 2025 13:26:51 +0300 Subject: [PATCH 04/17] remove usage of Safe/sprintf, Safe/substr --- src/CodeGenerator/Definitions/ClassDefinition.php | 1 - src/CodeGenerator/Naming/CannotCreateNamespace.php | 2 -- src/CodeGenerator/Naming/CannotCreatePropertyName.php | 2 -- src/CodeGenerator/PhpParserGenerators/CodeGenerator.php | 1 - src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php | 1 - src/CodeGenerator/PhpParserGenerators/FileBuilder.php | 1 - .../PhpParserGenerators/InterfaceCodeGenerator.php | 1 - .../PhpParserGenerators/ServiceSubscriberCodeGenerator.php | 2 -- src/Command/DeleteGeneratedCodeCommand.php | 1 - src/Command/GenerateApiCodeCommand.php | 1 - src/Controller/ApiController.php | 1 - src/Exception/ApiCallFailed.php | 1 - src/Exception/CannotParseOpenApi.php | 2 -- src/Specification/SpecificationLoader.php | 1 - 14 files changed, 18 deletions(-) diff --git a/src/CodeGenerator/Definitions/ClassDefinition.php b/src/CodeGenerator/Definitions/ClassDefinition.php index ee07611..23792e0 100644 --- a/src/CodeGenerator/Definitions/ClassDefinition.php +++ b/src/CodeGenerator/Definitions/ClassDefinition.php @@ -4,7 +4,6 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; -use function Safe\substr; use function strrpos; class ClassDefinition implements ClassReference diff --git a/src/CodeGenerator/Naming/CannotCreateNamespace.php b/src/CodeGenerator/Naming/CannotCreateNamespace.php index 80da985..a5b2ecf 100644 --- a/src/CodeGenerator/Naming/CannotCreateNamespace.php +++ b/src/CodeGenerator/Naming/CannotCreateNamespace.php @@ -6,8 +6,6 @@ use OnMoon\OpenApiServerBundle\Exception\OpenApiError; -use function Safe\sprintf; - final class CannotCreateNamespace extends OpenApiError { public static function becauseTextContainsNoValidSymbols(string $text): self diff --git a/src/CodeGenerator/Naming/CannotCreatePropertyName.php b/src/CodeGenerator/Naming/CannotCreatePropertyName.php index 22b8b87..9d33a61 100644 --- a/src/CodeGenerator/Naming/CannotCreatePropertyName.php +++ b/src/CodeGenerator/Naming/CannotCreatePropertyName.php @@ -6,8 +6,6 @@ use OnMoon\OpenApiServerBundle\Exception\OpenApiError; -use function Safe\sprintf; - final class CannotCreatePropertyName extends OpenApiError { public static function becauseTextContainsNoValidSymbols(string $text): self diff --git a/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php index be417a1..991fbf1 100644 --- a/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php @@ -16,7 +16,6 @@ use function array_map; use function count; use function implode; -use function Safe\sprintf; use function trim; use const PHP_EOL; diff --git a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php index 04b4b3e..43c9a5c 100644 --- a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php @@ -34,7 +34,6 @@ use function array_map; use function count; -use function Safe\sprintf; class DtoCodeGenerator extends CodeGenerator { diff --git a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php index 6dedcad..6c1461f 100644 --- a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php +++ b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php @@ -15,7 +15,6 @@ use function in_array; use function Safe\preg_match; use function Safe\preg_replace; -use function Safe\substr; class FileBuilder { diff --git a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php index 7312472..7bdc881 100644 --- a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php @@ -11,7 +11,6 @@ use function array_map; use function count; use function implode; -use function Safe\sprintf; class InterfaceCodeGenerator extends CodeGenerator { diff --git a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php index cefe0a0..0c8961f 100644 --- a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php @@ -24,8 +24,6 @@ use PhpParser\Node\Stmt\Return_; use Psr\Container\ContainerInterface; -use function Safe\sprintf; - class ServiceSubscriberCodeGenerator extends CodeGenerator { public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinition diff --git a/src/Command/DeleteGeneratedCodeCommand.php b/src/Command/DeleteGeneratedCodeCommand.php index 6001b1b..a0f6da1 100644 --- a/src/Command/DeleteGeneratedCodeCommand.php +++ b/src/Command/DeleteGeneratedCodeCommand.php @@ -18,7 +18,6 @@ use function is_dir; use function Safe\rmdir; -use function Safe\sprintf; use function Safe\unlink; #[AsCommand(name: 'open-api:delete')] diff --git a/src/Command/GenerateApiCodeCommand.php b/src/Command/GenerateApiCodeCommand.php index 97e3e2b..444a5a0 100644 --- a/src/Command/GenerateApiCodeCommand.php +++ b/src/Command/GenerateApiCodeCommand.php @@ -21,7 +21,6 @@ use function is_dir; use function iterator_count; use function Safe\rmdir; -use function Safe\sprintf; use function Safe\unlink; #[AsCommand(name: 'open-api:generate')] diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index 25362be..79ffe44 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -39,7 +39,6 @@ use function intdiv; use function is_numeric; use function ltrim; -use function Safe\sprintf; use function strcasecmp; use const JSON_THROW_ON_ERROR; diff --git a/src/Exception/ApiCallFailed.php b/src/Exception/ApiCallFailed.php index 4898bec..baf247b 100644 --- a/src/Exception/ApiCallFailed.php +++ b/src/Exception/ApiCallFailed.php @@ -5,7 +5,6 @@ namespace OnMoon\OpenApiServerBundle\Exception; use function implode; -use function Safe\sprintf; final class ApiCallFailed extends OpenApiError { diff --git a/src/Exception/CannotParseOpenApi.php b/src/Exception/CannotParseOpenApi.php index 4e08891..4af6e82 100644 --- a/src/Exception/CannotParseOpenApi.php +++ b/src/Exception/CannotParseOpenApi.php @@ -4,8 +4,6 @@ namespace OnMoon\OpenApiServerBundle\Exception; -use function Safe\sprintf; - final class CannotParseOpenApi extends OpenApiError { /** @param array{method:string,url:string,path:string} $context */ diff --git a/src/Specification/SpecificationLoader.php b/src/Specification/SpecificationLoader.php index 5fcc345..91bd9fd 100644 --- a/src/Specification/SpecificationLoader.php +++ b/src/Specification/SpecificationLoader.php @@ -17,7 +17,6 @@ use function file_exists; use function implode; use function pathinfo; -use function Safe\sprintf; use function stream_is_local; use const PATHINFO_EXTENSION; From d03396998c5e9a7c4b3cae8b298ab9dd7c59a21f Mon Sep 17 00:00:00 2001 From: innerfly Date: Wed, 14 May 2025 13:41:39 +0300 Subject: [PATCH 05/17] fixing phpstan errors --- src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php index 43c9a5c..2117527 100644 --- a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php @@ -316,8 +316,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); } From e6ca939b790f6f8e5975626d2d500643d98dc858 Mon Sep 17 00:00:00 2001 From: innerfly Date: Mon, 19 May 2025 12:54:01 +0300 Subject: [PATCH 06/17] fixing phpstan errors --- .../PhpParserGenerators/DtoCodeGenerator.php | 2 +- src/Command/DeleteGeneratedCodeCommand.php | 1 - src/Command/GenerateApiCodeCommand.php | 1 - src/Router/RouteLoader.php | 9 +++++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php index 2117527..6432100 100644 --- a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php @@ -301,7 +301,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; } diff --git a/src/Command/DeleteGeneratedCodeCommand.php b/src/Command/DeleteGeneratedCodeCommand.php index a0f6da1..f33f50b 100644 --- a/src/Command/DeleteGeneratedCodeCommand.php +++ b/src/Command/DeleteGeneratedCodeCommand.php @@ -82,7 +82,6 @@ private function recursiveDelete(string $directoryPath): void return; } - /** @var SplFileInfo[] $iterator */ $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $directoryPath, diff --git a/src/Command/GenerateApiCodeCommand.php b/src/Command/GenerateApiCodeCommand.php index 444a5a0..50f846e 100644 --- a/src/Command/GenerateApiCodeCommand.php +++ b/src/Command/GenerateApiCodeCommand.php @@ -88,7 +88,6 @@ private function removeExtraFiles(string $root, array $generatedFiles): void return; } - /** @var SplFileInfo[] $iterator */ $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $root, diff --git a/src/Router/RouteLoader.php b/src/Router/RouteLoader.php index 2eb6df2..0aa4f59 100644 --- a/src/Router/RouteLoader.php +++ b/src/Router/RouteLoader.php @@ -41,8 +41,13 @@ 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 (is_null($pattern)) { + continue; + } + $requirements[$name] = $pattern; + } } $defaults = [ From 9c816df14a96ce0e3e6cf40c75bcb461da756ed0 Mon Sep 17 00:00:00 2001 From: innerfly Date: Mon, 19 May 2025 13:55:00 +0300 Subject: [PATCH 07/17] fixing psalm errors --- src/CodeGenerator/ApiServerCodeGenerator.php | 2 +- src/CodeGenerator/AttributeGenerator.php | 2 +- src/CodeGenerator/Definitions/ClassDefinition.php | 3 +++ src/CodeGenerator/Definitions/ComponentDefinition.php | 2 +- src/CodeGenerator/Definitions/ComponentReference.php | 6 +++++- src/CodeGenerator/Definitions/DtoDefinition.php | 3 ++- src/CodeGenerator/FileGenerator.php | 2 +- src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php | 1 + src/CodeGenerator/GraphGenerator.php | 2 +- src/CodeGenerator/NameGenerator.php | 2 +- src/CodeGenerator/Naming/DefaultNamingStrategy.php | 6 ++++++ src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php | 2 +- src/CodeGenerator/PhpParserGenerators/FileBuilder.php | 2 +- .../PhpParserGenerators/InterfaceCodeGenerator.php | 2 +- .../PhpParserGenerators/ServiceSubscriberCodeGenerator.php | 2 +- src/Command/DeleteGeneratedCodeCommand.php | 3 +++ src/Command/GenerateApiCodeCommand.php | 3 +++ src/DependencyInjection/CompilerPass.php | 1 + src/DependencyInjection/Configuration.php | 1 + src/DependencyInjection/OpenApiServerExtension.php | 1 + src/OpenApiServerBundle.php | 1 + src/Router/RouteLoader.php | 4 +++- src/Serializer/ArrayDtoSerializer.php | 2 ++ src/Specification/Definitions/ComponentArray.php | 2 +- src/Specification/Definitions/ObjectReference.php | 3 ++- src/Specification/Definitions/ObjectSchema.php | 1 + src/Specification/SpecificationLoader.php | 2 +- src/Specification/SpecificationParser.php | 2 +- src/Types/ArgumentResolver.php | 2 +- src/Types/TypeSerializer.php | 2 +- src/Validator/LeaguePSR7RequestSchemaValidator.php | 1 + 31 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/CodeGenerator/ApiServerCodeGenerator.php b/src/CodeGenerator/ApiServerCodeGenerator.php index 74c1385..df2f099 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 68216d3..e05cf79 100644 --- a/src/CodeGenerator/AttributeGenerator.php +++ b/src/CodeGenerator/AttributeGenerator.php @@ -10,7 +10,7 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Definitions\PropertyDefinition; use OnMoon\OpenApiServerBundle\Specification\Definitions\Property; -class AttributeGenerator +final class AttributeGenerator { public function setAllAttributes(GraphDefinition $graph): void { diff --git a/src/CodeGenerator/Definitions/ClassDefinition.php b/src/CodeGenerator/Definitions/ClassDefinition.php index 23792e0..dc0237c 100644 --- a/src/CodeGenerator/Definitions/ClassDefinition.php +++ b/src/CodeGenerator/Definitions/ClassDefinition.php @@ -11,6 +11,7 @@ class ClassDefinition implements ClassReference private string $className; private string $namespace; + #[\Override] final public function getClassName(): string { return $this->className; @@ -23,6 +24,7 @@ final public function setClassName(string $className): self return $this; } + #[\Override] final public function getNamespace(): string { return $this->namespace; @@ -35,6 +37,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 ab8956c..c71be5d 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 d488201..45b1af9 100644 --- a/src/CodeGenerator/Definitions/ComponentReference.php +++ b/src/CodeGenerator/Definitions/ComponentReference.php @@ -4,27 +4,31 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; -class ComponentReference implements DtoReference +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 0c36486..778ef28 100644 --- a/src/CodeGenerator/Definitions/DtoDefinition.php +++ b/src/CodeGenerator/Definitions/DtoDefinition.php @@ -8,7 +8,7 @@ use function count; -class DtoDefinition extends GeneratedClassDefinition implements DtoReference +final class DtoDefinition extends GeneratedClassDefinition implements DtoReference { /** @var PropertyDefinition[] $properties; */ private array $properties; @@ -21,6 +21,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 7f3e966..ced159c 100644 --- a/src/CodeGenerator/FileGenerator.php +++ b/src/CodeGenerator/FileGenerator.php @@ -14,7 +14,7 @@ use function array_push; -class FileGenerator +final class FileGenerator { private DtoCodeGenerator $dtoGenerator; private InterfaceCodeGenerator $interfaceGenerator; diff --git a/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php b/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php index beb97ba..b434e0f 100644 --- a/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php +++ b/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php @@ -19,6 +19,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 2eee373..a913db2 100644 --- a/src/CodeGenerator/GraphGenerator.php +++ b/src/CodeGenerator/GraphGenerator.php @@ -25,7 +25,7 @@ use function array_map; use function count; -class GraphGenerator +final class GraphGenerator { private SpecificationLoader $loader; diff --git a/src/CodeGenerator/NameGenerator.php b/src/CodeGenerator/NameGenerator.php index 2ecade1..7209d18 100644 --- a/src/CodeGenerator/NameGenerator.php +++ b/src/CodeGenerator/NameGenerator.php @@ -13,7 +13,7 @@ use function ucfirst; -class NameGenerator +final class NameGenerator { private const DTO_NAMESPACE = 'Dto'; private const REQUEST_SUFFIX = 'Request'; diff --git a/src/CodeGenerator/Naming/DefaultNamingStrategy.php b/src/CodeGenerator/Naming/DefaultNamingStrategy.php index 76b5b4a..a4f8e1e 100644 --- a/src/CodeGenerator/Naming/DefaultNamingStrategy.php +++ b/src/CodeGenerator/Naming/DefaultNamingStrategy.php @@ -37,11 +37,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 +58,7 @@ public function getInterfaceFQCN(string $apiNameSpace, string $operationId): str return $interfaceNamespace; } + #[\Override] public function stringToNamespace(string $text): string { $namespace = $this->padStringThatIsReservedNamespaceName( @@ -71,6 +74,7 @@ public function stringToNamespace(string $text): string return $namespace; } + #[\Override] public function stringToMethodName(string $text): string { $propertyName = $this->padStringThatIsReservedMethodName( @@ -88,11 +92,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/DtoCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php index 6432100..a3ce040 100644 --- a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php @@ -35,7 +35,7 @@ use function array_map; use function count; -class DtoCodeGenerator extends CodeGenerator +final class DtoCodeGenerator extends CodeGenerator { public function generate(DtoDefinition $definition): GeneratedFileDefinition { diff --git a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php index 6c1461f..a2e2040 100644 --- a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php +++ b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php @@ -16,7 +16,7 @@ use function Safe\preg_match; use function Safe\preg_replace; -class FileBuilder +final class FileBuilder { private ClassDefinition $definition; private Namespace_ $namespace; diff --git a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php index 7bdc881..10217fb 100644 --- a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php @@ -12,7 +12,7 @@ use function count; use function implode; -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 0c8961f..e3f6b74 100644 --- a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php @@ -24,7 +24,7 @@ use PhpParser\Node\Stmt\Return_; use Psr\Container\ContainerInterface; -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 f33f50b..c68fc11 100644 --- a/src/Command/DeleteGeneratedCodeCommand.php +++ b/src/Command/DeleteGeneratedCodeCommand.php @@ -41,6 +41,7 @@ public function __construct(string $rootPath, ?string $name = null) */ protected static $defaultName = self::COMMAND; + #[\Override] protected function configure(): void { $this @@ -52,6 +53,7 @@ protected function configure(): void ); } + #[\Override] protected function execute(InputInterface $input, OutputInterface $output): int { if (! (bool) $input->getOption('yes')) { @@ -82,6 +84,7 @@ private function recursiveDelete(string $directoryPath): void return; } + /** @var SplFileInfo[] $iterator */ $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $directoryPath, diff --git a/src/Command/GenerateApiCodeCommand.php b/src/Command/GenerateApiCodeCommand.php index 50f846e..3bb5328 100644 --- a/src/Command/GenerateApiCodeCommand.php +++ b/src/Command/GenerateApiCodeCommand.php @@ -45,6 +45,7 @@ public function __construct( parent::__construct($name); } + #[\Override] protected function configure(): void { $this @@ -64,6 +65,7 @@ protected function configure(): void */ protected static $defaultName = self::COMMAND; + #[\Override] protected function execute(InputInterface $input, OutputInterface $output): int { $keep = (bool) $input->getOption('keep'); @@ -96,6 +98,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/DependencyInjection/CompilerPass.php b/src/DependencyInjection/CompilerPass.php index a29636a..595e575 100644 --- a/src/DependencyInjection/CompilerPass.php +++ b/src/DependencyInjection/CompilerPass.php @@ -20,6 +20,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 148487e..a765770 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -9,6 +9,7 @@ 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 416633d..0467ef4 100644 --- a/src/DependencyInjection/OpenApiServerExtension.php +++ b/src/DependencyInjection/OpenApiServerExtension.php @@ -19,6 +19,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/OpenApiServerBundle.php b/src/OpenApiServerBundle.php index 7a9839b..599bc0a 100644 --- a/src/OpenApiServerBundle.php +++ b/src/OpenApiServerBundle.php @@ -13,6 +13,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 0aa4f59..6b752c3 100644 --- a/src/Router/RouteLoader.php +++ b/src/Router/RouteLoader.php @@ -14,7 +14,7 @@ use function array_key_exists; -class RouteLoader extends Loader +final class RouteLoader extends Loader { private SpecificationLoader $loader; private ArgumentResolver $argumentResolver; @@ -28,6 +28,7 @@ public function __construct(SpecificationLoader $loader, ArgumentResolver $argum $this->argumentResolver = $argumentResolver; } + #[\Override] public function load(mixed $resource, ?string $type = null): RouteCollection { $specName = (string) $resource; @@ -66,6 +67,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 474dcb7..ecae4ac 100644 --- a/src/Serializer/ArrayDtoSerializer.php +++ b/src/Serializer/ArrayDtoSerializer.php @@ -27,6 +27,7 @@ public function __construct(ScalarTypesResolver $resolver, bool $sendNulls) $this->sendNotRequiredNullableNulls = $sendNulls; } + #[\Override] public function createRequestDto( Request $request, Operation $operation, @@ -67,6 +68,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 242c88c..d7b1385 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 630ad7e..7d9d434 100644 --- a/src/Specification/Definitions/ObjectReference.php +++ b/src/Specification/Definitions/ObjectReference.php @@ -4,7 +4,7 @@ namespace OnMoon\OpenApiServerBundle\Specification\Definitions; -class ObjectReference implements GetSchema +final class ObjectReference implements GetSchema { public function __construct(private string $schemaName, private ObjectSchema $referencedObject) { @@ -20,6 +20,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 e642b4f..370ed3e 100644 --- a/src/Specification/Definitions/ObjectSchema.php +++ b/src/Specification/Definitions/ObjectSchema.php @@ -21,6 +21,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 91bd9fd..399bc5f 100644 --- a/src/Specification/SpecificationLoader.php +++ b/src/Specification/SpecificationLoader.php @@ -21,7 +21,7 @@ use const PATHINFO_EXTENSION; -class SpecificationLoader +final class SpecificationLoader { public const CACHE_TAG = 'openapi.server.bundle.specifications'; private const CACHE_KEY_PREFIX = 'openapi-server-bundle-specification-'; diff --git a/src/Specification/SpecificationParser.php b/src/Specification/SpecificationParser.php index fea367a..c8f0919 100644 --- a/src/Specification/SpecificationParser.php +++ b/src/Specification/SpecificationParser.php @@ -42,7 +42,7 @@ use function strcasecmp; use function substr; -class SpecificationParser +final class SpecificationParser { private ScalarTypesResolver $typeResolver; /** @var string[] */ diff --git a/src/Types/ArgumentResolver.php b/src/Types/ArgumentResolver.php index 947309e..38385c5 100644 --- a/src/Types/ArgumentResolver.php +++ b/src/Types/ArgumentResolver.php @@ -9,7 +9,7 @@ use function Safe\preg_match; -class ArgumentResolver +final class ArgumentResolver { private ScalarTypesResolver $typesResolver; diff --git a/src/Types/TypeSerializer.php b/src/Types/TypeSerializer.php index a78f702..6f94a68 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 aaefffa..863345c 100644 --- a/src/Validator/LeaguePSR7RequestSchemaValidator.php +++ b/src/Validator/LeaguePSR7RequestSchemaValidator.php @@ -23,6 +23,7 @@ public function __construct( $this->httpFactory = $httpFactory; } + #[\Override] public function validate( Request $request, Specification $specification, From 8524486576ff1e0688b984f37d623fc961bf3c21 Mon Sep 17 00:00:00 2001 From: innerfly Date: Mon, 19 May 2025 17:30:09 +0300 Subject: [PATCH 08/17] tests --- src/CodeGenerator/AttributeGenerator.php | 3 ++- src/CodeGenerator/FileGenerator.php | 3 ++- src/CodeGenerator/GraphGenerator.php | 3 ++- src/CodeGenerator/NameGenerator.php | 3 ++- src/CodeGenerator/PhpParserGenerators/FileBuilder.php | 3 ++- src/Router/RouteLoader.php | 3 ++- src/Specification/SpecificationLoader.php | 3 ++- src/Specification/SpecificationParser.php | 3 ++- src/Types/ArgumentResolver.php | 3 ++- .../functional/Command/DeleteGeneratedCodeCommandTest.php | 1 - test/functional/Command/GenerateApiCodeCommandTest.php | 1 - test/functional/DependencyInjection/ConfigurationTest.php | 1 - test/functional/Specification/SpecificationLoaderTest.php | 1 - test/generation/GeneratedClassAsserter.php | 4 ++-- test/generation/GenerationTestCase.php | 3 ++- .../CodeGenerator/Naming/CannotCreateNamespaceTest.php | 2 -- .../CodeGenerator/Naming/CannotCreatePropertyNameTest.php | 2 -- .../CodeGenerator/PhpParserGenerators/FileBuilderTest.php | 6 ++---- .../PhpParserGenerators/InterfaceCodeGeneratorTest.php | 8 ++++---- .../ServiceSubscriberCodeGeneratorTest.php | 6 +++--- test/unit/Exception/ApiCallFailedTest.php | 2 -- test/unit/Exception/CannotParseOpenApiTest.php | 2 -- 22 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/CodeGenerator/AttributeGenerator.php b/src/CodeGenerator/AttributeGenerator.php index e05cf79..f31502d 100644 --- a/src/CodeGenerator/AttributeGenerator.php +++ b/src/CodeGenerator/AttributeGenerator.php @@ -10,7 +10,8 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Definitions\PropertyDefinition; use OnMoon\OpenApiServerBundle\Specification\Definitions\Property; -final class AttributeGenerator +/** @psalm-suppress ClassMustBeFinal */ +class AttributeGenerator { public function setAllAttributes(GraphDefinition $graph): void { diff --git a/src/CodeGenerator/FileGenerator.php b/src/CodeGenerator/FileGenerator.php index ced159c..c184828 100644 --- a/src/CodeGenerator/FileGenerator.php +++ b/src/CodeGenerator/FileGenerator.php @@ -14,7 +14,8 @@ use function array_push; -final class FileGenerator +/** @psalm-suppress ClassMustBeFinal */ +class FileGenerator { private DtoCodeGenerator $dtoGenerator; private InterfaceCodeGenerator $interfaceGenerator; diff --git a/src/CodeGenerator/GraphGenerator.php b/src/CodeGenerator/GraphGenerator.php index a913db2..4aa6af1 100644 --- a/src/CodeGenerator/GraphGenerator.php +++ b/src/CodeGenerator/GraphGenerator.php @@ -25,7 +25,8 @@ use function array_map; use function count; -final class GraphGenerator +/** @psalm-suppress ClassMustBeFinal */ +class GraphGenerator { private SpecificationLoader $loader; diff --git a/src/CodeGenerator/NameGenerator.php b/src/CodeGenerator/NameGenerator.php index 7209d18..658a3f9 100644 --- a/src/CodeGenerator/NameGenerator.php +++ b/src/CodeGenerator/NameGenerator.php @@ -13,7 +13,8 @@ use function ucfirst; -final class NameGenerator +/** @psalm-suppress ClassMustBeFinal */ +class NameGenerator { private const DTO_NAMESPACE = 'Dto'; private const REQUEST_SUFFIX = 'Request'; diff --git a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php index a2e2040..c18003d 100644 --- a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php +++ b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php @@ -16,7 +16,8 @@ use function Safe\preg_match; use function Safe\preg_replace; -final class FileBuilder +/** @psalm-suppress ClassMustBeFinal */ +class FileBuilder { private ClassDefinition $definition; private Namespace_ $namespace; diff --git a/src/Router/RouteLoader.php b/src/Router/RouteLoader.php index 6b752c3..63eb1bf 100644 --- a/src/Router/RouteLoader.php +++ b/src/Router/RouteLoader.php @@ -14,7 +14,8 @@ use function array_key_exists; -final class RouteLoader extends Loader +/** @psalm-suppress ClassMustBeFinal */ +class RouteLoader extends Loader { private SpecificationLoader $loader; private ArgumentResolver $argumentResolver; diff --git a/src/Specification/SpecificationLoader.php b/src/Specification/SpecificationLoader.php index 399bc5f..1967838 100644 --- a/src/Specification/SpecificationLoader.php +++ b/src/Specification/SpecificationLoader.php @@ -21,7 +21,8 @@ use const PATHINFO_EXTENSION; -final class SpecificationLoader +/** @psalm-suppress ClassMustBeFinal */ +class SpecificationLoader { public const CACHE_TAG = 'openapi.server.bundle.specifications'; private const CACHE_KEY_PREFIX = 'openapi-server-bundle-specification-'; diff --git a/src/Specification/SpecificationParser.php b/src/Specification/SpecificationParser.php index c8f0919..329cdab 100644 --- a/src/Specification/SpecificationParser.php +++ b/src/Specification/SpecificationParser.php @@ -42,7 +42,8 @@ use function strcasecmp; use function substr; -final class SpecificationParser +/** @psalm-suppress ClassMustBeFinal */ +class SpecificationParser { private ScalarTypesResolver $typeResolver; /** @var string[] */ diff --git a/src/Types/ArgumentResolver.php b/src/Types/ArgumentResolver.php index 38385c5..61fd5ee 100644 --- a/src/Types/ArgumentResolver.php +++ b/src/Types/ArgumentResolver.php @@ -9,7 +9,8 @@ use function Safe\preg_match; -final class ArgumentResolver +/** @psalm-suppress ClassMustBeFinal */ +class ArgumentResolver { private ScalarTypesResolver $typesResolver; diff --git a/test/functional/Command/DeleteGeneratedCodeCommandTest.php b/test/functional/Command/DeleteGeneratedCodeCommandTest.php index 3f30b67..4c05830 100644 --- a/test/functional/Command/DeleteGeneratedCodeCommandTest.php +++ b/test/functional/Command/DeleteGeneratedCodeCommandTest.php @@ -12,7 +12,6 @@ use function rtrim; use function Safe\file_put_contents; use function Safe\mkdir; -use function Safe\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 081ab9d..898c4a7 100644 --- a/test/functional/Command/GenerateApiCodeCommandTest.php +++ b/test/functional/Command/GenerateApiCodeCommandTest.php @@ -10,7 +10,6 @@ use Symfony\Component\Console\Tester\CommandTester; use function rtrim; -use function Safe\sprintf; use function ucfirst; use const DIRECTORY_SEPARATOR; diff --git a/test/functional/DependencyInjection/ConfigurationTest.php b/test/functional/DependencyInjection/ConfigurationTest.php index b861252..ceea77b 100644 --- a/test/functional/DependencyInjection/ConfigurationTest.php +++ b/test/functional/DependencyInjection/ConfigurationTest.php @@ -9,7 +9,6 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\HttpKernel\Kernel; -use function Safe\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 e6289e9..17e2c59 100644 --- a/test/functional/Specification/SpecificationLoaderTest.php +++ b/test/functional/Specification/SpecificationLoaderTest.php @@ -22,7 +22,6 @@ use Symfony\Contracts\Cache\TagAwareCacheInterface; use function array_pop; -use function Safe\sprintf; /** @covers \OnMoon\OpenApiServerBundle\Specification\SpecificationLoader */ class SpecificationLoaderTest extends TestCase diff --git a/test/generation/GeneratedClassAsserter.php b/test/generation/GeneratedClassAsserter.php index 174a558..dc809af 100644 --- a/test/generation/GeneratedClassAsserter.php +++ b/test/generation/GeneratedClassAsserter.php @@ -22,12 +22,12 @@ 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 strpos; final class GeneratedClassAsserter @@ -39,7 +39,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 3b5c79d..69cbf28 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 3993cf1..8c1a932 100644 --- a/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php +++ b/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php @@ -7,8 +7,6 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreateNamespace; use PHPUnit\Framework\TestCase; -use function Safe\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 45b0ee5..371ff54 100644 --- a/test/unit/CodeGenerator/Naming/CannotCreatePropertyNameTest.php +++ b/test/unit/CodeGenerator/Naming/CannotCreatePropertyNameTest.php @@ -7,8 +7,6 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreatePropertyName; use PHPUnit\Framework\TestCase; -use function Safe\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 dd67499..0798d40 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 6523fdd..6ac4394 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 7f418ec..cee4328 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 761fcd3..810a83f 100644 --- a/test/unit/Exception/ApiCallFailedTest.php +++ b/test/unit/Exception/ApiCallFailedTest.php @@ -7,8 +7,6 @@ use OnMoon\OpenApiServerBundle\Exception\ApiCallFailed; use PHPUnit\Framework\TestCase; -use function Safe\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 8ffa902..713d0c7 100644 --- a/test/unit/Exception/CannotParseOpenApiTest.php +++ b/test/unit/Exception/CannotParseOpenApiTest.php @@ -7,8 +7,6 @@ use OnMoon\OpenApiServerBundle\Exception\CannotParseOpenApi; use PHPUnit\Framework\TestCase; -use function Safe\sprintf; - /** @covers \OnMoon\OpenApiServerBundle\Exception\CannotParseOpenApi */ final class CannotParseOpenApiTest extends TestCase { From 38719825627a26bffce8541b69e50d17e83aa617 Mon Sep 17 00:00:00 2001 From: innerfly Date: Mon, 19 May 2025 18:24:02 +0300 Subject: [PATCH 09/17] tests --- test/functional/openapi_specification.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/functional/openapi_specification.yaml b/test/functional/openapi_specification.yaml index 680a4b3..d1697be 100644 --- a/test/functional/openapi_specification.yaml +++ b/test/functional/openapi_specification.yaml @@ -6,6 +6,8 @@ paths: '/goods/{goodId}': get: operationId: "getGood" + security: + - bearerAuth: [] parameters: - $ref: '#/components/parameters/GoodIdParam' responses: @@ -16,6 +18,11 @@ paths: schema: $ref: '#/components/schemas/GoodResponseSchema' components: + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT schemas: GoodResponseSchema: title: Good Response From f8e9aa794111688e746e40bb837f7f25d20db38e Mon Sep 17 00:00:00 2001 From: innerfly Date: Tue, 20 May 2025 12:28:30 +0300 Subject: [PATCH 10/17] tests --- test/functional/openapi_specification.yaml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/test/functional/openapi_specification.yaml b/test/functional/openapi_specification.yaml index d1697be..4aedfe0 100644 --- a/test/functional/openapi_specification.yaml +++ b/test/functional/openapi_specification.yaml @@ -3,11 +3,9 @@ info: title: 'Test Goods API' version: '1.0' paths: - '/goods/{goodId}': + /goods/{goodId}: get: operationId: "getGood" - security: - - bearerAuth: [] parameters: - $ref: '#/components/parameters/GoodIdParam' responses: @@ -18,11 +16,6 @@ paths: schema: $ref: '#/components/schemas/GoodResponseSchema' components: - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT schemas: GoodResponseSchema: title: Good Response From ca5992ad032e5a115eb676d3abf56f9f61a41b01 Mon Sep 17 00:00:00 2001 From: innerfly Date: Tue, 20 May 2025 17:34:54 +0300 Subject: [PATCH 11/17] downgrade cebe/php-openapi --- composer.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 7851233..0d9d59c 100644 --- a/composer.json +++ b/composer.json @@ -25,12 +25,16 @@ { "type": "vcs", "url": "https://github.com/innerfly/reserved-words" + }, + { + "type": "vcs", + "url": "https://github.com/onmoon/php-openapi" } ], "require": { "php": "^8.1", "ext-json": "*", - "cebe/php-openapi": "^1.8", + "cebe/php-openapi": "1.6.99", "league/openapi-psr7-validator": "^0.22.0", "lukasoppermann/http-status": "^4.0", "nikic/php-parser": "^v5.4", From d0053a0eba34ef0e2a82323c79a308aa41476aa1 Mon Sep 17 00:00:00 2001 From: innerfly Date: Wed, 21 May 2025 16:24:13 +0300 Subject: [PATCH 12/17] Revert "downgrade cebe/php-openapi" This reverts commit ca5992ad032e5a115eb676d3abf56f9f61a41b01. --- composer.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 0d9d59c..7851233 100644 --- a/composer.json +++ b/composer.json @@ -25,16 +25,12 @@ { "type": "vcs", "url": "https://github.com/innerfly/reserved-words" - }, - { - "type": "vcs", - "url": "https://github.com/onmoon/php-openapi" } ], "require": { "php": "^8.1", "ext-json": "*", - "cebe/php-openapi": "1.6.99", + "cebe/php-openapi": "^1.8", "league/openapi-psr7-validator": "^0.22.0", "lukasoppermann/http-status": "^4.0", "nikic/php-parser": "^v5.4", From 61dcfd114d13e0dc4afda7213dc8e095f2339492 Mon Sep 17 00:00:00 2001 From: innerfly Date: Mon, 26 May 2025 17:16:03 +0300 Subject: [PATCH 13/17] Add PHP 8.3 and 8.4 support and update dependencies --- .github/workflows/ci.yml | 14 ++++++++------ composer.json | 8 +------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e328ee7..90ad77a 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 7851233..1bc41ff 100644 --- a/composer.json +++ b/composer.json @@ -21,12 +21,6 @@ "email": "dk@csgo.com" } ], - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/innerfly/reserved-words" - } - ], "require": { "php": "^8.1", "ext-json": "*", @@ -36,7 +30,7 @@ "nikic/php-parser": "^v5.4", "nyholm/psr7": "^1.5", "phpdocumentor/reflection-docblock": "^5.3", - "sspat/reserved-words": "dev-master", + "sspat/reserved-words": "^3.0", "symfony/cache": "^6.4|^7.0", "symfony/cache-contracts": "^3.5", "symfony/config": "^6.4|^7.0", From a1772c9c5df14e466e1e414c8b96f9d28137c487 Mon Sep 17 00:00:00 2001 From: innerfly Date: Tue, 27 May 2025 12:14:26 +0300 Subject: [PATCH 14/17] add security scheme --- test/functional/openapi_specification.yaml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/functional/openapi_specification.yaml b/test/functional/openapi_specification.yaml index 4aedfe0..e8b8dd9 100644 --- a/test/functional/openapi_specification.yaml +++ b/test/functional/openapi_specification.yaml @@ -6,6 +6,8 @@ paths: /goods/{goodId}: get: operationId: "getGood" + security: + - ApiKeyAuth: [] parameters: - $ref: '#/components/parameters/GoodIdParam' responses: @@ -16,6 +18,11 @@ paths: schema: $ref: '#/components/schemas/GoodResponseSchema' components: + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: X-API-Key schemas: GoodResponseSchema: title: Good Response @@ -33,4 +40,4 @@ components: schema: type: string description: Good ID - example: 136 + example: 136 \ No newline at end of file From 6445ac49d84a268cd7a82c2cc9250f72578494a3 Mon Sep 17 00:00:00 2001 From: innerfly Date: Tue, 27 May 2025 13:55:53 +0300 Subject: [PATCH 15/17] Revert "add security scheme" This reverts commit a1772c9c5df14e466e1e414c8b96f9d28137c487. --- test/functional/openapi_specification.yaml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/test/functional/openapi_specification.yaml b/test/functional/openapi_specification.yaml index e8b8dd9..4aedfe0 100644 --- a/test/functional/openapi_specification.yaml +++ b/test/functional/openapi_specification.yaml @@ -6,8 +6,6 @@ paths: /goods/{goodId}: get: operationId: "getGood" - security: - - ApiKeyAuth: [] parameters: - $ref: '#/components/parameters/GoodIdParam' responses: @@ -18,11 +16,6 @@ paths: schema: $ref: '#/components/schemas/GoodResponseSchema' components: - securitySchemes: - ApiKeyAuth: - type: apiKey - in: header - name: X-API-Key schemas: GoodResponseSchema: title: Good Response @@ -40,4 +33,4 @@ components: schema: type: string description: Good ID - example: 136 \ No newline at end of file + example: 136 From f3eca15744788b156b811c52430b09f1deac0b38 Mon Sep 17 00:00:00 2001 From: innerfly Date: Tue, 27 May 2025 16:31:20 +0300 Subject: [PATCH 16/17] update devizzent/cebe-php-openapi --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1bc41ff..edc81f4 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", From 9c441599d75a1a97ab87f4f9b6c9d153d2f30a82 Mon Sep 17 00:00:00 2001 From: innerfly Date: Wed, 28 May 2025 10:58:45 +0300 Subject: [PATCH 17/17] csfix --- src/CodeGenerator/Definitions/ClassDefinition.php | 9 ++++++--- .../Definitions/ComponentReference.php | 10 ++++++---- src/CodeGenerator/Definitions/DtoDefinition.php | 3 ++- .../Filesystem/FilePutContentsFileWriter.php | 4 +++- src/CodeGenerator/Naming/CannotCreateNamespace.php | 2 ++ .../Naming/CannotCreatePropertyName.php | 2 ++ src/CodeGenerator/Naming/DefaultNamingStrategy.php | 13 +++++++------ .../PhpParserGenerators/CodeGenerator.php | 1 + .../PhpParserGenerators/DtoCodeGenerator.php | 1 + .../PhpParserGenerators/FileBuilder.php | 1 + .../PhpParserGenerators/InterfaceCodeGenerator.php | 1 + .../ServiceSubscriberCodeGenerator.php | 2 ++ src/Command/DeleteGeneratedCodeCommand.php | 6 ++++-- src/Command/GenerateApiCodeCommand.php | 6 ++++-- src/Controller/ApiController.php | 1 + src/DependencyInjection/CompilerPass.php | 3 ++- src/DependencyInjection/Configuration.php | 3 ++- src/DependencyInjection/OpenApiServerExtension.php | 3 ++- src/Exception/ApiCallFailed.php | 1 + src/Exception/CannotParseOpenApi.php | 2 ++ src/OpenApiServerBundle.php | 3 ++- src/Router/RouteLoader.php | 8 +++++--- src/Serializer/ArrayDtoSerializer.php | 5 +++-- src/Specification/Definitions/ObjectReference.php | 4 +++- src/Specification/Definitions/ObjectSchema.php | 4 +++- src/Specification/SpecificationLoader.php | 1 + src/Validator/LeaguePSR7RequestSchemaValidator.php | 3 ++- .../Command/DeleteGeneratedCodeCommandTest.php | 1 + .../Command/GenerateApiCodeCommandTest.php | 1 + .../DependencyInjection/ConfigurationTest.php | 1 + .../Specification/SpecificationLoaderTest.php | 1 + test/generation/GeneratedClassAsserter.php | 1 + .../Naming/CannotCreateNamespaceTest.php | 2 ++ .../Naming/CannotCreatePropertyNameTest.php | 2 ++ test/unit/Exception/ApiCallFailedTest.php | 2 ++ test/unit/Exception/CannotParseOpenApiTest.php | 2 ++ 36 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/CodeGenerator/Definitions/ClassDefinition.php b/src/CodeGenerator/Definitions/ClassDefinition.php index dc0237c..6f226b5 100644 --- a/src/CodeGenerator/Definitions/ClassDefinition.php +++ b/src/CodeGenerator/Definitions/ClassDefinition.php @@ -4,14 +4,17 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; +use Override; + use function strrpos; +use function substr; class ClassDefinition implements ClassReference { private string $className; private string $namespace; - #[\Override] + #[Override] final public function getClassName(): string { return $this->className; @@ -24,7 +27,7 @@ final public function setClassName(string $className): self return $this; } - #[\Override] + #[Override] final public function getNamespace(): string { return $this->namespace; @@ -37,7 +40,7 @@ final public function setNamespace(string $namespace): self return $this; } - #[\Override] + #[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 45b1af9..d25b4f9 100644 --- a/src/CodeGenerator/Definitions/ComponentReference.php +++ b/src/CodeGenerator/Definitions/ComponentReference.php @@ -4,31 +4,33 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; +use Override; + final class ComponentReference implements DtoReference { public function __construct(private ComponentDefinition $referencedComponent) { } - #[\Override] + #[Override] public function getClassName(): string { return $this->referencedComponent->getDto()->getClassName(); } - #[\Override] + #[Override] public function getNamespace(): string { return $this->referencedComponent->getDto()->getNamespace(); } - #[\Override] + #[Override] public function getFQCN(): string { return $this->referencedComponent->getDto()->getFQCN(); } - #[\Override] + #[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 778ef28..7c0bcb6 100644 --- a/src/CodeGenerator/Definitions/DtoDefinition.php +++ b/src/CodeGenerator/Definitions/DtoDefinition.php @@ -5,6 +5,7 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Definitions; use OnMoon\OpenApiServerBundle\Interfaces\Dto; +use Override; use function count; @@ -21,7 +22,7 @@ public function __construct(array $properties) $this->properties = $properties; } - #[\Override] + #[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 b434e0f..d10065a 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,7 +21,7 @@ public function __construct(int $dirPemissions) $this->dirPemissions = $dirPemissions; } - #[\Override] + #[Override] public function write(string $path, string $filename, string $contents): void { if (! is_dir($path)) { diff --git a/src/CodeGenerator/Naming/CannotCreateNamespace.php b/src/CodeGenerator/Naming/CannotCreateNamespace.php index a5b2ecf..9394401 100644 --- a/src/CodeGenerator/Naming/CannotCreateNamespace.php +++ b/src/CodeGenerator/Naming/CannotCreateNamespace.php @@ -6,6 +6,8 @@ use OnMoon\OpenApiServerBundle\Exception\OpenApiError; +use function sprintf; + final class CannotCreateNamespace extends OpenApiError { public static function becauseTextContainsNoValidSymbols(string $text): self diff --git a/src/CodeGenerator/Naming/CannotCreatePropertyName.php b/src/CodeGenerator/Naming/CannotCreatePropertyName.php index 9d33a61..2e15083 100644 --- a/src/CodeGenerator/Naming/CannotCreatePropertyName.php +++ b/src/CodeGenerator/Naming/CannotCreatePropertyName.php @@ -6,6 +6,8 @@ use OnMoon\OpenApiServerBundle\Exception\OpenApiError; +use function sprintf; + final class CannotCreatePropertyName extends OpenApiError { public static function becauseTextContainsNoValidSymbols(string $text): self diff --git a/src/CodeGenerator/Naming/DefaultNamingStrategy.php b/src/CodeGenerator/Naming/DefaultNamingStrategy.php index a4f8e1e..233b0b9 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,13 +38,13 @@ public function __construct( $this->languageLevel = $languageLevel; } - #[\Override] + #[Override] public function isAllowedPhpPropertyName(string $name): bool { return preg_match('/^\d/', $name) === 0 && preg_match('/^[A-Za-z0-9_]+$/', $name) === 1; } - #[\Override] + #[Override] public function getInterfaceFQCN(string $apiNameSpace, string $operationId): string { /** @psalm-var class-string $interfaceNamespace */ @@ -58,7 +59,7 @@ public function getInterfaceFQCN(string $apiNameSpace, string $operationId): str return $interfaceNamespace; } - #[\Override] + #[Override] public function stringToNamespace(string $text): string { $namespace = $this->padStringThatIsReservedNamespaceName( @@ -74,7 +75,7 @@ public function stringToNamespace(string $text): string return $namespace; } - #[\Override] + #[Override] public function stringToMethodName(string $text): string { $propertyName = $this->padStringThatIsReservedMethodName( @@ -92,13 +93,13 @@ public function stringToMethodName(string $text): string return $propertyName; } - #[\Override] + #[Override] public function buildNamespace(string ...$parts): string { return implode('\\', array_map(static fn (string $part): string => trim($part, '\\'), $parts)); } - #[\Override] + #[Override] public function buildPath(string ...$parts): string { return implode( diff --git a/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php index 991fbf1..87e7976 100644 --- a/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php @@ -16,6 +16,7 @@ use function array_map; use function count; use function implode; +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 a3ce040..2b47970 100644 --- a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php @@ -34,6 +34,7 @@ use function array_map; use function count; +use function sprintf; final class DtoCodeGenerator extends CodeGenerator { diff --git a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php index c18003d..2dd9cf7 100644 --- a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php +++ b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php @@ -15,6 +15,7 @@ use function in_array; use function Safe\preg_match; use function Safe\preg_replace; +use function substr; /** @psalm-suppress ClassMustBeFinal */ class FileBuilder diff --git a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php index 10217fb..68cc340 100644 --- a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php @@ -11,6 +11,7 @@ use function array_map; use function count; use function implode; +use function sprintf; final class InterfaceCodeGenerator extends CodeGenerator { diff --git a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php index e3f6b74..fbcbeb7 100644 --- a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php @@ -24,6 +24,8 @@ use PhpParser\Node\Stmt\Return_; use Psr\Container\ContainerInterface; +use function sprintf; + final class ServiceSubscriberCodeGenerator extends CodeGenerator { public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinition diff --git a/src/Command/DeleteGeneratedCodeCommand.php b/src/Command/DeleteGeneratedCodeCommand.php index c68fc11..23d1f2b 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; @@ -19,6 +20,7 @@ use function is_dir; use function Safe\rmdir; use function Safe\unlink; +use function sprintf; #[AsCommand(name: 'open-api:delete')] final class DeleteGeneratedCodeCommand extends Command @@ -41,7 +43,7 @@ public function __construct(string $rootPath, ?string $name = null) */ protected static $defaultName = self::COMMAND; - #[\Override] + #[Override] protected function configure(): void { $this @@ -53,7 +55,7 @@ protected function configure(): void ); } - #[\Override] + #[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 3bb5328..f32dbd0 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; @@ -22,6 +23,7 @@ use function iterator_count; use function Safe\rmdir; use function Safe\unlink; +use function sprintf; #[AsCommand(name: 'open-api:generate')] final class GenerateApiCodeCommand extends Command @@ -45,7 +47,7 @@ public function __construct( parent::__construct($name); } - #[\Override] + #[Override] protected function configure(): void { $this @@ -65,7 +67,7 @@ protected function configure(): void */ protected static $defaultName = self::COMMAND; - #[\Override] + #[Override] protected function execute(InputInterface $input, OutputInterface $output): int { $keep = (bool) $input->getOption('keep'); diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index 79ffe44..e66df13 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -39,6 +39,7 @@ use function intdiv; use function is_numeric; use function ltrim; +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 595e575..0fa329a 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,7 +21,7 @@ public function __construct(string $tag) $this->tag = $tag; } - #[\Override] + #[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 a765770..9424a6d 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -4,12 +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] + #[Override] public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder('open_api_server'); diff --git a/src/DependencyInjection/OpenApiServerExtension.php b/src/DependencyInjection/OpenApiServerExtension.php index 0467ef4..23a7a57 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,7 +20,7 @@ final class OpenApiServerExtension extends Extension implements ExtensionInterface { /** @param mixed[] $configs */ - #[\Override] + #[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 baf247b..bee70ef 100644 --- a/src/Exception/ApiCallFailed.php +++ b/src/Exception/ApiCallFailed.php @@ -5,6 +5,7 @@ namespace OnMoon\OpenApiServerBundle\Exception; use function implode; +use function sprintf; final class ApiCallFailed extends OpenApiError { diff --git a/src/Exception/CannotParseOpenApi.php b/src/Exception/CannotParseOpenApi.php index 4af6e82..d2036e1 100644 --- a/src/Exception/CannotParseOpenApi.php +++ b/src/Exception/CannotParseOpenApi.php @@ -4,6 +4,8 @@ namespace OnMoon\OpenApiServerBundle\Exception; +use function sprintf; + final class CannotParseOpenApi extends OpenApiError { /** @param array{method:string,url:string,path:string} $context */ diff --git a/src/OpenApiServerBundle.php b/src/OpenApiServerBundle.php index 599bc0a..0cbc82a 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,7 +14,7 @@ final class OpenApiServerBundle extends Bundle { public const API_LOADER_TAG = 'openapi.api_loader'; - #[\Override] + #[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 63eb1bf..b33a928 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; @@ -29,7 +30,7 @@ public function __construct(SpecificationLoader $loader, ArgumentResolver $argum $this->argumentResolver = $argumentResolver; } - #[\Override] + #[Override] public function load(mixed $resource, ?string $type = null): RouteCollection { $specName = (string) $resource; @@ -45,9 +46,10 @@ public function load(mixed $resource, ?string $type = null): RouteCollection if (array_key_exists('path', $parameters)) { $argumentPatterns = $this->argumentResolver->resolveArgumentPatterns($parameters['path']); foreach ($argumentPatterns as $name => $pattern) { - if (is_null($pattern)) { + if ($pattern === null) { continue; } + $requirements[$name] = $pattern; } } @@ -68,7 +70,7 @@ public function load(mixed $resource, ?string $type = null): RouteCollection } /** @inheritDoc */ - #[\Override] + #[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 ecae4ac..789db2e 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,7 +28,7 @@ public function __construct(ScalarTypesResolver $resolver, bool $sendNulls) $this->sendNotRequiredNullableNulls = $sendNulls; } - #[\Override] + #[Override] public function createRequestDto( Request $request, Operation $operation, @@ -68,7 +69,7 @@ public function createRequestDto( } /** @inheritDoc */ - #[\Override] + #[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 7d9d434..c3f6cad 100644 --- a/src/Specification/Definitions/ObjectReference.php +++ b/src/Specification/Definitions/ObjectReference.php @@ -4,6 +4,8 @@ namespace OnMoon\OpenApiServerBundle\Specification\Definitions; +use Override; + final class ObjectReference implements GetSchema { public function __construct(private string $schemaName, private ObjectSchema $referencedObject) @@ -20,7 +22,7 @@ public function getReferencedObject(): ObjectSchema return $this->referencedObject; } - #[\Override] + #[Override] public function getSchema(): ObjectSchema { return $this->getReferencedObject(); diff --git a/src/Specification/Definitions/ObjectSchema.php b/src/Specification/Definitions/ObjectSchema.php index 370ed3e..bbfba6a 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,7 +23,7 @@ public function getProperties(): array return $this->properties; } - #[\Override] + #[Override] public function getSchema(): ObjectSchema { return $this; diff --git a/src/Specification/SpecificationLoader.php b/src/Specification/SpecificationLoader.php index 1967838..5376d02 100644 --- a/src/Specification/SpecificationLoader.php +++ b/src/Specification/SpecificationLoader.php @@ -17,6 +17,7 @@ use function file_exists; use function implode; use function pathinfo; +use function sprintf; use function stream_is_local; use const PATHINFO_EXTENSION; diff --git a/src/Validator/LeaguePSR7RequestSchemaValidator.php b/src/Validator/LeaguePSR7RequestSchemaValidator.php index 863345c..c002046 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,7 +24,7 @@ public function __construct( $this->httpFactory = $httpFactory; } - #[\Override] + #[Override] public function validate( Request $request, Specification $specification, diff --git a/test/functional/Command/DeleteGeneratedCodeCommandTest.php b/test/functional/Command/DeleteGeneratedCodeCommandTest.php index 4c05830..a638d68 100644 --- a/test/functional/Command/DeleteGeneratedCodeCommandTest.php +++ b/test/functional/Command/DeleteGeneratedCodeCommandTest.php @@ -12,6 +12,7 @@ use function rtrim; use function Safe\file_put_contents; use function Safe\mkdir; +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 898c4a7..4c14b39 100644 --- a/test/functional/Command/GenerateApiCodeCommandTest.php +++ b/test/functional/Command/GenerateApiCodeCommandTest.php @@ -10,6 +10,7 @@ use Symfony\Component\Console\Tester\CommandTester; use function rtrim; +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 ceea77b..f700e80 100644 --- a/test/functional/DependencyInjection/ConfigurationTest.php +++ b/test/functional/DependencyInjection/ConfigurationTest.php @@ -9,6 +9,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\HttpKernel\Kernel; +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 17e2c59..408ea05 100644 --- a/test/functional/Specification/SpecificationLoaderTest.php +++ b/test/functional/Specification/SpecificationLoaderTest.php @@ -22,6 +22,7 @@ use Symfony\Contracts\Cache\TagAwareCacheInterface; use function array_pop; +use function sprintf; /** @covers \OnMoon\OpenApiServerBundle\Specification\SpecificationLoader */ class SpecificationLoaderTest extends TestCase diff --git a/test/generation/GeneratedClassAsserter.php b/test/generation/GeneratedClassAsserter.php index dc809af..780b47e 100644 --- a/test/generation/GeneratedClassAsserter.php +++ b/test/generation/GeneratedClassAsserter.php @@ -28,6 +28,7 @@ use function array_pop; use function explode; use function is_array; +use function sprintf; use function strpos; final class GeneratedClassAsserter diff --git a/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php b/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php index 8c1a932..cf12839 100644 --- a/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php +++ b/test/unit/CodeGenerator/Naming/CannotCreateNamespaceTest.php @@ -7,6 +7,8 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreateNamespace; use PHPUnit\Framework\TestCase; +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 371ff54..0dfae5f 100644 --- a/test/unit/CodeGenerator/Naming/CannotCreatePropertyNameTest.php +++ b/test/unit/CodeGenerator/Naming/CannotCreatePropertyNameTest.php @@ -7,6 +7,8 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreatePropertyName; use PHPUnit\Framework\TestCase; +use function sprintf; + /** @covers \OnMoon\OpenApiServerBundle\CodeGenerator\Naming\CannotCreatePropertyName */ final class CannotCreatePropertyNameTest extends TestCase { diff --git a/test/unit/Exception/ApiCallFailedTest.php b/test/unit/Exception/ApiCallFailedTest.php index 810a83f..061dd33 100644 --- a/test/unit/Exception/ApiCallFailedTest.php +++ b/test/unit/Exception/ApiCallFailedTest.php @@ -7,6 +7,8 @@ use OnMoon\OpenApiServerBundle\Exception\ApiCallFailed; use PHPUnit\Framework\TestCase; +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 713d0c7..b82eaf4 100644 --- a/test/unit/Exception/CannotParseOpenApiTest.php +++ b/test/unit/Exception/CannotParseOpenApiTest.php @@ -7,6 +7,8 @@ use OnMoon\OpenApiServerBundle\Exception\CannotParseOpenApi; use PHPUnit\Framework\TestCase; +use function sprintf; + /** @covers \OnMoon\OpenApiServerBundle\Exception\CannotParseOpenApi */ final class CannotParseOpenApiTest extends TestCase {