From 5b89f8ab1b27e4abc62eb7ea3218bb730c063476 Mon Sep 17 00:00:00 2001 From: Patrik Foldes Date: Fri, 3 Jul 2020 15:13:07 +0300 Subject: [PATCH] Add symfony 5 compatibility (#71) * Updated dev packages * Updated code style * Updated symfony packages to ^5.0 * Fixed psalm type issue * Ignored phpstan false positive and removed fix for it * Removed another unnecessary check --- .travis.yml | 4 +- composer.json | 40 ++++++++--------- src/CodeGenerator/ApiServerCodeGenerator.php | 2 +- src/CodeGenerator/AttributeGenerator.php | 6 +-- .../Definitions/ClassDefinition.php | 12 +++--- .../Definitions/DtoDefinition.php | 8 ++-- .../Definitions/GeneratedClassDefinition.php | 8 ++-- .../Definitions/GeneratedFileDefinition.php | 6 +-- .../GeneratedInterfaceDefinition.php | 4 +- .../Definitions/GraphDefinition.php | 4 +- .../Definitions/OperationDefinition.php | 22 +++++----- .../Definitions/PropertyDefinition.php | 42 +++++++++--------- .../RequestHandlerInterfaceDefinition.php | 16 +++---- .../Definitions/ResponseDtoDefinition.php | 2 +- .../ServiceSubscriberDefinition.php | 4 +- .../Definitions/SpecificationDefinition.php | 4 +- src/CodeGenerator/FileGenerator.php | 5 ++- .../Filesystem/FilePutContentsFileWriter.php | 3 +- src/CodeGenerator/Filesystem/FileWriter.php | 2 +- src/CodeGenerator/GraphGenerator.php | 15 ++++--- src/CodeGenerator/InterfaceGenerator.php | 5 ++- src/CodeGenerator/NameGenerator.php | 15 ++++--- .../Naming/CannotCreateNamespace.php | 3 +- .../Naming/CannotCreatePropertyName.php | 5 ++- .../Naming/DefaultNamingStrategy.php | 27 ++++++------ src/CodeGenerator/Naming/NamingStrategy.php | 13 +++--- .../PhpParserGenerators/CodeGenerator.php | 14 +++--- .../PhpParserGenerators/DtoCodeGenerator.php | 43 ++++++++++--------- .../PhpParserGenerators/FileBuilder.php | 11 ++--- .../InterfaceCodeGenerator.php | 3 +- .../ServiceSubscriberCodeGenerator.php | 3 +- src/Command/DeleteGeneratedCodeCommand.php | 7 +-- src/Command/GenerateApiCodeCommand.php | 5 ++- src/Command/RefreshApiCodeCommand.php | 11 ++--- src/Controller/ApiController.php | 22 +++++----- src/DependencyInjection/CompilerPass.php | 2 +- .../OpenApiServerExtension.php | 6 ++- .../CodeGenerator/ClassGraphReadyEvent.php | 2 +- src/Event/CodeGenerator/FilesReadyEvent.php | 2 +- src/Event/Server/RequestDtoEvent.php | 6 +-- src/Event/Server/RequestEvent.php | 6 +-- src/Event/Server/ResponseDtoEvent.php | 6 +-- src/Event/Server/ResponseEvent.php | 6 +-- src/Exception/ApiCallFailed.php | 4 +- src/Exception/CannotParseOpenApi.php | 12 +++--- src/Interfaces/ApiLoader.php | 2 +- src/Interfaces/Dto.php | 4 +- src/Interfaces/GetResponseCode.php | 2 +- src/Interfaces/ResponseDto.php | 3 +- src/Interfaces/SetClientIp.php | 2 +- src/Interfaces/SetRequest.php | 2 +- src/OpenApiServerBundle.php | 2 +- src/Router/RouteLoader.php | 5 ++- src/Serializer/ArrayDtoSerializer.php | 19 +++++--- src/Serializer/DtoSerializer.php | 4 +- src/Specification/Definitions/ObjectType.php | 2 +- src/Specification/Definitions/Operation.php | 16 +++---- src/Specification/Definitions/Property.php | 32 +++++++------- .../Definitions/Specification.php | 6 +-- .../Definitions/SpecificationConfig.php | 8 ++-- src/Specification/SpecificationLoader.php | 14 +++--- src/Specification/SpecificationParser.php | 30 ++++++------- src/Types/ArgumentResolver.php | 6 ++- src/Types/ScalarTypesResolver.php | 23 ++++++---- src/Types/TypeSerializer.php | 13 +++--- .../LeaguePSR7RequestSchemaValidator.php | 2 +- src/Validator/RequestSchemaValidator.php | 2 +- 67 files changed, 345 insertions(+), 302 deletions(-) diff --git a/.travis.yml b/.travis.yml index 012e8f2..04907ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ jobs: include: - stage: Psalm php: 7.4 - script: ./vendor/bin/psalm + script: ./vendor/bin/psalm.phar - stage: Stan php: 7.4 @@ -39,4 +39,4 @@ jobs: - composer show squizlabs/php_codesniffer - composer show doctrine/coding-standard - composer show slevomat/coding-standard - - ./vendor/bin/phpcs \ No newline at end of file + - ./vendor/bin/phpcs diff --git a/composer.json b/composer.json index 83be7ab..19e3699 100644 --- a/composer.json +++ b/composer.json @@ -24,33 +24,33 @@ "require": { "php": "^7.4", "ext-json": "*", - "cebe/php-openapi": "^1.3", - "league/openapi-psr7-validator": "^0.6.0", + "cebe/php-openapi": "^1.4", + "league/openapi-psr7-validator": "^0.9.0", "lukasoppermann/http-status": "^2.0", - "nikic/php-parser": "^4.3", - "nyholm/psr7": "^1.2", - "phpdocumentor/reflection-docblock": "^4.3", + "nikic/php-parser": "^4.5", + "nyholm/psr7": "^1.3", + "phpdocumentor/reflection-docblock": "^5.1", "sspat/reserved-words": "^1.0", - "symfony/cache": "^4.4", - "symfony/config": "4.4.*", - "symfony/console": "4.4.*", - "symfony/dependency-injection": "4.4.*", - "symfony/event-dispatcher": "4.4.*", - "symfony/http-kernel": "4.4.*", - "symfony/process": "^4.4", + "symfony/cache": "^5.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/process": "^5.0", "symfony/psr-http-message-bridge": "^2.0", - "symfony/routing": "4.4.*", - "symfony/yaml": "4.4.*", + "symfony/routing": "^5.0", + "symfony/yaml": "^5.0", "thecodingmachine/safe": "^1.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.12.8", - "phpunit/phpunit": "^8.5", + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12.32", + "phpunit/phpunit": "^9.2", + "psalm/phar": "^3.12", "sensiolabs/security-checker": "^6.0", "squizlabs/php_codesniffer": "^3.5", - "thecodingmachine/phpstan-safe-rule": "^1.0", - "vimeo/psalm": "^3.8" + "thecodingmachine/phpstan-safe-rule": "^1.0" }, "minimum-stability": "stable", "config": { @@ -72,7 +72,7 @@ "scripts": { "cs": "phpcs", "csfix": "phpcbf", - "psalm": "psalm", + "psalm": "psalm.phar", "stan": "phpstan analyze src -l 8 --memory-limit=512m", "sec": "security-checker security:check", "test": "phpunit", diff --git a/src/CodeGenerator/ApiServerCodeGenerator.php b/src/CodeGenerator/ApiServerCodeGenerator.php index 570b04b..c3c3e19 100644 --- a/src/CodeGenerator/ApiServerCodeGenerator.php +++ b/src/CodeGenerator/ApiServerCodeGenerator.php @@ -30,7 +30,7 @@ public function __construct(GraphGenerator $graphGenerator, NameGenerator $nameG $this->eventDispatcher = $eventDispatcher; } - public function generate() : void + public function generate(): void { $graph = $this->graphGenerator->generateClassGraph(); $this->interfaceGenerator->setAllInterfaces($graph); diff --git a/src/CodeGenerator/AttributeGenerator.php b/src/CodeGenerator/AttributeGenerator.php index c8562b5..c765c78 100644 --- a/src/CodeGenerator/AttributeGenerator.php +++ b/src/CodeGenerator/AttributeGenerator.php @@ -9,7 +9,7 @@ class AttributeGenerator { - public function setAllAttributes(GraphDefinition $graph) : void + public function setAllAttributes(GraphDefinition $graph): void { foreach ($graph->getSpecifications() as $specificationDefinition) { foreach ($specificationDefinition->getOperations() as $operation) { @@ -25,7 +25,7 @@ public function setAllAttributes(GraphDefinition $graph) : void } } - public function requestPass(DtoDefinition $root) : void + public function requestPass(DtoDefinition $root): void { foreach ($root->getProperties() as $property) { $specProperty = $property->getSpecProperty(); @@ -45,7 +45,7 @@ public function requestPass(DtoDefinition $root) : void } } - public function responsePass(DtoDefinition $root) : void + public function responsePass(DtoDefinition $root): void { foreach ($root->getProperties() as $property) { $specProperty = $property->getSpecProperty(); diff --git a/src/CodeGenerator/Definitions/ClassDefinition.php b/src/CodeGenerator/Definitions/ClassDefinition.php index d84ae60..99cec47 100644 --- a/src/CodeGenerator/Definitions/ClassDefinition.php +++ b/src/CodeGenerator/Definitions/ClassDefinition.php @@ -12,36 +12,36 @@ class ClassDefinition private string $className; private string $namespace; - public function getClassName() : string + public function getClassName(): string { return $this->className; } - public function setClassName(string $className) : self + public function setClassName(string $className): self { $this->className = $className; return $this; } - public function getNamespace() : string + public function getNamespace(): string { return $this->namespace; } - public function setNamespace(string $namespace) : self + public function setNamespace(string $namespace): self { $this->namespace = $namespace; return $this; } - public function getFQCN() : string + public function getFQCN(): string { return $this->namespace . '\\' . $this->className; } - public static function fromFQCN(string $className) : ClassDefinition + public static function fromFQCN(string $className): ClassDefinition { $lastPart = strrpos($className, '\\'); if ($lastPart !== false) { diff --git a/src/CodeGenerator/Definitions/DtoDefinition.php b/src/CodeGenerator/Definitions/DtoDefinition.php index b3cdd66..c6285b3 100644 --- a/src/CodeGenerator/Definitions/DtoDefinition.php +++ b/src/CodeGenerator/Definitions/DtoDefinition.php @@ -20,7 +20,7 @@ public function __construct(array $properties) $this->properties = $properties; } - public function isEmpty() : bool + public function isEmpty(): bool { return count($this->properties) === 0; } @@ -28,12 +28,12 @@ public function isEmpty() : bool /** * @return PropertyDefinition[] */ - public function getProperties() : array + public function getProperties(): array { return $this->properties; } - public function getImplements() : ?ClassDefinition + public function getImplements(): ?ClassDefinition { return $this->implements; } @@ -41,7 +41,7 @@ public function getImplements() : ?ClassDefinition /** * @return DtoDefinition */ - public function setImplements(?ClassDefinition $implements) : self + public function setImplements(?ClassDefinition $implements): self { $this->implements = $implements; diff --git a/src/CodeGenerator/Definitions/GeneratedClassDefinition.php b/src/CodeGenerator/Definitions/GeneratedClassDefinition.php index 7eaf39b..4acc713 100644 --- a/src/CodeGenerator/Definitions/GeneratedClassDefinition.php +++ b/src/CodeGenerator/Definitions/GeneratedClassDefinition.php @@ -9,24 +9,24 @@ class GeneratedClassDefinition extends ClassDefinition private string $fileName; private string $filePath; - public function getFileName() : string + public function getFileName(): string { return $this->fileName; } - public function setFileName(string $fileName) : self + public function setFileName(string $fileName): self { $this->fileName = $fileName; return $this; } - public function getFilePath() : string + public function getFilePath(): string { return $this->filePath; } - public function setFilePath(string $filePath) : self + public function setFilePath(string $filePath): self { $this->filePath = $filePath; diff --git a/src/CodeGenerator/Definitions/GeneratedFileDefinition.php b/src/CodeGenerator/Definitions/GeneratedFileDefinition.php index a57031a..5f39e14 100644 --- a/src/CodeGenerator/Definitions/GeneratedFileDefinition.php +++ b/src/CodeGenerator/Definitions/GeneratedFileDefinition.php @@ -15,17 +15,17 @@ public function __construct(GeneratedClassDefinition $class, string $fileContent $this->fileContents = $fileContents; } - public function getClass() : GeneratedClassDefinition + public function getClass(): GeneratedClassDefinition { return $this->class; } - public function getFileContents() : string + public function getFileContents(): string { return $this->fileContents; } - public function setFileContents(string $fileContents) : self + public function setFileContents(string $fileContents): self { $this->fileContents = $fileContents; diff --git a/src/CodeGenerator/Definitions/GeneratedInterfaceDefinition.php b/src/CodeGenerator/Definitions/GeneratedInterfaceDefinition.php index e8e5fb6..95ff3ea 100644 --- a/src/CodeGenerator/Definitions/GeneratedInterfaceDefinition.php +++ b/src/CodeGenerator/Definitions/GeneratedInterfaceDefinition.php @@ -8,7 +8,7 @@ class GeneratedInterfaceDefinition extends GeneratedClassDefinition { private ?ClassDefinition $extends = null; - public function getExtends() : ?ClassDefinition + public function getExtends(): ?ClassDefinition { return $this->extends; } @@ -16,7 +16,7 @@ public function getExtends() : ?ClassDefinition /** * @return GeneratedInterfaceDefinition */ - public function setExtends(?ClassDefinition $extends) : self + public function setExtends(?ClassDefinition $extends): self { $this->extends = $extends; diff --git a/src/CodeGenerator/Definitions/GraphDefinition.php b/src/CodeGenerator/Definitions/GraphDefinition.php index b0ef9e0..c8968a3 100644 --- a/src/CodeGenerator/Definitions/GraphDefinition.php +++ b/src/CodeGenerator/Definitions/GraphDefinition.php @@ -22,12 +22,12 @@ public function __construct(array $specifications, ServiceSubscriberDefinition $ /** * @return SpecificationDefinition[] */ - public function getSpecifications() : array + public function getSpecifications(): array { return $this->specifications; } - public function getServiceSubscriber() : ServiceSubscriberDefinition + public function getServiceSubscriber(): ServiceSubscriberDefinition { return $this->serviceSubscriber; } diff --git a/src/CodeGenerator/Definitions/OperationDefinition.php b/src/CodeGenerator/Definitions/OperationDefinition.php index be55487..afdde5a 100644 --- a/src/CodeGenerator/Definitions/OperationDefinition.php +++ b/src/CodeGenerator/Definitions/OperationDefinition.php @@ -32,32 +32,32 @@ public function __construct(string $url, string $method, string $operationId, st $this->responses = $responses; } - public function getUrl() : string + public function getUrl(): string { return $this->url; } - public function getMethod() : string + public function getMethod(): string { return $this->method; } - public function getOperationId() : string + public function getOperationId(): string { return $this->operationId; } - public function getRequestHandlerName() : string + public function getRequestHandlerName(): string { return $this->requestHandlerName; } - public function getSummary() : ?string + public function getSummary(): ?string { return $this->summary; } - public function getRequest() : ?RequestDtoDefinition + public function getRequest(): ?RequestDtoDefinition { return $this->request; } @@ -65,29 +65,29 @@ public function getRequest() : ?RequestDtoDefinition /** * @return ResponseDtoDefinition[] */ - public function getResponses() : array + public function getResponses(): array { return $this->responses; } - public function getMarkersInterface() : ?ClassDefinition + public function getMarkersInterface(): ?ClassDefinition { return $this->markersInterface; } - public function setMarkersInterface(?ClassDefinition $markersInterface) : self + public function setMarkersInterface(?ClassDefinition $markersInterface): self { $this->markersInterface = $markersInterface; return $this; } - public function getRequestHandlerInterface() : RequestHandlerInterfaceDefinition + public function getRequestHandlerInterface(): RequestHandlerInterfaceDefinition { return $this->requestHandlerInterface; } - public function setRequestHandlerInterface(RequestHandlerInterfaceDefinition $requestHandlerInterface) : self + public function setRequestHandlerInterface(RequestHandlerInterfaceDefinition $requestHandlerInterface): self { $this->requestHandlerInterface = $requestHandlerInterface; diff --git a/src/CodeGenerator/Definitions/PropertyDefinition.php b/src/CodeGenerator/Definitions/PropertyDefinition.php index 0437299..5696607 100644 --- a/src/CodeGenerator/Definitions/PropertyDefinition.php +++ b/src/CodeGenerator/Definitions/PropertyDefinition.php @@ -23,121 +23,121 @@ public function __construct(Property $specProperty) $this->specProperty = $specProperty; } - public function getDescription() : ?string + public function getDescription(): ?string { return $this->specProperty->getDescription(); } - public function getSpecProperty() : Property + public function getSpecProperty(): Property { return $this->specProperty; } - public function getClassPropertyName() : string + public function getClassPropertyName(): string { return $this->classPropertyName; } - public function setClassPropertyName(string $classPropertyName) : self + public function setClassPropertyName(string $classPropertyName): self { $this->classPropertyName = $classPropertyName; return $this; } - public function getSpecPropertyName() : string + public function getSpecPropertyName(): string { return $this->specProperty->getName(); } - public function isArray() : bool + public function isArray(): bool { return $this->specProperty->isArray(); } - public function getScalarTypeId() : ?int + public function getScalarTypeId(): ?int { return $this->specProperty->getScalarTypeId(); } - public function getObjectTypeDefinition() : ?DtoDefinition + public function getObjectTypeDefinition(): ?DtoDefinition { return $this->objectTypeDefinition; } - public function setObjectTypeDefinition(?DtoDefinition $objectTypeDefinition) : self + public function setObjectTypeDefinition(?DtoDefinition $objectTypeDefinition): self { $this->objectTypeDefinition = $objectTypeDefinition; return $this; } - public function isNullable() : bool + public function isNullable(): bool { return $this->nullable; } - public function setNullable(bool $nullable) : self + public function setNullable(bool $nullable): self { $this->nullable = $nullable; return $this; } - public function getGetterName() : ?string + public function getGetterName(): ?string { return $this->getterName; } - public function setGetterName(?string $getterName) : self + public function setGetterName(?string $getterName): self { $this->getterName = $getterName; return $this; } - public function getSetterName() : ?string + public function getSetterName(): ?string { return $this->setterName; } - public function setSetterName(?string $setterName) : self + public function setSetterName(?string $setterName): self { $this->setterName = $setterName; return $this; } - public function hasGetter() : bool + public function hasGetter(): bool { return $this->hasGetter; } - public function setHasGetter(bool $hasGetter) : self + public function setHasGetter(bool $hasGetter): self { $this->hasGetter = $hasGetter; return $this; } - public function hasSetter() : bool + public function hasSetter(): bool { return $this->hasSetter; } - public function setHasSetter(bool $hasSetter) : self + public function setHasSetter(bool $hasSetter): self { $this->hasSetter = $hasSetter; return $this; } - public function isInConstructor() : bool + public function isInConstructor(): bool { return $this->inConstructor; } - public function setInConstructor(bool $inConstructor) : self + public function setInConstructor(bool $inConstructor): self { $this->inConstructor = $inConstructor; diff --git a/src/CodeGenerator/Definitions/RequestHandlerInterfaceDefinition.php b/src/CodeGenerator/Definitions/RequestHandlerInterfaceDefinition.php index f4b27e2..a95aab0 100644 --- a/src/CodeGenerator/Definitions/RequestHandlerInterfaceDefinition.php +++ b/src/CodeGenerator/Definitions/RequestHandlerInterfaceDefinition.php @@ -11,48 +11,48 @@ class RequestHandlerInterfaceDefinition extends GeneratedInterfaceDefinition private string $methodName; private ?string $methodDescription = null; - public function getRequestType() : ?ClassDefinition + public function getRequestType(): ?ClassDefinition { return $this->requestType; } - public function setRequestType(?ClassDefinition $requestType) : self + public function setRequestType(?ClassDefinition $requestType): self { $this->requestType = $requestType; return $this; } - public function getResponseType() : ?ClassDefinition + public function getResponseType(): ?ClassDefinition { return $this->responseType; } - public function setResponseType(?ClassDefinition $responseType) : self + public function setResponseType(?ClassDefinition $responseType): self { $this->responseType = $responseType; return $this; } - public function getMethodName() : string + public function getMethodName(): string { return $this->methodName; } - public function setMethodName(string $methodName) : self + public function setMethodName(string $methodName): self { $this->methodName = $methodName; return $this; } - public function getMethodDescription() : ?string + public function getMethodDescription(): ?string { return $this->methodDescription; } - public function setMethodDescription(?string $methodDescription) : self + public function setMethodDescription(?string $methodDescription): self { $this->methodDescription = $methodDescription; diff --git a/src/CodeGenerator/Definitions/ResponseDtoDefinition.php b/src/CodeGenerator/Definitions/ResponseDtoDefinition.php index 4b57bf8..bc80bb7 100644 --- a/src/CodeGenerator/Definitions/ResponseDtoDefinition.php +++ b/src/CodeGenerator/Definitions/ResponseDtoDefinition.php @@ -17,7 +17,7 @@ public function __construct(string $statusCode, array $properties) parent::__construct($properties); } - public function getStatusCode() : string + public function getStatusCode(): string { return $this->statusCode; } diff --git a/src/CodeGenerator/Definitions/ServiceSubscriberDefinition.php b/src/CodeGenerator/Definitions/ServiceSubscriberDefinition.php index 6401225..27d9a3f 100644 --- a/src/CodeGenerator/Definitions/ServiceSubscriberDefinition.php +++ b/src/CodeGenerator/Definitions/ServiceSubscriberDefinition.php @@ -12,7 +12,7 @@ class ServiceSubscriberDefinition extends GeneratedClassDefinition /** * @return ClassDefinition[] */ - public function getImplements() : array + public function getImplements(): array { return $this->implements; } @@ -20,7 +20,7 @@ public function getImplements() : array /** * @param ClassDefinition[] $implements */ - public function setImplements(array $implements) : self + public function setImplements(array $implements): self { $this->implements = $implements; diff --git a/src/CodeGenerator/Definitions/SpecificationDefinition.php b/src/CodeGenerator/Definitions/SpecificationDefinition.php index 598f7d3..56a9e71 100644 --- a/src/CodeGenerator/Definitions/SpecificationDefinition.php +++ b/src/CodeGenerator/Definitions/SpecificationDefinition.php @@ -24,12 +24,12 @@ public function __construct(SpecificationConfig $specification, array $operation /** * @return OperationDefinition[] */ - public function getOperations() : array + public function getOperations(): array { return $this->operations; } - public function getSpecification() : SpecificationConfig + public function getSpecification(): SpecificationConfig { return $this->specification; } diff --git a/src/CodeGenerator/FileGenerator.php b/src/CodeGenerator/FileGenerator.php index 45f3fa4..e8e5a51 100644 --- a/src/CodeGenerator/FileGenerator.php +++ b/src/CodeGenerator/FileGenerator.php @@ -11,6 +11,7 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\PhpParserGenerators\DtoCodeGenerator; use OnMoon\OpenApiServerBundle\CodeGenerator\PhpParserGenerators\InterfaceCodeGenerator; use OnMoon\OpenApiServerBundle\CodeGenerator\PhpParserGenerators\ServiceSubscriberCodeGenerator; + use function array_merge; class FileGenerator @@ -32,7 +33,7 @@ public function __construct( /** * @return GeneratedFileDefinition[] */ - public function generateAllFiles(GraphDefinition $graph) : array + public function generateAllFiles(GraphDefinition $graph): array { /** @var GeneratedFileDefinition[] $result */ $result = []; @@ -64,7 +65,7 @@ public function generateAllFiles(GraphDefinition $graph) : array /** * @return GeneratedFileDefinition[] */ - public function generateDtoTree(DtoDefinition $root) : array + public function generateDtoTree(DtoDefinition $root): array { $result = []; $result[] = $this->dtoGenerator->generate($root); diff --git a/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php b/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php index e8884f9..7724bad 100644 --- a/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php +++ b/src/CodeGenerator/Filesystem/FilePutContentsFileWriter.php @@ -7,6 +7,7 @@ use function is_dir; use function Safe\file_put_contents; use function Safe\mkdir; + use const DIRECTORY_SEPARATOR; class FilePutContentsFileWriter implements FileWriter @@ -18,7 +19,7 @@ public function __construct(int $dirPemissions) $this->dirPemissions = $dirPemissions; } - public function write(string $path, string $filename, string $contents) : void + public function write(string $path, string $filename, string $contents): void { if (! is_dir($path)) { mkdir($path, $this->dirPemissions, true); diff --git a/src/CodeGenerator/Filesystem/FileWriter.php b/src/CodeGenerator/Filesystem/FileWriter.php index bcf987c..bfad1df 100644 --- a/src/CodeGenerator/Filesystem/FileWriter.php +++ b/src/CodeGenerator/Filesystem/FileWriter.php @@ -6,5 +6,5 @@ interface FileWriter { - public function write(string $path, string $filename, string $contents) : void; + public function write(string $path, string $filename, string $contents): void; } diff --git a/src/CodeGenerator/GraphGenerator.php b/src/CodeGenerator/GraphGenerator.php index 89acd8e..bfca379 100644 --- a/src/CodeGenerator/GraphGenerator.php +++ b/src/CodeGenerator/GraphGenerator.php @@ -17,6 +17,7 @@ use OnMoon\OpenApiServerBundle\Specification\Definitions\ObjectType; use OnMoon\OpenApiServerBundle\Specification\Definitions\Property; use OnMoon\OpenApiServerBundle\Specification\SpecificationLoader; + use function array_key_exists; use function array_map; @@ -29,7 +30,7 @@ public function __construct(SpecificationLoader $loader) $this->loader = $loader; } - public function generateClassGraph() : GraphDefinition + public function generateClassGraph(): GraphDefinition { $specificationDefinitions = []; foreach ($this->loader->list() as $specificationName => $specificationConfig) { @@ -76,7 +77,7 @@ public function generateClassGraph() : GraphDefinition * * @return ResponseDtoDefinition[] */ - private function getResponseDtoDefinitions(array $responses) : array + private function getResponseDtoDefinitions(array $responses): array { $responseDtoDefinitions = []; @@ -93,7 +94,7 @@ private function getResponseDtoDefinitions(array $responses) : array /** * @param ObjectType[] $parameters */ - private function parametersToDto(string $in, array $parameters) : ?RequestParametersDtoDefinition + private function parametersToDto(string $in, array $parameters): ?RequestParametersDtoDefinition { if (! array_key_exists($in, $parameters)) { return null; @@ -104,7 +105,7 @@ private function parametersToDto(string $in, array $parameters) : ?RequestParame ); } - private function objectTypeToDefinition(?ObjectType $type) : ?DtoDefinition + private function objectTypeToDefinition(?ObjectType $type): ?DtoDefinition { if ($type === null) { return null; @@ -118,15 +119,15 @@ private function objectTypeToDefinition(?ObjectType $type) : ?DtoDefinition * * @return PropertyDefinition[] */ - private function propertiesToDefinitions(array $properties) : array + private function propertiesToDefinitions(array $properties): array { return array_map( - fn (Property $p) : PropertyDefinition => $this->propertyToDefinition($p), + fn (Property $p): PropertyDefinition => $this->propertyToDefinition($p), $properties ); } - private function propertyToDefinition(Property $property) : PropertyDefinition + private function propertyToDefinition(Property $property): PropertyDefinition { return (new PropertyDefinition($property)) ->setObjectTypeDefinition($this->objectTypeToDefinition($property->getObjectTypeDefinition())); diff --git a/src/CodeGenerator/InterfaceGenerator.php b/src/CodeGenerator/InterfaceGenerator.php index 6f4083c..ed74f91 100644 --- a/src/CodeGenerator/InterfaceGenerator.php +++ b/src/CodeGenerator/InterfaceGenerator.php @@ -13,6 +13,7 @@ use OnMoon\OpenApiServerBundle\Interfaces\Dto; use OnMoon\OpenApiServerBundle\Interfaces\RequestHandler; use OnMoon\OpenApiServerBundle\Interfaces\ResponseDto; + use function count; class InterfaceGenerator @@ -28,7 +29,7 @@ public function __construct() $this->defaultHandler = ClassDefinition::fromFQCN(RequestHandler::class); } - public function setAllInterfaces(GraphDefinition $graph) : void + public function setAllInterfaces(GraphDefinition $graph): void { $graph->getServiceSubscriber()->setImplements([ ClassDefinition::fromFQCN(ApiLoader::class), @@ -73,7 +74,7 @@ public function setAllInterfaces(GraphDefinition $graph) : void } } - public function setChildrenRecursive(DtoDefinition $root, ClassDefinition $implements) : void + public function setChildrenRecursive(DtoDefinition $root, ClassDefinition $implements): void { foreach ($root->getProperties() as $property) { $objectDefinition = $property->getObjectTypeDefinition(); diff --git a/src/CodeGenerator/NameGenerator.php b/src/CodeGenerator/NameGenerator.php index b688e89..5072050 100644 --- a/src/CodeGenerator/NameGenerator.php +++ b/src/CodeGenerator/NameGenerator.php @@ -12,6 +12,7 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Definitions\ResponseDtoDefinition; use OnMoon\OpenApiServerBundle\CodeGenerator\Naming\NamingStrategy; use Throwable; + use function ucfirst; class NameGenerator @@ -35,7 +36,7 @@ public function __construct(NamingStrategy $naming, Httpstatus $httpstatus, stri $this->rootPath = $rootPath; } - public function setAllNamesAndPaths(GraphDefinition $graph) : void + public function setAllNamesAndPaths(GraphDefinition $graph): void { $graph->getServiceSubscriber() ->setFileName('ApiServiceLoaderServiceSubscriber.php') @@ -103,7 +104,7 @@ public function setAllNamesAndPaths(GraphDefinition $graph) : void } } - public function setRequestNames(RequestDtoDefinition $request, string $operationNamespace, string $operationName, string $operationPath) : void + public function setRequestNames(RequestDtoDefinition $request, string $operationNamespace, string $operationName, string $operationPath): void { $requestDtoNamespace = $this->naming->buildNamespace( $operationNamespace, @@ -122,7 +123,7 @@ public function setRequestNames(RequestDtoDefinition $request, string $operation $this->setTreePathsAndClassNames($request, $requestDtoNamespace, $requestDtoClassName, $requestDtoPath); } - public function setResponseNames(ResponseDtoDefinition $response, string $responseNamespace, string $operationName, string $responsePath) : void + public function setResponseNames(ResponseDtoDefinition $response, string $responseNamespace, string $operationName, string $responsePath): void { try { $statusNamespace = $this->httpstatus->getReasonPhrase($response->getStatusCode()); @@ -141,7 +142,7 @@ public function setResponseNames(ResponseDtoDefinition $response, string $respon $this->setTreePathsAndClassNames($response, $responseDtoNamespace, $responseDtoClassName, $responseDtoPath); } - public function setTreePathsAndClassNames(DtoDefinition $root, string $namespace, string $className, string $path) : void + public function setTreePathsAndClassNames(DtoDefinition $root, string $namespace, string $className, string $path): void { $root->setClassName($className); $root->setFileName($this->getFileName($className)); @@ -162,12 +163,12 @@ public function setTreePathsAndClassNames(DtoDefinition $root, string $namespace } } - public function getFileName(string $className) : string + public function getFileName(string $className): string { return $className . '.php'; } - public function setTreeGettersSetters(DtoDefinition $root) : void + public function setTreeGettersSetters(DtoDefinition $root): void { foreach ($root->getProperties() as $property) { $baseName = ucfirst($this->naming->stringToMethodName($property->getClassPropertyName())); @@ -183,7 +184,7 @@ public function setTreeGettersSetters(DtoDefinition $root) : void } } - public function setTreePropertyClassNames(DtoDefinition $root) : void + public function setTreePropertyClassNames(DtoDefinition $root): void { foreach ($root->getProperties() as $property) { $propertyName = $property->getSpecPropertyName(); diff --git a/src/CodeGenerator/Naming/CannotCreateNamespace.php b/src/CodeGenerator/Naming/CannotCreateNamespace.php index a21d9ed..80da985 100644 --- a/src/CodeGenerator/Naming/CannotCreateNamespace.php +++ b/src/CodeGenerator/Naming/CannotCreateNamespace.php @@ -5,11 +5,12 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Naming; use OnMoon\OpenApiServerBundle\Exception\OpenApiError; + use function Safe\sprintf; final class CannotCreateNamespace extends OpenApiError { - public static function becauseTextContainsNoValidSymbols(string $text) : self + public static function becauseTextContainsNoValidSymbols(string $text): self { return new self( sprintf( diff --git a/src/CodeGenerator/Naming/CannotCreatePropertyName.php b/src/CodeGenerator/Naming/CannotCreatePropertyName.php index cbcd864..22b8b87 100644 --- a/src/CodeGenerator/Naming/CannotCreatePropertyName.php +++ b/src/CodeGenerator/Naming/CannotCreatePropertyName.php @@ -5,11 +5,12 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Naming; use OnMoon\OpenApiServerBundle\Exception\OpenApiError; + use function Safe\sprintf; final class CannotCreatePropertyName extends OpenApiError { - public static function becauseTextContainsNoValidSymbols(string $text) : self + public static function becauseTextContainsNoValidSymbols(string $text): self { return new self( sprintf( @@ -19,7 +20,7 @@ public static function becauseTextContainsNoValidSymbols(string $text) : self ); } - public static function becauseIsNotValidPhpPropertyName(string $text) : self + public static function becauseIsNotValidPhpPropertyName(string $text): self { return new self( sprintf( diff --git a/src/CodeGenerator/Naming/DefaultNamingStrategy.php b/src/CodeGenerator/Naming/DefaultNamingStrategy.php index 0e04885..dddaba7 100644 --- a/src/CodeGenerator/Naming/DefaultNamingStrategy.php +++ b/src/CodeGenerator/Naming/DefaultNamingStrategy.php @@ -5,8 +5,10 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Naming; use OnMoon\OpenApiServerBundle\CodeGenerator\NameGenerator; +// phpcs:ignore SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse use OnMoon\OpenApiServerBundle\Interfaces\RequestHandler; use sspat\ReservedWords\ReservedWords; + use function array_map; use function implode; use function lcfirst; @@ -17,6 +19,7 @@ use function trim; use function ucfirst; use function ucwords; + use const DIRECTORY_SEPARATOR; class DefaultNamingStrategy implements NamingStrategy @@ -35,12 +38,12 @@ public function __construct( $this->languageLevel = $languageLevel; } - public function isAllowedPhpPropertyName(string $name) : bool + public function isAllowedPhpPropertyName(string $name): bool { return ! preg_match('/^\d/', $name) && preg_match('/^[A-Za-z0-9_]+$/i', $name); } - public function getInterfaceFQCN(string $apiNameSpace, string $operationId) : string + public function getInterfaceFQCN(string $apiNameSpace, string $operationId): string { /** @psalm-var class-string $interfaceNamespace */ $interfaceNamespace = $this->buildNamespace( @@ -54,7 +57,7 @@ public function getInterfaceFQCN(string $apiNameSpace, string $operationId) : st return $interfaceNamespace; } - public function stringToNamespace(string $text) : string + public function stringToNamespace(string $text): string { $namespace = $this->padStringThatIsReservedNamespaceName( $this->padStringStartingWithNumber( @@ -71,7 +74,7 @@ public function stringToNamespace(string $text) : string return $namespace; } - public function stringToMethodName(string $text) : string + public function stringToMethodName(string $text): string { $propertyName = $this->padStringThatIsReservedMethodName( $this->padStringStartingWithNumber( @@ -88,20 +91,20 @@ public function stringToMethodName(string $text) : string return $propertyName; } - public function buildNamespace(string ...$parts) : string + public function buildNamespace(string ...$parts): string { - return implode('\\', array_map(static fn(string $part) : string => trim($part, '\\'), $parts)); + return implode('\\', array_map(static fn (string $part): string => trim($part, '\\'), $parts)); } - public function buildPath(string ...$parts) : string + public function buildPath(string ...$parts): string { return implode( DIRECTORY_SEPARATOR, - array_map(static fn(string $part) : string => rtrim($part, DIRECTORY_SEPARATOR), $parts) + array_map(static fn (string $part): string => rtrim($part, DIRECTORY_SEPARATOR), $parts) ); } - private function prepareTextForPhp(string $text) : string + private function prepareTextForPhp(string $text): string { /** @var string $filteredText */ $filteredText = preg_replace('/[^A-Z0-9]/i', ' ', $text); @@ -109,17 +112,17 @@ private function prepareTextForPhp(string $text) : string return str_replace(' ', '', ucwords($filteredText)); } - private function padStringThatIsReservedNamespaceName(string $string) : string + private function padStringThatIsReservedNamespaceName(string $string): string { return $this->reservedWords->isReservedNamespaceName($string, $this->languageLevel) ? '_' . $string : $string; } - private function padStringThatIsReservedMethodName(string $string) : string + private function padStringThatIsReservedMethodName(string $string): string { return $this->reservedWords->isReservedMethodName($string, $this->languageLevel) ? '_' . $string : $string; } - private function padStringStartingWithNumber(string $string) : string + private function padStringStartingWithNumber(string $string): string { return preg_match('/^\d/', $string) ? '_' . $string : $string; } diff --git a/src/CodeGenerator/Naming/NamingStrategy.php b/src/CodeGenerator/Naming/NamingStrategy.php index 4dcb75b..2b3cfb3 100644 --- a/src/CodeGenerator/Naming/NamingStrategy.php +++ b/src/CodeGenerator/Naming/NamingStrategy.php @@ -4,6 +4,7 @@ namespace OnMoon\OpenApiServerBundle\CodeGenerator\Naming; +// phpcs:ignore SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse use OnMoon\OpenApiServerBundle\Interfaces\RequestHandler; interface NamingStrategy @@ -11,15 +12,15 @@ interface NamingStrategy /** * @psalm-return class-string */ - public function getInterfaceFQCN(string $apiNameSpace, string $operationId) : string; + public function getInterfaceFQCN(string $apiNameSpace, string $operationId): string; - public function stringToNamespace(string $text) : string; + public function stringToNamespace(string $text): string; - public function stringToMethodName(string $text) : string; + public function stringToMethodName(string $text): string; - public function buildNamespace(string ...$parts) : string; + public function buildNamespace(string ...$parts): string; - public function buildPath(string ...$parts) : string; + public function buildPath(string ...$parts): string; - public function isAllowedPhpPropertyName(string $name) : bool; + public function isAllowedPhpPropertyName(string $name): bool; } diff --git a/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php index b232d20..5211e87 100644 --- a/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/CodeGenerator.php @@ -12,11 +12,13 @@ use PhpParser\Node\Stmt\Declare_; use PhpParser\Node\Stmt\DeclareDeclare; use PhpParser\PrettyPrinter\Standard; + use function array_map; use function count; use function implode; use function Safe\sprintf; use function trim; + use const PHP_EOL; abstract class CodeGenerator @@ -39,20 +41,20 @@ public function __construct(BuilderFactory $factory, ScalarTypesResolver $typeRe $this->fullDocs = $fullDocs; } - public function getTypeDocBlock(FileBuilder $builder, PropertyDefinition $definition) : string + public function getTypeDocBlock(FileBuilder $builder, PropertyDefinition $definition): string { return $this->getTypeName($builder, $definition) . ($definition->isArray() ? '[]' : '') . ($definition->isNullable() ? '|null' : ''); } - public function getTypePhp(FileBuilder $builder, PropertyDefinition $definition) : string + public function getTypePhp(FileBuilder $builder, PropertyDefinition $definition): string { return ($definition->isNullable() ? '?' : '') . ($definition->isArray() ? 'array' : $this->getTypeName($builder, $definition)); } - public function getTypeName(FileBuilder $builder, PropertyDefinition $definition) : string + public function getTypeName(FileBuilder $builder, PropertyDefinition $definition): string { $objectType = $definition->getObjectTypeDefinition(); $scalarType = $definition->getScalarTypeId(); @@ -69,13 +71,13 @@ public function getTypeName(FileBuilder $builder, PropertyDefinition $definition } /** @param string[] $lines */ - public function getDocComment(array $lines) : string + public function getDocComment(array $lines): string { if (count($lines) === 1) { $glued = ' ' . trim($lines[0]); } else { $asteriskLines = array_map( - static fn(string $line) : string => ' * ' . trim($line), + static fn (string $line): string => ' * ' . trim($line), $lines ); $glued = PHP_EOL . implode(PHP_EOL, $asteriskLines) . PHP_EOL; @@ -84,7 +86,7 @@ public function getDocComment(array $lines) : string return sprintf('/**%s */', $glued); } - public function printFile(FileBuilder $fileBuilder) : string + public function printFile(FileBuilder $fileBuilder): string { return (new Standard())->prettyPrintFile([ new Declare_([new DeclareDeclare('strict_types', new LNumber(1))]), diff --git a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php index 7249b2a..aa58c56 100644 --- a/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/DtoCodeGenerator.php @@ -32,13 +32,14 @@ use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; + use function array_map; use function count; use function Safe\sprintf; class DtoCodeGenerator extends CodeGenerator { - public function generate(DtoDefinition $definition) : GeneratedFileDefinition + public function generate(DtoDefinition $definition): GeneratedFileDefinition { $fileBuilder = new FileBuilder($definition); @@ -76,7 +77,7 @@ public function generate(DtoDefinition $definition) : GeneratedFileDefinition /** * @return Builder[] */ - private function generateProperties(FileBuilder $builder, DtoDefinition $definition) : array + private function generateProperties(FileBuilder $builder, DtoDefinition $definition): array { $properties = []; foreach ($definition->getProperties() as $property) { @@ -89,7 +90,7 @@ private function generateProperties(FileBuilder $builder, DtoDefinition $definit /** * @return Builder[] */ - private function generateGetters(FileBuilder $builder, DtoDefinition $definition) : array + private function generateGetters(FileBuilder $builder, DtoDefinition $definition): array { $properties = []; foreach ($definition->getProperties() as $property) { @@ -106,7 +107,7 @@ private function generateGetters(FileBuilder $builder, DtoDefinition $definition /** * @return Builder[] */ - private function generateSetters(FileBuilder $builder, DtoDefinition $definition) : array + private function generateSetters(FileBuilder $builder, DtoDefinition $definition): array { $properties = []; foreach ($definition->getProperties() as $property) { @@ -123,7 +124,7 @@ private function generateSetters(FileBuilder $builder, DtoDefinition $definition /** * @return Builder[] */ - private function generateConstructor(FileBuilder $builder, DtoDefinition $definition) : array + private function generateConstructor(FileBuilder $builder, DtoDefinition $definition): array { $constructorBuilder = $this->factory->method('__construct')->makePublic(); $constructorDocs = []; @@ -160,7 +161,7 @@ private function generateConstructor(FileBuilder $builder, DtoDefinition $defini return [$constructorBuilder]; } - private function generateClassProperty(FileBuilder $builder, PropertyDefinition $definition) : Property + private function generateClassProperty(FileBuilder $builder, PropertyDefinition $definition): Property { $property = $this->factory ->property($definition->getClassPropertyName()) @@ -194,7 +195,7 @@ private function generateClassProperty(FileBuilder $builder, PropertyDefinition return $property; } - private function generateMethodParameter(FileBuilder $builder, PropertyDefinition $definition) : Param + private function generateMethodParameter(FileBuilder $builder, PropertyDefinition $definition): Param { return $this ->factory @@ -202,7 +203,7 @@ private function generateMethodParameter(FileBuilder $builder, PropertyDefinitio ->setType($this->getTypePhp($builder, $definition)); } - private function getAssignmentDefinition(string $name) : Assign + private function getAssignmentDefinition(string $name): Assign { return new Assign( new Variable('this->' . $name), @@ -210,7 +211,7 @@ private function getAssignmentDefinition(string $name) : Assign ); } - private function generateGetter(FileBuilder $builder, PropertyDefinition $definition) : Method + private function generateGetter(FileBuilder $builder, PropertyDefinition $definition): Method { $getterName = $definition->getGetterName(); if ($getterName === null) { @@ -232,7 +233,7 @@ private function generateGetter(FileBuilder $builder, PropertyDefinition $defini return $method; } - private function generateSetter(FileBuilder $builder, PropertyDefinition $definition) : Method + private function generateSetter(FileBuilder $builder, PropertyDefinition $definition): Method { $setterName = $definition->getSetterName(); if ($setterName === null) { @@ -265,7 +266,7 @@ private function generateSetter(FileBuilder $builder, PropertyDefinition $defini return $method; } - private function generateResponseCodeStaticMethod(ResponseDtoDefinition $definition) : Method + private function generateResponseCodeStaticMethod(ResponseDtoDefinition $definition): Method { $responseCode = $definition->getStatusCode(); $method = $this @@ -288,7 +289,7 @@ private function generateResponseCodeStaticMethod(ResponseDtoDefinition $definit return $method; } - private function generateToArray(FileBuilder $builder, DtoDefinition $definition) : Method + private function generateToArray(FileBuilder $builder, DtoDefinition $definition): Method { return $this ->factory @@ -308,7 +309,7 @@ private function generateToArray(FileBuilder $builder, DtoDefinition $definition ); } - private function generateToArrayItem(FileBuilder $builder, PropertyDefinition $property) : ArrayItem + private function generateToArrayItem(FileBuilder $builder, PropertyDefinition $property): ArrayItem { $source = new Variable('this->' . $property->getClassPropertyName()); $value = $this->getConverter($builder, $property, false, $source); @@ -316,7 +317,7 @@ private function generateToArrayItem(FileBuilder $builder, PropertyDefinition $p return new ArrayItem($value, new String_($property->getSpecPropertyName())); } - private function generateFromArray(FileBuilder $builder, DtoDefinition $definition) : Method + private function generateFromArray(FileBuilder $builder, DtoDefinition $definition): Method { $source = new Variable('data'); $dto = new Variable('dto'); @@ -359,32 +360,32 @@ private function generateFromArray(FileBuilder $builder, DtoDefinition $definiti ->addStmts($statements); } - private function generateFromArrayPropFetch(FileBuilder $builder, PropertyDefinition $property, Variable $sourceVar) : Expr + private function generateFromArrayPropFetch(FileBuilder $builder, PropertyDefinition $property, Variable $sourceVar): Expr { $source = $this->generateFromArrayGetValue($property, $sourceVar); return $this->getConverter($builder, $property, true, $source); } - private function generateFromArrayGetValue(PropertyDefinition $property, Variable $sourceVar) : Expr + private function generateFromArrayGetValue(PropertyDefinition $property, Variable $sourceVar): Expr { return new ArrayDimFetch($sourceVar, new String_($property->getSpecPropertyName())); } - private function getConverter(FileBuilder $builder, PropertyDefinition $property, bool $deserialize, Expr $source) : Expr + private function getConverter(FileBuilder $builder, PropertyDefinition $property, bool $deserialize, Expr $source): Expr { $converter = null; $objectType = $property->getObjectTypeDefinition(); if ($objectType !== null) { if ($deserialize) { - $converter = static fn (Expr $v) : Expr => new StaticCall(new Name($builder->getReference($objectType)), 'fromArray', [new Arg($v)]); + $converter = static fn (Expr $v): Expr => new StaticCall(new Name($builder->getReference($objectType)), 'fromArray', [new Arg($v)]); } else { - $converter = static fn (Expr $v) : Expr => new MethodCall($v, 'toArray'); + $converter = static fn (Expr $v): Expr => new MethodCall($v, 'toArray'); } } if ($property->isArray() && $converter !== null) { - $converter = fn (Expr $v) : Expr => $this->factory->funcCall('array_map', [ + $converter = fn (Expr $v): Expr => $this->factory->funcCall('array_map', [ new ArrowFunction( [ 'static' => true, @@ -397,7 +398,7 @@ private function getConverter(FileBuilder $builder, PropertyDefinition $property } if ($property->isNullable() && $converter !== null) { - $converter = fn (Expr $v) : Expr => new Ternary( + $converter = fn (Expr $v): Expr => new Ternary( new Identical($this->factory->val(null), $v), $this->factory->val(null), $converter($v) diff --git a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php index eb5f816..cea6727 100644 --- a/src/CodeGenerator/PhpParserGenerators/FileBuilder.php +++ b/src/CodeGenerator/PhpParserGenerators/FileBuilder.php @@ -10,6 +10,7 @@ use PhpParser\Builder\Use_; use PhpParser\Node; use PhpParser\Node\Stmt\Use_ as UseStmt; + use function array_search; use function Safe\preg_match; use function Safe\preg_replace; @@ -29,7 +30,7 @@ public function __construct(ClassDefinition $definition) $this->namespace = new Namespace_($definition->getNamespace()); } - public function getReference(ClassDefinition $class) : string + public function getReference(ClassDefinition $class): string { $fullName = $class->getFQCN(); @@ -62,7 +63,7 @@ public function getReference(ClassDefinition $class) : string * @psalm-suppress PossiblyNullArrayAccess * @psalm-suppress InvalidReturnStatement */ - private function rename(string $class) : string + private function rename(string $class): string { if (substr($class, -1) === '_') { return $class . '1'; @@ -71,7 +72,7 @@ private function rename(string $class) : string if (preg_match('"_(\d+)$"', $class, $match)) { $oldNumber = (int) $match[1]; - return preg_replace('"_\d+$"', '_' . ($oldNumber+1), $class); + return preg_replace('"_\d+$"', '_' . ($oldNumber + 1), $class); } return $class . '_'; @@ -84,14 +85,14 @@ private function rename(string $class) : string * * @return $this The builder instance (for fluid interface) */ - public function addStmt($stmt) : self + public function addStmt($stmt): self { $this->namespace->addStmt($stmt); return $this; } - public function getNamespace() : Namespace_ + public function getNamespace(): Namespace_ { return $this->namespace; } diff --git a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php index 3b95713..97d99f3 100644 --- a/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/InterfaceCodeGenerator.php @@ -7,12 +7,13 @@ use OnMoon\OpenApiServerBundle\CodeGenerator\Definitions\GeneratedFileDefinition; use OnMoon\OpenApiServerBundle\CodeGenerator\Definitions\GeneratedInterfaceDefinition; use OnMoon\OpenApiServerBundle\CodeGenerator\Definitions\RequestHandlerInterfaceDefinition; + use function count; use function Safe\sprintf; class InterfaceCodeGenerator extends CodeGenerator { - public function generate(GeneratedInterfaceDefinition $definition) : GeneratedFileDefinition + public function generate(GeneratedInterfaceDefinition $definition): GeneratedFileDefinition { $fileBuilder = new FileBuilder($definition); diff --git a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php index 1d9d6ef..3dc6fd8 100644 --- a/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php +++ b/src/CodeGenerator/PhpParserGenerators/ServiceSubscriberCodeGenerator.php @@ -22,11 +22,12 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use Psr\Container\ContainerInterface; + use function Safe\sprintf; class ServiceSubscriberCodeGenerator extends CodeGenerator { - public function generate(GraphDefinition $graphDefinition) : GeneratedFileDefinition + public function generate(GraphDefinition $graphDefinition): GeneratedFileDefinition { $subscriberDefinition = $graphDefinition->getServiceSubscriber(); diff --git a/src/Command/DeleteGeneratedCodeCommand.php b/src/Command/DeleteGeneratedCodeCommand.php index 0c6f6f6..7e90c78 100644 --- a/src/Command/DeleteGeneratedCodeCommand.php +++ b/src/Command/DeleteGeneratedCodeCommand.php @@ -14,6 +14,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; + use function is_dir; use function Safe\rmdir; use function Safe\sprintf; @@ -38,7 +39,7 @@ public function __construct(string $rootPath, ?string $name = null) */ protected static $defaultName = self::COMMAND; - protected function configure() : void + protected function configure(): void { $this ->setDescription('Deletes API server code generated by the bundle') @@ -49,7 +50,7 @@ protected function configure() : void ); } - protected function execute(InputInterface $input, OutputInterface $output) : int + protected function execute(InputInterface $input, OutputInterface $output): int { if (! $input->getOption('yes')) { /** @var QuestionHelper $questionHelper */ @@ -73,7 +74,7 @@ protected function execute(InputInterface $input, OutputInterface $output) : int return 0; } - private function recursiveDelete(string $directoryPath) : void + private function recursiveDelete(string $directoryPath): void { if (! is_dir($directoryPath)) { return; diff --git a/src/Command/GenerateApiCodeCommand.php b/src/Command/GenerateApiCodeCommand.php index 15cb4cc..9696a56 100644 --- a/src/Command/GenerateApiCodeCommand.php +++ b/src/Command/GenerateApiCodeCommand.php @@ -10,6 +10,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Contracts\Cache\TagAwareCacheInterface; + use function Safe\sprintf; class GenerateApiCodeCommand extends Command @@ -33,7 +34,7 @@ public function __construct( parent::__construct($name); } - protected function configure() : void + protected function configure(): void { $this->setDescription('Generates API server code'); } @@ -44,7 +45,7 @@ protected function configure() : void */ protected static $defaultName = self::COMMAND; - protected function execute(InputInterface $input, OutputInterface $output) : int + protected function execute(InputInterface $input, OutputInterface $output): int { $this->cache->invalidateTags([SpecificationLoader::CACHE_TAG]); $this->apiServerCodeGenerator->generate(); diff --git a/src/Command/RefreshApiCodeCommand.php b/src/Command/RefreshApiCodeCommand.php index d139528..f25ca8b 100644 --- a/src/Command/RefreshApiCodeCommand.php +++ b/src/Command/RefreshApiCodeCommand.php @@ -11,6 +11,7 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; use Symfony\Component\Process\Process; + use function Safe\sprintf; class RefreshApiCodeCommand extends Command @@ -30,12 +31,12 @@ public function __construct(string $rootPath, ?string $name = null) */ protected static $defaultName = 'open-api:refresh'; - protected function configure() : void + protected function configure(): void { $this->setDescription('Refreshes API server code'); } - protected function execute(InputInterface $input, OutputInterface $output) : int + protected function execute(InputInterface $input, OutputInterface $output): int { if (! $this->isConfirmed($input, $output)) { return 0; @@ -49,7 +50,7 @@ protected function execute(InputInterface $input, OutputInterface $output) : int 1; } - private function isConfirmed(InputInterface $input, OutputInterface $output) : bool + private function isConfirmed(InputInterface $input, OutputInterface $output): bool { /** @var QuestionHelper $questionHelper */ $questionHelper = $this->getHelper('question'); @@ -64,9 +65,9 @@ private function isConfirmed(InputInterface $input, OutputInterface $output) : b return (bool) $questionHelper->ask($input, $output, $question); } - private function processOutputHandler(OutputInterface $output) : callable + private function processOutputHandler(OutputInterface $output): callable { - return static function (string $type, string $data) use ($output) : void { + return static function (string $type, string $data) use ($output): void { if ($type === Process::ERR && $output instanceof ConsoleOutputInterface) { $output->getErrorOutput()->writeln($data); diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index f291007..c01f5da 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -33,9 +33,11 @@ use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouterInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; + use function count; use function ltrim; use function Safe\sprintf; + use const JSON_PRETTY_PRINT; use const JSON_THROW_ON_ERROR; use const JSON_UNESCAPED_UNICODE; @@ -63,12 +65,12 @@ public function __construct( $this->requestValidator = $requestValidator; } - public function setApiLoader(ApiLoader $loader) : void + public function setApiLoader(ApiLoader $loader): void { $this->apiLoader = $loader; } - public function handle(Request $request) : Response + public function handle(Request $request): Response { $route = $this->getRoute($request); $operationId = (string) $route->getOption(RouteLoader::OPENAPI_OPERATION); @@ -96,12 +98,12 @@ public function handle(Request $request) : Response return $response; } - private function getSpecificationName(Route $route) : string + private function getSpecificationName(Route $route): string { return (string) $route->getOption(RouteLoader::OPENAPI_SPEC); } - private function getSpecification(Route $route) : Specification + private function getSpecification(Route $route): Specification { return $this->specificationLoader->load($this->getSpecificationName($route)); } @@ -113,7 +115,7 @@ private function createRequestDto( Request $request, Operation $operation, string $inputDtoClass - ) : Dto { + ): Dto { return $this->serializer->createRequestDto( $request, $operation, @@ -125,7 +127,7 @@ private function executeRequestHandler( RequestHandler $requestHandler, string $methodName, ?Dto $requestDto - ) : ?ResponseDto { + ): ?ResponseDto { /** @var ResponseDto|null $responseDto */ $responseDto = $requestDto !== null ? $requestHandler->{$methodName}($requestDto) : @@ -137,7 +139,7 @@ private function executeRequestHandler( /** * @return array{0: class-string, 1: RequestHandler} */ - private function getRequestHandler(Request $request, Operation $operation) : array + private function getRequestHandler(Request $request, Operation $operation): array { if ($this->apiLoader === null) { throw ApiCallFailed::becauseApiLoaderNotFound(); @@ -167,7 +169,7 @@ private function getRequestHandler(Request $request, Operation $operation) : arr return [$requestHandlerInterface, $requestHandler]; } - private function createResponse(RequestHandler $requestHandler, Operation $operation, ?ResponseDto $responseDto = null) : Response + private function createResponse(RequestHandler $requestHandler, Operation $operation, ?ResponseDto $responseDto = null): Response { $response = new JsonResponse(); $response->setEncodingOptions(JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR); @@ -192,7 +194,7 @@ private function createResponse(RequestHandler $requestHandler, Operation $opera return $response; } - private function getRoute(Request $request) : Route + private function getRoute(Request $request): Route { $routeName = (string) $request->attributes->get('_route', ''); $route = $this->router->getRouteCollection()->get($routeName); @@ -209,7 +211,7 @@ private function getRoute(Request $request) : Route * * @psalm-param class-string $requestHandlerInterface */ - private function getMethodAndInputDtoFQCN(string $requestHandlerInterface) : array + private function getMethodAndInputDtoFQCN(string $requestHandlerInterface): array { $interfaceReflectionClass = new ReflectionClass($requestHandlerInterface); $methods = $interfaceReflectionClass->getMethods(ReflectionMethod::IS_PUBLIC); diff --git a/src/DependencyInjection/CompilerPass.php b/src/DependencyInjection/CompilerPass.php index 31b4777..65660b5 100644 --- a/src/DependencyInjection/CompilerPass.php +++ b/src/DependencyInjection/CompilerPass.php @@ -18,7 +18,7 @@ public function __construct(string $tag) $this->tag = $tag; } - public function process(ContainerBuilder $container) : void + public function process(ContainerBuilder $container): void { if (! $container->has(ApiController::class)) { return; diff --git a/src/DependencyInjection/OpenApiServerExtension.php b/src/DependencyInjection/OpenApiServerExtension.php index 5e464e6..edb0f8c 100644 --- a/src/DependencyInjection/OpenApiServerExtension.php +++ b/src/DependencyInjection/OpenApiServerExtension.php @@ -11,6 +11,7 @@ use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; + use function Safe\preg_match; use function Safe\preg_replace; use function str_replace; @@ -20,7 +21,7 @@ class OpenApiServerExtension extends Extension implements ExtensionInterface /** * @param mixed[] $configs */ - public function load(array $configs, ContainerBuilder $container) : void + public function load(array $configs, ContainerBuilder $container): void { $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); $loader->load('services.xml'); @@ -52,10 +53,11 @@ public function load(array $configs, ContainerBuilder $container) : void 'using App namespace for generated code.'); } + /** @var string $rootPath */ $rootPath = preg_replace('|^App\\\\|', '%kernel.project_dir%/src/', $rootNameSpace); $rootPath = str_replace('\\', '/', $rootPath); } else { - $rootPath = $config['root_path']; + $rootPath = $config['root_path']; // @phpstan-ignore-line } $container->setParameter('openapi.generated.code.root.path', $rootPath); diff --git a/src/Event/CodeGenerator/ClassGraphReadyEvent.php b/src/Event/CodeGenerator/ClassGraphReadyEvent.php index 9cf52f7..043b156 100644 --- a/src/Event/CodeGenerator/ClassGraphReadyEvent.php +++ b/src/Event/CodeGenerator/ClassGraphReadyEvent.php @@ -26,7 +26,7 @@ public function __construct(GraphDefinition $graph) $this->graph = $graph; } - public function graph() : GraphDefinition + public function graph(): GraphDefinition { return $this->graph; } diff --git a/src/Event/CodeGenerator/FilesReadyEvent.php b/src/Event/CodeGenerator/FilesReadyEvent.php index 7277518..1ad1153 100644 --- a/src/Event/CodeGenerator/FilesReadyEvent.php +++ b/src/Event/CodeGenerator/FilesReadyEvent.php @@ -30,7 +30,7 @@ public function __construct(array $files) /** * @return GeneratedFileDefinition[] */ - public function files() : array + public function files(): array { return $this->files; } diff --git a/src/Event/Server/RequestDtoEvent.php b/src/Event/Server/RequestDtoEvent.php index 0edbedb..f78b4b7 100644 --- a/src/Event/Server/RequestDtoEvent.php +++ b/src/Event/Server/RequestDtoEvent.php @@ -35,17 +35,17 @@ public function __construct(?Dto $requestDto, string $operationId, Specification $this->specification = $specification; } - public function getRequestDto() : ?Dto + public function getRequestDto(): ?Dto { return $this->requestDto; } - public function getOperationId() : string + public function getOperationId(): string { return $this->operationId; } - public function getSpecification() : Specification + public function getSpecification(): Specification { return $this->specification; } diff --git a/src/Event/Server/RequestEvent.php b/src/Event/Server/RequestEvent.php index 4f4a5e8..6f7b22c 100644 --- a/src/Event/Server/RequestEvent.php +++ b/src/Event/Server/RequestEvent.php @@ -29,17 +29,17 @@ public function __construct(Request $request, string $operationId, Specification $this->specification = $specification; } - public function getRequest() : Request + public function getRequest(): Request { return $this->request; } - public function getOperationId() : string + public function getOperationId(): string { return $this->operationId; } - public function getSpecification() : Specification + public function getSpecification(): Specification { return $this->specification; } diff --git a/src/Event/Server/ResponseDtoEvent.php b/src/Event/Server/ResponseDtoEvent.php index 70baa86..507b4e7 100644 --- a/src/Event/Server/ResponseDtoEvent.php +++ b/src/Event/Server/ResponseDtoEvent.php @@ -37,17 +37,17 @@ public function __construct(?ResponseDto $responseDto, string $operationId, Spec $this->specification = $specification; } - public function getResponseDto() : ?ResponseDto + public function getResponseDto(): ?ResponseDto { return $this->responseDto; } - public function getOperationId() : string + public function getOperationId(): string { return $this->operationId; } - public function getSpecification() : Specification + public function getSpecification(): Specification { return $this->specification; } diff --git a/src/Event/Server/ResponseEvent.php b/src/Event/Server/ResponseEvent.php index 564aad1..b704aed 100644 --- a/src/Event/Server/ResponseEvent.php +++ b/src/Event/Server/ResponseEvent.php @@ -28,17 +28,17 @@ public function __construct(Response $response, string $operationId, Specificati $this->specification = $specification; } - public function getResponse() : Response + public function getResponse(): Response { return $this->response; } - public function getOperationId() : string + public function getOperationId(): string { return $this->operationId; } - public function getSpecification() : Specification + public function getSpecification(): Specification { return $this->specification; } diff --git a/src/Exception/ApiCallFailed.php b/src/Exception/ApiCallFailed.php index 3e2f3bd..e54fedd 100644 --- a/src/Exception/ApiCallFailed.php +++ b/src/Exception/ApiCallFailed.php @@ -8,12 +8,12 @@ class ApiCallFailed extends OpenApiError { - public static function becauseApiLoaderNotFound() : self + public static function becauseApiLoaderNotFound(): self { return new self('ApiLoader not found. Try re-generating code'); } - public static function becauseNotImplemented(string $interface) : self + public static function becauseNotImplemented(string $interface): self { return new self( sprintf( diff --git a/src/Exception/CannotParseOpenApi.php b/src/Exception/CannotParseOpenApi.php index 27467f4..14936a5 100644 --- a/src/Exception/CannotParseOpenApi.php +++ b/src/Exception/CannotParseOpenApi.php @@ -9,7 +9,7 @@ final class CannotParseOpenApi extends OpenApiError { /** @param string[] $context */ - public static function becauseNoOperationIdSpecified(array $context) : self + public static function becauseNoOperationIdSpecified(array $context): self { return new self( sprintf( @@ -22,7 +22,7 @@ public static function becauseNoOperationIdSpecified(array $context) : self } /** @param string[] $context */ - public static function becauseDuplicateOperationId(string $id, array $context) : self + public static function becauseDuplicateOperationId(string $id, array $context): self { return new self( sprintf( @@ -39,7 +39,7 @@ public static function becauseDuplicateOperationId(string $id, array $context) : public static function becauseRootIsNotObject( array $context, bool $isArray - ) : self { + ): self { $moreInfo = ''; if ($isArray) { $moreInfo = '(array as root is insecure, see https://haacked.com/archive/2009/06/25/json-hijacking.aspx/) '; @@ -58,7 +58,7 @@ public static function becauseRootIsNotObject( } /** @param string[] $context */ - public static function becauseOnlyScalarAreAllowed(string $propertyName, array $context) : self + public static function becauseOnlyScalarAreAllowed(string $propertyName, array $context): self { return new self( sprintf( @@ -73,7 +73,7 @@ public static function becauseOnlyScalarAreAllowed(string $propertyName, array $ } /** @param string[] $context */ - public static function becauseArrayIsNotDescribed(string $propertyName, array $context) : self + public static function becauseArrayIsNotDescribed(string $propertyName, array $context): self { return new self( sprintf( @@ -88,7 +88,7 @@ public static function becauseArrayIsNotDescribed(string $propertyName, array $c } /** @param string[] $context */ - public static function becauseTypeNotSupported(string $propertyName, string $type, array $context) : self + public static function becauseTypeNotSupported(string $propertyName, string $type, array $context): self { return new self( sprintf( diff --git a/src/Interfaces/ApiLoader.php b/src/Interfaces/ApiLoader.php index 6371c10..4706880 100644 --- a/src/Interfaces/ApiLoader.php +++ b/src/Interfaces/ApiLoader.php @@ -8,5 +8,5 @@ interface ApiLoader extends ServiceSubscriberInterface { - public function get(string $interfaceName) : ?RequestHandler; + public function get(string $interfaceName): ?RequestHandler; } diff --git a/src/Interfaces/Dto.php b/src/Interfaces/Dto.php index 714fe9d..5b310ea 100644 --- a/src/Interfaces/Dto.php +++ b/src/Interfaces/Dto.php @@ -11,12 +11,12 @@ interface Dto * * @return mixed[] */ - public function toArray() : array; + public function toArray(): array; /** * Generate Dto tree from normalized array * * @param mixed[] $data */ - public static function fromArray(array $data) : self; + public static function fromArray(array $data): self; } diff --git a/src/Interfaces/GetResponseCode.php b/src/Interfaces/GetResponseCode.php index 3a1f4ec..fc4bd5f 100644 --- a/src/Interfaces/GetResponseCode.php +++ b/src/Interfaces/GetResponseCode.php @@ -6,5 +6,5 @@ interface GetResponseCode { - public function getResponseCode(?int $guessedCode) : ?int; + public function getResponseCode(?int $guessedCode): ?int; } diff --git a/src/Interfaces/ResponseDto.php b/src/Interfaces/ResponseDto.php index 0100e64..ce71b73 100644 --- a/src/Interfaces/ResponseDto.php +++ b/src/Interfaces/ResponseDto.php @@ -4,10 +4,11 @@ namespace OnMoon\OpenApiServerBundle\Interfaces; +// phpcs:disable PSR2.Methods.MethodDeclaration.Underscore interface ResponseDto extends Dto { /** * @internal */ - public static function _getResponseCode() : string; + public static function _getResponseCode(): string; } diff --git a/src/Interfaces/SetClientIp.php b/src/Interfaces/SetClientIp.php index 19733d9..995beec 100644 --- a/src/Interfaces/SetClientIp.php +++ b/src/Interfaces/SetClientIp.php @@ -6,5 +6,5 @@ interface SetClientIp { - public function setClientIp(string $ip) : void; + public function setClientIp(string $ip): void; } diff --git a/src/Interfaces/SetRequest.php b/src/Interfaces/SetRequest.php index 374c3f4..6fa502d 100644 --- a/src/Interfaces/SetRequest.php +++ b/src/Interfaces/SetRequest.php @@ -8,5 +8,5 @@ interface SetRequest { - public function setRequest(Request $request) : void; + public function setRequest(Request $request): void; } diff --git a/src/OpenApiServerBundle.php b/src/OpenApiServerBundle.php index 071b3a4..b75db5f 100644 --- a/src/OpenApiServerBundle.php +++ b/src/OpenApiServerBundle.php @@ -13,7 +13,7 @@ class OpenApiServerBundle extends Bundle { public const API_LOADER_TAG = 'openapi.api_loader'; - public function build(ContainerBuilder $container) : void + public function build(ContainerBuilder $container): void { $container->registerForAutoconfiguration(ApiLoader::class)->addTag(self::API_LOADER_TAG); $container->addCompilerPass(new CompilerPass(self::API_LOADER_TAG)); diff --git a/src/Router/RouteLoader.php b/src/Router/RouteLoader.php index 98b034f..58eef81 100644 --- a/src/Router/RouteLoader.php +++ b/src/Router/RouteLoader.php @@ -11,6 +11,7 @@ use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; + use function array_key_exists; class RouteLoader extends Loader implements LoaderInterface @@ -30,7 +31,7 @@ public function __construct(SpecificationLoader $loader, ArgumentResolver $argum /** * @inheritDoc */ - public function load($resource, $type = null) : RouteCollection + public function load($resource, ?string $type = null): RouteCollection { $specName = (string) $resource; $specification = $this->loader->load($specName); @@ -63,7 +64,7 @@ public function load($resource, $type = null) : RouteCollection /** * @inheritDoc */ - public function supports($resource, $type = null) + public function supports($resource, ?string $type = null) { return $type === self::OPENAPI_TYPE; } diff --git a/src/Serializer/ArrayDtoSerializer.php b/src/Serializer/ArrayDtoSerializer.php index dad313c..42975a4 100644 --- a/src/Serializer/ArrayDtoSerializer.php +++ b/src/Serializer/ArrayDtoSerializer.php @@ -11,6 +11,7 @@ use OnMoon\OpenApiServerBundle\Specification\Definitions\Operation; use OnMoon\OpenApiServerBundle\Types\ScalarTypesResolver; use Symfony\Component\HttpFoundation\Request; + use function array_key_exists; use function array_map; use function is_resource; @@ -31,7 +32,7 @@ public function createRequestDto( Request $request, Operation $operation, string $inputDtoFQCN - ) : Dto { + ): Dto { /** @var mixed[] $input */ $input = []; $params = $operation->getRequestParameters(); @@ -68,7 +69,7 @@ public function createRequestDto( } /** @inheritDoc */ - public function createResponseFromDto(ResponseDto $responseDto, Operation $operation) : array + public function createResponseFromDto(ResponseDto $responseDto, Operation $operation): array { $statusCode = $responseDto::_getResponseCode(); $source = $responseDto->toArray(); @@ -86,7 +87,7 @@ public function createResponseFromDto(ResponseDto $responseDto, Operation $opera * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment */ - private function convert(bool $deserialize, array $source, ObjectType $params) : array + private function convert(bool $deserialize, array $source, ObjectType $params): array { $result = []; foreach ($params->getProperties() as $property) { @@ -98,7 +99,8 @@ private function convert(bool $deserialize, array $source, ObjectType $params) : if (! $deserialize && $source[$name] === null) { $value = $property->getDefaultValue(); - if ($property->isRequired() || $value !== null || + if ( + $property->isRequired() || $value !== null || ($this->sendNotRequiredNullableNulls && $property->isNullable()) ) { $result[$name] = $value; @@ -111,13 +113,16 @@ private function convert(bool $deserialize, array $source, ObjectType $params) : $objectType = $property->getObjectTypeDefinition(); if ($objectType !== null) { - $converter = fn($v) => $this->convert($deserialize, $v, $objectType); + /** @psalm-suppress MissingClosureParamType */ + $converter = fn ($v) => $this->convert($deserialize, $v, $objectType); } else { - $converter = fn($v) => $this->resolver->convert($deserialize, $typeId??0, $v); + /** @psalm-suppress MissingClosureParamType */ + $converter = fn ($v) => $this->resolver->convert($deserialize, $typeId ?? 0, $v); } if ($property->isArray()) { - $converter = static fn($v) => array_map(static fn ($i) => $converter($i), $v); + /** @psalm-suppress MissingClosureParamType */ + $converter = static fn ($v) => array_map(static fn ($i) => $converter($i), $v); } $result[$name] = $converter($source[$name]); diff --git a/src/Serializer/DtoSerializer.php b/src/Serializer/DtoSerializer.php index 8d1c708..de7ff53 100644 --- a/src/Serializer/DtoSerializer.php +++ b/src/Serializer/DtoSerializer.php @@ -18,8 +18,8 @@ public function createRequestDto( Request $request, Operation $operation, string $inputDtoFQCN - ) : Dto; + ): Dto; /** @return mixed[] */ - public function createResponseFromDto(ResponseDto $responseDto, Operation $operation) : array; + public function createResponseFromDto(ResponseDto $responseDto, Operation $operation): array; } diff --git a/src/Specification/Definitions/ObjectType.php b/src/Specification/Definitions/ObjectType.php index e9895ea..7537864 100644 --- a/src/Specification/Definitions/ObjectType.php +++ b/src/Specification/Definitions/ObjectType.php @@ -20,7 +20,7 @@ public function __construct(array $properties) /** * @return Property[] */ - public function getProperties() : array + public function getProperties(): array { return $this->properties; } diff --git a/src/Specification/Definitions/Operation.php b/src/Specification/Definitions/Operation.php index 0b9fe35..bed4f54 100644 --- a/src/Specification/Definitions/Operation.php +++ b/src/Specification/Definitions/Operation.php @@ -41,27 +41,27 @@ public function __construct(string $url, string $method, string $requestHandlerN $this->responses = $responses; } - public function getUrl() : string + public function getUrl(): string { return $this->url; } - public function getMethod() : string + public function getMethod(): string { return $this->method; } - public function getRequestHandlerName() : string + public function getRequestHandlerName(): string { return $this->requestHandlerName; } - public function getSummary() : ?string + public function getSummary(): ?string { return $this->summary; } - public function getRequestBody() : ?ObjectType + public function getRequestBody(): ?ObjectType { return $this->requestBody; } @@ -71,7 +71,7 @@ public function getRequestBody() : ?ObjectType * * @psalm-return array */ - public function getRequestParameters() : array + public function getRequestParameters(): array { return $this->requestParameters; } @@ -81,12 +81,12 @@ public function getRequestParameters() : array * * @psalm-return array */ - public function getResponses() : array + public function getResponses(): array { return $this->responses; } - public function getResponse(string $code) : ObjectType + public function getResponse(string $code): ObjectType { return $this->responses[$code]; } diff --git a/src/Specification/Definitions/Property.php b/src/Specification/Definitions/Property.php index 150539d..140903b 100644 --- a/src/Specification/Definitions/Property.php +++ b/src/Specification/Definitions/Property.php @@ -23,12 +23,12 @@ public function __construct(string $name) $this->name = $name; } - public function getName() : string + public function getName(): string { return $this->name; } - public function isArray() : bool + public function isArray(): bool { return $this->array; } @@ -36,7 +36,7 @@ public function isArray() : bool /** * @return Property */ - public function setArray(bool $array) : self + public function setArray(bool $array): self { $this->array = $array; @@ -54,14 +54,14 @@ public function getDefaultValue() /** * @param bool|float|int|string|null $defaultValue */ - public function setDefaultValue($defaultValue) : Property + public function setDefaultValue($defaultValue): Property { $this->defaultValue = $defaultValue; return $this; } - public function isRequired() : bool + public function isRequired(): bool { return $this->required; } @@ -69,14 +69,14 @@ public function isRequired() : bool /** * @return Property */ - public function setRequired(bool $required) : self + public function setRequired(bool $required): self { $this->required = $required; return $this; } - public function getScalarTypeId() : ?int + public function getScalarTypeId(): ?int { return $this->scalarTypeId; } @@ -84,14 +84,14 @@ public function getScalarTypeId() : ?int /** * @return Property */ - public function setScalarTypeId(?int $scalarTypeId) : self + public function setScalarTypeId(?int $scalarTypeId): self { $this->scalarTypeId = $scalarTypeId; return $this; } - public function getObjectTypeDefinition() : ?ObjectType + public function getObjectTypeDefinition(): ?ObjectType { return $this->objectTypeDefinition; } @@ -99,14 +99,14 @@ public function getObjectTypeDefinition() : ?ObjectType /** * @return Property */ - public function setObjectTypeDefinition(?ObjectType $objectTypeDefinition) : self + public function setObjectTypeDefinition(?ObjectType $objectTypeDefinition): self { $this->objectTypeDefinition = $objectTypeDefinition; return $this; } - public function getDescription() : ?string + public function getDescription(): ?string { return $this->description; } @@ -114,14 +114,14 @@ public function getDescription() : ?string /** * @return Property */ - public function setDescription(?string $description) : self + public function setDescription(?string $description): self { $this->description = $description; return $this; } - public function getPattern() : ?string + public function getPattern(): ?string { return $this->pattern; } @@ -129,19 +129,19 @@ public function getPattern() : ?string /** * @return Property */ - public function setPattern(?string $pattern) : self + public function setPattern(?string $pattern): self { $this->pattern = $pattern; return $this; } - public function isNullable() : bool + public function isNullable(): bool { return $this->nullable; } - public function setNullable(bool $nullable) : self + public function setNullable(bool $nullable): self { $this->nullable = $nullable; diff --git a/src/Specification/Definitions/Specification.php b/src/Specification/Definitions/Specification.php index 003e108..087797f 100644 --- a/src/Specification/Definitions/Specification.php +++ b/src/Specification/Definitions/Specification.php @@ -31,17 +31,17 @@ public function __construct(array $operations, OpenApi $openApi) * * @psalm-return array */ - public function getOperations() : array + public function getOperations(): array { return $this->operations; } - public function getOperation(string $id) : Operation + public function getOperation(string $id): Operation { return $this->operations[$id]; } - public function getOpenApi() : OpenApi + public function getOpenApi(): OpenApi { return $this->openApi; } diff --git a/src/Specification/Definitions/SpecificationConfig.php b/src/Specification/Definitions/SpecificationConfig.php index c0a242f..9eb7c39 100644 --- a/src/Specification/Definitions/SpecificationConfig.php +++ b/src/Specification/Definitions/SpecificationConfig.php @@ -19,22 +19,22 @@ public function __construct(string $path, ?string $type, string $nameSpace, stri $this->mediaType = $mediaType; } - public function getPath() : string + public function getPath(): string { return $this->path; } - public function getType() : ?string + public function getType(): ?string { return $this->type; } - public function getNameSpace() : string + public function getNameSpace(): string { return $this->nameSpace; } - public function getMediaType() : string + public function getMediaType(): string { return $this->mediaType; } diff --git a/src/Specification/SpecificationLoader.php b/src/Specification/SpecificationLoader.php index 9dec21e..60a3817 100644 --- a/src/Specification/SpecificationLoader.php +++ b/src/Specification/SpecificationLoader.php @@ -12,6 +12,7 @@ use Symfony\Component\Config\FileLocatorInterface; use Symfony\Contracts\Cache\ItemInterface; use Symfony\Contracts\Cache\TagAwareCacheInterface; + use function array_keys; use function file_exists; use function implode; @@ -19,6 +20,7 @@ use function pathinfo; use function Safe\sprintf; use function stream_is_local; + use const PATHINFO_EXTENSION; class SpecificationLoader @@ -45,7 +47,7 @@ public function __construct(SpecificationParser $parser, FileLocatorInterface $l /** * @param string[] $spec */ - public function registerSpec(string $name, array $spec) : void + public function registerSpec(string $name, array $spec): void { $this->specs[$name] = new SpecificationConfig( $spec['path'], @@ -60,12 +62,12 @@ public function registerSpec(string $name, array $spec) : void * * @psalm-return array */ - public function list() : array + public function list(): array { return $this->specs; } - public function get(string $name) : SpecificationConfig + public function get(string $name): SpecificationConfig { if (empty($this->specs[$name])) { throw new Exception('OpenApi spec "' . $name . '" is not registered in bundle config, ' . @@ -75,12 +77,12 @@ public function get(string $name) : SpecificationConfig return $this->specs[$name]; } - public function load(string $name) : Specification + public function load(string $name): Specification { /** @var Specification $parsedSpecification */ $parsedSpecification = $this->cache->get( self::CACHE_KEY_PREFIX . $name, - function (ItemInterface $cacheItem) use ($name) : Specification { + function (ItemInterface $cacheItem) use ($name): Specification { $cacheItem->tag(self::CACHE_TAG); return $this->parseSpecification($name, $this->get($name)); @@ -90,7 +92,7 @@ function (ItemInterface $cacheItem) use ($name) : Specification { return $parsedSpecification; } - private function parseSpecification(string $specificationName, SpecificationConfig $specificationConfig) : Specification + private function parseSpecification(string $specificationName, SpecificationConfig $specificationConfig): Specification { $specPath = $this->locator->locate($specificationConfig->getPath()); diff --git a/src/Specification/SpecificationParser.php b/src/Specification/SpecificationParser.php index a241528..88c9921 100644 --- a/src/Specification/SpecificationParser.php +++ b/src/Specification/SpecificationParser.php @@ -24,6 +24,7 @@ use OnMoon\OpenApiServerBundle\Specification\Definitions\SpecificationConfig; use OnMoon\OpenApiServerBundle\Types\ScalarTypesResolver; use Safe\DateTime; + use function array_filter; use function array_key_exists; use function array_map; @@ -42,7 +43,7 @@ public function __construct(ScalarTypesResolver $typeResolver) $this->typeResolver = $typeResolver; } - public function parseOpenApi(string $specificationName, SpecificationConfig $specificationConfig, OpenApi $parsedSpecification) : Specification + public function parseOpenApi(string $specificationName, SpecificationConfig $specificationConfig, OpenApi $parsedSpecification): Specification { $operationDefinitions = []; /** @@ -123,7 +124,7 @@ private function getResponseDtoDefinitions( $responses, SpecificationConfig $specificationConfig, array $exceptionContext - ) : array { + ): array { $responseDefinitions = []; if ($responses === null) { @@ -159,7 +160,7 @@ private function getResponseDtoDefinitions( /** * @param RequestBody|Response|Reference|null $body */ - private function findByMediaType($body, string $mediaType) : ?Schema + private function findByMediaType($body, string $mediaType): ?Schema { if ($body === null || $body instanceof Reference) { return null; @@ -183,10 +184,10 @@ private function findByMediaType($body, string $mediaType) : ?Schema * * @return Parameter[] */ - private function filterParameters(array $parameters) : array + private function filterParameters(array $parameters): array { /** @var Parameter[] $parameters */ - $parameters = array_filter($parameters, static fn ($parameter) : bool => $parameter instanceof Parameter); + $parameters = array_filter($parameters, static fn ($parameter): bool => $parameter instanceof Parameter); return $parameters; } @@ -194,18 +195,18 @@ private function filterParameters(array $parameters) : array /** * @return Parameter[] */ - private function mergeParameters(PathItem $pathItem, Operation $operation) : array + private function mergeParameters(PathItem $pathItem, Operation $operation): array { $operationParameters = $this->filterParameters($operation->parameters); return array_merge( array_filter( $this->filterParameters($pathItem->parameters), - static function (Parameter $pathParameter) use ($operationParameters) : bool { + static function (Parameter $pathParameter) use ($operationParameters): bool { return count( array_filter( $operationParameters, - static function (Parameter $operationParameter) use ($pathParameter) : bool { + static function (Parameter $operationParameter) use ($pathParameter): bool { return $operationParameter->name === $pathParameter->name && $operationParameter->in === $pathParameter->in; } @@ -222,20 +223,19 @@ static function (Parameter $operationParameter) use ($pathParameter) : bool { * * @return Parameter[] */ - private function filterSupportedParameters(string $in, array $parameters) : array + private function filterSupportedParameters(string $in, array $parameters): array { - return array_filter($parameters, static fn ($parameter) : bool => $parameter->in === $in); + return array_filter($parameters, static fn ($parameter): bool => $parameter->in === $in); } /** * @param Parameter[] $parameters * @param string[] $exceptionContext */ - private function parseParameters(string $in, array $parameters, array $exceptionContext) : ?ObjectDefinition + private function parseParameters(string $in, array $parameters, array $exceptionContext): ?ObjectDefinition { $properties = array_map( - fn (Parameter $p) => - $this + fn (Parameter $p) => $this ->getProperty($p->name, $p->schema, true, $exceptionContext, false) ->setRequired($p->required) ->setDescription($p->description), @@ -254,7 +254,7 @@ private function parseParameters(string $in, array $parameters, array $exception * * @return PropertyDefinition[] */ - private function getPropertyGraph(Schema $schema, bool $isRequest, bool $isRoot, array $exceptionContext) : array + private function getPropertyGraph(Schema $schema, bool $isRequest, bool $isRoot, array $exceptionContext): array { if ($isRoot && $schema->type !== Type::OBJECT) { throw CannotParseOpenApi::becauseRootIsNotObject( @@ -290,7 +290,7 @@ private function getPropertyGraph(Schema $schema, bool $isRequest, bool $isRoot, * @param Schema|Reference|null $property * @param string[] $exceptionContext */ - private function getProperty(string $propertyName, $property, bool $isRequest, array $exceptionContext, bool $allowNonScalar = true) : PropertyDefinition + private function getProperty(string $propertyName, $property, bool $isRequest, array $exceptionContext, bool $allowNonScalar = true): PropertyDefinition { if (! ($property instanceof Schema)) { throw new Exception('Property is not scheme'); diff --git a/src/Types/ArgumentResolver.php b/src/Types/ArgumentResolver.php index c97970c..1b4d115 100644 --- a/src/Types/ArgumentResolver.php +++ b/src/Types/ArgumentResolver.php @@ -6,6 +6,7 @@ use Exception; use OnMoon\OpenApiServerBundle\Specification\Definitions\ObjectType; + use function Safe\preg_match; class ArgumentResolver @@ -18,7 +19,7 @@ public function __construct(ScalarTypesResolver $typesResolver) } /** @return string[] */ - public function resolveArgumentPatterns(ObjectType $pathParameters) : array + public function resolveArgumentPatterns(ObjectType $pathParameters): array { $patterns = []; @@ -31,7 +32,8 @@ public function resolveArgumentPatterns(ObjectType $pathParameters) : array $schemaPattern = $parameter->getPattern(); $pattern = $this->typesResolver->getPattern($type); - if ($schemaPattern !== null && + if ( + $schemaPattern !== null && preg_match('/^\^(.*)\$$/', $schemaPattern, $matches) ) { /** @psalm-suppress PossiblyNullArrayAccess */ diff --git a/src/Types/ScalarTypesResolver.php b/src/Types/ScalarTypesResolver.php index e596509..f3fd8de 100644 --- a/src/Types/ScalarTypesResolver.php +++ b/src/Types/ScalarTypesResolver.php @@ -5,6 +5,7 @@ namespace OnMoon\OpenApiServerBundle\Types; use cebe\openapi\spec\Type; + use function Safe\settype; class ScalarTypesResolver @@ -77,8 +78,12 @@ public function convert(bool $deserialize, int $id, $value) $format = $this->scalarTypes[$id]; - if (isset($format[$deserialize?'deserializer':'serializer'])) { - return TypeSerializer::{$format[$deserialize?'deserializer':'serializer']}($value); + if ($deserialize && isset($format['deserializer'])) { + return TypeSerializer::{$format['deserializer']}($value); + } + + if (! $deserialize && isset($format['serializer'])) { + return TypeSerializer::{$format['serializer']}($value); } if ($deserialize) { @@ -89,7 +94,7 @@ public function convert(bool $deserialize, int $id, $value) return $value; } - public function getPattern(int $id) : ?string + public function getPattern(int $id): ?string { $format = $this->scalarTypes[$id]; @@ -100,17 +105,17 @@ public function getPattern(int $id) : ?string return null; } - public function getPhpType(int $id) : string + public function getPhpType(int $id): string { return (string) $this->scalarTypes[$id]['phpType']; } - public function isDateTime(int $id) : bool + public function isDateTime(int $id): bool { return $this->getPhpType($id) === '\DateTime'; } - public function findScalarType(?string $type, ?string $format) : int + public function findScalarType(?string $type, ?string $format): int { if ($type === null) { return 0; @@ -118,7 +123,8 @@ public function findScalarType(?string $type, ?string $format) : int if ($format !== null) { foreach ($this->scalarTypes as $id => $scalar) { - if ($scalar['type'] === $type && + if ( + $scalar['type'] === $type && isset($scalar['format']) && $scalar['format'] === $format ) { @@ -128,7 +134,8 @@ public function findScalarType(?string $type, ?string $format) : int } foreach ($this->scalarTypes as $id => $scalar) { - if ($scalar['type'] === $type && + if ( + $scalar['type'] === $type && ! isset($scalar['format']) ) { return $id; diff --git a/src/Types/TypeSerializer.php b/src/Types/TypeSerializer.php index a4a81b9..654b7d8 100644 --- a/src/Types/TypeSerializer.php +++ b/src/Types/TypeSerializer.php @@ -5,37 +5,38 @@ namespace OnMoon\OpenApiServerBundle\Types; use DateTime; + use function base64_encode; use function Safe\base64_decode; class TypeSerializer { - public static function deserializeDate(string $date) : DateTime + public static function deserializeDate(string $date): DateTime { return \Safe\DateTime::createFromFormat('Y-m-d', $date); } - public static function serializeDate(DateTime $date) : string + public static function serializeDate(DateTime $date): string { return $date->format('Y-m-d'); } - public static function deserializeDateTime(string $date) : DateTime + public static function deserializeDateTime(string $date): DateTime { return new \Safe\DateTime($date); } - public static function serializeDateTime(DateTime $date) : string + public static function serializeDateTime(DateTime $date): string { return $date->format('c'); } - public static function deserializeByte(string $data) : string + public static function deserializeByte(string $data): string { return base64_decode($data); } - public static function serializeByte(string $data) : string + public static function serializeByte(string $data): string { return base64_encode($data); } diff --git a/src/Validator/LeaguePSR7RequestSchemaValidator.php b/src/Validator/LeaguePSR7RequestSchemaValidator.php index 9aa918c..45c6fcb 100644 --- a/src/Validator/LeaguePSR7RequestSchemaValidator.php +++ b/src/Validator/LeaguePSR7RequestSchemaValidator.php @@ -27,7 +27,7 @@ public function validate( Request $request, Specification $specification, string $operationId - ) : void { + ): void { $operation = $specification->getOperation($operationId); $this->validatorBuilder ->fromSchema($specification->getOpenApi()) diff --git a/src/Validator/RequestSchemaValidator.php b/src/Validator/RequestSchemaValidator.php index 04d9b99..de43b25 100644 --- a/src/Validator/RequestSchemaValidator.php +++ b/src/Validator/RequestSchemaValidator.php @@ -9,5 +9,5 @@ interface RequestSchemaValidator { - public function validate(Request $request, Specification $specification, string $operationId) : void; + public function validate(Request $request, Specification $specification, string $operationId): void; }