From 40d4cb3ad94e13dda1ae98503f42263c369b16d6 Mon Sep 17 00:00:00 2001 From: Niklas Baudy Date: Fri, 30 Jun 2017 21:28:05 +0200 Subject: [PATCH] Add KtLint. --- .../tools/CodeQualityToolsPlugin.groovy | 33 +++++++++++ .../CodeQualityToolsPluginExtension.groovy | 11 ++++ ...QualityToolsPluginExceptionForTests.groovy | 3 +- ...CodeQualityToolsPluginExtensionTest.groovy | 2 + .../CodeQualityToolsPluginKtlintTest.groovy | 55 +++++++++++++++++++ .../tools/CodeQualityToolsPluginTest.groovy | 44 +-------------- .../tools/CommonCodeQualityToolsTest.groovy | 44 +++++++++++++++ 7 files changed, 149 insertions(+), 43 deletions(-) create mode 100755 src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginKtlintTest.groovy create mode 100755 src/test/groovy/com/vanniktech/code/quality/tools/CommonCodeQualityToolsTest.groovy diff --git a/src/main/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPlugin.groovy b/src/main/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPlugin.groovy index f4351a5..278bb79 100755 --- a/src/main/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPlugin.groovy +++ b/src/main/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPlugin.groovy @@ -5,6 +5,7 @@ import org.gradle.api.Project import org.gradle.api.plugins.quality.Checkstyle import org.gradle.api.plugins.quality.FindBugs import org.gradle.api.plugins.quality.Pmd +import org.gradle.api.tasks.JavaExec class CodeQualityToolsPlugin implements Plugin { @Override @@ -14,6 +15,7 @@ class CodeQualityToolsPlugin implements Plugin { rootProject.codeQualityTools.extensions.create('checkstyle', CodeQualityToolsPluginExtension.Checkstyle) rootProject.codeQualityTools.extensions.create('pmd', CodeQualityToolsPluginExtension.Pmd) rootProject.codeQualityTools.extensions.create('lint', CodeQualityToolsPluginExtension.Lint) + rootProject.codeQualityTools.extensions.create('ktlint', CodeQualityToolsPluginExtension.Ktlint) rootProject.subprojects { subProject -> afterEvaluate { @@ -25,6 +27,7 @@ class CodeQualityToolsPlugin implements Plugin { addCheckstyle(subProject, rootProject, extension) addFindbugs(subProject, rootProject, extension) addLint(subProject, extension) + addKtlint(subProject, extension) } } } @@ -170,6 +173,36 @@ class CodeQualityToolsPlugin implements Plugin { return false } + protected static boolean addKtlint(final Project subProject, final CodeQualityToolsPluginExtension extension) { + if (!shouldIgnore(subProject, extension) && extension.ktlint.enabled) { + subProject.configurations { + ktlint + } + + subProject.dependencies { + ktlint "com.github.shyiko:ktlint:${extension.ktlint.toolVersion}" + } + + subProject.task('ktlint', type: JavaExec) { + main = "com.github.shyiko.ktlint.Main" + classpath = subProject.configurations.ktlint + args "src/**/*.kt" + } + + subProject.task('ktlintFormat', type: JavaExec) { + main = "com.github.shyiko.ktlint.Main" + classpath = subProject.configurations.ktlint + args "-F", "src/**/*.kt" + } + + subProject.check.dependsOn 'ktlint' + + return true + } + + return false + } + protected static boolean isAndroidProject(final Project project) { final boolean isAndroidLibrary = project.plugins.hasPlugin('com.android.library') final boolean isAndroidApp = project.plugins.hasPlugin('com.android.application') diff --git a/src/main/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExtension.groovy b/src/main/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExtension.groovy index 46649f4..2b3c521 100644 --- a/src/main/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExtension.groovy +++ b/src/main/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExtension.groovy @@ -165,4 +165,15 @@ class CodeQualityToolsPluginExtension { */ String baselineFileName = null } + + static class Ktlint { + /** + * ability to enable or disable only ktlint for every subproject that is not ignored + * @since 0.5.0 + */ + boolean enabled = true + + /** @since 0.5.0 */ + String toolVersion = '0.8.3' + } } diff --git a/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExceptionForTests.groovy b/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExceptionForTests.groovy index 7013730..48eb56f 100644 --- a/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExceptionForTests.groovy +++ b/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExceptionForTests.groovy @@ -9,4 +9,5 @@ class CodeQualityToolsPluginExceptionForTests extends CodeQualityToolsPluginExte CodeQualityToolsPluginExtension.Checkstyle checkstyle = new CodeQualityToolsPluginExtension.Checkstyle() CodeQualityToolsPluginExtension.Pmd pmd = new CodeQualityToolsPluginExtension.Pmd() CodeQualityToolsPluginExtension.Lint lint = new CodeQualityToolsPluginExtension.Lint() -} \ No newline at end of file + CodeQualityToolsPluginExtension.Ktlint ktlint = new CodeQualityToolsPluginExtension.Ktlint() +} diff --git a/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExtensionTest.groovy b/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExtensionTest.groovy index 14026ad..1c9d12d 100644 --- a/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExtensionTest.groovy +++ b/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginExtensionTest.groovy @@ -11,6 +11,7 @@ class CodeQualityToolsPluginExtensionTest { assert extension.xmlReports assert !extension.htmlReports + assert extension.ktlint.toolVersion == '0.8.3' assert extension.findbugs.toolVersion == '3.0.1' assert extension.checkstyle.toolVersion == '7.6' assert extension.pmd.toolVersion == '5.5.4' @@ -36,6 +37,7 @@ class CodeQualityToolsPluginExtensionTest { assert extension.ignoreProjects.size() == 0 + assert extension.ktlint.enabled assert extension.lint.enabled assert extension.findbugs.enabled assert extension.checkstyle.enabled diff --git a/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginKtlintTest.groovy b/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginKtlintTest.groovy new file mode 100755 index 0000000..80df50c --- /dev/null +++ b/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginKtlintTest.groovy @@ -0,0 +1,55 @@ +package com.vanniktech.code.quality.tools + +import org.gradle.api.Project +import org.junit.Ignore +import org.junit.Test + +public class CodeQualityToolsPluginKtlintTest extends CommonCodeQualityToolsTest { + @Test public void javaDefault() { + assert CodeQualityToolsPlugin.addKtlint(javaProject, new CodeQualityToolsPluginExceptionForTests()) + + assertKtlint(javaProject) + } + + @Test @Ignore("buildToolsVersion is not specified.") public void androidAppDefault() { + assert CodeQualityToolsPlugin.addKtlint(androidAppProject, new CodeQualityToolsPluginExceptionForTests()) + + assertKtlint(androidAppProject) + } + + @Test @Ignore("buildToolsVersion is not specified.") public void androidLibraryDefault() { + assert CodeQualityToolsPlugin.addKtlint(androidLibraryProject, new CodeQualityToolsPluginExceptionForTests()) + + assertKtlint(androidLibraryProject) + } + + private static void assertKtlint(Project project) { + def ktlint = project.configurations.getByName('ktlint').dependencies[0] + assert ktlint.group == 'com.github.shyiko' + assert ktlint.name == 'ktlint' + assert ktlint.version == '0.8.3' + assert taskDependsOn(project.check, 'ktlint') + assert project.getTasksByName('ktlintFormat', false).size() == 1 + } + + @Test public void configurations() { + def extension = new CodeQualityToolsPluginExceptionForTests() + extension.ktlint.toolVersion = '0.8.2' + + assert CodeQualityToolsPlugin.addKtlint(androidLibraryProject, extension) + + def ktlint = androidLibraryProject.configurations.getByName('ktlint').dependencies[0] + assert ktlint.group == 'com.github.shyiko' + assert ktlint.name == 'ktlint' + assert ktlint.version == '0.8.2' + } + + @Test public void enabled() { + def extension = new CodeQualityToolsPluginExceptionForTests() + extension.ktlint.enabled = false + + for (def project : projects) { + assert !CodeQualityToolsPlugin.addKtlint(project, extension) + } + } +} diff --git a/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginTest.groovy b/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginTest.groovy index 4bf4661..1761afa 100755 --- a/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginTest.groovy +++ b/src/test/groovy/com/vanniktech/code/quality/tools/CodeQualityToolsPluginTest.groovy @@ -1,36 +1,10 @@ package com.vanniktech.code.quality.tools import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.api.plugins.quality.* -import org.gradle.testfixtures.ProjectBuilder -import org.junit.Before import org.junit.Test -public class CodeQualityToolsPluginTest { - private Project rootProject - private Project javaProject - private Project androidAppProject - private Project androidLibraryProject - - private Project[] projects - - @Before - public void setUp() { - rootProject = ProjectBuilder.builder().withName('root').build() - - javaProject = ProjectBuilder.builder().withName('java').withParent(rootProject).build() - javaProject.plugins.apply('java') - - androidAppProject = ProjectBuilder.builder().withName('android app').build() - androidAppProject.plugins.apply('com.android.application') - - androidLibraryProject = ProjectBuilder.builder().withName('android library').build() - androidLibraryProject.plugins.apply('com.android.library') - - projects = [javaProject, androidAppProject, androidLibraryProject] - } - +public class CodeQualityToolsPluginTest extends CommonCodeQualityToolsTest { @Test public void testAddFindbugsJavaDefault() { assert CodeQualityToolsPlugin.addFindbugs(javaProject, rootProject, new CodeQualityToolsPluginExceptionForTests()) @@ -205,7 +179,7 @@ public class CodeQualityToolsPluginTest { assertLint(androidLibraryProject) } - private void assertLint(Project project) { + private static void assertLint(Project project) { assert project.android.lintOptions.warningsAsErrors assert project.android.lintOptions.abortOnError assert !project.android.lintOptions.textReport @@ -644,18 +618,4 @@ public class CodeQualityToolsPluginTest { assert CodeQualityToolsPlugin.isAndroidProject(androidLibraryProject) assert !CodeQualityToolsPlugin.isAndroidProject(javaProject) } - - static boolean taskDependsOn(final Task task, final String taskName) { - def it = task.dependsOn.iterator() - - while (it.hasNext()) { - def item = it.next() - - if (item.toString().equals(taskName)) { - return true - } - } - - return false - } } diff --git a/src/test/groovy/com/vanniktech/code/quality/tools/CommonCodeQualityToolsTest.groovy b/src/test/groovy/com/vanniktech/code/quality/tools/CommonCodeQualityToolsTest.groovy new file mode 100755 index 0000000..d08371b --- /dev/null +++ b/src/test/groovy/com/vanniktech/code/quality/tools/CommonCodeQualityToolsTest.groovy @@ -0,0 +1,44 @@ +package com.vanniktech.code.quality.tools + +import org.gradle.api.Project +import org.gradle.api.Task +import org.gradle.testfixtures.ProjectBuilder +import org.junit.Before + +public abstract class CommonCodeQualityToolsTest { + Project rootProject + Project javaProject + Project androidAppProject + Project androidLibraryProject + + Project[] projects + + @Before public void setUp() { + rootProject = ProjectBuilder.builder().withName('root').build() + + javaProject = ProjectBuilder.builder().withName('java').withParent(rootProject).build() + javaProject.plugins.apply('java') + + androidAppProject = ProjectBuilder.builder().withName('android app').build() + androidAppProject.plugins.apply('com.android.application') + + androidLibraryProject = ProjectBuilder.builder().withName('android library').build() + androidLibraryProject.plugins.apply('com.android.library') + + projects = [javaProject, androidAppProject, androidLibraryProject] + } + + static boolean taskDependsOn(final Task task, final String taskName) { + def it = task.dependsOn.iterator() + + while (it.hasNext()) { + def item = it.next() + + if (item.toString().equals(taskName)) { + return true + } + } + + return false + } +}