diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index 1309d10d5c84..3d495ece07c5 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -53,8 +53,6 @@ formatting: active: true android: false autoCorrect: true - NoItParamInMultilineLambda: - active: false MaximumLineLength: active: false @@ -117,6 +115,7 @@ style: ignoreHashCodeFunction: true ignorePropertyDeclaration: true ignoreAnnotation: true + ignoreEnums: true ignoreNumbers: '-1,0,1,2,100,1000' MayBeConst: active: true @@ -126,9 +125,6 @@ style: active: true SpacingBetweenPackageAndImports: active: true - VariableNaming: - active: true - variablePattern: '(_)?[a-z][a-zA-Z0-9]*' UnnecessaryAbstractClass: active: true UnnecessaryInheritance: diff --git a/config/detekt/format.yml b/config/detekt/format.yml index 23a46cbfaa4d..02f8e377815e 100644 --- a/config/detekt/format.yml +++ b/config/detekt/format.yml @@ -2,8 +2,5 @@ formatting: active: true android: false autoCorrect: true - # reports false positive for calls named 'it' in Spek - NoItParamInMultilineLambda: - active: false MaximumLineLength: active: false diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/CompositeConfig.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/CompositeConfig.kt index 7b390f8d50a0..ec41d9481c0a 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/CompositeConfig.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/CompositeConfig.kt @@ -1,9 +1,13 @@ package io.gitlab.arturbosch.detekt.api +import io.gitlab.arturbosch.detekt.api.internal.ValidatableConfiguration +import io.gitlab.arturbosch.detekt.api.internal.validateConfig + /** * Wraps two different configuration which should be considered when retrieving properties. */ -class CompositeConfig(private val lookFirst: Config, private val lookSecond: Config) : Config { +class CompositeConfig(private val lookFirst: Config, private val lookSecond: Config) : + Config, ValidatableConfiguration { override fun subConfig(key: String): Config { return CompositeConfig(lookFirst.subConfig(key), lookSecond.subConfig(key)) @@ -18,4 +22,10 @@ class CompositeConfig(private val lookFirst: Config, private val lookSecond: Con } override fun toString(): String = "CompositeConfig(lookFirst=$lookFirst, lookSecond=$lookSecond)" + + /** + * Validates both sides of the composite config according to defined properties of the baseline config. + */ + override fun validate(baseline: Config, excludePatterns: Set): List = + validateConfig(lookFirst, baseline, excludePatterns) + validateConfig(lookSecond, baseline, excludePatterns) } diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Config.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Config.kt index d67dc4f621d5..b26ccdc8bf5a 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Config.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Config.kt @@ -110,10 +110,10 @@ abstract class BaseConfig : HierarchicalConfig { } } catch (_: ClassCastException) { error("Value \"$result\" set for config parameter \"${keySequence(key)}\" is not of" + - " required type ${default::class.simpleName}.") + " required type ${default::class.simpleName}.") } catch (_: NumberFormatException) { error("Value \"$result\" set for config parameter \"${keySequence(key)}\" is not of" + - " required type ${default::class.simpleName}.") + " required type ${default::class.simpleName}.") } } diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/SplitPattern.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/SplitPattern.kt index 25875f75718b..e87c8354d0f1 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/SplitPattern.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/SplitPattern.kt @@ -5,7 +5,7 @@ package io.gitlab.arturbosch.detekt.api * Basic use cases are to specify different function or class names in the detekt * yaml config and test for their appearance in specific rules. */ -class SplitPattern( +open class SplitPattern( text: String, delimiters: String = ",", removeTrailingAsterisks: Boolean = true diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/YamlConfig.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/YamlConfig.kt index 04155b1fb483..619efe519bc0 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/YamlConfig.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/YamlConfig.kt @@ -1,5 +1,7 @@ package io.gitlab.arturbosch.detekt.api +import io.gitlab.arturbosch.detekt.api.internal.ValidatableConfiguration +import io.gitlab.arturbosch.detekt.api.internal.validateConfig import org.yaml.snakeyaml.Yaml import java.io.BufferedReader import java.net.URL @@ -14,7 +16,7 @@ import java.nio.file.Path class YamlConfig internal constructor( val properties: Map, override val parent: HierarchicalConfig.Parent? -) : BaseConfig() { +) : BaseConfig(), ValidatableConfiguration { override fun subConfig(key: String): Config { val subProperties = properties.getOrElse(key) { mapOf() } @@ -34,6 +36,9 @@ class YamlConfig internal constructor( return "YamlConfig(properties=$properties)" } + override fun validate(baseline: Config, excludePatterns: Set): List = + validateConfig(this, baseline, excludePatterns) + companion object { private const val YAML = ".yml" diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/CommaSeparatedPattern.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/CommaSeparatedPattern.kt new file mode 100644 index 000000000000..fcf73476d71b --- /dev/null +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/CommaSeparatedPattern.kt @@ -0,0 +1,9 @@ +package io.gitlab.arturbosch.detekt.api.internal + +import io.gitlab.arturbosch.detekt.api.SplitPattern + +class CommaSeparatedPattern(text: String, delimiters: String = ",") : + SplitPattern(text, delimiters, false) { + + fun mapToRegex(): Set = mapAll(::Regex).toSet() +} diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/FailFastConfig.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/FailFastConfig.kt similarity index 65% rename from detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/FailFastConfig.kt rename to detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/FailFastConfig.kt index 121047f3698a..bfc2266bae9c 100644 --- a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/FailFastConfig.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/FailFastConfig.kt @@ -1,10 +1,13 @@ -package io.gitlab.arturbosch.detekt.cli +package io.gitlab.arturbosch.detekt.api.internal import io.gitlab.arturbosch.detekt.api.Config @Suppress("UNCHECKED_CAST") -data class FailFastConfig(private val originalConfig: Config, private val defaultConfig: Config) : Config { - override fun subConfig(key: String) = FailFastConfig(originalConfig.subConfig(key), defaultConfig.subConfig(key)) +data class FailFastConfig(private val originalConfig: Config, private val defaultConfig: Config) : + Config, ValidatableConfiguration { + + override fun subConfig(key: String) = + FailFastConfig(originalConfig.subConfig(key), defaultConfig.subConfig(key)) override fun valueOrDefault(key: String, default: T): T { return when (key) { @@ -21,4 +24,7 @@ data class FailFastConfig(private val originalConfig: Config, private val defaul else -> originalConfig.valueOrNull(key) ?: defaultConfig.valueOrNull(key) } } + + override fun validate(baseline: Config, excludePatterns: Set) = + validateConfig(originalConfig, baseline, excludePatterns) } diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/SimpleNotification.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/SimpleNotification.kt index f519f68d58a7..56e07351ae65 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/SimpleNotification.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/SimpleNotification.kt @@ -2,4 +2,7 @@ package io.gitlab.arturbosch.detekt.api.internal import io.gitlab.arturbosch.detekt.api.Notification -data class SimpleNotification(override val message: String) : Notification +data class SimpleNotification(override val message: String) : Notification { + + override fun toString(): String = message +} diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/ValidatableConfiguration.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/ValidatableConfiguration.kt new file mode 100644 index 000000000000..086281ab9f8f --- /dev/null +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/internal/ValidatableConfiguration.kt @@ -0,0 +1,76 @@ +package io.gitlab.arturbosch.detekt.api.internal + +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.Notification +import io.gitlab.arturbosch.detekt.api.YamlConfig + +interface ValidatableConfiguration { + + fun validate(baseline: Config, excludePatterns: Set): List +} + +/** + * Known existing properties on rule's which my be absent in the default-detekt-config.yml. + * + * We need to predefine them as the user may not have already declared an 'config'-block + * in the configuration and we want to validate the config by default. + */ +const val DEFAULT_PROPERTY_EXCLUDES = ".*>.*>excludes,.*>.*>includes,.*>.*>active,.*>.*>autoCorrect" + +@Suppress("UNCHECKED_CAST", "ComplexMethod") +fun validateConfig( + config: Config, + baseline: Config, + excludePatterns: Set = CommaSeparatedPattern(DEFAULT_PROPERTY_EXCLUDES).mapToRegex() +): List { + require(baseline != Config.empty) { "Cannot validate configuration based on an empty baseline config." } + require(baseline is YamlConfig) { "Only supported baseline config is the YamlConfig." } + + if (config == Config.empty) { + return emptyList() + } + + val notifications = mutableListOf() + + fun testKeys(current: Map, base: Map, parentPath: String?) { + for (prop in current.keys) { + + val propertyPath = "${if (parentPath == null) "" else "$parentPath>"}$prop" + + if (excludePatterns.any { it.matches(propertyPath) }) { + continue + } + + if (!base.contains(prop)) { + notifications.add(propertyDoesNotExists(propertyPath)) + } + + val next = current[prop] as? Map + val nextBase = base[prop] as? Map + + when { + next == null && nextBase != null -> notifications.add(nestedConfigurationExpected(propertyPath)) + base.contains(prop) && next != null && nextBase == null -> + notifications.add(unexpectedNestedConfiguration(propertyPath)) + next != null && nextBase != null -> testKeys(next, nextBase, propertyPath) + } + } + } + + when (config) { + is YamlConfig -> testKeys(config.properties, baseline.properties, null) + is ValidatableConfiguration -> notifications.addAll(config.validate(baseline, excludePatterns)) + else -> error("Unsupported config type for validation: '${config::class}'.") + } + + return notifications +} + +internal fun propertyDoesNotExists(prop: String): Notification = + SimpleNotification("Property '$prop' is misspelled or does not exist.") + +internal fun nestedConfigurationExpected(prop: String): Notification = + SimpleNotification("Nested config expected for '$prop'.") + +internal fun unexpectedNestedConfiguration(prop: String): Notification = + SimpleNotification("Unexpected nested config for '$prop'.") diff --git a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/internal/ConfigValidationSpec.kt b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/internal/ConfigValidationSpec.kt new file mode 100644 index 000000000000..3620f28f0079 --- /dev/null +++ b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/internal/ConfigValidationSpec.kt @@ -0,0 +1,156 @@ +package io.gitlab.arturbosch.detekt.api.internal + +import io.gitlab.arturbosch.detekt.api.CompositeConfig +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.test.yamlConfig +import org.assertj.core.api.Assertions.assertThat +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe + +internal class ConfigValidationSpec : Spek({ + + describe("validate configuration file") { + + val baseline = yamlConfig("config_validation/baseline.yml") + + it("passes for same config test") { + val result = validateConfig(baseline, baseline) + assertThat(result).isEmpty() + } + + it("passes for properties which may appear on rules but may be not present in default config") { + val result = validateConfig( + yamlConfig("config_validation/default-excluded-properties.yml"), + baseline + ) + assertThat(result).isEmpty() + } + + it("reports different rule set name") { + val result = validateConfig( + yamlConfig("config_validation/other-ruleset-name.yml"), + baseline + ) + assertThat(result).contains(propertyDoesNotExists("code-smell")) + } + + it("reports different nested property names") { + val result = validateConfig( + yamlConfig("config_validation/other-nested-property-names.yml"), + baseline + ) + assertThat(result).contains( + propertyDoesNotExists("complexity>LongLongMethod"), + propertyDoesNotExists("complexity>LongParameterList>enabled"), + propertyDoesNotExists("complexity>LargeClass>howMany"), + propertyDoesNotExists("complexity>InnerMap>InnerKey"), + propertyDoesNotExists("complexity>InnerMap>Inner2>nestedActive") + ) + } + + it("reports different rule set name") { + val result = validateConfig( + yamlConfig("config_validation/no-nested-config.yml"), + baseline + ) + assertThat(result).contains( + nestedConfigurationExpected("complexity"), + nestedConfigurationExpected("style>WildcardImport") + ) + } + + it("reports unexpected nested configs") { + // note that the baseline config is now the first argument + val result = validateConfig(baseline, yamlConfig("config_validation/no-value.yml")) + assertThat(result).contains( + unexpectedNestedConfiguration("style"), + unexpectedNestedConfiguration("comments") + ) + } + + describe("validate composite configurations") { + + it("passes for same left, right and baseline config") { + val result = validateConfig(CompositeConfig(baseline, baseline), baseline) + assertThat(result).isEmpty() + } + + it("passes for empty configs") { + val result = validateConfig(CompositeConfig(Config.empty, Config.empty), baseline) + assertThat(result).isEmpty() + } + + it("finds accumulated errors") { + val result = validateConfig( + CompositeConfig( + yamlConfig("config_validation/other-nested-property-names.yml"), + yamlConfig("config_validation/no-nested-config.yml") + ), + baseline + ) + + assertThat(result).contains( + nestedConfigurationExpected("complexity"), + nestedConfigurationExpected("style>WildcardImport"), + propertyDoesNotExists("complexity>LongLongMethod"), + propertyDoesNotExists("complexity>LongParameterList>enabled"), + propertyDoesNotExists("complexity>LargeClass>howMany"), + propertyDoesNotExists("complexity>InnerMap>InnerKey"), + propertyDoesNotExists("complexity>InnerMap>Inner2>nestedActive") + ) + } + } + + describe("configure additional exclude paths") { + + fun patterns(str: String) = CommaSeparatedPattern(str).mapToRegex() + + it("does not report any complexity properties") { + val result = validateConfig( + yamlConfig("config_validation/other-nested-property-names.yml"), + baseline, + patterns("complexity") + ) + assertThat(result).isEmpty() + } + + it("does not report 'complexity>LargeClass>howMany'") { + val result = validateConfig( + yamlConfig("config_validation/other-nested-property-names.yml"), + baseline, + patterns(".*>.*>howMany") + ) + + assertThat(result).contains( + propertyDoesNotExists("complexity>LongLongMethod"), + propertyDoesNotExists("complexity>LongParameterList>enabled"), + propertyDoesNotExists("complexity>InnerMap>InnerKey"), + propertyDoesNotExists("complexity>InnerMap>Inner2>nestedActive") + ) + + assertThat(result).doesNotContain( + propertyDoesNotExists("complexity>LargeClass>howMany") + ) + } + + it("does not report '.*>InnerMap'") { + val result = validateConfig( + yamlConfig("config_validation/other-nested-property-names.yml"), + baseline, + patterns(".*>InnerMap") + ) + + assertThat(result).contains( + propertyDoesNotExists("complexity>LargeClass>howMany"), + propertyDoesNotExists("complexity>LongLongMethod"), + propertyDoesNotExists("complexity>LongParameterList>enabled") + ) + + assertThat(result).doesNotContain( + propertyDoesNotExists("complexity>InnerMap>InnerKey"), + propertyDoesNotExists("complexity>InnerMap>Inner2>nestedActive") + ) + } + } + } +}) diff --git a/detekt-api/src/test/resources/config_validation/baseline.yml b/detekt-api/src/test/resources/config_validation/baseline.yml new file mode 100644 index 000000000000..bb5a7a100923 --- /dev/null +++ b/detekt-api/src/test/resources/config_validation/baseline.yml @@ -0,0 +1,27 @@ +complexity: + LongMethod: + active: true + threshold: 20 + LongParameterList: + active: false + threshold: 5 + LargeClass: + active: false + threshold: 70 + InnerMap: + Inner1: + active: true + Inner2: + active: true + +style: + WildcardImport: + active: true + NoElseInWhenExpression: + active: true + MagicNumber: + active: true + ignoreNumbers: '-1,0,1,2' + +comments: + active: false diff --git a/detekt-api/src/test/resources/config_validation/default-excluded-properties.yml b/detekt-api/src/test/resources/config_validation/default-excluded-properties.yml new file mode 100644 index 000000000000..4d45bc846d5c --- /dev/null +++ b/detekt-api/src/test/resources/config_validation/default-excluded-properties.yml @@ -0,0 +1,6 @@ +style: + MagicNumber: + active: true + autoCorrect: true + excludes: "" + includes: "" diff --git a/detekt-api/src/test/resources/config_validation/no-nested-config.yml b/detekt-api/src/test/resources/config_validation/no-nested-config.yml new file mode 100644 index 000000000000..5bf1c4d6562c --- /dev/null +++ b/detekt-api/src/test/resources/config_validation/no-nested-config.yml @@ -0,0 +1,4 @@ +complexity: false + +style: + WildcardImport: false diff --git a/detekt-api/src/test/resources/config_validation/no-value.yml b/detekt-api/src/test/resources/config_validation/no-value.yml new file mode 100644 index 000000000000..51d239f8e133 --- /dev/null +++ b/detekt-api/src/test/resources/config_validation/no-value.yml @@ -0,0 +1,3 @@ +complexity: +style: +comments: diff --git a/detekt-api/src/test/resources/config_validation/other-nested-property-names.yml b/detekt-api/src/test/resources/config_validation/other-nested-property-names.yml new file mode 100644 index 000000000000..ec683e934e07 --- /dev/null +++ b/detekt-api/src/test/resources/config_validation/other-nested-property-names.yml @@ -0,0 +1,15 @@ +complexity: + LongLongMethod: + active: true + threshold: 20 + LongParameterList: + enabled: false + threshold: 5 + LargeClass: + active: false + howMany: 70 + InnerMap: + InnerKey: + active: true + Inner2: + nestedActive: true diff --git a/detekt-api/src/test/resources/config_validation/other-ruleset-name.yml b/detekt-api/src/test/resources/config_validation/other-ruleset-name.yml new file mode 100644 index 000000000000..68805c9bc440 --- /dev/null +++ b/detekt-api/src/test/resources/config_validation/other-ruleset-name.yml @@ -0,0 +1,15 @@ +code-smell: + LongMethod: + active: true + threshold: 20 + LongParameterList: + active: false + threshold: 5 + LargeClass: + active: false + threshold: 70 + InnerMap: + Inner1: + active: true + Inner2: + active: true diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/PathConverters.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/ArgumentConverters.kt similarity index 99% rename from detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/PathConverters.kt rename to detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/ArgumentConverters.kt index f44f80df38f0..29f7951edb3a 100644 --- a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/PathConverters.kt +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/ArgumentConverters.kt @@ -55,8 +55,6 @@ class JvmTargetConverter : IStringConverter { checkNotNull(JvmTarget.fromString(value)) { "Invalid value passed to --jvm-target" } } -/** - */ class ClasspathResourceConverter : IStringConverter { override fun convert(resource: String): URL { val relativeResource = if (resource.startsWith("/")) resource else "/$resource" diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Configurations.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Configurations.kt index 8421e9abdf5e..bc8b4a42feda 100644 --- a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Configurations.kt +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Configurations.kt @@ -3,6 +3,7 @@ package io.gitlab.arturbosch.detekt.cli import io.gitlab.arturbosch.detekt.api.CompositeConfig import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.YamlConfig +import io.gitlab.arturbosch.detekt.api.internal.FailFastConfig import io.gitlab.arturbosch.detekt.api.internal.PathFilters import java.nio.file.Path @@ -33,10 +34,10 @@ fun CliArgs.loadConfiguration(): Config { if (failFast) { val initializedDefaultConfig = defaultConfig ?: loadDefaultConfig() - declaredConfig = FailFastConfig(declaredConfig ?: initializedDefaultConfig, initializedDefaultConfig) + declaredConfig = FailFastConfig(declaredConfig + ?: initializedDefaultConfig, initializedDefaultConfig) } - if (debug) println("\n$declaredConfig\n") return declaredConfig ?: loadDefaultConfig() } @@ -62,6 +63,6 @@ private fun parsePathConfig(configPath: String): Config { } } -private fun loadDefaultConfig() = YamlConfig.loadResource(ClasspathResourceConverter().convert(DEFAULT_CONFIG)) - const val DEFAULT_CONFIG = "default-detekt-config.yml" + +fun loadDefaultConfig() = YamlConfig.loadResource(ClasspathResourceConverter().convert(DEFAULT_CONFIG)) diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/ExitCode.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/ExitCode.kt new file mode 100644 index 000000000000..63447da8ad76 --- /dev/null +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/ExitCode.kt @@ -0,0 +1,8 @@ +package io.gitlab.arturbosch.detekt.cli + +enum class ExitCode(val number: Int) { + NORMAL_RUN(0), + UNEXPECTED_DETEKT_ERROR(1), + MAX_ISSUES_REACHED(2), + INVALID_CONFIG(3), +} diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/InvalidConfig.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/InvalidConfig.kt new file mode 100644 index 000000000000..8081c84cfa5b --- /dev/null +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/InvalidConfig.kt @@ -0,0 +1,3 @@ +package io.gitlab.arturbosch.detekt.cli + +class InvalidConfig(override val message: String?) : RuntimeException(message, null, true, false) diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Main.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Main.kt index 3d9b756e7f30..adc2d1b94866 100644 --- a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Main.kt +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/Main.kt @@ -14,18 +14,17 @@ import kotlin.system.exitProcess fun main(args: Array) { try { buildRunner(args).execute() + } catch (e: InvalidConfig) { + e.printStackTrace() + exitProcess(ExitCode.INVALID_CONFIG.number) } catch (e: BuildFailure) { - // Exit with status code 2 when maxIssues value from configuration was reached. e.printStackTrace() - exitProcess(2) + exitProcess(ExitCode.MAX_ISSUES_REACHED.number) } catch (e: Exception) { - // Exit with status code 1 when an unexpected error occurred. e.printStackTrace() - exitProcess(1) + exitProcess(ExitCode.UNEXPECTED_DETEKT_ERROR.number) } - // Exit with status code 0 when detekt ran normally and maxIssues or failThreshold count was not reached in - // BuildFailureReport. - exitProcess(0) + exitProcess(ExitCode.NORMAL_RUN.number) } fun buildRunner(args: Array): Executable { diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/runners/Runner.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/runners/Runner.kt index fb733dbfa02f..5263d06180c3 100644 --- a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/runners/Runner.kt +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/runners/Runner.kt @@ -1,9 +1,14 @@ package io.gitlab.arturbosch.detekt.cli.runners import io.gitlab.arturbosch.detekt.api.Detektion +import io.gitlab.arturbosch.detekt.api.Notification +import io.gitlab.arturbosch.detekt.api.internal.CommaSeparatedPattern +import io.gitlab.arturbosch.detekt.api.internal.DEFAULT_PROPERTY_EXCLUDES import io.gitlab.arturbosch.detekt.api.internal.SimpleNotification +import io.gitlab.arturbosch.detekt.api.internal.validateConfig import io.gitlab.arturbosch.detekt.cli.BuildFailure import io.gitlab.arturbosch.detekt.cli.CliArgs +import io.gitlab.arturbosch.detekt.cli.InvalidConfig import io.gitlab.arturbosch.detekt.cli.OutputFacade import io.gitlab.arturbosch.detekt.cli.createClasspath import io.gitlab.arturbosch.detekt.cli.createFilters @@ -11,6 +16,7 @@ import io.gitlab.arturbosch.detekt.cli.createPlugins import io.gitlab.arturbosch.detekt.cli.getOrComputeWeightedAmountOfIssues import io.gitlab.arturbosch.detekt.cli.isValidAndSmallerOrEqual import io.gitlab.arturbosch.detekt.cli.loadConfiguration +import io.gitlab.arturbosch.detekt.cli.loadDefaultConfig import io.gitlab.arturbosch.detekt.cli.maxIssues import io.gitlab.arturbosch.detekt.core.DetektFacade import io.gitlab.arturbosch.detekt.core.ProcessingSettings @@ -19,6 +25,7 @@ class Runner(private val arguments: CliArgs) : Executable { override fun execute() { createSettings().use { settings -> + checkConfiguration(settings) val (time, result) = measure { DetektFacade.create(settings).run() } result.add(SimpleNotification("detekt finished in $time ms.")) OutputFacade(arguments, result, settings).run() @@ -28,6 +35,26 @@ class Runner(private val arguments: CliArgs) : Executable { } } + private fun checkConfiguration(settings: ProcessingSettings) { + settings.debug { "\n${settings.config}\n" } + val props = settings.config.subConfig("config") + val shouldValidate = props.valueOrDefault("validation", true) + + fun patterns(): Set { + val excludes = props.valueOrDefault("excludes", "") + ",$DEFAULT_PROPERTY_EXCLUDES" + return CommaSeparatedPattern(excludes).mapToRegex() + } + + if (shouldValidate) { + val notifications = validateConfig(settings.config, loadDefaultConfig(), patterns()) + if (notifications.isNotEmpty()) { + notifications.map(Notification::message).forEach(settings::info) + val propsString = if (notifications.size == 1) "property" else "properties" + throw InvalidConfig("Run failed with ${notifications.size} invalid config $propsString.") + } + } + } + private fun checkBuildFailureThreshold(result: Detektion, settings: ProcessingSettings) { val amount = result.getOrComputeWeightedAmountOfIssues(settings.config) val maxIssues = settings.config.maxIssues() diff --git a/detekt-cli/src/main/resources/default-detekt-config.yml b/detekt-cli/src/main/resources/default-detekt-config.yml index b3f293af127d..96a78d642d99 100644 --- a/detekt-cli/src/main/resources/default-detekt-config.yml +++ b/detekt-cli/src/main/resources/default-detekt-config.yml @@ -6,6 +6,11 @@ build: # style: 1 # comments: 1 +config: + validation: true + # when writing own rules with new properties, exclude the property path e.g.: "my_rule_set,.*>.*>[my_property]" + excludes: "" + processors: active: true exclude: diff --git a/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/DefaultConfigValidationSpec.kt b/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/DefaultConfigValidationSpec.kt new file mode 100644 index 000000000000..a1b100325812 --- /dev/null +++ b/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/DefaultConfigValidationSpec.kt @@ -0,0 +1,19 @@ +package io.gitlab.arturbosch.detekt.cli + +import io.gitlab.arturbosch.detekt.api.internal.validateConfig +import io.gitlab.arturbosch.detekt.test.yamlConfig +import org.assertj.core.api.Assertions.assertThat +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe + +class DefaultConfigValidationSpec : Spek({ + + describe("default configuration is valid") { + + it("is valid comparing itself") { + val baseline = yamlConfig("default-detekt-config.yml") + val result = validateConfig(baseline, baseline) + assertThat(result).isEmpty() + } + } +}) diff --git a/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/runners/RunnerSpec.kt b/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/runners/RunnerSpec.kt index 4be8f21240b1..d7b74e4045ff 100644 --- a/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/runners/RunnerSpec.kt +++ b/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/runners/RunnerSpec.kt @@ -2,6 +2,7 @@ package io.gitlab.arturbosch.detekt.cli.runners import io.gitlab.arturbosch.detekt.cli.BuildFailure import io.gitlab.arturbosch.detekt.cli.CliArgs +import io.gitlab.arturbosch.detekt.cli.InvalidConfig import io.gitlab.arturbosch.detekt.test.resource import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy @@ -39,6 +40,15 @@ class RunnerSpec : Spek({ assertThatThrownBy { Runner(cliArgs).execute() }.isExactlyInstanceOf(BuildFailure::class.java) } + it("should throw on invalid config property") { + val cliArgs = CliArgs.parse(arrayOf( + "--input", inputPath.toString(), + "--config-resource", "/configs/invalid-config.yml" + )) + + assertThatThrownBy { Runner(cliArgs).execute() }.isExactlyInstanceOf(InvalidConfig::class.java) + } + it("should never throw on maxIssues=-1") { val tmpReport = Files.createTempFile("RunnerSpec", ".txt") val cliArgs = CliArgs.parse(arrayOf( diff --git a/detekt-cli/src/test/resources/configs/invalid-config.yml b/detekt-cli/src/test/resources/configs/invalid-config.yml new file mode 100644 index 000000000000..68f655aca527 --- /dev/null +++ b/detekt-cli/src/test/resources/configs/invalid-config.yml @@ -0,0 +1,2 @@ +non-existing-property: + active: true diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/rulesetpage/ConfigPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/rulesetpage/ConfigPrinter.kt index 5e59734af66d..390ca71272c1 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/rulesetpage/ConfigPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/rulesetpage/ConfigPrinter.kt @@ -17,6 +17,8 @@ object ConfigPrinter : DocumentationPrinter> { return yaml { yaml { defaultBuildConfiguration() } emptyLine() + yaml { defaultConfigConfiguration() } + emptyLine() yaml { defaultProcessorsConfiguration() } emptyLine() yaml { defaultConsoleReportsConfiguration() } @@ -73,6 +75,13 @@ object ConfigPrinter : DocumentationPrinter> { # comments: 1 """.trimIndent() + private fun defaultConfigConfiguration(): String = """ + config: + validation: true + # when writing own rules with new properties, exclude the property path e.g.: "my_rule_set,.*>.*>[my_property]" + excludes: "" + """.trimIndent() + private fun defaultProcessorsConfiguration(): String = """ processors: active: true diff --git a/docs/pages/kdoc/detekt-api/alltypes/index.md b/docs/pages/kdoc/detekt-api/alltypes/index.md index fd1599a8f421..e19e043685f9 100644 --- a/docs/pages/kdoc/detekt-api/alltypes/index.md +++ b/docs/pages/kdoc/detekt-api/alltypes/index.md @@ -35,6 +35,11 @@ A code smell indicates any possible design problem inside a program's source cod The type of a code smell is described by an [Issue](../io.gitlab.arturbosch.detekt.api/-issue/index.html). +| + +##### [io.gitlab.arturbosch.detekt.api.internal.CommaSeparatedPattern](../io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/index.html) + + | ##### [io.gitlab.arturbosch.detekt.api.Compactable](../io.gitlab.arturbosch.detekt.api/-compactable/index.html) @@ -140,6 +145,11 @@ Defines extension points in detekt. Currently supported extensions are: +| + +##### [io.gitlab.arturbosch.detekt.api.internal.FailFastConfig](../io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/index.html) + + | ##### [io.gitlab.arturbosch.detekt.api.FileProcessListener](../io.gitlab.arturbosch.detekt.api/-file-process-listener/index.html) @@ -379,6 +389,11 @@ Provides a threshold attribute for this rule, which is specified manually for de but can be also obtained from within a configuration object. +| + +##### [io.gitlab.arturbosch.detekt.api.internal.ValidatableConfiguration](../io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.html) + + | ##### [io.gitlab.arturbosch.detekt.api.YamlConfig](../io.gitlab.arturbosch.detekt.api/-yaml-config/index.html) diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/-init-.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/-init-.md new file mode 100644 index 000000000000..2100fb181b46 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/-init-.md @@ -0,0 +1,9 @@ +--- +title: CommaSeparatedPattern. - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [CommaSeparatedPattern](index.html) / [<init>](./-init-.html) + +# <init> + +`CommaSeparatedPattern(text: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`, delimiters: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` = ",")` \ No newline at end of file diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/index.md new file mode 100644 index 000000000000..dc0392b10748 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/index.md @@ -0,0 +1,18 @@ +--- +title: CommaSeparatedPattern - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [CommaSeparatedPattern](./index.html) + +# CommaSeparatedPattern + +`class CommaSeparatedPattern : `[`SplitPattern`](../../io.gitlab.arturbosch.detekt.api/-split-pattern/index.html) + +### Constructors + +| [<init>](-init-.html) | `CommaSeparatedPattern(text: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`, delimiters: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)` = ",")` | + +### Functions + +| [mapToRegex](map-to-regex.html) | `fun mapToRegex(): `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>` | + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/map-to-regex.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/map-to-regex.md new file mode 100644 index 000000000000..747cf5fd8062 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/map-to-regex.md @@ -0,0 +1,9 @@ +--- +title: CommaSeparatedPattern.mapToRegex - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [CommaSeparatedPattern](index.html) / [mapToRegex](./map-to-regex.html) + +# mapToRegex + +`fun mapToRegex(): `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>` \ No newline at end of file diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-d-e-f-a-u-l-t_-p-r-o-p-e-r-t-y_-e-x-c-l-u-d-e-s.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-d-e-f-a-u-l-t_-p-r-o-p-e-r-t-y_-e-x-c-l-u-d-e-s.md new file mode 100644 index 000000000000..3d3a1b728dc1 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-d-e-f-a-u-l-t_-p-r-o-p-e-r-t-y_-e-x-c-l-u-d-e-s.md @@ -0,0 +1,15 @@ +--- +title: DEFAULT_PROPERTY_EXCLUDES - detekt-api +--- + +[detekt-api](../index.html) / [io.gitlab.arturbosch.detekt.api.internal](index.html) / [DEFAULT_PROPERTY_EXCLUDES](./-d-e-f-a-u-l-t_-p-r-o-p-e-r-t-y_-e-x-c-l-u-d-e-s.html) + +# DEFAULT_PROPERTY_EXCLUDES + +`const val DEFAULT_PROPERTY_EXCLUDES: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) + +Known existing properties on rule's which my be absent in the default-detekt-config.yml. + +We need to predefine them as the user may not have already declared an 'config'-block +in the configuration and we want to validate the config by default. + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/-init-.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/-init-.md new file mode 100644 index 000000000000..90f61dc2f74b --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/-init-.md @@ -0,0 +1,9 @@ +--- +title: FailFastConfig. - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [FailFastConfig](index.html) / [<init>](./-init-.html) + +# <init> + +`FailFastConfig(originalConfig: `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, defaultConfig: `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`)` \ No newline at end of file diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/index.md new file mode 100644 index 000000000000..b00038821c6a --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/index.md @@ -0,0 +1,21 @@ +--- +title: FailFastConfig - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [FailFastConfig](./index.html) + +# FailFastConfig + +`data class FailFastConfig : `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, `[`ValidatableConfiguration`](../-validatable-configuration/index.html) + +### Constructors + +| [<init>](-init-.html) | `FailFastConfig(originalConfig: `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, defaultConfig: `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`)` | + +### Functions + +| [subConfig](sub-config.html) | Tries to retrieve part of the configuration based on given key.`fun subConfig(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): `[`FailFastConfig`](./index.html) | +| [validate](validate.html) | `fun validate(baseline: `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../../io.gitlab.arturbosch.detekt.api/-notification/index.html)`>` | +| [valueOrDefault](value-or-default.html) | Retrieves a sub configuration or value based on given key. If configuration property cannot be found the specified default value is returned.`fun valueOrDefault(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`, default: T): T` | +| [valueOrNull](value-or-null.html) | Retrieves a sub configuration or value based on given key. If the configuration property cannot be found, null is returned.`fun valueOrNull(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): T?` | + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/sub-config.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/sub-config.md new file mode 100644 index 000000000000..42b2f2e8e78c --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/sub-config.md @@ -0,0 +1,12 @@ +--- +title: FailFastConfig.subConfig - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [FailFastConfig](index.html) / [subConfig](./sub-config.html) + +# subConfig + +`fun subConfig(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): `[`FailFastConfig`](index.html) + +Tries to retrieve part of the configuration based on given key. + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/validate.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/validate.md new file mode 100644 index 000000000000..9cd7bb92e577 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/validate.md @@ -0,0 +1,9 @@ +--- +title: FailFastConfig.validate - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [FailFastConfig](index.html) / [validate](./validate.html) + +# validate + +`fun validate(baseline: `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../../io.gitlab.arturbosch.detekt.api/-notification/index.html)`>` \ No newline at end of file diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/value-or-default.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/value-or-default.md new file mode 100644 index 000000000000..0f27c28f4295 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/value-or-default.md @@ -0,0 +1,13 @@ +--- +title: FailFastConfig.valueOrDefault - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [FailFastConfig](index.html) / [valueOrDefault](./value-or-default.html) + +# valueOrDefault + +`fun valueOrDefault(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`, default: T): T` + +Retrieves a sub configuration or value based on given key. If configuration property cannot be found +the specified default value is returned. + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/value-or-null.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/value-or-null.md new file mode 100644 index 000000000000..e09035da3161 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/value-or-null.md @@ -0,0 +1,13 @@ +--- +title: FailFastConfig.valueOrNull - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [FailFastConfig](index.html) / [valueOrNull](./value-or-null.html) + +# valueOrNull + +`fun valueOrNull(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): T?` + +Retrieves a sub configuration or value based on given key. +If the configuration property cannot be found, null is returned. + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-simple-notification/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-simple-notification/index.md index e989b7c67870..5f8b77bbaa28 100644 --- a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-simple-notification/index.md +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-simple-notification/index.md @@ -16,3 +16,7 @@ title: SimpleNotification - detekt-api | [message](message.html) | `val message: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) | +### Functions + +| [toString](to-string.html) | `fun toString(): `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) | + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-simple-notification/to-string.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-simple-notification/to-string.md new file mode 100644 index 000000000000..c5430bb7f250 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-simple-notification/to-string.md @@ -0,0 +1,9 @@ +--- +title: SimpleNotification.toString - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [SimpleNotification](index.html) / [toString](./to-string.html) + +# toString + +`fun toString(): `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) \ No newline at end of file diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.md new file mode 100644 index 000000000000..dc45dfeb4cb4 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.md @@ -0,0 +1,20 @@ +--- +title: ValidatableConfiguration - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [ValidatableConfiguration](./index.html) + +# ValidatableConfiguration + +`interface ValidatableConfiguration` + +### Functions + +| [validate](validate.html) | `abstract fun validate(baseline: `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../../io.gitlab.arturbosch.detekt.api/-notification/index.html)`>` | + +### Inheritors + +| [CompositeConfig](../../io.gitlab.arturbosch.detekt.api/-composite-config/index.html) | Wraps two different configuration which should be considered when retrieving properties.`class CompositeConfig : `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, `[`ValidatableConfiguration`](./index.html) | +| [FailFastConfig](../-fail-fast-config/index.html) | `data class FailFastConfig : `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, `[`ValidatableConfiguration`](./index.html) | +| [YamlConfig](../../io.gitlab.arturbosch.detekt.api/-yaml-config/index.html) | Config implementation using the yaml format. SubConfigurations can return sub maps according to the yaml specification.`class YamlConfig : `[`BaseConfig`](../../io.gitlab.arturbosch.detekt.api/-base-config/index.html)`, `[`ValidatableConfiguration`](./index.html) | + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/validate.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/validate.md new file mode 100644 index 000000000000..f4182f607109 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/validate.md @@ -0,0 +1,9 @@ +--- +title: ValidatableConfiguration.validate - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api.internal](../index.html) / [ValidatableConfiguration](index.html) / [validate](./validate.html) + +# validate + +`abstract fun validate(baseline: `[`Config`](../../io.gitlab.arturbosch.detekt.api/-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../../io.gitlab.arturbosch.detekt.api/-notification/index.html)`>` \ No newline at end of file diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/index.md index 7e369ea07e00..090c92e83318 100644 --- a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/index.md +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/index.md @@ -8,10 +8,13 @@ title: io.gitlab.arturbosch.detekt.api.internal - detekt-api ### Types +| [CommaSeparatedPattern](-comma-separated-pattern/index.html) | `class CommaSeparatedPattern : `[`SplitPattern`](../io.gitlab.arturbosch.detekt.api/-split-pattern/index.html) | | [DetektPomModel](-detekt-pom-model/index.html) | Adapted from https://github.com/pinterest/ktlint/blob/master/ktlint-core/src/main/kotlin/com/pinterest/ktlint/core/KtLint.kt Licenced under the MIT licence - https://github.com/pinterest/ktlint/blob/master/LICENSE`class DetektPomModel : UserDataHolderBase, PomModel` | +| [FailFastConfig](-fail-fast-config/index.html) | `data class FailFastConfig : `[`Config`](../io.gitlab.arturbosch.detekt.api/-config/index.html)`, `[`ValidatableConfiguration`](-validatable-configuration/index.html) | | [McCabeVisitor](-mc-cabe-visitor/index.html) | Counts the cyclomatic complexity of functions.`class McCabeVisitor : `[`DetektVisitor`](../io.gitlab.arturbosch.detekt.api/-detekt-visitor/index.html) | | [PathFilters](-path-filters/index.html) | `class PathFilters` | | [SimpleNotification](-simple-notification/index.html) | `data class SimpleNotification : `[`Notification`](../io.gitlab.arturbosch.detekt.api/-notification/index.html) | +| [ValidatableConfiguration](-validatable-configuration/index.html) | `interface ValidatableConfiguration` | ### Extensions for External Classes @@ -23,6 +26,7 @@ title: io.gitlab.arturbosch.detekt.api.internal - detekt-api ### Properties | [ABSOLUTE_PATH](-a-b-s-o-l-u-t-e_-p-a-t-h.html) | `val ABSOLUTE_PATH: Key<`[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`>` | +| [DEFAULT_PROPERTY_EXCLUDES](-d-e-f-a-u-l-t_-p-r-o-p-e-r-t-y_-e-x-c-l-u-d-e-s.html) | Known existing properties on rule's which my be absent in the default-detekt-config.yml.`const val DEFAULT_PROPERTY_EXCLUDES: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) | | [RELATIVE_PATH](-r-e-l-a-t-i-v-e_-p-a-t-h.html) | `val RELATIVE_PATH: Key<`[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`>` | ### Functions @@ -30,4 +34,5 @@ title: io.gitlab.arturbosch.detekt.api.internal - detekt-api | [createCompilerConfiguration](create-compiler-configuration.html) | Creates a compiler configuration for the kotlin compiler with all known sources and classpath jars. Be aware that if any path of [pathsToAnalyze](create-compiler-configuration.html#io.gitlab.arturbosch.detekt.api.internal$createCompilerConfiguration(kotlin.collections.List((java.nio.file.Path)), kotlin.collections.List((kotlin.String)), org.jetbrains.kotlin.config.LanguageVersion, org.jetbrains.kotlin.config.JvmTarget)/pathsToAnalyze) is a directory it is scanned for java and kotlin files.`fun createCompilerConfiguration(pathsToAnalyze: `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Path`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html)`>, classpath: `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`>, languageVersion: LanguageVersion?, jvmTarget: JvmTarget): CompilerConfiguration` | | [createKotlinCoreEnvironment](create-kotlin-core-environment.html) | Creates an environment instance which can be used to compile source code to KtFile's. This environment also allows to modify the resulting AST files.`fun createKotlinCoreEnvironment(configuration: CompilerConfiguration = CompilerConfiguration()): KotlinCoreEnvironment` | | [pathMatcher](path-matcher.html) | Converts given [pattern](path-matcher.html#io.gitlab.arturbosch.detekt.api.internal$pathMatcher(kotlin.String)/pattern) into a [PathMatcher](https://docs.oracle.com/javase/8/docs/api/java/nio/file/PathMatcher.html) specified by [FileSystem.getPathMatcher](https://docs.oracle.com/javase/8/docs/api/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String)). We only support the "glob:" syntax to stay os independently. Internally a globbing pattern is transformed to a regex respecting the Windows file system.`fun pathMatcher(pattern: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): `[`PathMatcher`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/PathMatcher.html) | +| [validateConfig](validate-config.html) | `fun validateConfig(config: `[`Config`](../io.gitlab.arturbosch.detekt.api/-config/index.html)`, baseline: `[`Config`](../io.gitlab.arturbosch.detekt.api/-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`> = CommaSeparatedPattern(DEFAULT_PROPERTY_EXCLUDES).mapToRegex()): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../io.gitlab.arturbosch.detekt.api/-notification/index.html)`>` | diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/validate-config.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/validate-config.md new file mode 100644 index 000000000000..83e824dd5ff7 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api.internal/validate-config.md @@ -0,0 +1,9 @@ +--- +title: validateConfig - detekt-api +--- + +[detekt-api](../index.html) / [io.gitlab.arturbosch.detekt.api.internal](index.html) / [validateConfig](./validate-config.html) + +# validateConfig + +`fun validateConfig(config: `[`Config`](../io.gitlab.arturbosch.detekt.api/-config/index.html)`, baseline: `[`Config`](../io.gitlab.arturbosch.detekt.api/-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`> = CommaSeparatedPattern(DEFAULT_PROPERTY_EXCLUDES).mapToRegex()): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../io.gitlab.arturbosch.detekt.api/-notification/index.html)`>` \ No newline at end of file diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-base-config/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-base-config/index.md index 1d5d8bbec65e..8b58bb33ddc5 100644 --- a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-base-config/index.md +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-base-config/index.md @@ -21,5 +21,5 @@ Convenient base configuration which parses/casts the configuration value based o ### Inheritors -| [YamlConfig](../-yaml-config/index.html) | Config implementation using the yaml format. SubConfigurations can return sub maps according to the yaml specification.`class YamlConfig : `[`BaseConfig`](./index.html) | +| [YamlConfig](../-yaml-config/index.html) | Config implementation using the yaml format. SubConfigurations can return sub maps according to the yaml specification.`class YamlConfig : `[`BaseConfig`](./index.html)`, `[`ValidatableConfiguration`](../../io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.html) | diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-composite-config/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-composite-config/index.md index 21542d1e9ef1..7adc4b5a6f04 100644 --- a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-composite-config/index.md +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-composite-config/index.md @@ -6,7 +6,7 @@ title: CompositeConfig - detekt-api # CompositeConfig -`class CompositeConfig : `[`Config`](../-config/index.html) +`class CompositeConfig : `[`Config`](../-config/index.html)`, `[`ValidatableConfiguration`](../../io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.html) Wraps two different configuration which should be considered when retrieving properties. @@ -18,6 +18,7 @@ Wraps two different configuration which should be considered when retrieving pro | [subConfig](sub-config.html) | Tries to retrieve part of the configuration based on given key.`fun subConfig(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): `[`Config`](../-config/index.html) | | [toString](to-string.html) | `fun toString(): `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) | +| [validate](validate.html) | Validates both sides of the composite config according to defined properties of the baseline config.`fun validate(baseline: `[`Config`](../-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../-notification/index.html)`>` | | [valueOrDefault](value-or-default.html) | Retrieves a sub configuration or value based on given key. If configuration property cannot be found the specified default value is returned.`fun valueOrDefault(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`, default: T): T` | | [valueOrNull](value-or-null.html) | Retrieves a sub configuration or value based on given key. If the configuration property cannot be found, null is returned.`fun valueOrNull(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): T?` | diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-composite-config/validate.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-composite-config/validate.md new file mode 100644 index 000000000000..d825ac7322f6 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-composite-config/validate.md @@ -0,0 +1,12 @@ +--- +title: CompositeConfig.validate - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api](../index.html) / [CompositeConfig](index.html) / [validate](./validate.html) + +# validate + +`fun validate(baseline: `[`Config`](../-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../-notification/index.html)`>` + +Validates both sides of the composite config according to defined properties of the baseline config. + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-config/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-config/index.md index 374dfa7069a7..d59f43df2333 100644 --- a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-config/index.md +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-config/index.md @@ -30,7 +30,8 @@ A configuration holds information about how to configure specific rules. ### Inheritors -| [CompositeConfig](../-composite-config/index.html) | Wraps two different configuration which should be considered when retrieving properties.`class CompositeConfig : `[`Config`](./index.html) | +| [CompositeConfig](../-composite-config/index.html) | Wraps two different configuration which should be considered when retrieving properties.`class CompositeConfig : `[`Config`](./index.html)`, `[`ValidatableConfiguration`](../../io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.html) | | [ConfigAware](../-config-aware/index.html) | Interface which is implemented by each Rule class to provide utility functions to retrieve specific or generic properties from the underlying detekt configuration file.`interface ConfigAware : `[`Config`](./index.html) | +| [FailFastConfig](../../io.gitlab.arturbosch.detekt.api.internal/-fail-fast-config/index.html) | `data class FailFastConfig : `[`Config`](./index.html)`, `[`ValidatableConfiguration`](../../io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.html) | | [HierarchicalConfig](../-hierarchical-config/index.html) | A configuration which keeps track of the config it got sub-config'ed from by the [subConfig](sub-config.html) function. It's main usage is to recreate the property-path which was taken when using the [subConfig](sub-config.html) function repeatedly.`interface HierarchicalConfig : `[`Config`](./index.html) | diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-config/validate.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-config/validate.md new file mode 100644 index 000000000000..38fdf3812f9c --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-config/validate.md @@ -0,0 +1,12 @@ +--- +title: Config.validate - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api](../index.html) / [Config](index.html) / [validate](./validate.html) + +# validate + +`fun validate(config: `[`Config`](index.html)`, baseline: `[`Config`](index.html)`): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../-notification/index.html)`>` + +Validates given first config according to properties defined in given baseline config. + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-split-pattern/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-split-pattern/index.md index 446881ff61c9..fae250337b31 100644 --- a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-split-pattern/index.md +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-split-pattern/index.md @@ -6,7 +6,7 @@ title: SplitPattern - detekt-api # SplitPattern -`class SplitPattern` +`open class SplitPattern` Splits given text into parts and provides testing utilities for its elements. Basic use cases are to specify different function or class names in the detekt @@ -26,3 +26,7 @@ yaml config and test for their appearance in specific rules. | [none](none.html) | Tests if none of the parts contain the given [value](none.html#io.gitlab.arturbosch.detekt.api.SplitPattern$none(kotlin.String)/value).`fun none(value: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): `[`Boolean`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html) | | [startWith](start-with.html) | Tests if any part starts with the given [value](start-with.html#io.gitlab.arturbosch.detekt.api.SplitPattern$startWith(kotlin.String)/value)`fun startWith(value: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`?): `[`Boolean`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html) | +### Inheritors + +| [CommaSeparatedPattern](../../io.gitlab.arturbosch.detekt.api.internal/-comma-separated-pattern/index.html) | `class CommaSeparatedPattern : `[`SplitPattern`](./index.html) | + diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-yaml-config/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-yaml-config/index.md index 03e403f32fdc..41edbdcdf5b6 100644 --- a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-yaml-config/index.md +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-yaml-config/index.md @@ -6,7 +6,7 @@ title: YamlConfig - detekt-api # YamlConfig -`class YamlConfig : `[`BaseConfig`](../-base-config/index.html) +`class YamlConfig : `[`BaseConfig`](../-base-config/index.html)`, `[`ValidatableConfiguration`](../../io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.html) Config implementation using the yaml format. SubConfigurations can return sub maps according to the yaml specification. @@ -20,6 +20,7 @@ yaml specification. | [subConfig](sub-config.html) | Tries to retrieve part of the configuration based on given key.`fun subConfig(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): `[`Config`](../-config/index.html) | | [toString](to-string.html) | `fun toString(): `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) | +| [validate](validate.html) | `fun validate(baseline: `[`Config`](../-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../-notification/index.html)`>` | | [valueOrDefault](value-or-default.html) | Retrieves a sub configuration or value based on given key. If configuration property cannot be found the specified default value is returned.`fun valueOrDefault(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`, default: T): T` | | [valueOrNull](value-or-null.html) | Retrieves a sub configuration or value based on given key. If the configuration property cannot be found, null is returned.`fun valueOrNull(key: `[`String`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html)`): T?` | diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-yaml-config/validate.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-yaml-config/validate.md new file mode 100644 index 000000000000..d5c1607bda47 --- /dev/null +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/-yaml-config/validate.md @@ -0,0 +1,9 @@ +--- +title: YamlConfig.validate - detekt-api +--- + +[detekt-api](../../index.html) / [io.gitlab.arturbosch.detekt.api](../index.html) / [YamlConfig](index.html) / [validate](./validate.html) + +# validate + +`fun validate(baseline: `[`Config`](../-config/index.html)`, excludePatterns: `[`Set`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/index.html)`<`[`Regex`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)`>): `[`List`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)`<`[`Notification`](../-notification/index.html)`>` \ No newline at end of file diff --git a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/index.md b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/index.md index 35bc5c6c5ae6..fdda3bf28b00 100644 --- a/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/index.md +++ b/docs/pages/kdoc/detekt-api/io.gitlab.arturbosch.detekt.api/index.md @@ -13,7 +13,7 @@ title: io.gitlab.arturbosch.detekt.api - detekt-api | [BaseRule](-base-rule/index.html) | Defines the visiting mechanism for KtFile's.`abstract class BaseRule : `[`DetektVisitor`](-detekt-visitor/index.html)`, `[`Context`](-context/index.html) | | [CodeSmell](-code-smell/index.html) | A code smell indicates any possible design problem inside a program's source code. The type of a code smell is described by an [Issue](-issue/index.html).`open class CodeSmell : `[`Finding`](-finding/index.html) | | [Compactable](-compactable/index.html) | Provides a compact string representation.`interface Compactable` | -| [CompositeConfig](-composite-config/index.html) | Wraps two different configuration which should be considered when retrieving properties.`class CompositeConfig : `[`Config`](-config/index.html) | +| [CompositeConfig](-composite-config/index.html) | Wraps two different configuration which should be considered when retrieving properties.`class CompositeConfig : `[`Config`](-config/index.html)`, `[`ValidatableConfiguration`](../io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.html) | | [Config](-config/index.html) | A configuration holds information about how to configure specific rules.`interface Config` | | [ConfigAware](-config-aware/index.html) | Interface which is implemented by each Rule class to provide utility functions to retrieve specific or generic properties from the underlying detekt configuration file.`interface ConfigAware : `[`Config`](-config/index.html) | | [ConsoleReport](-console-report/index.html) | Extension point which describes how findings should be printed on the console.`abstract class ConsoleReport : `[`Extension`](-extension/index.html) | @@ -46,11 +46,11 @@ title: io.gitlab.arturbosch.detekt.api - detekt-api | [Severity](-severity/index.html) | Rules can classified into different severity grades. Maintainer can choose a grade which is most harmful to their projects.`enum class Severity` | | [SingleAssign](-single-assign/index.html) | Allows to assign a property just once. Further assignments result in [IllegalStateException](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-illegal-state-exception/index.html)'s.`class SingleAssign` | | [SourceLocation](-source-location/index.html) | Stores line and column information of a location.`data class SourceLocation` | -| [SplitPattern](-split-pattern/index.html) | Splits given text into parts and provides testing utilities for its elements. Basic use cases are to specify different function or class names in the detekt yaml config and test for their appearance in specific rules.`class SplitPattern` | +| [SplitPattern](-split-pattern/index.html) | Splits given text into parts and provides testing utilities for its elements. Basic use cases are to specify different function or class names in the detekt yaml config and test for their appearance in specific rules.`open class SplitPattern` | | [TextLocation](-text-location/index.html) | Stores character start and end positions of an text file.`data class TextLocation` | | [ThresholdedCodeSmell](-thresholded-code-smell/index.html) | Represents a code smell for which a specific metric can be determined which is responsible for the existence of this rule violation.`open class ThresholdedCodeSmell : `[`CodeSmell`](-code-smell/index.html) | | [ThresholdRule](-threshold-rule/index.html) | Provides a threshold attribute for this rule, which is specified manually for default values but can be also obtained from within a configuration object.`abstract class ThresholdRule : `[`Rule`](-rule/index.html) | -| [YamlConfig](-yaml-config/index.html) | Config implementation using the yaml format. SubConfigurations can return sub maps according to the yaml specification.`class YamlConfig : `[`BaseConfig`](-base-config/index.html) | +| [YamlConfig](-yaml-config/index.html) | Config implementation using the yaml format. SubConfigurations can return sub maps according to the yaml specification.`class YamlConfig : `[`BaseConfig`](-base-config/index.html)`, `[`ValidatableConfiguration`](../io.gitlab.arturbosch.detekt.api.internal/-validatable-configuration/index.html) | ### Extensions for External Classes