Skip to content

Commit

Permalink
Create Rule Set For Libraries
Browse files Browse the repository at this point in the history
  • Loading branch information
VitalyVPinchuk committed Sep 28, 2022
1 parent 9a35a3a commit 4c1dfe6
Show file tree
Hide file tree
Showing 19 changed files with 85 additions and 38 deletions.
4 changes: 3 additions & 1 deletion build-logic/src/main/kotlin/releasing.gradle.kts
Expand Up @@ -41,7 +41,9 @@ project.afterEvaluate {
project(":detekt-formatting").buildDir.resolve("libs/detekt-formatting-${project.version}.jar"),
project(":detekt-generator").buildDir.resolve("libs/detekt-generator-${project.version}-all.jar"),
project(":detekt-rules-ruleauthors").buildDir
.resolve("libs/detekt-rules-ruleauthors-${project.version}.jar")
.resolve("libs/detekt-rules-ruleauthors-${project.version}.jar"),
project(":detekt-rules-libraries").buildDir
.resolve("libs/detekt-rules-libraries-${project.version}.jar")
)
)
}
Expand Down
1 change: 1 addition & 0 deletions build.gradle.kts
Expand Up @@ -28,6 +28,7 @@ allprojects {
detekt(project(":detekt-cli"))
detektPlugins(project(":detekt-formatting"))
detektPlugins(project(":detekt-rules-ruleauthors"))
detektPlugins(project(":detekt-rules-libraries"))
}

