diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c01ea1..98a3d2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,20 @@ Change Log ========== +[Version 0.7](https://github.com/novoda/gradle-static-analysis-plugin/releases/tag/v0.7) +-------------------------- + +- Fix Detekt RC9.x and RC10 integrations [PR#144](https://github.com/novoda/gradle-static-analysis-plugin/pull/144) +- Fix Ktlint integration [PR#145](https://github.com/novoda/gradle-static-analysis-plugin/pull/145) + - 6.1.0 and 6.2.1 versions are broken for Android projects because of [a bug in Ktlint](https://github.com/JLLeitschuh/ktlint-gradle/issues/153#issuecomment-437176852) +- Make Findbugs Html report generation cacheable [PR#148](https://github.com/novoda/gradle-static-analysis-plugin/pull/148) +- Use Gradle composite builds in sample projects [PR#142](https://github.com/novoda/gradle-static-analysis-plugin/pull/142) +- Improve docs [PR#128](https://github.com/novoda/gradle-static-analysis-plugin/pull/128), [PR#132](https://github.com/novoda/gradle-static-analysis-plugin/pull/132) + [Version 0.6](https://github.com/novoda/gradle-static-analysis-plugin/releases/tag/v0.6) -------------------------- -- Fix release to plugin portal ([PR#82](https://github.com/novoda/gradle-static-analysis-plugin/pull/82),[PR#83](https://github.com/novoda/gradle-static-analysis-plugin/pull/83)) +- Fix release to plugin portal ([PR#82](https://github.com/novoda/gradle-static-analysis-plugin/pull/82), [PR#83](https://github.com/novoda/gradle-static-analysis-plugin/pull/83)) - Improve plugin documentation and samples ([PR#85](https://github.com/novoda/gradle-static-analysis-plugin/pull/85), [PR#97](https://github.com/novoda/gradle-static-analysis-plugin/pull/97), [PR#99](https://github.com/novoda/gradle-static-analysis-plugin/pull/99), diff --git a/README.md b/README.md index 5c29744..be9e7de 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.novoda:gradle-static-analysis-plugin:0.6' + classpath 'com.novoda:gradle-static-analysis-plugin:0.7' } } @@ -52,7 +52,7 @@ or from the [Gradle Plugins Repository](https://plugins.gradle.org/): ```gradle plugins { - id 'com.novoda.static-analysis' version '0.6' + id 'com.novoda.static-analysis' version '0.7' } ``` diff --git a/build.gradle b/build.gradle index e8ce2d8..6a0f0d8 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,9 @@ subprojects { repositories { jcenter() gradlePluginPortal() + maven { + url 'https://novoda.bintray.com/snapshots' + } } dependencies { classpath gradlePlugins.bintrayRelease @@ -27,6 +30,6 @@ subprojects { } task wrapper(type: Wrapper) { - gradleVersion = '4.4.1' + gradleVersion = '4.10.2' distributionType = Wrapper.DistributionType.ALL } diff --git a/buildSrc/src/main/groovy/GradlePlugins.groovy b/buildSrc/src/main/groovy/GradlePlugins.groovy index 1849230..f074161 100644 --- a/buildSrc/src/main/groovy/GradlePlugins.groovy +++ b/buildSrc/src/main/groovy/GradlePlugins.groovy @@ -1,5 +1,5 @@ class GradlePlugins { - final bintrayRelease = 'com.novoda:bintray-release:0.4.0' + final bintrayRelease = 'com.novoda:bintray-release:SNAPSHOT-6' // TODO update when stable release is out final buildProperties = 'com.novoda:gradle-build-properties-plugin:0.4.1' final gradleGit = 'org.ajoberstar:gradle-git:1.6.0' final gradlePublish = 'com.gradle.publish:plugin-publish-plugin:0.9.9' diff --git a/docs/supported-tools.md b/docs/supported-tools.md index cba163b..40905bd 100644 --- a/docs/supported-tools.md +++ b/docs/supported-tools.md @@ -57,7 +57,6 @@ staticAnalysis { ``` ## Example configurations -If you want, you can use the Novoda [`team-props` scaffolding system](https://github.com/novoda/novoda/tree/master/team-props) as a starting point for setting -up your project. The repository contains a good example of [configuration](https://github.com/novoda/novoda/blob/master/team-props/static-analysis.gradle) for -the plugin, and [rulesets](https://github.com/novoda/novoda/tree/master/team-props/static-analysis) for all supported tools. - +If you want, you can use the Novoda [`team-props` scaffolding system](https://github.com/novoda/novoda/tree/master/scaffolding) as a starting point for setting +up your project. The repository contains a good example of [configuration](https://github.com/novoda/novoda/tree/master/scaffolding/team-props/static-analysis.gradle) for +the plugin, and [rulesets](https://github.com/novoda/novoda/tree/master/scaffolding/team-props/static-analysis) for all supported tools. diff --git a/docs/tools/ktlint.md b/docs/tools/ktlint.md index f804859..9232242 100644 --- a/docs/tools/ktlint.md +++ b/docs/tools/ktlint.md @@ -1,11 +1,11 @@ # ktlint [Ktlint](https://github.com/shyiko/ktlint) is a linter for Kotlin with a built-in formatter. It does not support Java. Adding -this tool only makes sense when you have Kotlin sources in your project. In fact, it will fail to run if you have 0 Kotlin -files. +this tool only makes sense when you have Kotlin sources in your project. ## Table of contents * [IMPORTANT: setup Ktlint](#important-setup-ktlint) * [Configure Ktlint](#configure-ktlint) + * [Known Issues](#known-issues) --- ## IMPORTANT: setup Ktlint @@ -25,7 +25,7 @@ In most common cases, adding Ktlint to a project boils down to these simple step 1. Add this statement to your root `build.gradle` project (change the version according to your needs): ```gradle plugins { - id 'org.jlleitschuh.gradle.ktlint' version '5.0.0' + id 'org.jlleitschuh.gradle.ktlint' version '5.1.0' // ... } ``` @@ -56,3 +56,9 @@ For other configuration options and adding custom rules, refer to the **Note:** Failures and threshold detection is handled by Static Analysis plugin. That is why `ignoreFailures = true` is set by the plugin. Please do not manually override `ignoreFailures` property. + +## Known Issues + +6.1.0 and 6.2.1 versions are broken for Android projects because of [a bug in Ktlint](https://github.com/JLLeitschuh/ktlint-gradle/issues/153#issuecomment-437176852) + +Because of a behavior change, the `main` sourceSet is not checked. We recommend to use the version 5.1.0 and before. diff --git a/gradle/publish.gradle b/gradle/publish.gradle index 87f79b4..473f561 100644 --- a/gradle/publish.gradle +++ b/gradle/publish.gradle @@ -2,7 +2,7 @@ ext { websiteUrl = 'https://github.com/novoda/gradle-static-analysis-plugin' } -version = '0.6' +version = '0.7' String tag = "v$project.version" groovydoc.docTitle = 'Static Analysis Plugin' @@ -56,15 +56,15 @@ apply plugin: 'com.novoda.bintray-release' publish { userOrg = 'novoda' - repoName = buildProperties.publish['bintrayRepo'].string groupId = 'com.novoda' artifactId = 'gradle-static-analysis-plugin' + desc = 'Easy setup of static analysis tools for Android and Java projects.' - version = project.buildProperties.publish['version'].string + repoName = project.buildProperties.publish['bintrayRepo'].string publishVersion = project.buildProperties.publish['version'].string bintrayUser = project.buildProperties.publish['bintrayUser'].string bintrayKey = project.buildProperties.publish['bintrayKey'].string - website = websiteUrl + website = project.websiteUrl } apply plugin: 'org.ajoberstar.grgit' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 99340b4..29953ea 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 57c7d2d..d76b502 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-all.zip diff --git a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/CollectViolationsTask.groovy b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/CollectViolationsTask.groovy index 776bc0c..c8e18f8 100644 --- a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/CollectViolationsTask.groovy +++ b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/CollectViolationsTask.groovy @@ -3,11 +3,15 @@ package com.novoda.staticanalysis.internal import com.novoda.staticanalysis.Violations import org.gradle.api.DefaultTask import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.TaskAction +import static org.gradle.api.tasks.PathSensitivity.RELATIVE + abstract class CollectViolationsTask extends DefaultTask { @InputFile + @PathSensitive(RELATIVE) private File xmlReportFile private File htmlReportFile private Violations violations diff --git a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/detekt/CollectDetektViolationsTask.groovy b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/detekt/CollectDetektViolationsTask.groovy deleted file mode 100644 index 845bc04..0000000 --- a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/detekt/CollectDetektViolationsTask.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package com.novoda.staticanalysis.internal.detekt - -import com.novoda.staticanalysis.Violations -import com.novoda.staticanalysis.internal.CollectViolationsTask -import groovy.util.slurpersupport.GPathResult - -class CollectDetektViolationsTask extends CollectViolationsTask { - - @Override - void collectViolations(File xmlReportFile, File htmlReportFile, Violations violations) { - GPathResult xml = new XmlSlurper().parse(xmlReportFile) - int errors = xml.'**'.findAll { node -> node.name() == 'error' && node.@severity == 'error' }.size() - int warnings = xml.'**'.findAll { node -> node.name() == 'error' && node.@severity == 'warning' }.size() - violations.addViolations(errors, warnings, htmlReportFile ?: xmlReportFile) - } - -} diff --git a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/detekt/DetektConfigurator.groovy b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/detekt/DetektConfigurator.groovy index 7e239c8..4e6cecf 100644 --- a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/detekt/DetektConfigurator.groovy +++ b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/detekt/DetektConfigurator.groovy @@ -3,6 +3,7 @@ package com.novoda.staticanalysis.internal.detekt import com.novoda.staticanalysis.StaticAnalysisExtension import com.novoda.staticanalysis.Violations import com.novoda.staticanalysis.internal.Configurator +import com.novoda.staticanalysis.internal.checkstyle.CollectCheckstyleViolationsTask import org.gradle.api.GradleException import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project @@ -11,15 +12,17 @@ import org.gradle.api.Task class DetektConfigurator implements Configurator { private static final String DETEKT_PLUGIN = 'io.gitlab.arturbosch.detekt' - private static final String LAST_COMPATIBLE_DETEKT_VERSION = '1.0.0.RC8' + private static final String LAST_COMPATIBLE_DETEKT_VERSION = '1.0.0-RC10' private static final String DETEKT_NOT_APPLIED = 'The Detekt plugin is configured but not applied. Please apply the plugin in your build script.\nFor more information see https://github.com/arturbosch/detekt.' private static final String OUTPUT_NOT_DEFINED = 'Output not defined! To analyze the results, `output` needs to be defined in Detekt profile.' private static final String DETEKT_CONFIGURATION_ERROR = "A problem occurred while configuring Detekt. Please make sure to use a compatible version (All versions up to $LAST_COMPATIBLE_DETEKT_VERSION)" + private static final String XML_REPORT_NOT_ENABLED = 'XML report must be enabled. Please make sure to enable "reports.xml" in your Detekt configuration' private final Project project private final Violations violations private final Task evaluateViolations + static DetektConfigurator create(Project project, NamedDomainObjectContainer violationsContainer, Task evaluateViolations) { @@ -45,24 +48,51 @@ class DetektConfigurator implements Configurator { } def detekt = project.extensions.findByName('detekt') + setDefaultXmlReport(detekt) config.delegate = detekt config() - configureToolTask(detekt) + + def collectViolations = configureToolTask(detekt) + evaluateViolations.dependsOn collectViolations } } - private void configureToolTask(detekt) { - def detektTask = project.tasks['detektCheck'] - detektTask.group = 'verification' + private void setDefaultXmlReport(detekt) { + if (detekt.hasProperty('reports')) { + detekt.reports { + xml.enabled = true + xml.destination = new File(project.buildDir, 'reports/detekt/detekt.xml') + } + } + } - // evaluate violations after detekt + private CollectCheckstyleViolationsTask configureToolTask(detekt) { + def detektTask = project.tasks.findByName('detekt') + if (detektTask?.hasProperty('reports')) { + def reports = detektTask.reports + if (!reports.xml.enabled) { + throw new IllegalStateException(XML_REPORT_NOT_ENABLED) + } + return createCollectViolationsTask( + violations, + detektTask, + reports.xml.destination, + reports.html.destination + ) + } + + // Fallback to old Detekt versions def output = resolveOutput(detekt) if (!output) { throw new IllegalArgumentException(OUTPUT_NOT_DEFINED) } - def collectViolations = createCollectViolationsTask(violations, project.file(output)) - evaluateViolations.dependsOn collectViolations - collectViolations.dependsOn detektTask + def outputFolder = project.file(output) + return createCollectViolationsTask( + violations, + project.tasks['detektCheck'], + new File(outputFolder, 'detekt-checkstyle.xml'), + new File(outputFolder, 'detekt-report.html') + ) } private static resolveOutput(detekt) { @@ -75,11 +105,13 @@ class DetektConfigurator implements Configurator { } } - private CollectDetektViolationsTask createCollectViolationsTask(Violations violations, File outputFolder) { - project.tasks.create('collectDetektViolations', CollectDetektViolationsTask) { task -> - task.xmlReportFile = new File(outputFolder, 'detekt-checkstyle.xml') - task.htmlReportFile = new File(outputFolder, 'detekt-report.html') + private CollectCheckstyleViolationsTask createCollectViolationsTask(Violations violations, detektTask, File xmlReportFile, File htmlReportFile) { + project.tasks.create('collectDetektViolations', CollectCheckstyleViolationsTask) { task -> + task.xmlReportFile = xmlReportFile + task.htmlReportFile = htmlReportFile task.violations = violations + + task.dependsOn(detektTask) } } @@ -87,8 +119,9 @@ class DetektConfigurator implements Configurator { final boolean isKotlin = project.plugins.hasPlugin('kotlin') final boolean isKotlinAndroid = project.plugins.hasPlugin('kotlin-android') final boolean isKotlinPlatformCommon = project.plugins.hasPlugin('kotlin-platform-common') + final boolean isKotlinMultiplatform = project.plugins.hasPlugin('org.jetbrains.kotlin.multiplatform') final boolean isKotlinPlatformJvm = project.plugins.hasPlugin('kotlin-platform-jvm') final boolean isKotlinPlatformJs = project.plugins.hasPlugin('kotlin-platform-js') - return isKotlin || isKotlinAndroid || isKotlinPlatformCommon || isKotlinPlatformJvm || isKotlinPlatformJs + return isKotlin || isKotlinAndroid || isKotlinPlatformCommon || isKotlinMultiplatform || isKotlinPlatformJvm || isKotlinPlatformJs } } diff --git a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/findbugs/GenerateFindBugsHtmlReport.groovy b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/findbugs/GenerateFindBugsHtmlReport.groovy index 5748065..ddfc474 100644 --- a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/findbugs/GenerateFindBugsHtmlReport.groovy +++ b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/findbugs/GenerateFindBugsHtmlReport.groovy @@ -1,19 +1,30 @@ package com.novoda.staticanalysis.internal.findbugs +import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.JavaExec +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.PathSensitive + +import static org.gradle.api.tasks.PathSensitivity.RELATIVE class GenerateFindBugsHtmlReport extends JavaExec { + @InputFile + @PathSensitive(RELATIVE) File xmlReportFile + @OutputFile + @PathSensitive(RELATIVE) File htmlReportFile + GenerateFindBugsHtmlReport() { + onlyIf { xmlReportFile?.exists() } + } + @Override void exec() { - if (xmlReportFile?.exists()) { - main = 'edu.umd.cs.findbugs.PrintingBugReporter' - standardOutput = new FileOutputStream(htmlReportFile) - args '-html', xmlReportFile - super.exec() - } + main = 'edu.umd.cs.findbugs.PrintingBugReporter' + standardOutput = new FileOutputStream(htmlReportFile) + args '-html', xmlReportFile + super.exec() } } diff --git a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintConfigurator.groovy b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintConfigurator.groovy index cee82a4..2b8d617 100644 --- a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintConfigurator.groovy +++ b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintConfigurator.groovy @@ -9,11 +9,13 @@ import org.gradle.api.GradleException import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.api.file.RegularFileProperty class KtlintConfigurator implements Configurator { private static final String KTLINT_PLUGIN = 'org.jlleitschuh.gradle.ktlint' - private static final String KTLINT_NOT_APPLIED = 'The Ktlint plugin is configured but not applied. Please apply the plugin in your build script.\nFor more information see https://github.com/jeremymailen/kotlinter-gradle' + private static final String KTLINT_NOT_APPLIED = 'The Ktlint plugin is configured but not applied. Please apply the plugin in your build script.\nFor more information see https://github.com/JLLeitschuh/ktlint-gradle/#how-to-use' + private static final String XML_REPORT_NOT_ENABLED = 'XML report must be enabled. Please make sure to add "CHECKSTYLE" into reports in your Ktlint configuration' private final Project project private final Violations violations @@ -41,14 +43,7 @@ class KtlintConfigurator implements Configurator { throw new GradleException(KTLINT_NOT_APPLIED) } - def ktlint = project.ktlint - ktlint.ignoreFailures = true - ktlint.reporters = ['CHECKSTYLE', 'PLAIN'] - ktlint.ext.includeVariants = { Closure filter -> - variantFilter.includeVariantsFilter = filter - } - config.delegate = ktlint - config() + configureKtlintExtension(config) project.afterEvaluate { @@ -61,6 +56,9 @@ class KtlintConfigurator implements Configurator { project.plugins.withId("kotlin-platform-common") { configureKotlinProject() } + project.plugins.withId("org.jetbrains.kotlin.multiplatform") { + configureKotlinProject() + } project.plugins.withId('com.android.application') { configureAndroidWithVariants(variantFilter.filteredApplicationVariants) } @@ -71,27 +69,61 @@ class KtlintConfigurator implements Configurator { } } + private void configureKtlintExtension(Closure config) { + def ktlint = project.ktlint + ktlint.ignoreFailures = true + ktlint.ext.includeVariants = { Closure filter -> + variantFilter.includeVariantsFilter = filter + } + config.delegate = ktlint + config() + } + private void configureKotlinProject() { - project.sourceSets.each { configureKtlint(it) } + project.sourceSets.each { configureKtlint(it.name) } } private void configureAndroidWithVariants(def mainVariants) { - mainVariants.all { configureKtlint(it) } - variantFilter.filteredTestVariants.all { configureKtlint(it) } - variantFilter.filteredUnitTestVariants.all { configureKtlint(it) } + mainVariants.all { configureKtlint(it.name) } + variantFilter.filteredTestVariants.all { configureKtlint(it.name) } + variantFilter.filteredUnitTestVariants.all { configureKtlint(it.name) } } - private void configureKtlint(def sourceSet) { - def collectViolations = createCollectViolationsTask(violations, sourceSet.name) - evaluateViolations.dependsOn collectViolations + private void configureKtlint(def sourceSetName) { + project.tasks.matching { + it.name == "ktlint${sourceSetName.capitalize()}Check" + }.all { Task ktlintTask -> + def collectViolations = configureKtlintWithOutputFiles(sourceSetName, ktlintTask.reportOutputFiles) + collectViolations.dependsOn ktlintTask + evaluateViolations.dependsOn collectViolations + } + } + + private def configureKtlintWithOutputFiles(def sourceSetName, Map reportOutputFiles) { + File xmlReportFile = null + File txtReportFile = null + reportOutputFiles.each { key, fileProp -> + def file = fileProp.get().asFile + if (file.name.endsWith('.xml')) { + xmlReportFile = file + } + if (file.name.endsWith('.txt')) { + txtReportFile = file + } + } + + if (xmlReportFile == null) { + throw new IllegalStateException(XML_REPORT_NOT_ENABLED) + } + + createCollectViolationsTask(violations, sourceSetName, xmlReportFile, txtReportFile) } - private def createCollectViolationsTask(Violations violations, def sourceSetName) { + private def createCollectViolationsTask(Violations violations, def sourceSetName, File xmlReportFile, File txtReportFile) { project.tasks.create("collectKtlint${sourceSetName.capitalize()}Violations", CollectCheckstyleViolationsTask) { task -> - task.xmlReportFile = new File(project.buildDir, "reports/ktlint/ktlint-${sourceSetName}.xml") - task.htmlReportFile = new File(project.buildDir, "reports/ktlint/ktlint-${sourceSetName}.txt") + task.xmlReportFile = xmlReportFile + task.htmlReportFile = txtReportFile task.violations = violations - task.dependsOn project.tasks["ktlint${sourceSetName.capitalize()}Check"] } } } diff --git a/plugin/src/test/fixtures/rules/detekt/detekt.yml b/plugin/src/test/fixtures/rules/detekt/detekt.yml index 6f3c5f6..a29e766 100644 --- a/plugin/src/test/fixtures/rules/detekt/detekt.yml +++ b/plugin/src/test/fixtures/rules/detekt/detekt.yml @@ -29,22 +29,10 @@ build: comments: 1 processors: - active: true - exclude: - # - 'FunctionCountProcessor' - # - 'PropertyCountProcessor' - # - 'ClassCountProcessor' - # - 'PackageCountProcessor' - # - 'KtFileCountProcessor' + active: false console-reports: - active: true - exclude: - # - 'ProjectStatisticsReport' - # - 'ComplexityReport' - # - 'NotificationReport' - # - 'FindingsReport' - # - 'BuildFailureReport' + active: false output-reports: active: true @@ -364,4 +352,4 @@ style: active: false WildcardImport: active: true - excludeImports: 'java.util.*,kotlinx.android.synthetic.*' \ No newline at end of file + excludeImports: 'java.util.*,kotlinx.android.synthetic.*' diff --git a/plugin/src/test/groovy/com/novoda/staticanalysis/internal/detekt/DetektIntegrationTest.groovy b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/detekt/DetektIntegrationTest.groovy index bb34b74..4fa018a 100644 --- a/plugin/src/test/groovy/com/novoda/staticanalysis/internal/detekt/DetektIntegrationTest.groovy +++ b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/detekt/DetektIntegrationTest.groovy @@ -37,7 +37,7 @@ class DetektIntegrationTest { @Test void shouldFailBuildOnConfigurationWhenNoOutputNotDefined() { - def emptyConfiguration = detektWith("") + def emptyConfiguration = detektWith(detektVersion, "") def result = createProjectWithZeroThreshold(Fixtures.Detekt.SOURCES_WITH_WARNINGS) .withToolsConfig(emptyConfiguration) @@ -49,7 +49,7 @@ class DetektIntegrationTest { @Test void shouldFailBuildOnConfigurationWhenDetektConfiguredButNotApplied() { def result = projectRule.newProject() - .withToolsConfig(detektConfiguration(Fixtures.Detekt.SOURCES_WITH_ERRORS)) + .withToolsConfig(detektConfiguration(Fixtures.Detekt.SOURCES_WITH_ERRORS, detektVersion)) .buildAndFail('check') assertThat(result.logs).contains(DETEKT_NOT_APPLIED) @@ -109,7 +109,7 @@ class DetektIntegrationTest { maxWarnings = 0 maxErrors = 0 }''') - .withToolsConfig(detektConfigurationWithoutInput()) + .withToolsConfig(detektConfigurationWithoutInput(detektVersion)) TestProject.Result result = testProject .build('check') @@ -130,7 +130,7 @@ class DetektIntegrationTest { maxWarnings = ${maxWarnings} maxErrors = ${maxErrors} }""") - .withToolsConfig(detektConfiguration(sources)) + .withToolsConfig(detektConfiguration(sources, detektVersion)) } private TestProject createProjectWithoutDetekt() { @@ -143,27 +143,29 @@ class DetektIntegrationTest { }''') } - private static String detektConfiguration(File input) { - detektWith """ + private static String detektConfiguration(File input, String detektVersion) { + detektWith(detektVersion, """ config = '${Fixtures.Detekt.RULES}' output = "\$buildDir/reports" // The input just needs to be configured for the tests. // Probably detekt doesn't pick up the changed source sets. // In a example project it was not needed. input = "${input}" - """ + """) } - private static String detektConfigurationWithoutInput() { - detektWith """ + private static String detektConfigurationWithoutInput(String detektVersion) { + detektWith(detektVersion, """ config = '${Fixtures.Detekt.RULES}' output = "\$buildDir/reports" - """ + """) } - private static String detektWith(String mainProfile) { + private static String detektWith(String detektVersion, String mainProfile) { """ - detekt { + detekt { + version '${detektVersion}' + profile('main') { ${mainProfile.stripIndent()} } diff --git a/plugin/src/test/groovy/com/novoda/staticanalysis/internal/detekt/DetektNewIntegrationTest.groovy b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/detekt/DetektNewIntegrationTest.groovy new file mode 100644 index 0000000..ca65ded --- /dev/null +++ b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/detekt/DetektNewIntegrationTest.groovy @@ -0,0 +1,181 @@ +package com.novoda.staticanalysis.internal.detekt + + +import com.novoda.test.Fixtures +import com.novoda.test.TestProject +import com.novoda.test.TestProjectRule +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized + +import static com.novoda.test.LogsSubject.assertThat + +@RunWith(Parameterized.class) +class DetektNewIntegrationTest { + + private static final String DETEKT_NOT_APPLIED = 'The Detekt plugin is configured but not applied. Please apply the plugin in your build script.' + private static final String XML_REPORT_NOT_ENABLED = 'XML report must be enabled. Please make sure to enable "reports.xml" in your Detekt configuration' + + + @Parameterized.Parameters(name = "{0} with Detekt: {1}") + static Iterable rules() { + return [ + [TestProjectRule.forKotlinProject(), "1.0.0.RC9.2"], + [TestProjectRule.forAndroidKotlinProject(), "1.0.0.RC9.2"], + [TestProjectRule.forKotlinProject(), "1.0.0-RC10"], + [TestProjectRule.forAndroidKotlinProject(), "1.0.0-RC10"], + ]*.toArray() + } + + @Rule + public final TestProjectRule projectRule + private final String detektVersion + + DetektNewIntegrationTest(TestProjectRule projectRule, String detektVersion) { + this.projectRule = projectRule + this.detektVersion = detektVersion + } + + @Test + void shouldFailBuildOnConfigurationWhenDetektConfiguredButNotApplied() { + def result = projectRule.newProject() + .withToolsConfig(detektConfiguration(Fixtures.Detekt.SOURCES_WITH_ERRORS, detektVersion)) + .buildAndFail('check') + + assertThat(result.logs).contains(DETEKT_NOT_APPLIED) + } + + @Test + void shouldFailBuildOnConfigurationWhenDetektConfiguredWithoutXmlReport() { + def result = projectRule.newProject() + .withPlugin("io.gitlab.arturbosch.detekt", detektVersion) + .withToolsConfig('''detekt { + reports { + xml.enabled = false + } + }''') + .buildAndFail('check') + + assertThat(result.logs).contains(XML_REPORT_NOT_ENABLED) + } + + @Test + void shouldFailBuildWhenDetektWarningsOverTheThreshold() { + def result = createProjectWithZeroThreshold(Fixtures.Detekt.SOURCES_WITH_WARNINGS) + .buildAndFail('check') + + assertThat(result.logs).containsLimitExceeded(0, 1) + assertThat(result.logs).containsDetektViolations(0, 1, + result.buildFileUrl('reports/detekt/detekt.html')) + } + + @Test + void shouldFailBuildWhenDetektErrorsOverTheThreshold() { + def result = createProjectWithZeroThreshold(Fixtures.Detekt.SOURCES_WITH_ERRORS) + .buildAndFail('check') + + assertThat(result.logs).containsLimitExceeded(1, 0) + assertThat(result.logs).containsDetektViolations(1, 0, + result.buildFileUrl('reports/detekt/detekt.html')) + } + + @Test + void shouldNotFailWhenDetektIsNotConfigured() throws Exception { + def result = createProjectWithoutDetekt() + .build('check') + + assertThat(result.logs).doesNotContainDetektViolations() + } + + @Test + void shouldNotFailWhenWarningsAreWithinThreshold() throws Exception { + def result = createProjectWith(Fixtures.Detekt.SOURCES_WITH_WARNINGS, 1, 0) + .build('check') + + assertThat(result.logs).containsDetektViolations(0, 1, + result.buildFileUrl('reports/detekt/detekt.html')) + } + + @Test + void shouldNotFailWhenErrorsAreWithinThreshold() throws Exception { + def result = createProjectWith(Fixtures.Detekt.SOURCES_WITH_ERRORS, 0, 1) + .build('check') + + assertThat(result.logs).containsDetektViolations(1, 0, + result.buildFileUrl('reports/detekt/detekt.html')) + } + + @Test + void shouldNotFailBuildWhenNoDetektWarningsOrErrorsEncounteredAndNoThresholdTrespassed() { + def testProject = projectRule.newProject() + .withPlugin("io.gitlab.arturbosch.detekt", detektVersion) + .withPenalty('''{ + maxWarnings = 0 + maxErrors = 0 + }''') + .withToolsConfig(detektConfigurationWithoutInput(detektVersion)) + + TestProject.Result result = testProject + .build('check') + + assertThat(result.logs).doesNotContainLimitExceeded() + assertThat(result.logs).doesNotContainDetektViolations() + } + + private TestProject createProjectWithZeroThreshold(File sources) { + createProjectWith(sources) + } + + private TestProject createProjectWith(File sources, int maxWarnings = 0, int maxErrors = 0) { + projectRule.newProject() + .withPlugin("io.gitlab.arturbosch.detekt", detektVersion) + .withSourceSet('main', sources) + .withPenalty("""{ + maxWarnings = ${maxWarnings} + maxErrors = ${maxErrors} + }""") + .withToolsConfig(detektConfiguration(sources, detektVersion)) + } + + private TestProject createProjectWithoutDetekt() { + projectRule.newProject() + .withPlugin("io.gitlab.arturbosch.detekt", detektVersion) + .withSourceSet('main', Fixtures.Detekt.SOURCES_WITH_WARNINGS) + .withPenalty('''{ + maxWarnings = 0 + maxErrors = 0 + }''') + } + + private static String detektConfiguration(File input, String detektVersion) { + detektWith(detektVersion, """ + config = files('${Fixtures.Detekt.RULES}') + // The input just needs to be configured for the tests. + // Probably detekt doesn't pick up the changed source sets. + // In a example project it was not needed. + input = files("${input}") + """) + } + + private static String detektConfigurationWithoutInput(String detektVersion) { + detektWith(detektVersion, """ + config = files('${Fixtures.Detekt.RULES}') + """) + } + + private static String detektWith(String detektVersion, String configuration) { + """ + detekt { + toolVersion '${detektVersion}' + + ${configuration.stripIndent()} + + reports { + xml.enabled = true + html.enabled = true + } + } + """ + } +} diff --git a/plugin/src/test/groovy/com/novoda/staticanalysis/internal/findbugs/FindbugsIntegrationTest.groovy b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/findbugs/FindbugsIntegrationTest.groovy index 19d96a1..8ce896e 100644 --- a/plugin/src/test/groovy/com/novoda/staticanalysis/internal/findbugs/FindbugsIntegrationTest.groovy +++ b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/findbugs/FindbugsIntegrationTest.groovy @@ -17,7 +17,7 @@ import static com.novoda.test.TestProjectSubject.assumeThat class FindbugsIntegrationTest { @Parameterized.Parameters(name = "{0}") - public static Iterable rules() { + static Iterable rules() { return [TestProjectRule.forJavaProject(), TestProjectRule.forAndroidProject()] } @@ -29,7 +29,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldFailBuildWhenFindbugsWarningsOverTheThreshold() { + void shouldFailBuildWhenFindbugsWarningsOverTheThreshold() { TestProject.Result result = projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) .withPenalty('''{ @@ -45,7 +45,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldFailBuildAfterSecondRunWhenFindbugsWarningsStillOverTheThreshold() { + void shouldFailBuildAfterSecondRunWhenFindbugsWarningsStillOverTheThreshold() { def project = projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) .withPenalty('''{ @@ -68,7 +68,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldDetectMoreWarningsWhenEffortIsMaxAndReportLevelIsLow() { + void shouldDetectMoreWarningsWhenEffortIsMaxAndReportLevelIsLow() { TestProject.Result result = projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) .withPenalty('''{ @@ -84,7 +84,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldFailBuildWhenFindbugsErrorsOverTheThreshold() { + void shouldFailBuildWhenFindbugsErrorsOverTheThreshold() { TestProject.Result result = projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_HIGH_VIOLATION) .withPenalty('''{ @@ -100,7 +100,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldNotFailBuildWhenNoFindbugsWarningsOrErrorsEncounteredAndNoThresholdTrespassed() { + void shouldNotFailBuildWhenNoFindbugsWarningsOrErrorsEncounteredAndNoThresholdTrespassed() { TestProject.Result result = projectRule.newProject() .withPenalty('''{ maxErrors = 0 @@ -114,7 +114,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldNotFailBuildWhenFindbugsWarningsAndErrorsEncounteredAndNoThresholdTrespassed() { + void shouldNotFailBuildWhenFindbugsWarningsAndErrorsEncounteredAndNoThresholdTrespassed() { TestProject.Result result = projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) .withSourceSet('release', SOURCES_WITH_HIGH_VIOLATION) @@ -132,7 +132,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldNotFailBuildWhenFindbugsConfiguredToNotIgnoreFailures() { + void shouldNotFailBuildWhenFindbugsConfiguredToNotIgnoreFailures() { projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) .withSourceSet('release', SOURCES_WITH_HIGH_VIOLATION) @@ -145,7 +145,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldNotFailBuildWhenFindbugsNotConfigured() { + void shouldNotFailBuildWhenFindbugsNotConfigured() { projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) .withSourceSet('release', SOURCES_WITH_HIGH_VIOLATION) @@ -157,7 +157,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldNotFailBuildWhenFindbugsConfiguredToExcludePattern() { + void shouldNotFailBuildWhenFindbugsConfiguredToExcludePattern() { TestProject.Result result = projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION) .withSourceSet('release', SOURCES_WITH_HIGH_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) @@ -174,7 +174,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldNotFailBuildWhenFindbugsConfiguredToIgnoreFaultySourceFolder() { + void shouldNotFailBuildWhenFindbugsConfiguredToIgnoreFaultySourceFolder() { TestProject.Result result = projectRule.newProject() .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) .withSourceSet('release', SOURCES_WITH_HIGH_VIOLATION) @@ -190,7 +190,8 @@ class FindbugsIntegrationTest { result.buildFileUrl('reports/findbugs/debug.html')) } - public void shouldNotFailBuildWhenFindbugsConfiguredToIgnoreFaultyJavaSourceSets() { + @Test + void shouldNotFailBuildWhenFindbugsConfiguredToIgnoreFaultyJavaSourceSets() { TestProject project = projectRule.newProject() assumeThat(project).isJavaProject() @@ -210,7 +211,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldNotFailBuildWhenFindbugsConfiguredToIgnoreFaultyAndroidSourceSets() { + void shouldNotFailBuildWhenFindbugsConfiguredToIgnoreFaultyAndroidSourceSets() { TestProject project = projectRule.newProject() assumeThat(project).isAndroidProject() @@ -234,7 +235,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldCollectDuplicatedFindbugsWarningsAndErrorsAcrossAndroidVariantsForSharedSourceSets() { + void shouldCollectDuplicatedFindbugsWarningsAndErrorsAcrossAndroidVariantsForSharedSourceSets() { TestProject project = projectRule.newProject() assumeThat(project).isAndroidProject() @@ -254,7 +255,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldSkipFindbugsTasksForIgnoredFaultyJavaSourceSets() { + void shouldSkipFindbugsTasksForIgnoredFaultyJavaSourceSets() { TestProject project = projectRule.newProject() assumeThat(project).isJavaProject() @@ -275,7 +276,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldSkipFindbugsTasksForIgnoredFaultyAndroidSourceSets() { + void shouldSkipFindbugsTasksForIgnoredFaultyAndroidSourceSets() { TestProject project = projectRule.newProject() assumeThat(project).isAndroidProject() @@ -304,7 +305,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldProvideNoClassesToFindbugsTaskWhenNoJavaSourcesToAnalyse() { + void shouldProvideNoClassesToFindbugsTaskWhenNoJavaSourcesToAnalyse() { TestProject project = projectRule.newProject() assumeThat(project).isJavaProject() @@ -323,7 +324,7 @@ class FindbugsIntegrationTest { } @Test - public void shouldProvideNoClassesToFindbugsTaskWhenNoAndroidSourcesToAnalyse() { + void shouldProvideNoClassesToFindbugsTaskWhenNoAndroidSourcesToAnalyse() { TestProject project = projectRule.newProject() assumeThat(project).isAndroidProject() @@ -359,6 +360,25 @@ class FindbugsIntegrationTest { .build('check') } + @Test + void shouldBeUpToDateWhenCheckTaskRunsAgain() { + def project = projectRule.newProject() + .withSourceSet('debug', SOURCES_WITH_LOW_VIOLATION, SOURCES_WITH_MEDIUM_VIOLATION) + .withSourceSet('release', SOURCES_WITH_HIGH_VIOLATION) + .withPenalty('''{ + maxErrors = 10 + maxWarnings = 10 + }''') + .withToolsConfig('findbugs {}') + + project.build('check') + + def result = project.build('check') + + Truth.assertThat(result.outcome(':findbugsDebug')).isEqualTo(TaskOutcome.UP_TO_DATE) + Truth.assertThat(result.outcome(':generateFindbugsDebugHtmlReport')).isEqualTo(TaskOutcome.UP_TO_DATE) + } + /** * The custom task created in the snippet below will check whether {@code Findbugs} tasks with * empty {@code source} will have empty {@code classes} too.

diff --git a/plugin/src/test/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintIntegrationTest.groovy b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintIntegrationTest.groovy index e259bfe..17e0511 100644 --- a/plugin/src/test/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintIntegrationTest.groovy +++ b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintIntegrationTest.groovy @@ -14,28 +14,45 @@ import static com.novoda.test.LogsSubject.assertThat class KtlintIntegrationTest { private static final String KTLINT_NOT_APPLIED = 'The Ktlint plugin is configured but not applied. Please apply the plugin in your build script.' + private static final String XML_REPORT_NOT_ENABLED = 'XML report must be enabled. Please make sure to add "CHECKSTYLE" into reports in your Ktlint configuration' + public static final String DEFAULT_CONFIG = ''' ktlint { + reporters = [ + org.jlleitschuh.gradle.ktlint.reporter.ReporterType.PLAIN, + org.jlleitschuh.gradle.ktlint.reporter.ReporterType.CHECKSTYLE + ] + includeVariants { it.name == "debug" } } ''' - public static final String EMPTY_CONFIG = 'ktlint {}' - @Parameterized.Parameters(name = '{0}') + @Parameterized.Parameters(name = '{0} with ktlint {1}') static def rules() { return [ - [TestProjectRule.forKotlinProject(), 'main'].toArray(), - [TestProjectRule.forAndroidKotlinProject(), 'debug'].toArray() - ] + [TestProjectRule.forKotlinProject(), '4.1.0', 'ktlint-main.txt'], + [TestProjectRule.forAndroidKotlinProject(), '4.1.0', 'ktlint-debug.txt'], + [TestProjectRule.forKotlinProject(), '5.1.0', 'ktlint-main.txt'], + [TestProjectRule.forAndroidKotlinProject(), '5.1.0', 'ktlint-debug.txt'], + [TestProjectRule.forKotlinProject(), '6.1.0', 'ktlintMainCheck.txt'], + [TestProjectRule.forKotlinProject(), '6.2.1', 'ktlintMainCheck.txt'], + /** + * Tracked in https://github.com/novoda/gradle-static-analysis-plugin/issues/146 + */ + //[TestProjectRule.forAndroidKotlinProject(), '6.1.0', 'ktlintDebugCheck.txt'], + //[TestProjectRule.forAndroidKotlinProject(), '6.2.1', 'ktlintDebugCheck.txt'], + ]*.toArray() } @Rule public final TestProjectRule projectRule - private final String sourceSetName; + private final String ktlintVersion + private final String expectedOutputFileName - KtlintIntegrationTest(TestProjectRule projectRule, String sourceSetName) { + KtlintIntegrationTest(TestProjectRule projectRule, String ktlintVersion, String expectedOutputFileName) { this.projectRule = projectRule - this.sourceSetName = sourceSetName + this.ktlintVersion = ktlintVersion + this.expectedOutputFileName = expectedOutputFileName } @Test @@ -46,10 +63,20 @@ class KtlintIntegrationTest { assertThat(result.logs).doesNotContainKtlintViolations() } + @Test + void shouldFailBuildOnConfigurationWhenDetektConfiguredWithoutXmlReport() { + def result = projectRule.newProject() + .withPlugin('org.jlleitschuh.gradle.ktlint', ktlintVersion) + .withToolsConfig('ktlint { }') + .buildAndFail('evaluateViolations') + + assertThat(result.logs).contains(XML_REPORT_NOT_ENABLED) + } + @Test void shouldFailBuildOnConfigurationWhenKtlintConfiguredButNotApplied() { def result = projectRule.newProject() - .withToolsConfig(EMPTY_CONFIG) + .withToolsConfig(DEFAULT_CONFIG) .buildAndFail('evaluateViolations') assertThat(result.logs).contains(KTLINT_NOT_APPLIED) @@ -63,7 +90,7 @@ class KtlintIntegrationTest { assertThat(result.logs).containsLimitExceeded(1, 0) assertThat(result.logs).containsKtlintViolations(1, - result.buildFileUrl("reports/ktlint/ktlint-${sourceSetName}.txt")) + result.buildFileUrl("reports/ktlint/$expectedOutputFileName")) } @Test @@ -73,13 +100,13 @@ class KtlintIntegrationTest { .build('evaluateViolations') assertThat(result.logs).containsKtlintViolations(1, - result.buildFileUrl("reports/ktlint/ktlint-${sourceSetName}.txt")) + result.buildFileUrl("reports/ktlint/$expectedOutputFileName")) } @Test void shouldNotFailBuildWhenNoErrorsEncounteredAndNoThresholdTrespassed() { def result = createProjectWith(Fixtures.Ktlint.SOURCES_NO_ERROR, 0) - .withToolsConfig(EMPTY_CONFIG) + .withToolsConfig(DEFAULT_CONFIG) .build('evaluateViolations') assertThat(result.logs).doesNotContainLimitExceeded() @@ -88,7 +115,7 @@ class KtlintIntegrationTest { private TestProject createProjectWith(File sources, int maxErrors = 0) { projectRule.newProject() - .withPlugin('org.jlleitschuh.gradle.ktlint', '4.1.0') + .withPlugin('org.jlleitschuh.gradle.ktlint', ktlintVersion) .withSourceSet('main', sources) .withPenalty("""{ maxWarnings = 0 diff --git a/plugin/src/test/groovy/com/novoda/test/TestAndroidKotlinProject.groovy b/plugin/src/test/groovy/com/novoda/test/TestAndroidKotlinProject.groovy index 3fceefc..03089c3 100644 --- a/plugin/src/test/groovy/com/novoda/test/TestAndroidKotlinProject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/TestAndroidKotlinProject.groovy @@ -9,7 +9,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.1.4' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.20' } } @@ -26,7 +26,6 @@ apply plugin: 'kotlin-android' android { compileSdkVersion 27 - buildToolsVersion '27.0.0' defaultConfig { minSdkVersion 16 @@ -34,6 +33,9 @@ android { versionCode 1 versionName '1.0' } + lintOptions { + disable 'OldTargetApi' + } sourceSets { ${formatSourceSets(project)} } diff --git a/plugin/src/test/groovy/com/novoda/test/TestAndroidProject.groovy b/plugin/src/test/groovy/com/novoda/test/TestAndroidProject.groovy index f8d9eda..b4dc3ac 100644 --- a/plugin/src/test/groovy/com/novoda/test/TestAndroidProject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/TestAndroidProject.groovy @@ -9,7 +9,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.1.4' } } plugins { @@ -23,13 +23,15 @@ repositories { apply plugin: 'com.android.library' android { compileSdkVersion 27 - buildToolsVersion '27.0.0' defaultConfig { minSdkVersion 16 targetSdkVersion 27 versionCode 1 versionName '1.0' + } + lintOptions { + disable 'OldTargetApi' } sourceSets { ${formatSourceSets(project)} diff --git a/sample-multi-module/app/build.gradle b/sample-multi-module/app/build.gradle index 263b25d..4513420 100644 --- a/sample-multi-module/app/build.gradle +++ b/sample-multi-module/app/build.gradle @@ -4,7 +4,6 @@ apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 27 - buildToolsVersion '27.0.3' defaultConfig { applicationId 'com.novoda.staticanalysis.sample' diff --git a/sample-multi-module/build.gradle b/sample-multi-module/build.gradle index f2a0dee..70628e7 100644 --- a/sample-multi-module/build.gradle +++ b/sample-multi-module/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.60' + ext.kotlin_version = '1.3.0' repositories { google() @@ -7,12 +7,14 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.novoda:gradle-static-analysis-plugin:local' + classpath 'io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.0.0-RC10' + classpath 'gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:5.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'gradle.plugin.io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.0.0.RC8' - classpath 'gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:5.0.0' } } +ext.ReporterType = org.jlleitschuh.gradle.ktlint.reporter.ReporterType apply from: rootProject.file('team-props/tasks.gradle') @@ -30,3 +32,8 @@ subprojects { jcenter() } } + +task wrapper(type: Wrapper) { + gradleVersion = '4.10.2' + distributionType = Wrapper.DistributionType.ALL +} diff --git a/sample-multi-module/buildSrc/build.gradle b/sample-multi-module/buildSrc/build.gradle deleted file mode 100644 index a995c56..0000000 --- a/sample-multi-module/buildSrc/build.gradle +++ /dev/null @@ -1,15 +0,0 @@ -repositories { - jcenter() -} - -apply plugin: 'groovy' - -dependencies { - compile gradleApi() -} - -sourceSets { - main { - groovy { srcDir '../../plugin/src/main/groovy' } - } -} diff --git a/sample-multi-module/core/build.gradle b/sample-multi-module/core/build.gradle index 2d9c112..b989299 100644 --- a/sample-multi-module/core/build.gradle +++ b/sample-multi-module/core/build.gradle @@ -1,16 +1,6 @@ apply plugin: 'java-library' apply plugin: 'kotlin' -buildscript { - ext.kotlin_version = '1.2.30' - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - repositories { mavenCentral() } diff --git a/sample-multi-module/gradle/wrapper/gradle-wrapper.jar b/sample-multi-module/gradle/wrapper/gradle-wrapper.jar index f6b961f..0d4a951 100644 Binary files a/sample-multi-module/gradle/wrapper/gradle-wrapper.jar and b/sample-multi-module/gradle/wrapper/gradle-wrapper.jar differ diff --git a/sample-multi-module/gradle/wrapper/gradle-wrapper.properties b/sample-multi-module/gradle/wrapper/gradle-wrapper.properties index 7dc503f..d76b502 100644 --- a/sample-multi-module/gradle/wrapper/gradle-wrapper.properties +++ b/sample-multi-module/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/sample-multi-module/settings.gradle b/sample-multi-module/settings.gradle index ebf6dd7..822a8f0 100644 --- a/sample-multi-module/settings.gradle +++ b/sample-multi-module/settings.gradle @@ -1,3 +1,9 @@ rootProject.name = 'gradle-static-analysis-plugin-sample' include ':app' include ':core' + +includeBuild('../') { + dependencySubstitution { + substitute module('com.novoda:gradle-static-analysis-plugin') with project(':plugin') + } +} diff --git a/sample-multi-module/team-props/static-analysis.gradle b/sample-multi-module/team-props/static-analysis.gradle index 05279c1..3a9f7be 100644 --- a/sample-multi-module/team-props/static-analysis.gradle +++ b/sample-multi-module/team-props/static-analysis.gradle @@ -1,6 +1,6 @@ -apply plugin: com.novoda.staticanalysis.StaticAnalysisPlugin +apply plugin: 'com.novoda.static-analysis' apply plugin: 'io.gitlab.arturbosch.detekt' -apply plugin: "org.jlleitschuh.gradle.ktlint" +apply plugin: 'org.jlleitschuh.gradle.ktlint' staticAnalysis { @@ -34,15 +34,13 @@ staticAnalysis { } detekt { - profile('main') { - input = project.file("src/main/java") - config = rootProject.file('team-props/detekt-config.yml') - filters = '.*test.*,.*/resources/.*,.*/tmp/.*' - output = project.file("build/reports/detekt") - } + config = rootProject.files('team-props/detekt-config.yml') + filters = '.*test.*,.*/resources/.*,.*/tmp/.*' } ktlint { + reporters = [ReporterType.CHECKSTYLE] + includeVariants { variant -> variant.name.contains('debug') } } } diff --git a/sample/app/build.gradle b/sample/app/build.gradle index 53f2243..3743065 100755 --- a/sample/app/build.gradle +++ b/sample/app/build.gradle @@ -1,12 +1,14 @@ +import org.jlleitschuh.gradle.ktlint.reporter.ReporterType + plugins { - id 'io.gitlab.arturbosch.detekt' version '1.0.0.RC8' - id "org.jlleitschuh.gradle.ktlint" version "5.0.0" + id 'io.gitlab.arturbosch.detekt' version '1.0.0-RC10' + id "org.jlleitschuh.gradle.ktlint" } apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' -apply plugin: com.novoda.staticanalysis.StaticAnalysisPlugin +apply plugin: 'com.novoda.static-analysis' android { compileSdkVersion 27 @@ -18,15 +20,6 @@ android { versionCode 1 versionName '1.0' } - - buildTypes { - debug { - } - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt') - } - } } dependencies { @@ -67,16 +60,14 @@ staticAnalysis { } detekt { - profile('main') { - input = "$projectDir/src/main/java" - config = rootProject.file('team-props/detekt-config.yml') - filters = '.*test.*,.*/resources/.*,.*/tmp/.*' - output = "$projectDir/build/reports/detekt" - } + config = rootProject.files('team-props/detekt-config.yml') + filters = '.*test.*,.*/resources/.*,.*/tmp/.*' } ktlint { android true + reporters = [ReporterType.CHECKSTYLE] + includeVariants { variant -> variant.name.contains('debug') } } } diff --git a/sample/build.gradle b/sample/build.gradle index c63946c..e806ef9 100755 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.60' + ext.kotlin_version = '1.3.0' repositories { google() @@ -7,8 +7,10 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.novoda:gradle-static-analysis-plugin:local' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:5.1.0' } } @@ -19,3 +21,8 @@ subprojects { jcenter() } } + +task wrapper(type: Wrapper) { + gradleVersion = '4.10.2' + distributionType = Wrapper.DistributionType.ALL +} diff --git a/sample/buildSrc/build.gradle b/sample/buildSrc/build.gradle deleted file mode 100755 index a995c56..0000000 --- a/sample/buildSrc/build.gradle +++ /dev/null @@ -1,15 +0,0 @@ -repositories { - jcenter() -} - -apply plugin: 'groovy' - -dependencies { - compile gradleApi() -} - -sourceSets { - main { - groovy { srcDir '../../plugin/src/main/groovy' } - } -} diff --git a/sample/gradle/wrapper/gradle-wrapper.jar b/sample/gradle/wrapper/gradle-wrapper.jar index a5fe1cb..0d4a951 100755 Binary files a/sample/gradle/wrapper/gradle-wrapper.jar and b/sample/gradle/wrapper/gradle-wrapper.jar differ diff --git a/sample/gradle/wrapper/gradle-wrapper.properties b/sample/gradle/wrapper/gradle-wrapper.properties index bd24854..d76b502 100755 --- a/sample/gradle/wrapper/gradle-wrapper.properties +++ b/sample/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip diff --git a/sample/settings.gradle b/sample/settings.gradle index 5d3454e..f62a18e 100755 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -1,2 +1,8 @@ rootProject.name = 'gradle-static-analysis-plugin-sample' include ':app' + +includeBuild('../') { + dependencySubstitution { + substitute module('com.novoda:gradle-static-analysis-plugin') with project(':plugin') + } +}