From ab3528ebcc3c019fbb5aa248af336504dad932e6 Mon Sep 17 00:00:00 2001 From: Said Tahsin Dane Date: Sat, 7 Jul 2018 22:50:27 +0200 Subject: [PATCH 1/2] Initial ktlint integration with tests for Android projects. --- .../StaticAnalysisPlugin.groovy | 2 + .../internal/CollectViolationsTask.groovy | 2 + .../internal/ktlint/KtlintConfigurator.groovy | 93 ++++++++++++++++++ .../sources/ktlint/no-error/ValidClass.kt | 1 + .../ktlint/with-error/KtLintViolator.kt | 7 ++ .../ktlint/KtlintIntegrationTest.groovy | 95 +++++++++++++++++++ .../groovy/com/novoda/test/Fixtures.groovy | 5 + .../groovy/com/novoda/test/LogsSubject.groovy | 9 ++ .../test/TestAndroidKotlinProject.groovy | 5 +- .../com/novoda/test/TestAndroidProject.groovy | 1 + .../com/novoda/test/TestJavaProject.groovy | 3 +- .../com/novoda/test/TestKotlinProject.groovy | 1 + .../groovy/com/novoda/test/TestProject.groovy | 3 +- 13 files changed, 222 insertions(+), 5 deletions(-) create mode 100644 plugin/src/main/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintConfigurator.groovy create mode 100644 plugin/src/test/fixtures/sources/ktlint/no-error/ValidClass.kt create mode 100644 plugin/src/test/fixtures/sources/ktlint/with-error/KtLintViolator.kt create mode 100644 plugin/src/test/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintIntegrationTest.groovy diff --git a/plugin/src/main/groovy/com/novoda/staticanalysis/StaticAnalysisPlugin.groovy b/plugin/src/main/groovy/com/novoda/staticanalysis/StaticAnalysisPlugin.groovy index 35d41eb..da9042f 100644 --- a/plugin/src/main/groovy/com/novoda/staticanalysis/StaticAnalysisPlugin.groovy +++ b/plugin/src/main/groovy/com/novoda/staticanalysis/StaticAnalysisPlugin.groovy @@ -4,6 +4,7 @@ import com.novoda.staticanalysis.internal.CodeQualityConfigurator import com.novoda.staticanalysis.internal.checkstyle.CheckstyleConfigurator import com.novoda.staticanalysis.internal.detekt.DetektConfigurator import com.novoda.staticanalysis.internal.findbugs.FindbugsConfigurator +import com.novoda.staticanalysis.internal.ktlint.KtlintConfigurator import com.novoda.staticanalysis.internal.lint.LintConfigurator import com.novoda.staticanalysis.internal.pmd.PmdConfigurator import org.gradle.api.NamedDomainObjectContainer @@ -40,6 +41,7 @@ class StaticAnalysisPlugin implements Plugin { PmdConfigurator.create(project, violationsContainer, evaluateViolations), FindbugsConfigurator.create(project, violationsContainer, evaluateViolations), DetektConfigurator.create(project, violationsContainer, evaluateViolations), + KtlintConfigurator.create(project, violationsContainer, evaluateViolations), LintConfigurator.create(project, violationsContainer, evaluateViolations) ] } 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 6d1cd91..776bc0c 100644 --- a/plugin/src/main/groovy/com/novoda/staticanalysis/internal/CollectViolationsTask.groovy +++ b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/CollectViolationsTask.groovy @@ -2,10 +2,12 @@ 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.TaskAction abstract class CollectViolationsTask extends DefaultTask { + @InputFile private File xmlReportFile private File htmlReportFile private Violations violations 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 new file mode 100644 index 0000000..4527b5e --- /dev/null +++ b/plugin/src/main/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintConfigurator.groovy @@ -0,0 +1,93 @@ +package com.novoda.staticanalysis.internal.ktlint + +import com.novoda.staticanalysis.StaticAnalysisExtension +import com.novoda.staticanalysis.Violations +import com.novoda.staticanalysis.internal.Configurator +import com.novoda.staticanalysis.internal.VariantFilter +import com.novoda.staticanalysis.internal.checkstyle.CollectCheckstyleViolationsTask +import org.gradle.api.GradleException +import org.gradle.api.NamedDomainObjectContainer +import org.gradle.api.Project +import org.gradle.api.Task + +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 final Project project + private final Violations violations + private final Task evaluateViolations + private final VariantFilter variantFilter + + static KtlintConfigurator create(Project project, + NamedDomainObjectContainer violationsContainer, + Task evaluateViolations) { + Violations violations = violationsContainer.maybeCreate('ktlint') + return new KtlintConfigurator(project, violations, evaluateViolations) + } + + KtlintConfigurator(Project project, Violations violations, Task evaluateViolations) { + this.project = project + this.violations = violations + this.evaluateViolations = evaluateViolations + this.variantFilter = new VariantFilter(project) + } + + @Override + void execute() { + project.extensions.findByType(StaticAnalysisExtension).ext.ktlint = { Closure config -> + if (!project.plugins.hasPlugin(KTLINT_PLUGIN)) { + 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() + + project.afterEvaluate { + + project.plugins.withId("kotlin") { + it.sourceSets.each { configureKtlint(it) } + } + project.plugins.withId("kotlin2js") { + it.sourceSets.each { configureKtlint(it) } + } + project.plugins.withId("kotlin-platform-common") { + it.sourceSets.each { configureKtlint(it) } + } + project.plugins.withId('com.android.application') { + configureAndroidWithVariants(variantFilter.filteredApplicationVariants) + } + project.plugins.withId('com.android.library') { + configureAndroidWithVariants(variantFilter.filteredLibraryVariants) + } + } + } + } + + def configureAndroidWithVariants(def mainVariants) { + mainVariants.all { configureKtlint(it) } + variantFilter.filteredTestVariants.all { configureKtlint(it) } + variantFilter.filteredUnitTestVariants.all { configureKtlint(it) } + } + + private void configureKtlint(def sourceSet) { + def collectViolations = createCollectViolationsTask(violations, sourceSet.name) + evaluateViolations.dependsOn collectViolations + } + + private def createCollectViolationsTask(Violations violations, def sourceSetName) { + 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.violations = violations + task.dependsOn project.tasks["ktlint${sourceSetName.capitalize()}Check"] + } + } +} diff --git a/plugin/src/test/fixtures/sources/ktlint/no-error/ValidClass.kt b/plugin/src/test/fixtures/sources/ktlint/no-error/ValidClass.kt new file mode 100644 index 0000000..6136d80 --- /dev/null +++ b/plugin/src/test/fixtures/sources/ktlint/no-error/ValidClass.kt @@ -0,0 +1 @@ +data class ValidClass(val prop1: String, val prop2: Int) diff --git a/plugin/src/test/fixtures/sources/ktlint/with-error/KtLintViolator.kt b/plugin/src/test/fixtures/sources/ktlint/with-error/KtLintViolator.kt new file mode 100644 index 0000000..0aaf0e2 --- /dev/null +++ b/plugin/src/test/fixtures/sources/ktlint/with-error/KtLintViolator.kt @@ -0,0 +1,7 @@ +class KtLintViolator { + + override fun equals(other: Any?): Boolean { + // this is not allowed + return true; + } +} 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 new file mode 100644 index 0000000..ed8cfc9 --- /dev/null +++ b/plugin/src/test/groovy/com/novoda/staticanalysis/internal/ktlint/KtlintIntegrationTest.groovy @@ -0,0 +1,95 @@ +package com.novoda.staticanalysis.internal.ktlint + +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 KtlintIntegrationTest { + + private static final String KTLINT_NOT_APPLIED = 'The Ktlint plugin is configured but not applied. Please apply the plugin in your build script.' + + @Parameterized.Parameters(name = "{0}") + static def rules() { + return [TestProjectRule.forAndroidKotlinProject()] // TestProjectRule.forKotlinProject(), + } + + @Rule + public final TestProjectRule projectRule + + KtlintIntegrationTest(TestProjectRule projectRule) { + this.projectRule = projectRule + } + + @Test + void shouldNotFailWhenKtlintIsNotConfigured() { + def result = createProjectWith(Fixtures.Ktlint.SOURCES_WITH_ERROR) + .build('evaluateViolations') + + assertThat(result.logs).doesNotContainKtlintViolations() + } + + @Test + void shouldFailBuildOnConfigurationWhenKtlintConfiguredButNotApplied() { + def result = projectRule.newProject() + .withToolsConfig('ktlint {}') + .buildAndFail('evaluateViolations') + + assertThat(result.logs).contains(KTLINT_NOT_APPLIED) + } + + @Test + void shouldFailBuildWhenKtlintErrorsOverTheThreshold() { + def result = createProjectWith(Fixtures.Ktlint.SOURCES_WITH_ERROR) + .withToolsConfig(''' + ktlint { + includeVariants { it.name == "debug" } + } + ''') + .buildAndFail('evaluateViolations') + + assertThat(result.logs).containsLimitExceeded(1, 0) + assertThat(result.logs).containsKtlintViolations(1, + result.buildFileUrl('reports/ktlint/ktlint-debug.txt')) + } + + @Test + void shouldNotFailWhenErrorsAreWithinThreshold() { + def result = createProjectWith(Fixtures.Ktlint.SOURCES_WITH_ERROR, 1) + .withToolsConfig(''' + ktlint { + includeVariants { it.name == "debug" } + } + ''') + .build('evaluateViolations') + + assertThat(result.logs).containsKtlintViolations(1, + result.buildFileUrl('reports/ktlint/ktlint-debug.txt')) + } + + @Test + void shouldNotFailBuildWhenNoErrorsEncounteredAndNoThresholdTrespassed() { + def result = createProjectWith(Fixtures.Ktlint.SOURCES_NO_ERROR, 0) + .withToolsConfig('ktlint {}') + .build('evaluateViolations') + + assertThat(result.logs).doesNotContainLimitExceeded() + assertThat(result.logs).doesNotContainKtlintViolations() + } + + private TestProject createProjectWith(File sources, int maxErrors = 0) { + projectRule.newProject() + .withPlugin("org.jlleitschuh.gradle.ktlint", "4.1.0") + .withSourceSet('main', sources) + .withPenalty("""{ + maxWarnings = 0 + maxErrors = ${maxErrors} + }""") + } +} diff --git a/plugin/src/test/groovy/com/novoda/test/Fixtures.groovy b/plugin/src/test/groovy/com/novoda/test/Fixtures.groovy index a583ed6..9c17b14 100644 --- a/plugin/src/test/groovy/com/novoda/test/Fixtures.groovy +++ b/plugin/src/test/groovy/com/novoda/test/Fixtures.groovy @@ -50,6 +50,11 @@ public final class Fixtures { public static final File RULES = new File(RULES_DIR, 'detekt/detekt.yml') } + final static class Ktlint { + static final File SOURCES_WITH_ERROR = new File(SOURCES_DIR, 'ktlint/with-error') + static final File SOURCES_NO_ERROR = new File(SOURCES_DIR, 'ktlint/no-error') + } + final static class Lint { public static final File SOURCES_WITH_WARNINGS = new File(SOURCES_DIR, 'lint/warnings') public static final File SOURCES_WITH_ERRORS = new File(SOURCES_DIR, 'lint/errors') diff --git a/plugin/src/test/groovy/com/novoda/test/LogsSubject.groovy b/plugin/src/test/groovy/com/novoda/test/LogsSubject.groovy index 5fde8cf..35fb1e9 100644 --- a/plugin/src/test/groovy/com/novoda/test/LogsSubject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/LogsSubject.groovy @@ -18,6 +18,7 @@ class LogsSubject extends Subject { private static final String PMD_VIOLATIONS_FOUND = 'PMD violations found' private static final String FINDBUGS_VIOLATIONS_FOUND = 'Findbugs violations found' private static final String DETEKT_VIOLATIONS_FOUND = 'Detekt violations found' + private static final String KTLINT_VIOLATIONS_FOUND = 'ktlint violations found' private static final String LINT_VIOLATIONS_FOUND = 'Lint violations found' private static final SubjectFactory FACTORY = new SubjectFactory() { @@ -71,6 +72,10 @@ class LogsSubject extends Subject { outputSubject.doesNotContain(DETEKT_VIOLATIONS_FOUND) } + public void doesNotContainKtlintViolations() { + outputSubject.doesNotContain(KTLINT_VIOLATIONS_FOUND) + } + public void doesNotContainLintViolations() { outputSubject.doesNotContain(LINT_VIOLATIONS_FOUND) } @@ -91,6 +96,10 @@ class LogsSubject extends Subject { containsToolViolations(DETEKT_VIOLATIONS_FOUND, errors, warnings, reportUrls) } + public void containsKtlintViolations(int errors, String... reportUrls) { + containsToolViolations(KTLINT_VIOLATIONS_FOUND, errors, 0, reportUrls) + } + public void containsLintViolations(int errors, int warnings, String... reportUrls) { containsToolViolations(LINT_VIOLATIONS_FOUND, errors, warnings, reportUrls) } diff --git a/plugin/src/test/groovy/com/novoda/test/TestAndroidKotlinProject.groovy b/plugin/src/test/groovy/com/novoda/test/TestAndroidKotlinProject.groovy index eb9ffaf..3fceefc 100644 --- a/plugin/src/test/groovy/com/novoda/test/TestAndroidKotlinProject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/TestAndroidKotlinProject.groovy @@ -14,7 +14,8 @@ buildscript { } } plugins { - ${formatPlugins(project)} + ${formatPlugins(project)} + id 'com.novoda.static-analysis' } repositories { google() @@ -58,7 +59,7 @@ ${formatExtension(project)} .collect { Map.Entry> entry -> """$entry.key { manifest.srcFile '${Fixtures.ANDROID_MANIFEST}' - kotlin { + java { ${entry.value.collect { "srcDir '$it'" }.join('\n\t\t\t\t')} } }""" diff --git a/plugin/src/test/groovy/com/novoda/test/TestAndroidProject.groovy b/plugin/src/test/groovy/com/novoda/test/TestAndroidProject.groovy index 2c90a82..f8d9eda 100644 --- a/plugin/src/test/groovy/com/novoda/test/TestAndroidProject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/TestAndroidProject.groovy @@ -14,6 +14,7 @@ buildscript { } plugins { ${formatPlugins(project)} + id 'com.novoda.static-analysis' } repositories { google() diff --git a/plugin/src/test/groovy/com/novoda/test/TestJavaProject.groovy b/plugin/src/test/groovy/com/novoda/test/TestJavaProject.groovy index e014658..ac01e0a 100644 --- a/plugin/src/test/groovy/com/novoda/test/TestJavaProject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/TestJavaProject.groovy @@ -5,7 +5,8 @@ final class TestJavaProject extends TestProject { private static final Closure TEMPLATE = { TestProject project -> """ plugins { - ${formatPlugins(project)} + ${formatPlugins(project)} + id 'com.novoda.static-analysis' } repositories { jcenter() diff --git a/plugin/src/test/groovy/com/novoda/test/TestKotlinProject.groovy b/plugin/src/test/groovy/com/novoda/test/TestKotlinProject.groovy index 89f80c0..10f20ca 100644 --- a/plugin/src/test/groovy/com/novoda/test/TestKotlinProject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/TestKotlinProject.groovy @@ -15,6 +15,7 @@ buildscript { plugins { ${formatPlugins(project)} + id 'com.novoda.static-analysis' } apply plugin: 'kotlin' diff --git a/plugin/src/test/groovy/com/novoda/test/TestProject.groovy b/plugin/src/test/groovy/com/novoda/test/TestProject.groovy index 0b53755..c8e7efd 100644 --- a/plugin/src/test/groovy/com/novoda/test/TestProject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/TestProject.groovy @@ -34,7 +34,6 @@ ${project.additionalConfiguration} .withPluginClasspath() .forwardStdOutput(new OutputStreamWriter(System.out)) .forwardStdError(new OutputStreamWriter(System.out)) - withPlugin('com.novoda.static-analysis') } private static File createProjectDir(String path) { @@ -126,7 +125,7 @@ ${project.additionalConfiguration} } protected static String formatPlugins(TestProject project) { - "${project.plugins.join('\n')}" + project.plugins.join('\n') } public static class Result { From b280376eb33789a3191ed23d9a1dc99e8054e9c5 Mon Sep 17 00:00:00 2001 From: Said Tahsin Dane Date: Sat, 7 Jul 2018 23:30:25 +0200 Subject: [PATCH 2/2] Fix integration for pure kotlin projects --- .../internal/ktlint/KtlintConfigurator.groovy | 12 ++++-- .../ktlint/KtlintIntegrationTest.groovy | 39 ++++++++++--------- .../com/novoda/test/TestKotlinProject.groovy | 5 +++ 3 files changed, 34 insertions(+), 22 deletions(-) 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 4527b5e..cee82a4 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 @@ -53,13 +53,13 @@ class KtlintConfigurator implements Configurator { project.afterEvaluate { project.plugins.withId("kotlin") { - it.sourceSets.each { configureKtlint(it) } + configureKotlinProject() } project.plugins.withId("kotlin2js") { - it.sourceSets.each { configureKtlint(it) } + configureKotlinProject() } project.plugins.withId("kotlin-platform-common") { - it.sourceSets.each { configureKtlint(it) } + configureKotlinProject() } project.plugins.withId('com.android.application') { configureAndroidWithVariants(variantFilter.filteredApplicationVariants) @@ -71,7 +71,11 @@ class KtlintConfigurator implements Configurator { } } - def configureAndroidWithVariants(def mainVariants) { + private void configureKotlinProject() { + project.sourceSets.each { configureKtlint(it) } + } + + private void configureAndroidWithVariants(def mainVariants) { mainVariants.all { configureKtlint(it) } variantFilter.filteredTestVariants.all { configureKtlint(it) } variantFilter.filteredUnitTestVariants.all { configureKtlint(it) } 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 ed8cfc9..e259bfe 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,17 +14,28 @@ 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.' + public static final String DEFAULT_CONFIG = ''' + ktlint { + includeVariants { it.name == "debug" } + } + ''' + public static final String EMPTY_CONFIG = 'ktlint {}' - @Parameterized.Parameters(name = "{0}") + @Parameterized.Parameters(name = '{0}') static def rules() { - return [TestProjectRule.forAndroidKotlinProject()] // TestProjectRule.forKotlinProject(), + return [ + [TestProjectRule.forKotlinProject(), 'main'].toArray(), + [TestProjectRule.forAndroidKotlinProject(), 'debug'].toArray() + ] } @Rule public final TestProjectRule projectRule + private final String sourceSetName; - KtlintIntegrationTest(TestProjectRule projectRule) { + KtlintIntegrationTest(TestProjectRule projectRule, String sourceSetName) { this.projectRule = projectRule + this.sourceSetName = sourceSetName } @Test @@ -38,7 +49,7 @@ class KtlintIntegrationTest { @Test void shouldFailBuildOnConfigurationWhenKtlintConfiguredButNotApplied() { def result = projectRule.newProject() - .withToolsConfig('ktlint {}') + .withToolsConfig(EMPTY_CONFIG) .buildAndFail('evaluateViolations') assertThat(result.logs).contains(KTLINT_NOT_APPLIED) @@ -47,36 +58,28 @@ class KtlintIntegrationTest { @Test void shouldFailBuildWhenKtlintErrorsOverTheThreshold() { def result = createProjectWith(Fixtures.Ktlint.SOURCES_WITH_ERROR) - .withToolsConfig(''' - ktlint { - includeVariants { it.name == "debug" } - } - ''') + .withToolsConfig(DEFAULT_CONFIG) .buildAndFail('evaluateViolations') assertThat(result.logs).containsLimitExceeded(1, 0) assertThat(result.logs).containsKtlintViolations(1, - result.buildFileUrl('reports/ktlint/ktlint-debug.txt')) + result.buildFileUrl("reports/ktlint/ktlint-${sourceSetName}.txt")) } @Test void shouldNotFailWhenErrorsAreWithinThreshold() { def result = createProjectWith(Fixtures.Ktlint.SOURCES_WITH_ERROR, 1) - .withToolsConfig(''' - ktlint { - includeVariants { it.name == "debug" } - } - ''') + .withToolsConfig(DEFAULT_CONFIG) .build('evaluateViolations') assertThat(result.logs).containsKtlintViolations(1, - result.buildFileUrl('reports/ktlint/ktlint-debug.txt')) + result.buildFileUrl("reports/ktlint/ktlint-${sourceSetName}.txt")) } @Test void shouldNotFailBuildWhenNoErrorsEncounteredAndNoThresholdTrespassed() { def result = createProjectWith(Fixtures.Ktlint.SOURCES_NO_ERROR, 0) - .withToolsConfig('ktlint {}') + .withToolsConfig(EMPTY_CONFIG) .build('evaluateViolations') assertThat(result.logs).doesNotContainLimitExceeded() @@ -85,7 +88,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', '4.1.0') .withSourceSet('main', sources) .withPenalty("""{ maxWarnings = 0 diff --git a/plugin/src/test/groovy/com/novoda/test/TestKotlinProject.groovy b/plugin/src/test/groovy/com/novoda/test/TestKotlinProject.groovy index 10f20ca..2debb58 100644 --- a/plugin/src/test/groovy/com/novoda/test/TestKotlinProject.groovy +++ b/plugin/src/test/groovy/com/novoda/test/TestKotlinProject.groovy @@ -19,6 +19,11 @@ plugins { } apply plugin: 'kotlin' + +repositories { + jcenter() +} + sourceSets { ${formatSourceSets(project)} }