tasks.withType<Detekt>().configureEach {
Expand Down
4 changes: 0 additions & 4 deletions config/detekt/detekt.yml
Expand Up @@ -190,10 +190,6 @@ style:
- 'org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile'
ForbiddenVoid:
active: true
LibraryCodeMustSpecifyReturnType:
active: true
excludes: ['**/*.kt']
includes: ['**/detekt-api/src/main/**/api/*.kt']
MagicNumber:
excludes: ['**/test/**', '**/*Test.kt', '**/*Spec.kt']
ignorePropertyDeclaration: true
Expand Down
12 changes: 0 additions & 12 deletions detekt-core/src/main/resources/default-detekt-config.yml
Expand Up @@ -547,12 +547,6 @@ style:
value: 'kotlin.io.print'
- reason: 'println does not allow you to configure the output stream. Use a logger instead.'
value: 'kotlin.io.println'
ForbiddenPublicDataClass:
active: true
excludes: ['**']
ignorePackages:
- '*.internal'
- '*.internal.*'
ForbiddenSuppress:
active: false
rules: []
Expand All @@ -565,12 +559,6 @@ style:
ignoreOverridableFunction: true
ignoreActualFunction: true
excludedFunctions: []
LibraryCodeMustSpecifyReturnType:
active: true
excludes: ['**']
LibraryEntitiesShouldNotBePublic:
active: true
excludes: ['**']
LoopWithTooManyJumpStatements:
active: true
maxJumpCount: 1
Expand Down
4 changes: 4 additions & 0 deletions detekt-generator/build.gradle.kts
Expand Up @@ -27,6 +27,7 @@ val defaultConfigFile = "$configDir/default-detekt-config.yml"
val deprecationFile = "$configDir/deprecation.properties"
val formattingConfigFile = "${rootProject.rootDir}/detekt-formatting/src/main/resources/config/config.yml"
val ruleauthorsConfigFile = "${rootProject.rootDir}/detekt-rules-ruleauthors/src/main/resources/config/config.yml"
val librariesConfigFile = "${rootProject.rootDir}/detekt-rules-libraries/src/main/resources/config/config.yml"

val ruleModules = rootProject.subprojects
.filter { "rules" in it.name }
Expand All @@ -42,6 +43,7 @@ val generateDocumentation by tasks.registering(JavaExec::class) {
inputs.files(
ruleModules.map { fileTree(it) },
fileTree("${rootProject.rootDir}/detekt-rules-ruleauthors/src/main/kotlin"),
fileTree("${rootProject.rootDir}/detekt-rules-libraries/src/main/kotlin"),
fileTree("${rootProject.rootDir}/detekt-formatting/src/main/kotlin"),
file("${rootProject.rootDir}/detekt-generator/build/libs/detekt-generator-${Versions.DETEKT}-all.jar"),
)
Expand All @@ -51,6 +53,7 @@ val generateDocumentation by tasks.registering(JavaExec::class) {
file(defaultConfigFile),
file(formattingConfigFile),
file(ruleauthorsConfigFile),
file(librariesConfigFile),
file(deprecationFile),
file(cliOptionsFile),
)
Expand All @@ -65,6 +68,7 @@ val generateDocumentation by tasks.registering(JavaExec::class) {
"--input",
ruleModules
.plus("${rootProject.rootDir}/detekt-rules-ruleauthors/src/main/kotlin")
.plus("${rootProject.rootDir}/detekt-rules-libraries/src/main/kotlin")
.plus("${rootProject.rootDir}/detekt-formatting/src/main/kotlin")
.joinToString(","),
"--documentation",
Expand Down
Expand Up @@ -24,7 +24,9 @@ class DetektPrinter(private val arguments: GeneratorArgs) {
}
}
yamlWriter.write(arguments.configPath, "default-detekt-config") {
ConfigPrinter.print(pages.filterNot { it.ruleSet.name == "formatting" || it.ruleSet.name == "ruleauthors" })
ConfigPrinter.print(
pages.filterNot { it.ruleSet.name in listOf("formatting", "ruleauthors", "libraries") }
)
}
propertiesWriter.write(arguments.configPath, "deprecation") {
// We intentionally not filter for "formatting" as we want to be able to deprecate
Expand All @@ -41,6 +43,11 @@ class DetektPrinter(private val arguments: GeneratorArgs) {
printRuleSetPage(pages.first { it.ruleSet.name == "ruleauthors" })
}
}
yamlWriter.write(Paths.get("../detekt-rules-libraries/src/main/resources/config"), "config") {
yaml {
printRuleSetPage(pages.first { it.ruleSet.name == "libraries" })
}
}
}

fun printCustomRuleConfig(pages: List<RuleSetPage>, folder: String) {
Expand Down
Expand Up @@ -5,7 +5,7 @@ import io.gitlab.arturbosch.detekt.generator.collection.Rule
/**
* Holds a list of extra exclusions for rules and rule sets.
*/
val exclusions = arrayOf(TestExclusions, KotlinScriptExclusions, KotlinScriptAndTestExclusions, LibraryExclusions)
val exclusions = arrayOf(TestExclusions, KotlinScriptExclusions, KotlinScriptAndTestExclusions)

/**
* Tracks rules and rule sets which needs an extra `excludes: $pattern` property
Expand Down Expand Up @@ -56,13 +56,3 @@ private object KotlinScriptAndTestExclusions : Exclusions() {
"'**/*.kts']"
override val rules = setOf("MagicNumber")
}

private object LibraryExclusions : Exclusions() {

override val pattern = "['**']"
override val rules = setOf(
"ForbiddenPublicDataClass",
"LibraryCodeMustSpecifyReturnType",
"LibraryEntitiesShouldNotBePublic",
)
}
9 changes: 9 additions & 0 deletions detekt-rules-libraries/build.gradle.kts
@@ -0,0 +1,9 @@
plugins {
id("module")
}

dependencies {
compileOnly(projects.detektApi)
testImplementation(projects.detektTest)
testImplementation(libs.assertj)
}
@@ -1,4 +1,4 @@
package io.gitlab.arturbosch.detekt.rules.style
package io.gitlab.arturbosch.detekt.libraries

import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
Expand Down Expand Up @@ -63,3 +63,5 @@ class ForbiddenPublicDataClass(config: Config = Config.empty) : Rule(config) {
}
}
}

