/
DefaultConfigProvider.kt
60 lines (48 loc) · 2.12 KB
/
DefaultConfigProvider.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
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
class DefaultConfigProvider : DefaultConfigurationProvider {
private lateinit var extensionsSpec: ExtensionsSpec
override fun init(extensionsSpec: ExtensionsSpec) {
this.extensionsSpec = extensionsSpec
}
override fun get(): Config = extensionsSpec.getDefaultConfiguration()
override fun copy(targetLocation: Path) {
Files.copy(configInputStream(extensionsSpec), targetLocation, StandardCopyOption.REPLACE_EXISTING)
}
}
private fun configInputStream(extensionsSpec: ExtensionsSpec): InputStream {
val outputStream = ByteArrayOutputStream()
requireNotNull(DefaultConfigProvider::class.java.getSafeResourceAsStream("/default-detekt-config.yml"))
.use { it.copyTo(outputStream) }
ExtensionFacade(extensionsSpec.plugins).pluginLoader
.getResourcesAsStream("config/config.yml")
.forEach { inputStream ->
outputStream.bufferedWriter().append('\n').flush()
inputStream.use { it.copyTo(outputStream) }
}
return ByteArrayInputStream(outputStream.toByteArray())
}
private fun ClassLoader.getResourcesAsStream(name: String): Sequence<InputStream> {
return getResources(name)
.asSequence()
.map { it.openSafeStream() }
}
private fun ExtensionsSpec.getDefaultConfiguration(): Config {
return YamlConfig.load(configInputStream(this).reader())
}
fun ProcessingSpec.getDefaultConfiguration(): Config {
return extensionsSpec.getDefaultConfiguration()
}