From 2043b2db6d2364cd250b65818256d35fc89c7e60 Mon Sep 17 00:00:00 2001 From: DerManoMann Date: Wed, 14 Oct 2026 14:34:16 +1300 Subject: [PATCH 1/2] Generate the fallback specification with swagger-php's Builder --- .../AbstractOpenApiResponseVerifier.php | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/Adapters/AbstractOpenApiResponseVerifier.php b/src/Adapters/AbstractOpenApiResponseVerifier.php index 52982ab..e92a4b7 100644 --- a/src/Adapters/AbstractOpenApiResponseVerifier.php +++ b/src/Adapters/AbstractOpenApiResponseVerifier.php @@ -3,6 +3,7 @@ namespace Radebatz\OpenApi\Verifier\Adapters; use Composer\Autoload\ClassLoader; +use OpenApi\Builder; use OpenApi\Generator; trait AbstractOpenApiResponseVerifier @@ -33,8 +34,35 @@ protected function prepareOpenApiSpecificationLoader(string $srcDir, ?string $sp } } - $openApi = (new Generator())->generate([$appRoot . '/' . $srcDir]); - $this->openapiSpecification = json_decode($openApi->toJson()); + $this->openapiSpecification = $this->generateOpenApiSpecification($appRoot . '/' . $srcDir); + } + + /** + * Generate the specification from `$sourceDir` with swagger-php, in its default mode. + * + * Override to configure the generation, for example `Mode::SPEC` for a project written in + * `OpenApi\Spec` attributes on swagger-php 6.x. + */ + protected function generateOpenApiSpecification(string $sourceDir): object + { + if (class_exists(Builder::class)) { + $json = (new Builder())->addSource($sourceDir)->build()->toJson(); + } elseif (class_exists(Generator::class)) { + // swagger-php before 6.4 + $json = (string) (new Generator())->generate([$sourceDir])?->toJson(); + } else { + throw new \LogicException(sprintf( + 'No specification found: none given, and neither tests/openapi.json nor tests/openapi.yaml exists. Generating one from %s requires zircote/swagger-php.', + $sourceDir + )); + } + + $specification = json_decode($json); + if (!$specification instanceof \stdClass) { + throw new \RuntimeException(sprintf('Could not generate a specification from %s', $sourceDir)); + } + + return $specification; } /** From 1ce19b497e9395c2179fa7a4ce4aff0bf4ab3865 Mon Sep 17 00:00:00 2001 From: DerManoMann Date: Wed, 14 Oct 2026 15:02:12 +1300 Subject: [PATCH 2/2] Drop a decode check that cannot fail --- src/Adapters/AbstractOpenApiResponseVerifier.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Adapters/AbstractOpenApiResponseVerifier.php b/src/Adapters/AbstractOpenApiResponseVerifier.php index e92a4b7..f326e8d 100644 --- a/src/Adapters/AbstractOpenApiResponseVerifier.php +++ b/src/Adapters/AbstractOpenApiResponseVerifier.php @@ -57,12 +57,7 @@ protected function generateOpenApiSpecification(string $sourceDir): object )); } - $specification = json_decode($json); - if (!$specification instanceof \stdClass) { - throw new \RuntimeException(sprintf('Could not generate a specification from %s', $sourceDir)); - } - - return $specification; + return (object) json_decode($json); } /**