Skip to content

Commit

Permalink
Add KtLint. (#60)
Browse files Browse the repository at this point in the history
  • Loading branch information
vanniktech committed Jul 1, 2017
1 parent 438a393 commit 9b1724a
Show file tree
Hide file tree
Showing 7 changed files with 149 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Project> {
@Override
Expand All @@ -14,6 +15,7 @@ class CodeQualityToolsPlugin implements Plugin<Project> {
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 {
Expand All @@ -25,6 +27,7 @@ class CodeQualityToolsPlugin implements Plugin<Project> {
addCheckstyle(subProject, rootProject, extension)
addFindbugs(subProject, rootProject, extension)
addLint(subProject, extension)
addKtlint(subProject, extension)
}
}
}
Expand Down Expand Up @@ -170,6 +173,36 @@ class CodeQualityToolsPlugin implements Plugin<Project> {
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')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
CodeQualityToolsPluginExtension.Ktlint ktlint = new CodeQualityToolsPluginExtension.Ktlint()
}
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}
}
}
Original file line number Diff line number Diff line change
@@ -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())
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
@@ -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
}
}

0 comments on commit 9b1724a

Please sign in to comment.