diff --git a/README.md b/README.md index b9b06ed..35cdd78 100644 --- a/README.md +++ b/README.md @@ -87,9 +87,9 @@ openApi { | Parameter | Description | Required | Default | |----------------------|-------------------------------------------------------------------------------------------------------------------------------------|----------|--------------------------------------| -| `apiDocsUrl` | The URL from where the OpenAPI doc can be downloaded | No | http://localhost:8080/v3/api-docs | +| `apiDocsUrl` | The URL from where the OpenAPI doc can be downloaded. If the url ends with `.yaml`, output will YAML format. | No | http://localhost:8080/v3/api-docs | | `outputDir` | The output directory for the generated OpenAPI file | No | $buildDir - Your project's build dir | -| `outputFileName` | Specifies the output file name and format. Use extension `.yaml` for YAML output, `.json` for JSON output | No | openapi.json | +| `outputFileName` | Specifies the output file name. | No | openapi.json | | `waitTimeInSeconds` | Time to wait in seconds for your Spring Boot application to start, before we make calls to `apiDocsUrl` to download the OpenAPI doc | No | 30 seconds | | `groupedApiMappings` | A map of URLs (from where the OpenAPI docs can be downloaded) to output file names | No | [] | | `customBootRun` | Any bootRun property that you would normal need to start your spring boot application. | No | (N/A) | diff --git a/build.gradle.kts b/build.gradle.kts index cf775f1..c2143fc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } group = "org.springdoc" -version = "1.7.0" +version = "1.8.0" sonarqube { properties { @@ -87,6 +87,8 @@ val jvmVersion: JavaLanguageVersion = JavaLanguageVersion.of(8) java { toolchain.languageVersion.set(jvmVersion) + // Recommended by https://docs.gradle.org/current/userguide/building_java_projects.html#sec:java_packaging + withSourcesJar() } tasks.withType { diff --git a/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiExtension.kt b/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiExtension.kt index 136ecb9..47eb8c5 100644 --- a/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiExtension.kt +++ b/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiExtension.kt @@ -3,6 +3,7 @@ package org.springdoc.openapi.gradle.plugin import org.gradle.api.Action import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.ProjectLayout import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.ListProperty import org.gradle.api.provider.MapProperty @@ -11,6 +12,7 @@ import javax.inject.Inject open class OpenApiExtension @Inject constructor( objects: ObjectFactory, + layout: ProjectLayout ) { val apiDocsUrl: Property = objects.property(String::class.java) val outputFileName: Property = objects.property(String::class.java) @@ -21,6 +23,14 @@ open class OpenApiExtension @Inject constructor( val customBootRun: CustomBootRunAction = objects.newInstance(CustomBootRunAction::class.java) + init { + apiDocsUrl.convention(DEFAULT_API_DOCS_URL) + outputFileName.convention(DEFAULT_OPEN_API_FILE_NAME) + outputDir.convention(layout.buildDirectory) + waitTimeInSeconds.convention(DEFAULT_WAIT_TIME_IN_SECONDS) + groupedApiMappings.convention(emptyMap()) + } + fun customBootRun(action: Action) { action.execute(customBootRun) } diff --git a/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt b/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt index 1a7d6f5..316b8a8 100644 --- a/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt +++ b/src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt @@ -16,6 +16,7 @@ import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction import java.net.ConnectException @@ -23,7 +24,6 @@ import java.net.HttpURLConnection import java.net.URL import java.time.Duration import java.time.temporal.ChronoUnit.SECONDS -import java.util.* private const val MAX_HTTP_STATUS_CODE = 299 @@ -40,7 +40,8 @@ open class OpenApiGeneratorTask : DefaultTask() { @get:OutputDirectory val outputDir: DirectoryProperty = project.objects.directoryProperty() - private val waitTimeInSeconds: Property = + @get:Internal + val waitTimeInSeconds: Property = project.objects.property(Int::class.java) init { @@ -50,23 +51,11 @@ open class OpenApiGeneratorTask : DefaultTask() { val extension: OpenApiExtension = project.extensions.getByName(EXTENSION_NAME) as OpenApiExtension - // set a default value if not provided - val defaultOutputDir = project.objects.directoryProperty() - defaultOutputDir.set(project.buildDir) - - apiDocsUrl.convention(extension.apiDocsUrl.getOrElse(DEFAULT_API_DOCS_URL)) - outputFileName.convention( - extension.outputFileName.getOrElse( - DEFAULT_OPEN_API_FILE_NAME - ) - ) - groupedApiMappings.convention(extension.groupedApiMappings.getOrElse(emptyMap())) - outputDir.convention(extension.outputDir.getOrElse(defaultOutputDir.get())) - waitTimeInSeconds.convention( - extension.waitTimeInSeconds.getOrElse( - DEFAULT_WAIT_TIME_IN_SECONDS - ) - ) + apiDocsUrl.convention(extension.apiDocsUrl) + outputFileName.convention(extension.outputFileName) + groupedApiMappings.convention(extension.groupedApiMappings) + outputDir.convention(extension.outputDir) + waitTimeInSeconds.convention(extension.waitTimeInSeconds) } @TaskAction diff --git a/src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt b/src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt index 192e7b1..805d3c3 100644 --- a/src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt +++ b/src/test/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePluginTest.kt @@ -102,6 +102,27 @@ class OpenApiGradlePluginTest { assertOpenApiJsonFile(1, specialOutputJsonFileName) } + @Test + fun `accessing the task does not break later configuration`() { + val specialOutputDir = File(projectTestDir, "specialDir") + specialOutputDir.mkdirs() + + buildFile.writeText( + """$baseBuildGradle + tasks.withType(org.springdoc.openapi.gradle.plugin.OpenApiGeneratorTask.class) { + dependsOn("clean") + } + + openApi{ + outputDir = file("${specialOutputDir.toURI().path}") + } + """.trimMargin() + ) + + assertEquals(TaskOutcome.SUCCESS, openApiDocsTask(runTheBuild()).outcome) + assertOpenApiJsonFile(1, buildDir = specialOutputDir) + } + @Test fun `using properties`() { buildFile.writeText(