From 5662cb5a4c2dee88cd5375b5f77d5986784fcb04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brais=20Gab=C3=ADn?= Date: Tue, 29 Mar 2022 12:37:53 +0200 Subject: [PATCH] Fix regression generating configuration (#4646) --- .../detekt/api/AnnotationExcluderSpec.kt | 2 +- .../gitlab/arturbosch/detekt/cli/CliRunner.kt | 2 +- .../io/gitlab/arturbosch/detekt/cli/Main.kt | 2 +- .../detekt/cli/runners/ConfigExporter.kt | 13 ++++--- .../detekt/cli/runners/ConfigExporterSpec.kt | 17 ++++------ .../detekt/core/ProcessingSettings.kt | 2 +- .../detekt/core/settings/ClassloaderAware.kt | 7 ++-- .../core/tooling/DefaultConfigProvider.kt | 23 ++++++++----- .../core/tooling/DefaultConfigProviderSpec.kt | 14 ++++---- detekt-tooling/api/detekt-tooling.api | 6 ++-- .../api/DefaultConfigurationProvider.kt | 13 ++++--- .../api/DefaultConfigurationProviderSpec.kt | 34 ++++--------------- 12 files changed, 61 insertions(+), 74 deletions(-) diff --git a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/AnnotationExcluderSpec.kt b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/AnnotationExcluderSpec.kt index 29361765a055..6da78a438adb 100644 --- a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/AnnotationExcluderSpec.kt +++ b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/AnnotationExcluderSpec.kt @@ -114,7 +114,7 @@ class AnnotationExcluderSpec(private val env: KotlinCoreEnvironment) { } @Nested - inner class `Know where ends a package` { + inner class `Know where a package ends` { val helloWorldAnnotationsKtFile = compileContentForTest( """ package com.Hello diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/CliRunner.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/CliRunner.kt index 0abcb35f5992..9f17fa60be6f 100644 --- a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/CliRunner.kt +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/CliRunner.kt @@ -20,7 +20,7 @@ class CliRunner : DetektCli { val specialRunner = when { arguments.showVersion -> VersionPrinter(outputChannel) - arguments.generateConfig -> ConfigExporter(arguments, outputChannel, errorChannel) + arguments.generateConfig -> ConfigExporter(arguments, outputChannel) arguments.printAst -> AstPrinter(arguments, outputChannel) else -> null } 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 915dc72a6aa0..18d211adca9c 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 @@ -54,7 +54,7 @@ fun buildRunner( val arguments = parseArguments(args) return when { arguments.showVersion -> VersionPrinter(outputPrinter) - arguments.generateConfig -> ConfigExporter(arguments, outputPrinter, errorPrinter) + arguments.generateConfig -> ConfigExporter(arguments, outputPrinter) arguments.printAst -> AstPrinter(arguments, outputPrinter) else -> Runner(arguments, outputPrinter, errorPrinter) } diff --git a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/runners/ConfigExporter.kt b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/runners/ConfigExporter.kt index f10891ecd91a..c2491bdc73b6 100644 --- a/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/runners/ConfigExporter.kt +++ b/detekt-cli/src/main/kotlin/io/gitlab/arturbosch/detekt/cli/runners/ConfigExporter.kt @@ -1,20 +1,25 @@ package io.gitlab.arturbosch.detekt.cli.runners import io.github.detekt.tooling.api.DefaultConfigurationProvider +import io.github.detekt.tooling.api.spec.ProcessingSpec import io.gitlab.arturbosch.detekt.cli.CliArgs -import io.gitlab.arturbosch.detekt.cli.createSpec +import io.gitlab.arturbosch.detekt.cli.MultipleExistingPathConverter import java.nio.file.Paths class ConfigExporter( private val arguments: CliArgs, private val outputPrinter: Appendable, - private val errorPrinter: Appendable, ) : Executable { override fun execute() { val configPath = Paths.get(arguments.config ?: "detekt.yml") - val spec = arguments.createSpec(outputPrinter, errorPrinter) - DefaultConfigurationProvider.load(spec).copy(configPath) + val spec = ProcessingSpec { + extensions { + disableDefaultRuleSets = arguments.disableDefaultRuleSets + fromPaths { arguments.plugins?.let { MultipleExistingPathConverter().convert(it) }.orEmpty() } + } + } + DefaultConfigurationProvider.load(spec.extensionsSpec).copy(configPath) outputPrinter.appendLine("Successfully copied default config to ${configPath.toAbsolutePath()}") } } diff --git a/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/runners/ConfigExporterSpec.kt b/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/runners/ConfigExporterSpec.kt index ffe5dd647ea3..dde645b35ae8 100644 --- a/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/runners/ConfigExporterSpec.kt +++ b/detekt-cli/src/test/kotlin/io/gitlab/arturbosch/detekt/cli/runners/ConfigExporterSpec.kt @@ -4,23 +4,18 @@ import io.github.detekt.test.utils.NullPrintStream import io.github.detekt.test.utils.createTempFileForTest import io.gitlab.arturbosch.detekt.cli.parseArguments import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import java.nio.file.Files class ConfigExporterSpec { - @Nested - inner class `config exporter` { + @Test + fun `should export the given config`() { + val tmpConfig = createTempFileForTest("ConfigPrinterSpec", ".yml").also { Files.delete(it) } + val cliArgs = parseArguments(arrayOf("--config", tmpConfig.toString())) - @Test - fun `should export the given config`() { - val tmpConfig = createTempFileForTest("ConfigPrinterSpec", ".yml") - val cliArgs = parseArguments(arrayOf("--config", tmpConfig.toString())) + ConfigExporter(cliArgs, NullPrintStream()).execute() - ConfigExporter(cliArgs, NullPrintStream(), NullPrintStream()).execute() - - assertThat(Files.readAllLines(tmpConfig)).isNotEmpty - } + assertThat(Files.readAllLines(tmpConfig)).isNotEmpty } } diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/ProcessingSettings.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/ProcessingSettings.kt index afc90b9b4bae..c1369d6d1730 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/ProcessingSettings.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/ProcessingSettings.kt @@ -33,7 +33,7 @@ class ProcessingSettings( LoggingAware by LoggingFacade(spec.loggingSpec), PropertiesAware by PropertiesFacade(), EnvironmentAware by EnvironmentFacade(spec.projectSpec, spec.compilerSpec), - ClassloaderAware by ExtensionFacade(spec.extensionsSpec), + ClassloaderAware by ExtensionFacade(spec.extensionsSpec.plugins), SetupContext { override val configUris: Collection = spec.configSpec.extractUris() diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/settings/ClassloaderAware.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/settings/ClassloaderAware.kt index 1734d9875f38..39b704073219 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/settings/ClassloaderAware.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/settings/ClassloaderAware.kt @@ -14,11 +14,11 @@ interface ClassloaderAware { } class ExtensionFacade( - private val extensionsSpec: ExtensionsSpec + private val plugins: ExtensionsSpec.Plugins? ) : AutoCloseable, Closeable, ClassloaderAware { init { - extensionsSpec.plugins?.paths?.forEach { + plugins?.paths?.forEach { require(Files.exists(it)) { "Given plugin ‘$it’ does not exist." } require(it.toString().endsWith("jar")) { "Given plugin ‘$it’ is not a JAR." } } @@ -28,7 +28,6 @@ class ExtensionFacade( * Shared class loader used to load services from plugin jars. */ override val pluginLoader: ClassLoader by lazy { - val plugins = extensionsSpec.plugins when { plugins?.loader != null -> checkNotNull(plugins.loader) plugins?.paths != null -> { @@ -46,7 +45,7 @@ class ExtensionFacade( } override fun closeLoaderIfNeeded() { - if (extensionsSpec.plugins?.paths != null) { + if (plugins?.paths != null) { // we created a classloader and need to close it closeQuietly(pluginLoader as? URLClassLoader) } diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/tooling/DefaultConfigProvider.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/tooling/DefaultConfigProvider.kt index d87d575219d2..3bddf2f45e46 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/tooling/DefaultConfigProvider.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/tooling/DefaultConfigProvider.kt @@ -1,6 +1,7 @@ package io.gitlab.arturbosch.detekt.core.tooling import io.github.detekt.tooling.api.DefaultConfigurationProvider +import io.github.detekt.tooling.api.spec.ExtensionsSpec import io.github.detekt.tooling.api.spec.ProcessingSpec import io.github.detekt.utils.getSafeResourceAsStream import io.github.detekt.utils.openSafeStream @@ -15,26 +16,26 @@ import java.nio.file.Path import java.nio.file.StandardCopyOption class DefaultConfigProvider : DefaultConfigurationProvider { - private lateinit var spec: ProcessingSpec + private lateinit var extensionsSpec: ExtensionsSpec - override fun init(spec: ProcessingSpec) { - this.spec = spec + override fun init(extensionsSpec: ExtensionsSpec) { + this.extensionsSpec = extensionsSpec } - override fun get(): Config = spec.getDefaultConfiguration() + override fun get(): Config = extensionsSpec.getDefaultConfiguration() override fun copy(targetLocation: Path) { - Files.copy(configInputStream(spec), targetLocation, StandardCopyOption.REPLACE_EXISTING) + Files.copy(configInputStream(extensionsSpec), targetLocation, StandardCopyOption.REPLACE_EXISTING) } } -private fun configInputStream(spec: ProcessingSpec): InputStream { +private fun configInputStream(extensionsSpec: ExtensionsSpec): InputStream { val outputStream = ByteArrayOutputStream() - requireNotNull(spec.javaClass.getSafeResourceAsStream("/default-detekt-config.yml")) + requireNotNull(extensionsSpec.javaClass.getSafeResourceAsStream("/default-detekt-config.yml")) .use { it.copyTo(outputStream) } - ExtensionFacade(spec.extensionsSpec).pluginLoader + ExtensionFacade(extensionsSpec.plugins).pluginLoader .getResourcesAsStream("config/config.yml") .forEach { inputStream -> outputStream.bufferedWriter().append('\n').flush() @@ -50,6 +51,10 @@ private fun ClassLoader.getResourcesAsStream(name: String): Sequence("maxIssues")).isEqualTo(0) @@ -25,7 +25,7 @@ class DefaultConfigProviderSpec { @Test fun `copies`() { val path = createTempFileForTest("test", "test") - DefaultConfigProvider().apply { init(spec) }.copy(path) + DefaultConfigProvider().apply { init(extensionsSpec) }.copy(path) assertThat(path) .hasSameTextualContentAs(resourceAsPath("default-detekt-config.yml")) @@ -34,15 +34,15 @@ class DefaultConfigProviderSpec { @Nested inner class `defaultConfigProvider with plugins` { - val spec = createNullLoggingSpec { + private val extensionsSpec = createNullLoggingSpec { extensions { fromPaths { listOf(resourceAsPath("sample-rule-set.jar")) } } - } + }.extensionsSpec @Test fun `gets`() { - val config = DefaultConfigProvider().apply { init(spec) }.get() + val config = DefaultConfigProvider().apply { init(extensionsSpec) }.get() assertThat(config.parentPath).isNull() assertThat(config.subConfig("build").valueOrNull("maxIssues")).isEqualTo(0) @@ -52,7 +52,7 @@ class DefaultConfigProviderSpec { @Test fun `copies`() { val path = createTempFileForTest("test", "test") - DefaultConfigProvider().apply { init(spec) }.copy(path) + DefaultConfigProvider().apply { init(extensionsSpec) }.copy(path) val actual = String(Files.readAllBytes(path), Charsets.UTF_8) val expected = String(Files.readAllBytes(resourceAsPath("default-detekt-config.yml")), Charsets.UTF_8) + diff --git a/detekt-tooling/api/detekt-tooling.api b/detekt-tooling/api/detekt-tooling.api index 4f2545aa11df..8cd9687dfbdc 100644 --- a/detekt-tooling/api/detekt-tooling.api +++ b/detekt-tooling/api/detekt-tooling.api @@ -11,12 +11,12 @@ public abstract interface class io/github/detekt/tooling/api/DefaultConfiguratio public static final field Companion Lio/github/detekt/tooling/api/DefaultConfigurationProvider$Companion; public abstract fun copy (Ljava/nio/file/Path;)V public abstract fun get ()Lio/gitlab/arturbosch/detekt/api/Config; - public abstract fun init (Lio/github/detekt/tooling/api/spec/ProcessingSpec;)V + public abstract fun init (Lio/github/detekt/tooling/api/spec/ExtensionsSpec;)V } public final class io/github/detekt/tooling/api/DefaultConfigurationProvider$Companion { - public final fun load (Lio/github/detekt/tooling/api/spec/ProcessingSpec;Ljava/lang/ClassLoader;)Lio/github/detekt/tooling/api/DefaultConfigurationProvider; - public static synthetic fun load$default (Lio/github/detekt/tooling/api/DefaultConfigurationProvider$Companion;Lio/github/detekt/tooling/api/spec/ProcessingSpec;Ljava/lang/ClassLoader;ILjava/lang/Object;)Lio/github/detekt/tooling/api/DefaultConfigurationProvider; + public final fun load (Lio/github/detekt/tooling/api/spec/ExtensionsSpec;Ljava/lang/ClassLoader;)Lio/github/detekt/tooling/api/DefaultConfigurationProvider; + public static synthetic fun load$default (Lio/github/detekt/tooling/api/DefaultConfigurationProvider$Companion;Lio/github/detekt/tooling/api/spec/ExtensionsSpec;Ljava/lang/ClassLoader;ILjava/lang/Object;)Lio/github/detekt/tooling/api/DefaultConfigurationProvider; } public abstract interface class io/github/detekt/tooling/api/Detekt { diff --git a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/DefaultConfigurationProvider.kt b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/DefaultConfigurationProvider.kt index 246f45556a3e..fcd2815a6d9a 100644 --- a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/DefaultConfigurationProvider.kt +++ b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/DefaultConfigurationProvider.kt @@ -1,13 +1,13 @@ package io.github.detekt.tooling.api -import io.github.detekt.tooling.api.spec.ProcessingSpec +import io.github.detekt.tooling.api.spec.ExtensionsSpec import io.gitlab.arturbosch.detekt.api.Config import java.nio.file.Path import java.util.ServiceLoader interface DefaultConfigurationProvider { - fun init(spec: ProcessingSpec) + fun init(extensionsSpec: ExtensionsSpec) fun get(): Config @@ -16,9 +16,12 @@ interface DefaultConfigurationProvider { companion object { fun load( - spec: ProcessingSpec, + extensionsSpec: ExtensionsSpec, classLoader: ClassLoader = DefaultConfigurationProvider::class.java.classLoader, - ): DefaultConfigurationProvider = - ServiceLoader.load(DefaultConfigurationProvider::class.java, classLoader).first().apply { init(spec) } + ): DefaultConfigurationProvider { + return ServiceLoader.load(DefaultConfigurationProvider::class.java, classLoader) + .first() + .apply { init(extensionsSpec) } + } } } diff --git a/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/api/DefaultConfigurationProviderSpec.kt b/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/api/DefaultConfigurationProviderSpec.kt index b4fce6ba7315..617e6ccfd4bb 100644 --- a/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/api/DefaultConfigurationProviderSpec.kt +++ b/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/api/DefaultConfigurationProviderSpec.kt @@ -1,16 +1,8 @@ package io.github.detekt.tooling.api import io.github.detekt.test.utils.createTempFileForTest -import io.github.detekt.tooling.api.spec.BaselineSpec -import io.github.detekt.tooling.api.spec.CompilerSpec -import io.github.detekt.tooling.api.spec.ConfigSpec -import io.github.detekt.tooling.api.spec.ExecutionSpec +import io.github.detekt.tooling.api.spec.ExtensionId import io.github.detekt.tooling.api.spec.ExtensionsSpec -import io.github.detekt.tooling.api.spec.LoggingSpec -import io.github.detekt.tooling.api.spec.ProcessingSpec -import io.github.detekt.tooling.api.spec.ProjectSpec -import io.github.detekt.tooling.api.spec.ReportsSpec -import io.github.detekt.tooling.api.spec.RulesSpec import io.gitlab.arturbosch.detekt.api.Config import org.assertj.core.api.Assertions.assertThatCode import org.junit.jupiter.api.Nested @@ -33,7 +25,7 @@ class DefaultConfigurationProviderSpec { } internal class TestConfigurationProvider : DefaultConfigurationProvider { - override fun init(spec: ProcessingSpec) { + override fun init(extensionsSpec: ExtensionsSpec) { // no-op } @@ -44,23 +36,11 @@ internal class TestConfigurationProvider : DefaultConfigurationProvider { } } -private object Spec : ProcessingSpec { - override val baselineSpec: BaselineSpec +private object Spec : ExtensionsSpec { + override val disableDefaultRuleSets: Boolean get() = error("No expected call") - override val compilerSpec: CompilerSpec - get() = error("No expected call") - override val configSpec: ConfigSpec - get() = error("No expected call") - override val executionSpec: ExecutionSpec - get() = error("No expected call") - override val extensionsSpec: ExtensionsSpec - get() = error("No expected call") - override val rulesSpec: RulesSpec - get() = error("No expected call") - override val loggingSpec: LoggingSpec - get() = error("No expected call") - override val projectSpec: ProjectSpec - get() = error("No expected call") - override val reportsSpec: ReportsSpec + override val plugins: ExtensionsSpec.Plugins? + get() = null + override val disabledExtensions: Set get() = error("No expected call") }