Skip to content

Commit

Permalink
Concat configurations
Browse files Browse the repository at this point in the history
  • Loading branch information
BraisGabin committed Dec 1, 2021
1 parent 86eb3d8 commit 74737bd
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 12 deletions.
Expand Up @@ -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
Expand All @@ -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<InputStream> {
return getResources(name)
.asSequence()
.map { it.openStream() }
}

fun ProcessingSpec.getDefaultConfiguration(): Config {
return YamlConfig.load(configInputStream(this).reader())
}
Expand Up @@ -2,7 +2,17 @@ package io.gitlab.arturbosch.detekt.core.config

import io.github.detekt.test.utils.createTempDirectoryForTest
import io.github.detekt.tooling.api.InvalidConfig
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.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.github.detekt.tooling.dsl.ExtensionsSpecBuilder
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.ConfigValidator
import io.gitlab.arturbosch.detekt.api.Notification
Expand Down Expand Up @@ -38,7 +48,7 @@ class SupportConfigValidationSpec : Spek({
"""
)
createProcessingSettings(testDir, config).use {
assertThatCode { checkConfiguration(it, mockk<ProcessingSpec>().getDefaultConfiguration()) }
assertThatCode { checkConfiguration(it, Spec.getDefaultConfiguration()) }
.isInstanceOf(InvalidConfig::class.java)
.hasMessageContaining("Run failed with 1 invalid config property.")
.hasMessageContaining("my_additional_properties")
Expand All @@ -56,7 +66,7 @@ class SupportConfigValidationSpec : Spek({
"""
)
createProcessingSettings(testDir, config).use {
assertThatCode { checkConfiguration(it, mockk<ProcessingSpec>().getDefaultConfiguration()) }
assertThatCode { checkConfiguration(it, Spec.getDefaultConfiguration()) }
.isInstanceOf(InvalidConfig::class.java)
.hasMessageContaining("Run failed with 1 invalid config property.")
}
Expand Down Expand Up @@ -85,7 +95,7 @@ class SupportConfigValidationSpec : Spek({
"""
)
createProcessingSettings(testDir, config).use {
assertThatCode { checkConfiguration(it, mockk<ProcessingSpec>().getDefaultConfiguration()) }
assertThatCode { checkConfiguration(it, Spec.getDefaultConfiguration()) }
.doesNotThrowAnyException()
}
}
Expand Down Expand Up @@ -113,3 +123,24 @@ internal class SampleConfigValidator : ConfigValidator {
return result
}
}

private object Spec : ProcessingSpec {
override val baselineSpec: BaselineSpec
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() = ExtensionsSpecBuilder().apply { fromPaths { emptyList() } }.build()
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
get() = error("No expected call")
}

0 comments on commit 74737bd

Please sign in to comment.