From 1d47fd3673a4e8b506a11198c7bf3c0a011adfdf Mon Sep 17 00:00:00 2001 From: Artur Bosch Date: Mon, 13 Jun 2022 07:42:26 +0200 Subject: [PATCH] Support disabling config validation via tooling spec (#4937) --- .../io/gitlab/arturbosch/detekt/cli/Spec.kt | 2 +- .../detekt/core/config/ConfigValidators.kt | 8 ++++--- .../core/config/CheckConfigurationSpec.kt | 22 +++++++++++++++++++ detekt-tooling/api/detekt-tooling.api | 6 ++--- .../detekt/tooling/api/spec/ConfigSpec.kt | 2 +- .../detekt/tooling/dsl/ConfigSpecBuilder.kt | 4 ++-- 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Spec.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Spec.kt index a3347e86f13..cc920fdd848 100644 --- a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Spec.kt +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Spec.kt @@ -41,7 +41,7 @@ internal fun CliArgs.createSpec(output: Appendable, error: Appendable): Processi config { useDefaultConfig = args.buildUponDefaultConfig - shouldValidateBeforeAnalysis = false + shouldValidateBeforeAnalysis = null knownPatterns = emptyList() // ^^ cli does not have these properties yet; specified in yaml config for now configPaths = config?.let { MultipleExistingPathConverter().convert(it) }.orEmpty() diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/config/ConfigValidators.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/config/ConfigValidators.kt index 8934b8234d4..bd00be46dc2 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/config/ConfigValidators.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/config/ConfigValidators.kt @@ -11,9 +11,11 @@ import io.gitlab.arturbosch.detekt.core.reporting.red import io.gitlab.arturbosch.detekt.core.reporting.yellow internal fun checkConfiguration(settings: ProcessingSettings, baseline: Config) { - val props = settings.config.subConfig("config") - val shouldValidate = props.valueOrDefault("validation", true) - + var shouldValidate = settings.spec.configSpec.shouldValidateBeforeAnalysis + if (shouldValidate == null) { + val props = settings.config.subConfig("config") + shouldValidate = props.valueOrDefault("validation", true) + } if (shouldValidate) { val validators = loadExtensions(settings) + DefaultPropertiesConfigValidator(settings, baseline) diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/config/CheckConfigurationSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/config/CheckConfigurationSpec.kt index b5830937bcd..9a0d468063c 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/config/CheckConfigurationSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/config/CheckConfigurationSpec.kt @@ -20,6 +20,28 @@ class SupportConfigValidationSpec { private val testDir = createTempDirectoryForTest("detekt-sample") private val spec = createNullLoggingSpec {} + @Test + fun `passes because config validation is disabled by tooling spec`() { + val config = yamlConfigFromContent( + """ + unknown_property: + unknown_var: "" + """ + ) + createProcessingSettings( + testDir, + config, + spec = createNullLoggingSpec { + config { + shouldValidateBeforeAnalysis = false + } + } + ).use { + assertThatCode { checkConfiguration(it, spec.getDefaultConfiguration()) } + .doesNotThrowAnyException() + } + } + @Test fun `fails when unknown properties are found`() { val config = yamlConfigFromContent( diff --git a/detekt-tooling/api/detekt-tooling.api b/detekt-tooling/api/detekt-tooling.api index 942a05e44b7..fbabfcc9532 100644 --- a/detekt-tooling/api/detekt-tooling.api +++ b/detekt-tooling/api/detekt-tooling.api @@ -105,7 +105,7 @@ public abstract interface class io/github/detekt/tooling/api/spec/ConfigSpec { public abstract fun getConfigPaths ()Ljava/util/Collection; public abstract fun getKnownPatterns ()Ljava/util/Collection; public abstract fun getResources ()Ljava/util/Collection; - public abstract fun getShouldValidateBeforeAnalysis ()Z + public abstract fun getShouldValidateBeforeAnalysis ()Ljava/lang/Boolean; public abstract fun getUseDefaultConfig ()Z } @@ -238,12 +238,12 @@ public final class io/github/detekt/tooling/dsl/ConfigSpecBuilder : io/github/de public final fun getConfigPaths ()Ljava/util/Collection; public final fun getKnownPatterns ()Ljava/util/Collection; public final fun getResources ()Ljava/util/Collection; - public final fun getShouldValidateBeforeAnalysis ()Z + public final fun getShouldValidateBeforeAnalysis ()Ljava/lang/Boolean; public final fun getUseDefaultConfig ()Z public final fun setConfigPaths (Ljava/util/Collection;)V public final fun setKnownPatterns (Ljava/util/Collection;)V public final fun setResources (Ljava/util/Collection;)V - public final fun setShouldValidateBeforeAnalysis (Z)V + public final fun setShouldValidateBeforeAnalysis (Ljava/lang/Boolean;)V public final fun setUseDefaultConfig (Z)V } diff --git a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/spec/ConfigSpec.kt b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/spec/ConfigSpec.kt index 0b0c08da369..beb0cfa0d95 100644 --- a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/spec/ConfigSpec.kt +++ b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/spec/ConfigSpec.kt @@ -10,7 +10,7 @@ interface ConfigSpec { * * Unknown properties to detekt will get reported as errors. */ - val shouldValidateBeforeAnalysis: Boolean + val shouldValidateBeforeAnalysis: Boolean? /** * Property patterns which should be excluded from validation. diff --git a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/dsl/ConfigSpecBuilder.kt b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/dsl/ConfigSpecBuilder.kt index eab3f0dc475..0f72fe18159 100644 --- a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/dsl/ConfigSpecBuilder.kt +++ b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/dsl/ConfigSpecBuilder.kt @@ -7,7 +7,7 @@ import java.nio.file.Path @ProcessingModelDsl class ConfigSpecBuilder : Builder { - var shouldValidateBeforeAnalysis: Boolean = true + var shouldValidateBeforeAnalysis: Boolean? = null var knownPatterns: Collection = emptyList() var useDefaultConfig: Boolean = false // false to be backwards compatible in 1.X @@ -24,7 +24,7 @@ class ConfigSpecBuilder : Builder { } private data class ConfigModel( - override val shouldValidateBeforeAnalysis: Boolean, + override val shouldValidateBeforeAnalysis: Boolean?, override val knownPatterns: Collection, override val useDefaultConfig: Boolean, override val resources: Collection,