From 561abbe11e06882326449e99903530beb9cb4f5d Mon Sep 17 00:00:00 2001 From: Andy Barilla Date: Mon, 25 Nov 2024 15:20:51 -0700 Subject: [PATCH] Add generatemodels and generateapis options --- .../generator/deployment/CodegenConfig.java | 4 +- .../deployment/CommonItemConfig.java | 12 +++ .../codegen/OpenApiGeneratorCodeGenBase.java | 6 ++ .../OpenApiClientGeneratorWrapper.java | 10 ++ .../wrapper/QuarkusJavaClientCodegen.java | 10 +- .../OpenApiConfigValidatorTest.java | 6 +- .../integration-tests/generate-flags/pom.xml | 97 +++++++++++++++++++ .../src/main/openapi/generate_apis_false.yaml | 60 ++++++++++++ .../main/openapi/generate_models_false.yaml | 60 ++++++++++++ .../src/main/resources/application.properties | 2 + .../generator/it/GenerateFlagsTest.java | 35 +++++++ client/integration-tests/pom.xml | 1 + docs/modules/ROOT/pages/client.adoc | 10 ++ .../ROOT/pages/includes/generate-apis.adoc | 6 ++ .../ROOT/pages/includes/generate-models.adoc | 6 ++ 15 files changed, 321 insertions(+), 4 deletions(-) create mode 100644 client/integration-tests/generate-flags/pom.xml create mode 100644 client/integration-tests/generate-flags/src/main/openapi/generate_apis_false.yaml create mode 100644 client/integration-tests/generate-flags/src/main/openapi/generate_models_false.yaml create mode 100644 client/integration-tests/generate-flags/src/main/resources/application.properties create mode 100644 client/integration-tests/generate-flags/src/test/java/io/quarkiverse/openapi/generator/it/GenerateFlagsTest.java create mode 100644 docs/modules/ROOT/pages/includes/generate-apis.adoc create mode 100644 docs/modules/ROOT/pages/includes/generate-models.adoc diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java index c913586e8..3f39dbdd2 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java @@ -67,7 +67,9 @@ public enum ConfigName { USE_FIELD_NAME_IN_PART_FILENAME("use-field-name-in-part-filename"), ADDITIONAL_PROPERTIES_AS_ATTRIBUTE("additional-properties-as-attribute"), ADDITIONAL_REQUEST_ARGS("additional-request-args"), - BEAN_VALIDATION("use-bean-validation"); + BEAN_VALIDATION("use-bean-validation"), + GENERATE_APIS("generate-apis"), + GENERATE_MODELS("generate-models"); private final String name; diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CommonItemConfig.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CommonItemConfig.java index 9a6baed5a..39820e7c6 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CommonItemConfig.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CommonItemConfig.java @@ -153,4 +153,16 @@ public class CommonItemConfig { */ @ConfigItem(name = "use-bean-validation") public Optional useBeanValidation; + + /** + * Enable the generation of APIs. If you set this to {@code false}, APIs will not be generated. + */ + @ConfigItem(name = "generate-apis") + public Optional generateApis; + + /** + * Enable the generation of models. If you set this to {@code false}, models will not be generated. + */ + @ConfigItem(name = "generate-models") + public Optional generateModels; } diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java index c2b0dd8f0..f5927ca81 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java @@ -288,6 +288,12 @@ protected void generate(OpenApiGeneratorOptions options) { getValues(config, openApiFilePath, CodegenConfig.ConfigName.BEAN_VALIDATION, Boolean.class) .ifPresent(generator::withUseBeanValidation); + getValues(config, openApiFilePath, CodegenConfig.ConfigName.GENERATE_APIS, Boolean.class) + .ifPresent(generator::withGenerateApis); + + getValues(config, openApiFilePath, CodegenConfig.ConfigName.GENERATE_MODELS, Boolean.class) + .ifPresent(generator::withGenerateModels); + SmallRyeConfig smallRyeConfig = config.unwrap(SmallRyeConfig.class); getValues(smallRyeConfig, openApiFilePath, CodegenConfig.ConfigName.TYPE_MAPPINGS, String.class, String.class) diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapper.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapper.java index e8cb162df..571678015 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapper.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapper.java @@ -270,6 +270,16 @@ public OpenApiClientGeneratorWrapper withUseBeanValidation(Boolean config) { return this; } + public OpenApiClientGeneratorWrapper withGenerateApis(Boolean config) { + configurator.addAdditionalProperty("generate-apis", config); + return this; + } + + public OpenApiClientGeneratorWrapper withGenerateModels(Boolean config) { + configurator.addAdditionalProperty("generate-models", config); + return this; + } + public OpenApiClientGeneratorWrapper withApiNameSuffix(final String apiNameSuffix) { this.configurator.setApiNameSuffix(apiNameSuffix); return this; diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/QuarkusJavaClientCodegen.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/QuarkusJavaClientCodegen.java index 97d87d1a1..cfe51cde9 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/QuarkusJavaClientCodegen.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/QuarkusJavaClientCodegen.java @@ -70,6 +70,8 @@ private void replaceWithQuarkusTemplateFiles() { supportingFiles.clear(); Boolean enableSecurityGeneration = (Boolean) this.additionalProperties.get("enable-security-generation"); + Boolean generateApis = (Boolean) this.additionalProperties.getOrDefault("generate-apis", Boolean.TRUE); + Boolean generateModels = (Boolean) this.additionalProperties.getOrDefault("generate-models", Boolean.TRUE); if (enableSecurityGeneration == null || enableSecurityGeneration) { if (ProcessUtils.hasHttpBasicMethods(this.openAPI) || @@ -92,10 +94,14 @@ private void replaceWithQuarkusTemplateFiles() { } apiTemplateFiles.clear(); - apiTemplateFiles.put("api.qute", ".java"); + if (generateApis) { + apiTemplateFiles.put("api.qute", ".java"); + } modelTemplateFiles.clear(); - modelTemplateFiles.put("model.qute", ".java"); + if (generateModels) { + modelTemplateFiles.put("model.qute", ".java"); + } } public String authFileFolder() { diff --git a/client/deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/OpenApiConfigValidatorTest.java b/client/deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/OpenApiConfigValidatorTest.java index 9fb6c26e2..0ab8ad7cc 100644 --- a/client/deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/OpenApiConfigValidatorTest.java +++ b/client/deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/OpenApiConfigValidatorTest.java @@ -18,7 +18,11 @@ class OpenApiConfigValidatorTest { "quarkus.openapi-generator.codegen.additional-api-type-annotations", "quarkus.openapi-generator.codegen.spec.spec_yaml.enable-security-generation", "quarkus.openapi-generator.codegen.type-mappings.UUID=String", - "quarkus.openapi-generator.codegen.spec.spec_yaml.type-mappings.UUID=String" + "quarkus.openapi-generator.codegen.spec.spec_yaml.type-mappings.UUID=String", + "quarkus.openapi-generator.codegen.spec.spec_yaml.generate-apis=false", + "quarkus.openapi-generator.codegen.spec.spec_yaml.generate-models=false", + "quarkus.openapi-generator.codegen.spec.spec_yaml.generate-apis=true", + "quarkus.openapi-generator.codegen.spec.spec_yaml.generate-models=true", }) void test_known_configs_ok(String validConfiguration) { assertThatCode(() -> OpenApiConfigValidator.validateInputConfiguration(List.of(validConfiguration))) diff --git a/client/integration-tests/generate-flags/pom.xml b/client/integration-tests/generate-flags/pom.xml new file mode 100644 index 000000000..07dad3649 --- /dev/null +++ b/client/integration-tests/generate-flags/pom.xml @@ -0,0 +1,97 @@ + + + + quarkus-openapi-generator-integration-tests + io.quarkiverse.openapi.generator + 3.0.0-SNAPSHOT + + 4.0.0 + + quarkus-openapi-generator-it-generate-flags + Quarkus - Openapi Generator - Integration Tests - Client - Generate Flags + Example project for usage of the generate-models and generate-apis properties + + + + io.quarkiverse.openapi.generator + quarkus-openapi-generator + + + org.assertj + assertj-core + test + + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-hibernate-validator + + + + + + io.quarkus + quarkus-maven-plugin + true + + + + build + generate-code + generate-code-tests + + + + + + + + + native-image + + + native + + + + + + maven-surefire-plugin + + ${native.surefire.skip} + + + + maven-failsafe-plugin + + + + integration-test + verify + + + + + ${project.build.directory}/${project.build.finalName}-runner + + org.jboss.logmanager.LogManager + + ${maven.home} + + + + + + + + + native + + + + + \ No newline at end of file diff --git a/client/integration-tests/generate-flags/src/main/openapi/generate_apis_false.yaml b/client/integration-tests/generate-flags/src/main/openapi/generate_apis_false.yaml new file mode 100644 index 000000000..e7e1b2247 --- /dev/null +++ b/client/integration-tests/generate-flags/src/main/openapi/generate_apis_false.yaml @@ -0,0 +1,60 @@ +--- +openapi: 3.0.3 +info: + title: Test API + version: "1.0" +paths: + /{pathParam}: + get: + tags: + - NonExistentEndpoint + operationId: test + parameters: + - name: pathParam + in: path + required: true + schema: + type: string + minimum: 5 + - name: headerParam + in: header + required: false + schema: + type: integer + maximum: 5 + - name: cookieParam + in: cookie + required: true + schema: + type: string + minLength: 10 + responses: + "200": + description: OK + content: + text/plain: + schema: + type: string +components: + schemas: + ExistentObject: + type: object + description: Some object not to be validated + required: + - id + - name + - size + properties: + id: + type: integer + minimum: 1 + maximum: 100 + name: + type: string + pattern: "[a-zA-Z]*" + minLength: 1 + maxLength: 10 + size: + type: number + minimum: 1.0 + maximum: 10.0 \ No newline at end of file diff --git a/client/integration-tests/generate-flags/src/main/openapi/generate_models_false.yaml b/client/integration-tests/generate-flags/src/main/openapi/generate_models_false.yaml new file mode 100644 index 000000000..c2b29f207 --- /dev/null +++ b/client/integration-tests/generate-flags/src/main/openapi/generate_models_false.yaml @@ -0,0 +1,60 @@ +--- +openapi: 3.0.3 +info: + title: Test API + version: "1.0" +paths: + /{pathParam}: + get: + tags: + - ExistentEndpoint + operationId: test + parameters: + - name: pathParam + in: path + required: true + schema: + type: string + minimum: 5 + - name: headerParam + in: header + required: false + schema: + type: integer + maximum: 5 + - name: cookieParam + in: cookie + required: true + schema: + type: string + minLength: 10 + responses: + "200": + description: OK + content: + text/plain: + schema: + type: string +components: + schemas: + NonExistentObject: + type: object + description: Some object not to be validated + required: + - id + - name + - size + properties: + id: + type: integer + minimum: 1 + maximum: 100 + name: + type: string + pattern: "[a-zA-Z]*" + minLength: 1 + maxLength: 10 + size: + type: number + minimum: 1.0 + maximum: 10.0 \ No newline at end of file diff --git a/client/integration-tests/generate-flags/src/main/resources/application.properties b/client/integration-tests/generate-flags/src/main/resources/application.properties new file mode 100644 index 000000000..40183424f --- /dev/null +++ b/client/integration-tests/generate-flags/src/main/resources/application.properties @@ -0,0 +1,2 @@ +quarkus.openapi-generator.codegen.spec.generate_models_false_yaml.generate-models = false +quarkus.openapi-generator.codegen.spec.generate_apis_false_yaml.generate-apis = false \ No newline at end of file diff --git a/client/integration-tests/generate-flags/src/test/java/io/quarkiverse/openapi/generator/it/GenerateFlagsTest.java b/client/integration-tests/generate-flags/src/test/java/io/quarkiverse/openapi/generator/it/GenerateFlagsTest.java new file mode 100644 index 000000000..58bab06ff --- /dev/null +++ b/client/integration-tests/generate-flags/src/test/java/io/quarkiverse/openapi/generator/it/GenerateFlagsTest.java @@ -0,0 +1,35 @@ +package io.quarkiverse.openapi.generator.it; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +class GenerateFlagsTest { + + @Test + void testEndpointIsInPlace() throws ClassNotFoundException { + Class.forName("org.openapi.quarkus.generate_models_false_yaml.api.ExistentEndpointApi"); + } + + @Test + void testModelIsInPlace() throws ClassNotFoundException { + Class.forName("org.openapi.quarkus.generate_apis_false_yaml.model.ExistentObject"); + } + + @Test + void testEndpointIsNotInPlace() { + Assertions.assertThatThrownBy(() -> { + Class.forName("org.openapi.quarkus.generate_apis_false_yaml.model.NonExistentEndpointApi"); + }).isInstanceOf(ClassNotFoundException.class); + } + + @Test + void testModelIsNotInPlace() { + Assertions.assertThatThrownBy(() -> { + Class.forName("org.openapi.quarkus.generate_models_false_yaml.api.NonExistentObject"); + }).isInstanceOf(ClassNotFoundException.class); + } + +} diff --git a/client/integration-tests/pom.xml b/client/integration-tests/pom.xml index ef2670df3..2aedb6099 100644 --- a/client/integration-tests/pom.xml +++ b/client/integration-tests/pom.xml @@ -23,6 +23,7 @@ enum-property enum-unexpected exclude + generate-flags generation-input generation-tests include diff --git a/docs/modules/ROOT/pages/client.adoc b/docs/modules/ROOT/pages/client.adoc index 95ad693fc..ec3335ada 100644 --- a/docs/modules/ROOT/pages/client.adoc +++ b/docs/modules/ROOT/pages/client.adoc @@ -170,6 +170,16 @@ include::./includes/additional-request-args.adoc[leveloffset=+1, opts=optional] include::./includes/bean-validation.adoc[leveloffset=+1, opts=optional] +[[generate-apis]] +== Generate APIs + +include::./includes/generate-apis.adoc[leveloffset=+1, opts=optional] + +[[generate-models]] +== Generate Models + +include::./includes/generate-models.adoc[leveloffset=+1, opts=optional] + == Known Limitations === Supported Arguments diff --git a/docs/modules/ROOT/pages/includes/generate-apis.adoc b/docs/modules/ROOT/pages/includes/generate-apis.adoc new file mode 100644 index 000000000..54d2c2611 --- /dev/null +++ b/docs/modules/ROOT/pages/includes/generate-apis.adoc @@ -0,0 +1,6 @@ +APIs are generated by default. To disable them set `generate-apis` to false: + +[source,properties] +---- +quarkus.openapi-generator.codegen.spec.my_openapi_yaml.generate-apis=false +---- \ No newline at end of file diff --git a/docs/modules/ROOT/pages/includes/generate-models.adoc b/docs/modules/ROOT/pages/includes/generate-models.adoc new file mode 100644 index 000000000..336071a55 --- /dev/null +++ b/docs/modules/ROOT/pages/includes/generate-models.adoc @@ -0,0 +1,6 @@ +Models are generated by default. To disable them set `generate-models` to false: + +[source,properties] +---- +quarkus.openapi-generator.codegen.spec.my_openapi_yaml.generate-models=false +---- \ No newline at end of file