All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vanniktech.code.quality.tools.CodeQualityToolsPlugin.groovy Maven / Gradle / Ivy

Go to download

Gradle plugin that generates ErrorProne, Findbugs, Checkstyle, PMD, CPD, Lint, Detekt & Ktlint Tasks for every subproject.

There is a newer version: 0.3.0
Show newest version
package com.vanniktech.code.quality.tools

import org.gradle.api.Plugin
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

class CodeQualityToolsPlugin implements Plugin {
    @Override
    void apply(final Project rootProject) {
        rootProject.extensions.create('codeQualityTools', CodeQualityToolsPluginExtension)
        rootProject.codeQualityTools.extensions.create('findbugs', CodeQualityToolsPluginExtension.Findbugs)
        rootProject.codeQualityTools.extensions.create('checkstyle', CodeQualityToolsPluginExtension.Checkstyle)
        rootProject.codeQualityTools.extensions.create('pmd', CodeQualityToolsPluginExtension.Pmd)
        rootProject.codeQualityTools.extensions.create('lint', CodeQualityToolsPluginExtension.Lint)

        rootProject.subprojects { subProject ->
            afterEvaluate {
                def extension = rootProject.codeQualityTools

                if (!shouldIgnore(subProject, extension)) {
                    // Reason for checking again in each add method: Unit Tests (they can't handle afterEvaluate properly)
                    def hasPmd = addPmd(subProject, rootProject, extension)
                    def hasCheckstyle = addCheckstyle(subProject, rootProject, extension)
                    def hasFindbugs = addFindbugs(subProject, rootProject, extension)
                    def hasLint = addLint(subProject, extension)

                    def checkTask = tasks.findByName('check')

                    if (hasPmd) {
                        tasks.findByName('pmd').dependsOn('assemble')
                        checkTask.dependsOn('pmd')
                    }

                    if (hasFindbugs) {
                        tasks.findByName('findbugs').dependsOn('assemble')
                        checkTask.dependsOn('findbugs')
                    }

                    if (hasCheckstyle) {
                        checkTask.dependsOn('checkstyle')
                    }

                    if (hasLint) {
                        checkTask.dependsOn('lint')
                    }
                }
            }
        }
    }

    protected static boolean addPmd(final Project subProject, final Project rootProject, final CodeQualityToolsPluginExtension extension) {
        if (!shouldIgnore(subProject, extension) && extension.pmd.enabled) {
            subProject.plugins.apply('pmd')

            subProject.pmd {
                toolVersion = extension.pmd.toolVersion
                ignoreFailures = !extension.failEarly
                ruleSetFiles = subProject.files(rootProject.file(extension.pmd.ruleSetFile))
            }

            subProject.task("pmd", type: Pmd) {
                description = 'Run pmd'
                group = 'verification'

                ruleSets = []

                source = subProject.fileTree('src/main/java')
                include '**/*.java'
                exclude '**/gen/**'

                reports {
                    html.enabled = extension.htmlReports
                    xml.enabled = extension.xmlReports
                }
            }

            return true
        }

        return false
    }

    protected static boolean addCheckstyle(final Project subProject, final Project rootProject, final CodeQualityToolsPluginExtension extension) {
        if (!shouldIgnore(subProject, extension) && extension.checkstyle.enabled) {
            subProject.plugins.apply('checkstyle')

            subProject.checkstyle {
                toolVersion = extension.checkstyle.toolVersion
                configFile rootProject.file(extension.checkstyle.configFile)
                ignoreFailures = !extension.failEarly
                showViolations extension.failEarly
            }

            subProject.task("checkstyle", type: Checkstyle) {
                description = 'Run checkstyle'
                group = 'verification'

                source 'src'
                include '**/*.java'
                exclude '**/gen/**'

                classpath = subProject.files()

                reports {
                    html.enabled = extension.htmlReports
                    xml.enabled = extension.xmlReports
                }
            }

            return true
        }

        return false
    }

    protected static boolean addFindbugs(final Project subProject, final Project rootProject, final CodeQualityToolsPluginExtension extension) {
        if (!shouldIgnore(subProject, extension) && extension.findbugs.enabled) {
            final String findbugsClassesPath = isAndroidProject(subProject) ? 'build/intermediates/classes/debug/' : 'build/classes/main/'

            subProject.plugins.apply('findbugs')

            subProject.findbugs {
                sourceSets = []
                ignoreFailures = !extension.failEarly
                toolVersion = extension.findbugs.toolVersion
                effort = 'max'
                reportLevel = 'low'
                excludeFilter = rootProject.file(extension.findbugs.excludeFilter)
            }

            subProject.task("findbugs", type: FindBugs) {
                description = 'Run findbugs'
                group = 'verification'

                classes = subProject.fileTree(findbugsClassesPath)
                source = subProject.fileTree('src')
                classpath = subProject.files()

                reports {
                    html.enabled = extension.htmlReports
                    xml.enabled = extension.xmlReports
                }
            }

            return true
        }

        return false
    }

    protected static boolean addLint(final Project subProject, final CodeQualityToolsPluginExtension extension) {
        if (!shouldIgnore(subProject, extension) && extension.lint.enabled && isAndroidProject(subProject)) {
            subProject.android.lintOptions {
                warningsAsErrors extension.lint.warningsAsErrors != null ? extension.lint.warningsAsErrors : extension.failEarly
                abortOnError extension.lint.abortOnError != null ? extension.lint.abortOnError : extension.failEarly
            }

            if (extension.lint.textReport != null) {
                subProject.android.lintOptions {
                    textReport extension.lint.textReport
                    textOutput extension.lint.textOutput
                }
            }

            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')
        return isAndroidLibrary || isAndroidApp
    }

    private static boolean shouldIgnore(final Project project, final CodeQualityToolsPluginExtension extension) {
        return extension.ignoreProjects?.contains(project.name)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy