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 dd4c77eed..f163f25ee 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 @@ -71,6 +71,8 @@ public enum ConfigName { REMOVE_OPERATION_ID_PREFIX("remove-operation-id-prefix"), REMOVE_OPERATION_ID_PREFIX_DELIMITER("remove-operation-id-prefix-delimiter"), REMOVE_OPERATION_ID_PREFIX_COUNT("remove-operation-id-prefix-count"), + GENERATE_APIS("generate-apis"), + GENERATE_MODELS("generate-models"), BEAN_VALIDATION("use-bean-validation"); 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 a43e7b810..926ea95ef 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 @@ -160,4 +160,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 143527c08..0431e6777 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 @@ -300,6 +300,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 56ca01450..7d34db5e4 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 @@ -275,6 +275,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..daec221de 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,7 @@ 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", }) 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 1a69f36e3..d884219ec 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 7f14d4e81..fa51d0525 100644 --- a/docs/modules/ROOT/pages/client.adoc +++ b/docs/modules/ROOT/pages/client.adoc @@ -173,6 +173,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