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 bb48079f18ac..05ee388ab229 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 @@ -2,10 +2,12 @@ package io.gitlab.arturbosch.detekt.core.tooling import io.github.detekt.tooling.api.DefaultConfigurationProvider import io.github.detekt.tooling.api.spec.ProcessingSpec -import io.github.detekt.tooling.internal.getSafeResourceAsStream -import io.github.detekt.tooling.internal.openSafeStream import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.core.config.YamlConfig +import io.gitlab.arturbosch.detekt.core.settings.ExtensionFacade +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.InputStream import java.nio.file.Files import java.nio.file.Path import java.nio.file.StandardCopyOption @@ -20,15 +22,32 @@ class DefaultConfigProvider : DefaultConfigurationProvider { override fun get(): Config = spec.getDefaultConfiguration() override fun copy(targetLocation: Path) { - val configUrl = javaClass.getResource(DEFAULT_CONFIG_RESOURCES_PATH)!! - Files.copy(configUrl.openSafeStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING) + Files.copy(configInputStream(spec), targetLocation, StandardCopyOption.REPLACE_EXISTING) } } -fun ProcessingSpec.getDefaultConfiguration(): Config { - return requireNotNull(javaClass.getSafeResourceAsStream(DEFAULT_CONFIG_RESOURCES_PATH)) - .reader() - .use(YamlConfig::load) +private fun configInputStream(spec: ProcessingSpec): InputStream { + val outputStream = ByteArrayOutputStream() + + requireNotNull(spec.javaClass.getResourceAsStream("/default-detekt-config.yml")) + .use { it.copyTo(outputStream) } + + ExtensionFacade(spec.extensionsSpec).pluginLoader + .getResourcesAsStream("config/config.yml") + .forEach { inputStream -> + outputStream.bufferedWriter().append('\n').flush() + inputStream.use { it.copyTo(outputStream) } + } + + return ByteArrayInputStream(outputStream.toByteArray()) } -private const val DEFAULT_CONFIG_RESOURCES_PATH = "/default-detekt-config.yml" +private fun ClassLoader.getResourcesAsStream(name: String): Sequence { + return getResources(name) + .asSequence() + .map { it.openStream() } +} + +fun ProcessingSpec.getDefaultConfiguration(): Config { + return YamlConfig.load(configInputStream(this).reader()) +} diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/tooling/DefaultConfigProviderTest.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/tooling/DefaultConfigProviderTest.kt index e9d032c53aec..c59c0cc4e6bf 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/tooling/DefaultConfigProviderTest.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/tooling/DefaultConfigProviderTest.kt @@ -6,10 +6,10 @@ import io.gitlab.arturbosch.detekt.core.createNullLoggingSpec import org.assertj.core.api.Assertions.assertThat import org.spekframework.spek2.Spek import org.spekframework.spek2.style.specification.describe +import java.nio.file.Files internal class DefaultConfigProviderSpec : Spek({ - - describe("defaultConfigProvider") { + describe("defaultConfigProvider without plugins") { val spec by memoized { createNullLoggingSpec {} } @@ -19,6 +19,7 @@ internal class DefaultConfigProviderSpec : Spek({ assertThat(config.parentPath).isNull() assertThat(config.subConfig("build").valueOrNull("maxIssues")).isEqualTo(0) + assertThat(config.valueOrNull("sample")).isNull() } it("copy") { @@ -29,4 +30,41 @@ internal class DefaultConfigProviderSpec : Spek({ .hasSameTextualContentAs(resourceAsPath("default-detekt-config.yml")) } } + + describe("defaultConfigProvider without plugins") { + val spec by memoized { + createNullLoggingSpec { + extensions { + fromPaths { listOf(resourceAsPath("sample-rule-set.jar")) } + } + } + } + + it("get") { + val config = DefaultConfigProvider().apply { init(spec) }.get() + + assertThat(config.parentPath).isNull() + assertThat(config.subConfig("build").valueOrNull("maxIssues")).isEqualTo(0) + assertThat(config.valueOrNull("sample")).isNotNull() + } + + it("copy") { + val path = createTempFileForTest("test", "test") + DefaultConfigProvider().apply { init(spec) }.copy(path) + + val actual = String(Files.readAllBytes(path), Charsets.UTF_8) + val expected = String(Files.readAllBytes(resourceAsPath("default-detekt-config.yml")), Charsets.UTF_8) + + """ + | + |sample: + | TooManyFunctions: + | active: true + | TooManyFunctionsTwo: + | active: true + | + """.trimMargin() + + assertThat(actual).isEqualTo(expected) + } + } }) diff --git a/detekt-core/src/test/resources/sample-rule-set.jar b/detekt-core/src/test/resources/sample-rule-set.jar index 335faf48280a..4a0859cbd439 100644 Binary files a/detekt-core/src/test/resources/sample-rule-set.jar and b/detekt-core/src/test/resources/sample-rule-set.jar differ diff --git a/detekt-sample-extensions/src/main/resources/config/config.yml b/detekt-sample-extensions/src/main/resources/config/config.yml new file mode 100644 index 000000000000..7b42d0fe2884 --- /dev/null +++ b/detekt-sample-extensions/src/main/resources/config/config.yml @@ -0,0 +1,5 @@ +sample: + TooManyFunctions: + active: true + TooManyFunctionsTwo: + active: true