Skip to content

Commit

Permalink
[gradle] Add recommendations to validate task
Browse files Browse the repository at this point in the history
  • Loading branch information
jimschubert committed Jan 31, 2020
1 parent 22c6c0c commit 8e93724
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 3 deletions.
6 changes: 6 additions & 0 deletions modules/openapi-generator-gradle-plugin/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,11 @@ openApiGenerate {
|None
|The input specification to validate. Supports all formats supported by the Parser.

|recommend
|Boolean
|true
|Whether or not to offer recommendations related to the validated specification document.

|===

=== openApiMeta
Expand Down Expand Up @@ -521,6 +526,7 @@ BUILD SUCCESSFUL in 0s
----
openApiValidate {
inputSpec = "/src/openapi-generator/modules/openapi-generator/src/test/resources/3_0/petstore.yaml"
recommend = true
}
----

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#Thu Jan 30 22:14:34 EST 2020
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ openApiMeta {

openApiValidate {
inputSpec = "$rootDir/petstore-v3.0-invalid.yaml".toString()
recommend = true
}

// Builds a Kotlin client by default.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class OpenApiGeneratorPlugin : Plugin<Project> {
description = "Validates an Open API 2.0 or 3.x specification document."

inputSpec.set(validate.inputSpec)
recommend.set(validate.recommend)
}

create("openApiGenerate", GenerateTask::class.java) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,18 @@ open class OpenApiGeneratorValidateExtension(project: Project) {
* The input specification to validate. Supports all formats supported by the Parser.
*/
val inputSpec = project.objects.property<String>()

/**
* Whether or not to offer recommendations related to the validated specification document.
*/
val recommend = project.objects.property<Boolean?>()

init {
applyDefaults()
}

@Suppress("MemberVisibilityCanBePrivate")
fun applyDefaults(){
recommend.set(true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
* limitations under the License.
*/

@file:Suppress("UnstableApiUsage")

package org.openapitools.generator.gradle.plugin.tasks

import io.swagger.parser.OpenAPIParser
Expand All @@ -22,9 +24,12 @@ import org.gradle.api.GradleException
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.options.Option
import org.gradle.api.logging.Logging
import org.gradle.internal.logging.text.StyledTextOutput
import org.gradle.internal.logging.text.StyledTextOutputFactory
import org.gradle.kotlin.dsl.property
import org.openapitools.codegen.validations.oas.OpenApiEvaluator
import org.openapitools.codegen.validations.oas.RuleConfiguration

/**
* A generator which validates an Open API spec. This task outputs a list of validation issues and errors.
Expand All @@ -46,6 +51,9 @@ open class ValidateTask : DefaultTask() {
@get:Internal
var inputSpec = project.objects.property<String>()

@get:Internal
var recommend = project.objects.property<Boolean?>()

@Suppress("unused")
@get:Internal
@set:Option(option = "input", description = "The input specification.")
Expand All @@ -57,25 +65,55 @@ open class ValidateTask : DefaultTask() {
@Suppress("unused")
@TaskAction
fun doWork() {
val logger = Logging.getLogger(javaClass)

val spec = inputSpec.get()
val recommendations = recommend.get()

logger.quiet("Validating spec $spec")
val result = OpenAPIParser().readLocation(spec, null, null)
val messages = result.messages.toSet()
val out = services.get(StyledTextOutputFactory::class.java).create("openapi")

if (messages.isNotEmpty()) {

val ruleConfiguration = RuleConfiguration()
ruleConfiguration.isEnableRecommendations = recommendations

val evaluator = OpenApiEvaluator(ruleConfiguration)
val validationResult = evaluator.validate(result.openAPI)

if (validationResult.warnings.isNotEmpty()) {
out.withStyle(StyledTextOutput.Style.Info)
out.println("\nSpec has issues or recommendations.\nIssues:\n")

validationResult.warnings.forEach {
out.withStyle(StyledTextOutput.Style.Info)
out.println("\t${it.message}\n")
logger.debug("WARNING: ${it.message}|${it.details}")
}
}

if (messages.isNotEmpty() || validationResult.errors.isNotEmpty()) {

out.withStyle(StyledTextOutput.Style.Error)
out.println("\nSpec is invalid.\nIssues:\n")

messages.forEach {
out.withStyle(StyledTextOutput.Style.Error)
out.println("\t$it\n")
logger.debug("ERROR: $it")
}

validationResult.errors.forEach {
out.withStyle(StyledTextOutput.Style.Error)
out.println("\t${it.message}\n")
logger.debug("ERROR: ${it.message}|${it.details}")
}

throw GradleException("Validation failed.")
} else {
out.withStyle(StyledTextOutput.Style.Success)
logger.debug("No error validations from swagger-parser or internal validations.")
out.println("Spec is valid.")
}
}
Expand Down

0 comments on commit 8e93724

Please sign in to comment.