From a0c78ced90eebf90ed9b0a4e51cece6ddf10932e Mon Sep 17 00:00:00 2001 From: Gary Tierney Date: Tue, 4 Sep 2018 05:53:06 +0100 Subject: [PATCH] Add library containing detekt rules for apollo plugins --- game/plugin-detekt-rules/build.gradle | 15 +++++++++ .../detekt/ApolloPluginRuleSetProvider.kt | 16 ++++++++++ .../detekt/rules/DeclarationInScriptRule.kt | 31 +++++++++++++++++++ ...tlab.arturbosch.detekt.api.RuleSetProvider | 1 + .../rules/DeclarationInScriptRuleTest.kt | 19 ++++++++++++ .../src/test/resources/testData/example.kts | 3 ++ gradle/code-quality.gradle | 1 + gradle/config/detekt.yml | 4 +++ settings.gradle | 1 + 9 files changed, 91 insertions(+) create mode 100644 game/plugin-detekt-rules/build.gradle create mode 100644 game/plugin-detekt-rules/src/main/kotlin/org/apollo/game/plugin/detekt/ApolloPluginRuleSetProvider.kt create mode 100644 game/plugin-detekt-rules/src/main/kotlin/org/apollo/game/plugin/detekt/rules/DeclarationInScriptRule.kt create mode 100644 game/plugin-detekt-rules/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider create mode 100644 game/plugin-detekt-rules/src/test/kotlin/org/apollo/game/plugin/detekt/rules/DeclarationInScriptRuleTest.kt create mode 100644 game/plugin-detekt-rules/src/test/resources/testData/example.kts diff --git a/game/plugin-detekt-rules/build.gradle b/game/plugin-detekt-rules/build.gradle new file mode 100644 index 00000000..a57e036c --- /dev/null +++ b/game/plugin-detekt-rules/build.gradle @@ -0,0 +1,15 @@ +apply plugin: 'java-library' +apply plugin: 'org.jetbrains.kotlin.jvm' +apply from: "$rootDir/gradle/kotlin.gradle" + +dependencies { + api group: 'io.gitlab.arturbosch.detekt', name: 'detekt-api', version: detektVersion + + test.useJUnitPlatform() + testImplementation("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}") + testImplementation("org.junit.jupiter:junit-jupiter-params:${junitJupiterVersion}") + testImplementation("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}") + testImplementation("org.junit.platform:junit-platform-launcher:${junitPlatformVersion}") + + testImplementation group: 'io.gitlab.arturbosch.detekt', name: 'detekt-test', version: detektVersion +} diff --git a/game/plugin-detekt-rules/src/main/kotlin/org/apollo/game/plugin/detekt/ApolloPluginRuleSetProvider.kt b/game/plugin-detekt-rules/src/main/kotlin/org/apollo/game/plugin/detekt/ApolloPluginRuleSetProvider.kt new file mode 100644 index 00000000..c084d54b --- /dev/null +++ b/game/plugin-detekt-rules/src/main/kotlin/org/apollo/game/plugin/detekt/ApolloPluginRuleSetProvider.kt @@ -0,0 +1,16 @@ +package org.apollo.game.plugin.detekt + +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.RuleSet +import io.gitlab.arturbosch.detekt.api.RuleSetProvider +import org.apollo.game.plugin.detekt.rules.DeclarationInScriptRule + +class ApolloPluginRuleSetProvider : RuleSetProvider { + override val ruleSetId = "apollo-plugin" + + override fun instance(config: Config): RuleSet { + return RuleSet(ruleSetId, listOf( + DeclarationInScriptRule() + )) + } +} \ No newline at end of file diff --git a/game/plugin-detekt-rules/src/main/kotlin/org/apollo/game/plugin/detekt/rules/DeclarationInScriptRule.kt b/game/plugin-detekt-rules/src/main/kotlin/org/apollo/game/plugin/detekt/rules/DeclarationInScriptRule.kt new file mode 100644 index 00000000..055b5fd1 --- /dev/null +++ b/game/plugin-detekt-rules/src/main/kotlin/org/apollo/game/plugin/detekt/rules/DeclarationInScriptRule.kt @@ -0,0 +1,31 @@ +package org.apollo.game.plugin.detekt.rules + +import io.gitlab.arturbosch.detekt.api.* +import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtObjectDeclaration + +class DeclarationInScriptRule : Rule() { + override val issue = Issue( + "DeclarationInScript", + Severity.CodeSmell, + "This rule reports a plugin file containing class or object declarations.", + Debt.FIVE_MINS + ) + + override fun visit(root: KtFile) { + super.visit(root) + + val script = root.script ?: return + val declarations = script.declarations.filter { it is KtClass || it is KtObjectDeclaration } + + declarations + .forEach { + report(CodeSmell( + issue, + Entity.from(it), + message = "Declaration of ${it.name} should live in a top-level file, not a script" + )) + } + } +} \ No newline at end of file diff --git a/game/plugin-detekt-rules/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider b/game/plugin-detekt-rules/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider new file mode 100644 index 00000000..3eb44c25 --- /dev/null +++ b/game/plugin-detekt-rules/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider @@ -0,0 +1 @@ +org.apollo.game.plugin.detekt.ApolloPluginRuleSetProvider \ No newline at end of file diff --git a/game/plugin-detekt-rules/src/test/kotlin/org/apollo/game/plugin/detekt/rules/DeclarationInScriptRuleTest.kt b/game/plugin-detekt-rules/src/test/kotlin/org/apollo/game/plugin/detekt/rules/DeclarationInScriptRuleTest.kt new file mode 100644 index 00000000..f6ca6dae --- /dev/null +++ b/game/plugin-detekt-rules/src/test/kotlin/org/apollo/game/plugin/detekt/rules/DeclarationInScriptRuleTest.kt @@ -0,0 +1,19 @@ +package org.apollo.game.plugin.detekt.rules + +import io.gitlab.arturbosch.detekt.test.lint +import java.nio.file.Paths +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +internal class DeclarationInScriptRuleTest { + val rule = DeclarationInScriptRule() + + @Test + fun `Finds warning in script file`() { + val srcPath = Paths.get(this.javaClass.getResource("/testData/example.kts").toURI()) + val findings = rule.lint(srcPath) + + assertEquals(1, findings.size) + assertEquals("Declaration of ExampleDeclaration should live in a top-level file, not a script", findings[0].message) + } +} \ No newline at end of file diff --git a/game/plugin-detekt-rules/src/test/resources/testData/example.kts b/game/plugin-detekt-rules/src/test/resources/testData/example.kts new file mode 100644 index 00000000..0fb1729b --- /dev/null +++ b/game/plugin-detekt-rules/src/test/resources/testData/example.kts @@ -0,0 +1,3 @@ +class ExampleDeclaration { + +} \ No newline at end of file diff --git a/gradle/code-quality.gradle b/gradle/code-quality.gradle index 7a269657..2dfdb911 100644 --- a/gradle/code-quality.gradle +++ b/gradle/code-quality.gradle @@ -15,6 +15,7 @@ detekt { dependencies { detekt group: 'io.gitlab.arturbosch.detekt', name: 'detekt-formatting', version: detektVersion + detekt project(':game:plugin-detekt-rules') } sonarqube { diff --git a/gradle/config/detekt.yml b/gradle/config/detekt.yml index 493cd78b..5ff58862 100644 --- a/gradle/config/detekt.yml +++ b/gradle/config/detekt.yml @@ -473,3 +473,7 @@ style: WildcardImport: active: false excludeImports: 'java.util.*,kotlinx.android.synthetic.*' + +apollo-plugin: + DeclarationInScript: + active: true \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 6cd4ff99..b9ba28b0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,6 +5,7 @@ rootProject.name = 'org.apollo' include ':cache' include ':game' include ':game:plugin' +include ':game:plugin-detekt-rules' include ':game:plugin-testing' include ':net' include ':util'