data class C(val a: String)
@@ -1,4 +1,4 @@
package io.gitlab.arturbosch.detekt.rules.style
package io.gitlab.arturbosch.detekt.libraries

import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
Expand Down
@@ -1,4 +1,4 @@
package io.gitlab.arturbosch.detekt.rules.style
package io.gitlab.arturbosch.detekt.libraries

import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
Expand Down
@@ -0,0 +1,24 @@
package io.gitlab.arturbosch.detekt.libraries

import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.RuleSet
import io.gitlab.arturbosch.detekt.api.RuleSetProvider
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault

/**
* Rules in this rule set report issues related to libraries API exposure.
*/
@ActiveByDefault("1.16.0")
class RuleLibrariesProvider : RuleSetProvider {

override val ruleSetId: String = "libraries"

override fun instance(config: Config) = RuleSet(
ruleSetId,
listOf(
ForbiddenPublicDataClass(config),
LibraryEntitiesShouldNotBePublic(config),
LibraryCodeMustSpecifyReturnType(config),
)
)
}
@@ -0,0 +1 @@
io.gitlab.arturbosch.detekt.libraries.RuleLibrariesProvider
11 changes: 11 additions & 0 deletions detekt-rules-libraries/src/main/resources/config/config.yml
@@ -0,0 +1,11 @@
libraries:
active: true
ForbiddenPublicDataClass:
active: true
ignorePackages:
- '*.internal'
- '*.internal.*'
LibraryCodeMustSpecifyReturnType:
active: true
LibraryEntitiesShouldNotBePublic:
active: true
@@ -1,4 +1,4 @@
package io.gitlab.arturbosch.detekt.rules.style
package io.gitlab.arturbosch.detekt.libraries

import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.test.TestConfig
Expand Down Expand Up @@ -166,3 +166,17 @@ class ForbiddenPublicDataClassSpec {
assertThat(ForbiddenPublicDataClass(config).compileAndLint(code)).isEmpty()
}
}

data class Ca(val a: String)

/**
* Set the [iii] parameter
*/
open class C1 {
private val iii = 0
protected data class D(val a: String)

fun printI(i: Int) {
printI(iii + i)
}
}
@@ -1,4 +1,4 @@
package io.gitlab.arturbosch.detekt.rules.style
package io.gitlab.arturbosch.detekt.libraries

import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.rules.KotlinCoreEnvironmentTest
Expand Down
@@ -1,4 +1,4 @@
package io.gitlab.arturbosch.detekt.rules.style
package io.gitlab.arturbosch.detekt.libraries

import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.test.TestConfig
Expand Down
Expand Up @@ -41,7 +41,6 @@ class StyleGuideProvider : DefaultRuleSetProvider {
ForbiddenComment(config),
ForbiddenImport(config),
ForbiddenMethodCall(config),
ForbiddenPublicDataClass(config),
ForbiddenSuppress(config),
FunctionOnlyReturningConstant(config),
SpacingBetweenPackageAndImports(config),
Expand Down Expand Up @@ -89,8 +88,6 @@ class StyleGuideProvider : DefaultRuleSetProvider {
UseCheckOrError(config),
UseIfInsteadOfWhen(config),
RedundantExplicitType(config),
LibraryEntitiesShouldNotBePublic(config),
LibraryCodeMustSpecifyReturnType(config),
UseArrayLiteralsInAnnotations(config),
UseEmptyCounterpart(config),
UseCheckNotNull(config),
Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Expand Up @@ -28,6 +28,7 @@ include("detekt-rules-documentation")
include("detekt-rules-empty")
include("detekt-rules-errorprone")
include("detekt-rules-exceptions")
include("detekt-rules-libraries")
include("detekt-rules-naming")
include("detekt-rules-performance")
include("detekt-rules-ruleauthors")
Expand Down

0 comments on commit 4c1dfe6

Please sign in to comment.