From 312b2c56fdf1deb9aaaa42afd3194234d9e3563c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E7=94=B0=20=E6=86=B2=E5=A4=AA=E9=83=8E?= Date: Mon, 5 Feb 2024 19:45:27 +0900 Subject: [PATCH 1/5] Helper function to check if additional dependencies are installed --- composer.json | 3 +++ src/SchemaRepository/L5SwaggerResolver.php | 4 +++- .../LaravelOpenApiResolver.php | 4 +++- src/ServiceProvider.php | 3 +-- src/helpers.php | 22 +++++++++++++++++++ 5 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 src/helpers.php diff --git a/composer.json b/composer.json index 4226589..9790bd3 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,9 @@ "license": "MIT", "type": "library", "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { "KentarouTakeda\\Laravel\\OpenApiValidator\\": "src/" } diff --git a/src/SchemaRepository/L5SwaggerResolver.php b/src/SchemaRepository/L5SwaggerResolver.php index fdac280..0ce8719 100644 --- a/src/SchemaRepository/L5SwaggerResolver.php +++ b/src/SchemaRepository/L5SwaggerResolver.php @@ -10,6 +10,8 @@ use KentarouTakeda\Laravel\OpenApiValidator\ResolverInterface; use L5Swagger\GeneratorFactory; +use function KentarouTakeda\Laravel\OpenApiValidator\isl5SwaggerInstalled; + class L5SwaggerResolver implements ResolverInterface { private readonly GeneratorFactory $generatorFactory; @@ -18,7 +20,7 @@ public function __construct( private readonly Repository $repository, private readonly Filesystem $filesystem, ) { - if (!class_exists(GeneratorFactory::class)) { + if (!isl5SwaggerInstalled()) { throw new LackOfDependenciesException('L5Swagger is not installed.', class: GeneratorFactory::class); } diff --git a/src/SchemaRepository/LaravelOpenApiResolver.php b/src/SchemaRepository/LaravelOpenApiResolver.php index 5639e64..7da869f 100644 --- a/src/SchemaRepository/LaravelOpenApiResolver.php +++ b/src/SchemaRepository/LaravelOpenApiResolver.php @@ -8,13 +8,15 @@ use KentarouTakeda\Laravel\OpenApiValidator\ResolverInterface; use Vyuldashev\LaravelOpenApi\Generator; +use function KentarouTakeda\Laravel\OpenApiValidator\isLaravelOpenAPIInstalled; + class LaravelOpenApiResolver implements ResolverInterface { private readonly Generator $generator; public function __construct( ) { - if (!class_exists(Generator::class)) { + if (!isLaravelOpenAPIInstalled()) { throw new LackOfDependenciesException('Laravel OpenAPI is not installed.', class: Generator::class); } diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php index fd629d2..1340af0 100644 --- a/src/ServiceProvider.php +++ b/src/ServiceProvider.php @@ -4,7 +4,6 @@ namespace KentarouTakeda\Laravel\OpenApiValidator; -use Composer\InstalledVersions; use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Support\ServiceProvider as BaseServiceProvider; use KentarouTakeda\Laravel\OpenApiValidator\Config\Config; @@ -44,7 +43,7 @@ public function boot( ]); } - if (InstalledVersions::isInstalled('swagger-api/swagger-ui') && $config->getIsSwaggerUiEnabled()) { + if (isSwaggerUIInstalled() && $config->getIsSwaggerUiEnabled()) { $this->loadRoutesFrom(__DIR__.'/../routes/swagger-ui.php'); $this->loadViewsFrom(__DIR__.'/../resources/views', 'openapi-validator'); } diff --git a/src/helpers.php b/src/helpers.php new file mode 100644 index 0000000..97996e2 --- /dev/null +++ b/src/helpers.php @@ -0,0 +1,22 @@ + Date: Mon, 5 Feb 2024 20:07:30 +0900 Subject: [PATCH 2/5] Skip tests if dependencies are not installed --- .../Http/Controllers/DocumentControllerTest.php | 16 ++++++++++++++++ .../SchemaRepository/L5SwaggerResolverTest.php | 11 +++++++++++ .../LaravelOpenApiResolverTest.php | 11 +++++++++++ tests/Feature/TestCase.php | 17 ++++++++++++++--- 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/tests/Feature/Http/Controllers/DocumentControllerTest.php b/tests/Feature/Http/Controllers/DocumentControllerTest.php index b197cb0..32b90a8 100644 --- a/tests/Feature/Http/Controllers/DocumentControllerTest.php +++ b/tests/Feature/Http/Controllers/DocumentControllerTest.php @@ -7,6 +7,9 @@ use Illuminate\Config\Repository; use KentarouTakeda\Laravel\OpenApiValidator\Tests\Feature\TestCase; +use function KentarouTakeda\Laravel\OpenApiValidator\isLaravelOpenAPIInstalled; +use function KentarouTakeda\Laravel\OpenApiValidator\isSwaggerUIInstalled; + class DocumentControllerTest extends TestCase { protected function defineEnvironment($app) @@ -16,6 +19,15 @@ protected function defineEnvironment($app) )); } + public static function setUpBeforeClass(): void + { + if (!isSwaggerUIInstalled()) { + self::markTestSkipped('Swagger UI is not installed.'); + } + + parent::setUpBeforeClass(); + } + /** * @test */ @@ -30,6 +42,10 @@ public function indexShouldRedirectToDefaultProvider(): void */ public function viewShouldReturnDocument(): void { + if (!isLaravelOpenAPIInstalled()) { + $this->markTestSkipped('Laravel OpenAPI is not installed.'); + } + $this->get(route('openapi-validator.document.laravel-openapi')) ->assertOk() ->assertViewIs('openapi-validator::documents') diff --git a/tests/Feature/SchemaRepository/L5SwaggerResolverTest.php b/tests/Feature/SchemaRepository/L5SwaggerResolverTest.php index b2d0f10..97b465a 100644 --- a/tests/Feature/SchemaRepository/L5SwaggerResolverTest.php +++ b/tests/Feature/SchemaRepository/L5SwaggerResolverTest.php @@ -13,12 +13,23 @@ use OpenApi\Attributes\Response; use OpenApi\Attributes\Schema; +use function KentarouTakeda\Laravel\OpenApiValidator\isl5SwaggerInstalled; + class L5SwaggerResolverTest extends TestCase { use TestWithTemporaryFilesTrait; private L5SwaggerResolver $l5SwaggerResolver; + public static function setUpBeforeClass(): void + { + if (!isl5SwaggerInstalled()) { + self::markTestSkipped('L5Swagger is not installed.'); + } + + parent::setUpBeforeClass(); + } + public function setUp(): void { parent::setUp(); diff --git a/tests/Feature/SchemaRepository/LaravelOpenApiResolverTest.php b/tests/Feature/SchemaRepository/LaravelOpenApiResolverTest.php index bb99a60..f0bca12 100644 --- a/tests/Feature/SchemaRepository/LaravelOpenApiResolverTest.php +++ b/tests/Feature/SchemaRepository/LaravelOpenApiResolverTest.php @@ -10,10 +10,21 @@ use Vyuldashev\LaravelOpenApi\Attributes\Operation; use Vyuldashev\LaravelOpenApi\Attributes\PathItem; +use function KentarouTakeda\Laravel\OpenApiValidator\isLaravelOpenAPIInstalled; + class LaravelOpenApiResolverTest extends TestCase { private LaravelOpenApiResolver $laravelOpenApiResolver; + public static function setUpBeforeClass(): void + { + if (!isLaravelOpenAPIInstalled()) { + self::markTestSkipped('Laravel OpenAPI is not installed.'); + } + + parent::setUpBeforeClass(); + } + public function setUp(): void { parent::setUp(); diff --git a/tests/Feature/TestCase.php b/tests/Feature/TestCase.php index 3559f13..fb6ea6e 100644 --- a/tests/Feature/TestCase.php +++ b/tests/Feature/TestCase.php @@ -7,14 +7,25 @@ use Orchestra\Testbench\TestCase as BaseTestCase; use Vyuldashev\LaravelOpenApi\OpenApiServiceProvider; +use function KentarouTakeda\Laravel\OpenApiValidator\isl5SwaggerInstalled; +use function KentarouTakeda\Laravel\OpenApiValidator\isLaravelOpenAPIInstalled; + class TestCase extends BaseTestCase { protected function getPackageProviders($app) { - return [ - L5SwaggerServiceProvider::class, - OpenApiServiceProvider::class, + $providers = [ ServiceProvider::class, ]; + + if (isl5SwaggerInstalled()) { + $providers[] = L5SwaggerServiceProvider::class; + } + + if (isLaravelOpenAPIInstalled()) { + $providers[] = OpenApiServiceProvider::class; + } + + return $providers; } } From 53b79c4c128ba37ada60b28731f679dfbdf097ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E7=94=B0=20=E6=86=B2=E5=A4=AA=E9=83=8E?= Date: Mon, 5 Feb 2024 20:08:54 +0900 Subject: [PATCH 3/5] prefer-stable is set to true --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9790bd3..be590df 100644 --- a/composer.json +++ b/composer.json @@ -82,5 +82,6 @@ ], "clear": "@php vendor/bin/testbench package:purge-skeleton --ansi", "prepare": "@php vendor/bin/testbench package:discover --ansi" - } + }, + "prefer-stable": true } From 72c1837770d30af301cf63f47ec333cc2f6264a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E7=94=B0=20=E6=86=B2=E5=A4=AA=E9=83=8E?= Date: Mon, 5 Feb 2024 20:13:00 +0900 Subject: [PATCH 4/5] Test with laravel 11 --- .github/workflows/test.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 66ec7c2..fd63b19 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,6 +21,7 @@ jobs: laravel: - "^9.0" - "^10.0" + - "^11.0" stability: - lowest - stable @@ -31,6 +32,13 @@ jobs: stability: stable - option: --ignore-platform-req=php php: "8.4" + - unstable: 1 + laravel: "^11.0" + exclude: + - laravel: "^11.0" + php: "8.1" + - laravel: "^11.0" + stability: lowest name: PHP:${{ matrix.php }} / Laravel:${{ matrix.laravel }} / ${{ matrix.stability }} @@ -46,9 +54,18 @@ jobs: coverage: none - name: Install Composer dependencies - run: | - composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update --ansi - composer update --prefer-${{ matrix.stability }} ${{ matrix.option }} --no-interaction --no-progress --ansi + run: composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update --ansi + + - name: Set minimum stability + if: ${{ matrix.unstable }} + run: composer config minimum-stability dev --ansi + + - name: Uninstall the package that is not compatible with Laravel 11 + if: ${{ matrix.unstable }} + run: composer remove --dev vyuldashev/laravel-openapi --no-interaction --no-update + + - name: Install Composer dependencies + run: composer update --prefer-${{ matrix.stability }} ${{ matrix.option }} --no-interaction --no-progress --ansi - name: Run Code Format Check if: ${{ matrix.current }} From a2f7aceea50da168edddb834bcfb0b339722aec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E7=94=B0=20=E6=86=B2=E5=A4=AA=E9=83=8E?= Date: Mon, 5 Feb 2024 20:29:23 +0900 Subject: [PATCH 5/5] Add Laravel 11 to package installation test --- .github/workflows/package-installation-tests.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/package-installation-tests.yml b/.github/workflows/package-installation-tests.yml index 5976d4c..9d349a7 100644 --- a/.github/workflows/package-installation-tests.yml +++ b/.github/workflows/package-installation-tests.yml @@ -19,9 +19,14 @@ jobs: laravel: - "^9.0" - "^10.0" + # TODO This tag will be revised after official release + - "^11.x-dev" include: - option: --ignore-platform-req=php php: "8.4" + exclude: + - php: "8.1" + laravel: "^11.x-dev" name: PHP:${{ matrix.php }} / Laravel:${{ matrix.laravel }}