From 239116b29aa87228321359579967ae6e2ab58a31 Mon Sep 17 00:00:00 2001 From: jnizet Date: Sun, 3 Mar 2019 10:53:30 +0100 Subject: [PATCH] Add Gradle Kotlin DSL support This commit refactors the existing Groovy DSL writers in order to share code between the Groovy DSL and Kotlin DSL writers. See gh-851 --- .../BuildProjectGenerationConfiguration.java | 4 +- .../gradle/GradleBuildProjectContributor.java | 21 +- .../GradleProjectGenerationConfiguration.java | 68 ++- ...roovyDslGradleBuildProjectContributor.java | 37 ++ ...vyDslSettingsGradleProjectContributor.java | 37 ++ ...otlinDslGradleBuildProjectContributor.java | 37 ++ ...inDslSettingsGradleProjectContributor.java | 37 ++ .../SettingsGradleProjectContributor.java | 21 +- ...ationDefaultContributorsConfiguration.java | 4 +- .../GroovyDslKotlinGradleBuildCustomizer.java | 45 ++ .../KotlinDslKotlinGradleBuildCustomizer.java | 45 ++ .../kotlin/KotlinGradleBuildCustomizer.java | 20 +- ...ationDefaultContributorsConfiguration.java | 23 +- .../GitProjectGenerationConfiguration.java | 3 +- .../spring/build/BuildComplianceTests.java | 16 +- ...tsProjectGenerationConfigurationTests.java | 163 +++++++ ...leProjectGenerationConfigurationTests.java | 5 +- ...slGradleBuildProjectContributorTests.java} | 16 +- ...ettingsGradleProjectContributorTests.java} | 7 +- ...DslGradleBuildProjectContributorTests.java | 85 ++++ ...SettingsGradleProjectContributorTests.java | 86 ++++ ...vyDslKotlinGradleBuildCustomizerTests.java | 73 +++ ...nDslKotlinGradleBuildCustomizerTests.java} | 20 +- .../test/InitializrMetadataTestBuilder.java | 2 +- ...-processor-dependency-build.gradle.kts.gen | 26 + .../bom-ordering-build.gradle.kts.gen | 26 + .../bom-property-build.gradle.kts.gen | 26 + ...mpile-only-dependency-build.gradle.kts.gen | 20 + .../project/gradle-kts/gitignore.gen | 26 + .../kotlin-java11-build.gradle.kts.gen | 30 ++ .../repositories-build.gradle.kts.gen | 21 + ...epositories-milestone-build.gradle.kts.gen | 20 + .../version-override-build.gradle.kts.gen | 21 + .../groovy/standard/build.gradle.kts.gen | 19 + .../groovy/standard/war-build.gradle.kts.gen | 21 + .../java/standard/build.gradle.kts.gen | 18 + .../java/standard/war-build.gradle.kts.gen | 20 + .../kotlin/standard/build.gradle.kts.gen | 30 ++ .../kotlin/standard/war-build.gradle.kts.gen | 32 ++ .../gradle/Gradle3BuildWriter.java | 4 +- .../buildsystem/gradle/GradleBuildWriter.java | 203 ++------ .../gradle/GradleSettingsWriter.java | 21 +- .../gradle/GroovyDslGradleBuildWriter.java | 202 ++++++++ .../gradle/GroovyDslGradleSettingsWriter.java | 36 ++ .../gradle/KotlinDslGradleBuildWriter.java | 203 ++++++++ .../gradle/KotlinDslGradleSettingsWriter.java | 36 ++ ...a => GroovyDslGradleBuildWriterTests.java} | 6 +- ...> GroovyDslGradleSettingsWriterTests.java} | 7 +- .../KotlinDslGradleBuildWriterTests.java | 457 ++++++++++++++++++ .../KotlinDslGradleSettingsWriterTests.java | 90 ++++ .../web/project/MainController.java | 5 +- 51 files changed, 2262 insertions(+), 239 deletions(-) create mode 100644 initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslGradleBuildProjectContributor.java create mode 100644 initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslSettingsGradleProjectContributor.java create mode 100644 initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslGradleBuildProjectContributor.java create mode 100644 initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslSettingsGradleProjectContributor.java create mode 100644 initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizer.java create mode 100644 initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinDslKotlinGradleBuildCustomizer.java create mode 100644 initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleKtsProjectGenerationConfigurationTests.java rename initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/{GradleBuildProjectContributorTests.java => GroovyDslGradleBuildProjectContributorTests.java} (85%) rename initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/{SettingsGradleProjectContributorTests.java => GroovyDslSettingsGradleProjectContributorTests.java} (93%) create mode 100644 initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslGradleBuildProjectContributorTests.java create mode 100644 initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslSettingsGradleProjectContributorTests.java create mode 100644 initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizerTests.java rename initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/{KotlinGradleBuildCustomizerTests.java => KotlinDslKotlinGradleBuildCustomizerTests.java} (81%) create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/annotation-processor-dependency-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/bom-ordering-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/bom-property-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/compile-only-dependency-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/gitignore.gen create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/kotlin-java11-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/repositories-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/repositories-milestone-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/gradle-kts/version-override-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/groovy/standard/build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/groovy/standard/war-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/java/standard/build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/java/standard/war-build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/kotlin/standard/build.gradle.kts.gen create mode 100644 initializr-generator-spring/src/test/resources/project/kotlin/standard/war-build.gradle.kts.gen create mode 100644 initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriter.java create mode 100644 initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleSettingsWriter.java create mode 100644 initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java create mode 100644 initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleSettingsWriter.java rename initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/{GradleBuildWriterTests.java => GroovyDslGradleBuildWriterTests.java} (99%) rename initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/{GradleSettingsWriterTests.java => GroovyDslGradleSettingsWriterTests.java} (94%) create mode 100644 initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java create mode 100644 initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleSettingsWriterTests.java diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/BuildProjectGenerationConfiguration.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/BuildProjectGenerationConfiguration.java index 47dcfa17..34473cbb 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/BuildProjectGenerationConfiguration.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/BuildProjectGenerationConfiguration.java @@ -19,6 +19,7 @@ package io.spring.initializr.generator.spring.build; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleKtsBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnLanguage; @@ -39,6 +40,7 @@ import org.springframework.context.annotation.Bean; * Project generation configuration for projects using any build system. * * @author Andy Wilkinson + * @author Jean-Baptiste Nizet */ @ProjectGenerationConfiguration public class BuildProjectGenerationConfiguration { @@ -70,7 +72,7 @@ public class BuildProjectGenerationConfiguration { @Bean @ConditionalOnLanguage(KotlinLanguage.ID) - @ConditionalOnBuildSystem(GradleBuildSystem.ID) + @ConditionalOnBuildSystem({ GradleBuildSystem.ID, GradleKtsBuildSystem.ID }) public KotlinJpaGradleBuildCustomizer kotlinJpaGradleBuildCustomizer( InitializrMetadata metadata, KotlinProjectSettings settings) { return new KotlinJpaGradleBuildCustomizer(metadata, settings); diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GradleBuildProjectContributor.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GradleBuildProjectContributor.java index 570b1ed7..74fe0d94 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GradleBuildProjectContributor.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GradleBuildProjectContributor.java @@ -29,11 +29,14 @@ import io.spring.initializr.generator.io.IndentingWriterFactory; import io.spring.initializr.generator.project.contributor.ProjectContributor; /** - * {@link ProjectContributor} for the project's {@code build.gradle} file. + * {@link ProjectContributor} template for the project's {@code build.gradle} or + * {@code build.gradle.kts} file. A subclass exists for each DSL. * * @author Andy Wilkinson + * @author Jean-Baptiste Nizet */ -public class GradleBuildProjectContributor implements BuildWriter, ProjectContributor { +public abstract class GradleBuildProjectContributor + implements BuildWriter, ProjectContributor { private final GradleBuildWriter buildWriter; @@ -41,21 +44,25 @@ public class GradleBuildProjectContributor implements BuildWriter, ProjectContri private final IndentingWriterFactory indentingWriterFactory; - GradleBuildProjectContributor(GradleBuildWriter buildWriter, GradleBuild build, - IndentingWriterFactory indentingWriterFactory) { + private final String buildFileName; + + protected GradleBuildProjectContributor(GradleBuildWriter buildWriter, + GradleBuild build, IndentingWriterFactory indentingWriterFactory, + String buildFileName) { this.buildWriter = buildWriter; this.build = build; this.indentingWriterFactory = indentingWriterFactory; + this.buildFileName = buildFileName; } @Override - public void contribute(Path projectRoot) throws IOException { - Path buildGradle = Files.createFile(projectRoot.resolve("build.gradle")); + public final void contribute(Path projectRoot) throws IOException { + Path buildGradle = Files.createFile(projectRoot.resolve(this.buildFileName)); writeBuild(Files.newBufferedWriter(buildGradle)); } @Override - public void writeBuild(Writer out) throws IOException { + public final void writeBuild(Writer out) throws IOException { try (IndentingWriter writer = this.indentingWriterFactory .createIndentingWriter("gradle", out)) { this.buildWriter.writeTo(writer, this.build); diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GradleProjectGenerationConfiguration.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GradleProjectGenerationConfiguration.java index 33b7fe6d..c7490b67 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GradleProjectGenerationConfiguration.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GradleProjectGenerationConfiguration.java @@ -23,7 +23,9 @@ import io.spring.initializr.generator.buildsystem.BuildItemResolver; import io.spring.initializr.generator.buildsystem.gradle.Gradle3BuildWriter; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; -import io.spring.initializr.generator.buildsystem.gradle.GradleBuildWriter; +import io.spring.initializr.generator.buildsystem.gradle.GradleKtsBuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GroovyDslGradleBuildWriter; +import io.spring.initializr.generator.buildsystem.gradle.KotlinDslGradleBuildWriter; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnLanguage; import io.spring.initializr.generator.condition.ConditionalOnPackaging; @@ -35,6 +37,7 @@ import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.project.ResolvedProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.util.LambdaSafe; +import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; @@ -45,9 +48,10 @@ import org.springframework.context.annotation.Configuration; * Gradle as its build system. * * @author Andy Wilkinson + * @author Jean-Baptiste Nizet */ @ProjectGenerationConfiguration -@ConditionalOnBuildSystem(GradleBuildSystem.ID) +@ConditionalOnBuildSystem({ GradleBuildSystem.ID, GradleKtsBuildSystem.ID }) public class GradleProjectGenerationConfiguration { private final IndentingWriterFactory indentingWriterFactory; @@ -100,14 +104,24 @@ public class GradleProjectGenerationConfiguration { @Bean @ConditionalOnPlatformVersion("2.0.0.M1") + @ConditionalOnBuildSystem(GradleBuildSystem.ID) public BuildCustomizer applyDependencyManagementPluginContributor() { return (build) -> build.applyPlugin("io.spring.dependency-management"); } @Bean + @ConditionalOnBuildSystem(GradleBuildSystem.ID) public GradleBuildProjectContributor gradleBuildProjectContributor( - GradleBuildWriter buildWriter, GradleBuild build) { - return new GradleBuildProjectContributor(buildWriter, build, + GroovyDslGradleBuildWriter buildWriter, GradleBuild build) { + return new GroovyDslGradleBuildProjectContributor(buildWriter, build, + this.indentingWriterFactory); + } + + @Bean + @ConditionalOnBuildSystem(GradleKtsBuildSystem.ID) + public KotlinDslGradleBuildProjectContributor gradleKtsBuildProjectContributor( + KotlinDslGradleBuildWriter buildWriter, GradleBuild build) { + return new KotlinDslGradleBuildProjectContributor(buildWriter, build, this.indentingWriterFactory); } @@ -116,6 +130,7 @@ public class GradleProjectGenerationConfiguration { */ @Configuration @ConditionalOnGradleVersion("3") + @ConditionalOnBuildSystem(GradleBuildSystem.ID) static class Gradle3ProjectGenerationConfiguration { @Bean @@ -152,6 +167,7 @@ public class GradleProjectGenerationConfiguration { */ @Configuration @ConditionalOnGradleVersion("4") + @ConditionalOnBuildSystem(GradleBuildSystem.ID) static class Gradle4ProjectGenerationConfiguration { @Bean @@ -176,21 +192,23 @@ public class GradleProjectGenerationConfiguration { } /** - * Configuration specific to projects using Gradle 4 or 5. + * Configuration specific to projects using Gradle (Groovy DSL) 4 or 5. */ @Configuration + @ConditionalOnBuildSystem(GradleBuildSystem.ID) @ConditionalOnGradleVersion({ "4", "5" }) static class Gradle4Or5ProjectGenerationConfiguration { @Bean - public GradleBuildWriter gradleBuildWriter() { - return new GradleBuildWriter(); + public GroovyDslGradleBuildWriter gradleBuildWriter() { + return new GroovyDslGradleBuildWriter(); } @Bean public SettingsGradleProjectContributor settingsGradleProjectContributor( GradleBuild build, IndentingWriterFactory indentingWriterFactory) { - return new SettingsGradleProjectContributor(build, indentingWriterFactory); + return new GroovyDslSettingsGradleProjectContributor(build, + indentingWriterFactory); } @Bean @@ -207,4 +225,38 @@ public class GradleProjectGenerationConfiguration { } + /** + * Configuration specific to projects using Gradle (Kotlin DSL). + */ + @Configuration + @ConditionalOnBuildSystem(GradleKtsBuildSystem.ID) + static class GradleKtsProjectGenerationConfiguration { + + @Bean + public KotlinDslGradleBuildWriter gradleKtsBuildWriter() { + return new KotlinDslGradleBuildWriter(); + } + + @Bean + public KotlinDslSettingsGradleProjectContributor settingsGradleKtsProjectContributor( + GradleBuild build, IndentingWriterFactory indentingWriterFactory) { + return new KotlinDslSettingsGradleProjectContributor(build, + indentingWriterFactory); + } + + @Bean + public BuildCustomizer springBootPluginContributor( + ResolvedProjectDescription projectDescription, + InitializrMetadata metadata) { + return (build) -> { + build.addPlugin("org.springframework.boot", + projectDescription.getPlatformVersion().toString()); + build.addPlugin("io.spring.dependency-management", + metadata.getConfiguration().getEnv().getGradle() + .getDependencyManagementPluginVersion()); + }; + } + + } + } diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslGradleBuildProjectContributor.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslGradleBuildProjectContributor.java new file mode 100644 index 00000000..7060d431 --- /dev/null +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslGradleBuildProjectContributor.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.build.gradle; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.GroovyDslGradleBuildWriter; +import io.spring.initializr.generator.io.IndentingWriterFactory; +import io.spring.initializr.generator.project.contributor.ProjectContributor; + +/** + * {@link ProjectContributor} for the project's {@code build.gradle} file. + * + * @author Jean-Baptiste Nizet + */ +public class GroovyDslGradleBuildProjectContributor + extends GradleBuildProjectContributor { + + GroovyDslGradleBuildProjectContributor(GroovyDslGradleBuildWriter buildWriter, + GradleBuild build, IndentingWriterFactory indentingWriterFactory) { + super(buildWriter, build, indentingWriterFactory, "build.gradle"); + } + +} diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslSettingsGradleProjectContributor.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslSettingsGradleProjectContributor.java new file mode 100644 index 00000000..3f4a87a6 --- /dev/null +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslSettingsGradleProjectContributor.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.build.gradle; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.GroovyDslGradleSettingsWriter; +import io.spring.initializr.generator.io.IndentingWriterFactory; +import io.spring.initializr.generator.project.contributor.ProjectContributor; + +/** + * {@link ProjectContributor} for the project's {@code settings.gradle} file. + * + * @author Jean-Baptiste Nizet + */ +class GroovyDslSettingsGradleProjectContributor extends SettingsGradleProjectContributor { + + GroovyDslSettingsGradleProjectContributor(GradleBuild build, + IndentingWriterFactory indentingWriterFactory) { + super(build, indentingWriterFactory, new GroovyDslGradleSettingsWriter(), + "settings.gradle"); + } + +} diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslGradleBuildProjectContributor.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslGradleBuildProjectContributor.java new file mode 100644 index 00000000..0ec81b7e --- /dev/null +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslGradleBuildProjectContributor.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.build.gradle; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.KotlinDslGradleBuildWriter; +import io.spring.initializr.generator.io.IndentingWriterFactory; +import io.spring.initializr.generator.project.contributor.ProjectContributor; + +/** + * {@link ProjectContributor} for the project's {@code build.gradle.kts} file. + * + * @author Jean-Baptiste Nizet + */ +public class KotlinDslGradleBuildProjectContributor + extends GradleBuildProjectContributor { + + KotlinDslGradleBuildProjectContributor(KotlinDslGradleBuildWriter buildWriter, + GradleBuild build, IndentingWriterFactory indentingWriterFactory) { + super(buildWriter, build, indentingWriterFactory, "build.gradle.kts"); + } + +} diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslSettingsGradleProjectContributor.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslSettingsGradleProjectContributor.java new file mode 100644 index 00000000..c6d4fc32 --- /dev/null +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslSettingsGradleProjectContributor.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.build.gradle; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.KotlinDslGradleSettingsWriter; +import io.spring.initializr.generator.io.IndentingWriterFactory; +import io.spring.initializr.generator.project.contributor.ProjectContributor; + +/** + * {@link ProjectContributor} for the project's {@code settings.gradle.kts} file. + * + * @author Jean-Baptiste Nizet + */ +class KotlinDslSettingsGradleProjectContributor extends SettingsGradleProjectContributor { + + KotlinDslSettingsGradleProjectContributor(GradleBuild build, + IndentingWriterFactory indentingWriterFactory) { + super(build, indentingWriterFactory, new KotlinDslGradleSettingsWriter(), + "settings.gradle.kts"); + } + +} diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/SettingsGradleProjectContributor.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/SettingsGradleProjectContributor.java index 91d5dd25..c31cb901 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/SettingsGradleProjectContributor.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/gradle/SettingsGradleProjectContributor.java @@ -27,11 +27,13 @@ import io.spring.initializr.generator.io.IndentingWriterFactory; import io.spring.initializr.generator.project.contributor.ProjectContributor; /** - * {@link ProjectContributor} for the project's {@code settings.gradle} file. + * {@link ProjectContributor} for the project's {@code settings.gradle} + * {@code settings.gradle.kts} or file. A subclass exists for each of the DSLs. * * @author Andy Wilkinson + * @author Jean-Baptiste Nizet */ -class SettingsGradleProjectContributor implements ProjectContributor { +abstract class SettingsGradleProjectContributor implements ProjectContributor { private final GradleBuild build; @@ -39,16 +41,21 @@ class SettingsGradleProjectContributor implements ProjectContributor { private final GradleSettingsWriter settingsWriter; - SettingsGradleProjectContributor(GradleBuild build, - IndentingWriterFactory indentingWriterFactory) { + private final String settingsFileName; + + protected SettingsGradleProjectContributor(GradleBuild build, + IndentingWriterFactory indentingWriterFactory, + GradleSettingsWriter settingsWriter, String settingsFileName) { this.build = build; this.indentingWriterFactory = indentingWriterFactory; - this.settingsWriter = new GradleSettingsWriter(); + this.settingsWriter = settingsWriter; + this.settingsFileName = settingsFileName; } @Override - public void contribute(Path projectRoot) throws IOException { - Path settingsGradle = Files.createFile(projectRoot.resolve("settings.gradle")); + public final void contribute(Path projectRoot) throws IOException { + Path settingsGradle = Files + .createFile(projectRoot.resolve(this.settingsFileName)); try (IndentingWriter writer = this.indentingWriterFactory.createIndentingWriter( "gradle", Files.newBufferedWriter(settingsGradle))) { this.settingsWriter.writeTo(writer, this.build); diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/groovy/GroovyProjectGenerationDefaultContributorsConfiguration.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/groovy/GroovyProjectGenerationDefaultContributorsConfiguration.java index 7beba1cf..111adbed 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/groovy/GroovyProjectGenerationDefaultContributorsConfiguration.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/groovy/GroovyProjectGenerationDefaultContributorsConfiguration.java @@ -20,6 +20,7 @@ import java.lang.reflect.Modifier; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleKtsBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnPackaging; @@ -44,6 +45,7 @@ import org.springframework.context.annotation.Configuration; * Default Groovy language contributors. * * @author Stephane Nicoll + * @author Jean-Baptiste Nizet */ @Configuration class GroovyProjectGenerationDefaultContributorsConfiguration { @@ -121,7 +123,7 @@ class GroovyProjectGenerationDefaultContributorsConfiguration { * Configuration for Groovy projects built with Gradle. */ @Configuration - @ConditionalOnBuildSystem(GradleBuildSystem.ID) + @ConditionalOnBuildSystem({ GradleBuildSystem.ID, GradleKtsBuildSystem.ID }) static class GroovyGradleProjectConfiguration { @Bean diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizer.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizer.java new file mode 100644 index 00000000..b64436d0 --- /dev/null +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizer.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.code.kotlin; + +import java.util.stream.Collectors; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild.TaskCustomization; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Kotlin projects build with Gradle (Groovy DSL). + * + * @author Jean-Baptiste Nizet + */ +class GroovyDslKotlinGradleBuildCustomizer extends KotlinGradleBuildCustomizer { + + GroovyDslKotlinGradleBuildCustomizer(KotlinProjectSettings kotlinProjectSettings) { + super(kotlinProjectSettings); + } + + @Override + protected void customizeKotlinOptions(TaskCustomization compile) { + compile.nested("kotlinOptions", (kotlinOptions) -> { + String compilerArgs = this.settings.getCompilerArgs().stream() + .map((arg) -> "'" + arg + "'").collect(Collectors.joining(", ")); + kotlinOptions.set("freeCompilerArgs", "[" + compilerArgs + "]"); + kotlinOptions.set("jvmTarget", "'" + this.settings.getJvmTarget() + "'"); + }); + } + +} diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinDslKotlinGradleBuildCustomizer.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinDslKotlinGradleBuildCustomizer.java new file mode 100644 index 00000000..405c4fb7 --- /dev/null +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinDslKotlinGradleBuildCustomizer.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.code.kotlin; + +import java.util.stream.Collectors; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild.TaskCustomization; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Kotlin projects build with Gradle (Kotlin DSL). + * + * @author Jean-Baptiste Nizet + */ +class KotlinDslKotlinGradleBuildCustomizer extends KotlinGradleBuildCustomizer { + + KotlinDslKotlinGradleBuildCustomizer(KotlinProjectSettings kotlinProjectSettings) { + super(kotlinProjectSettings); + } + + @Override + protected void customizeKotlinOptions(TaskCustomization compile) { + compile.nested("kotlinOptions", (kotlinOptions) -> { + String compilerArgs = this.settings.getCompilerArgs().stream() + .map((arg) -> "\"" + arg + "\"").collect(Collectors.joining(", ")); + kotlinOptions.set("freeCompilerArgs", "listOf(" + compilerArgs + ")"); + kotlinOptions.set("jvmTarget", "\"" + this.settings.getJvmTarget() + "\""); + }); + } + +} diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizer.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizer.java index 19b567c9..98f4c67b 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizer.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizer.java @@ -16,41 +16,33 @@ package io.spring.initializr.generator.spring.code.kotlin; -import java.util.stream.Collectors; - import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild.TaskCustomization; import io.spring.initializr.generator.spring.build.BuildCustomizer; /** - * {@link BuildCustomizer} for Kotlin projects build with Gradle. + * {@link BuildCustomizer} template for Kotlin projects build with Gradle. A subclass + * exists for each DSL. * * @author Andy Wilkinson * @author Jean-Baptiste Nizet */ -class KotlinGradleBuildCustomizer implements BuildCustomizer { +abstract class KotlinGradleBuildCustomizer implements BuildCustomizer { - private final KotlinProjectSettings settings; + protected final KotlinProjectSettings settings; KotlinGradleBuildCustomizer(KotlinProjectSettings kotlinProjectSettings) { this.settings = kotlinProjectSettings; } @Override - public void customize(GradleBuild build) { + public final void customize(GradleBuild build) { build.addPlugin("org.jetbrains.kotlin.jvm", this.settings.getVersion()); build.addPlugin("org.jetbrains.kotlin.plugin.spring", this.settings.getVersion()); build.customizeTasksWithType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile", this::customizeKotlinOptions); } - private void customizeKotlinOptions(TaskCustomization compile) { - compile.nested("kotlinOptions", (kotlinOptions) -> { - String compilerArgs = this.settings.getCompilerArgs().stream() - .map((arg) -> "'" + arg + "'").collect(Collectors.joining(", ")); - kotlinOptions.set("freeCompilerArgs", "[" + compilerArgs + "]"); - kotlinOptions.set("jvmTarget", "'" + this.settings.getJvmTarget() + "'"); - }); - } + protected abstract void customizeKotlinOptions(TaskCustomization compile); } diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinProjectGenerationDefaultContributorsConfiguration.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinProjectGenerationDefaultContributorsConfiguration.java index 4b899a7b..8a315f89 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinProjectGenerationDefaultContributorsConfiguration.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/kotlin/KotlinProjectGenerationDefaultContributorsConfiguration.java @@ -18,6 +18,7 @@ package io.spring.initializr.generator.spring.code.kotlin; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleKtsBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnPackaging; @@ -47,6 +48,7 @@ import org.springframework.context.annotation.Configuration; * * @author Andy Wilkinson * @author Stephane Nicoll + * @author Jean-Baptiste Nizet */ @Configuration class KotlinProjectGenerationDefaultContributorsConfiguration { @@ -155,7 +157,7 @@ class KotlinProjectGenerationDefaultContributorsConfiguration { } /** - * Configuration for Kotlin projects built with Gradle. + * Configuration for Kotlin projects built with Gradle (Groovy DSL). * * @author Andy Wilkinson */ @@ -166,7 +168,24 @@ class KotlinProjectGenerationDefaultContributorsConfiguration { @Bean public KotlinGradleBuildCustomizer kotlinBuildCustomizer( KotlinProjectSettings kotlinProjectSettings) { - return new KotlinGradleBuildCustomizer(kotlinProjectSettings); + return new GroovyDslKotlinGradleBuildCustomizer(kotlinProjectSettings); + } + + } + + /** + * Configuration for Kotlin projects built with Gradle (Kotlin DSL). + * + * @author Jean-Baptiste Nizet + */ + @Configuration + @ConditionalOnBuildSystem(GradleKtsBuildSystem.ID) + static class KotlinGradleKtsProjectConfiguration { + + @Bean + public KotlinDslKotlinGradleBuildCustomizer kotlinBuildCustomizer( + KotlinProjectSettings kotlinProjectSettings) { + return new KotlinDslKotlinGradleBuildCustomizer(kotlinProjectSettings); } } diff --git a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/scm/git/GitProjectGenerationConfiguration.java b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/scm/git/GitProjectGenerationConfiguration.java index 4296fd65..02f86293 100644 --- a/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/scm/git/GitProjectGenerationConfiguration.java +++ b/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/scm/git/GitProjectGenerationConfiguration.java @@ -17,6 +17,7 @@ package io.spring.initializr.generator.spring.scm.git; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleKtsBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; @@ -56,7 +57,7 @@ public class GitProjectGenerationConfiguration { } @Bean - @ConditionalOnBuildSystem(GradleBuildSystem.ID) + @ConditionalOnBuildSystem({ GradleBuildSystem.ID, GradleKtsBuildSystem.ID }) public GitIgnoreCustomizer gradleGitIgnoreCustomizer() { return (gitIgnore) -> { gitIgnore.getGeneral().add(".gradle", "/build/", diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/BuildComplianceTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/BuildComplianceTests.java index 28a0762e..e4459afa 100755 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/BuildComplianceTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/BuildComplianceTests.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.BuildSystem; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleKtsBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.language.Language; import io.spring.initializr.generator.language.groovy.GroovyLanguage; @@ -45,6 +46,7 @@ import org.springframework.core.io.ClassPathResource; * Build compliance tests. * * @author Stephane Nicoll + * @author Jean-Baptiste Nizet */ class BuildComplianceTests extends AbstractComplianceTests { @@ -54,13 +56,19 @@ class BuildComplianceTests extends AbstractComplianceTests { private static final Language kotlin = new KotlinLanguage(); - static Stream parameters() { + static Stream previousGenerationParameters() { return Stream.of( Arguments.arguments(BuildSystem.forId(MavenBuildSystem.ID), "pom.xml"), Arguments.arguments(BuildSystem.forId(GradleBuildSystem.ID), "build.gradle")); } + static Stream parameters() { + return Stream.concat(previousGenerationParameters(), + Stream.of(Arguments.arguments(BuildSystem.forId(GradleKtsBuildSystem.ID), + "build.gradle.kts"))); + } + @ParameterizedTest @MethodSource("parameters") void currentGenerationJarJava(BuildSystem build, String fileName) { @@ -117,19 +125,19 @@ class BuildComplianceTests extends AbstractComplianceTests { } @ParameterizedTest - @MethodSource("parameters") + @MethodSource("previousGenerationParameters") void previousGenerationJarJava(BuildSystem build, String fileName) { testPreviousGenerationJar(java, build, fileName); } @ParameterizedTest - @MethodSource("parameters") + @MethodSource("previousGenerationParameters") void previousGenerationJarGroovy(BuildSystem build, String fileName) { testPreviousGenerationJar(groovy, build, fileName); } @ParameterizedTest - @MethodSource("parameters") + @MethodSource("previousGenerationParameters") void previousGenerationJarKotlin(BuildSystem build, String fileName) { testPreviousGenerationJar(kotlin, build, fileName); } diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleKtsProjectGenerationConfigurationTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleKtsProjectGenerationConfigurationTests.java new file mode 100644 index 00000000..e080c0de --- /dev/null +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleKtsProjectGenerationConfigurationTests.java @@ -0,0 +1,163 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.build.gradle; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.buildsystem.gradle.GradleKtsBuildSystem; +import io.spring.initializr.generator.language.java.JavaLanguage; +import io.spring.initializr.generator.packaging.war.WarPackaging; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.build.BuildProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildWriter; +import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder; +import io.spring.initializr.generator.test.project.ProjectAssetTester; +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.metadata.InitializrMetadata; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import org.springframework.util.StreamUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link GradleProjectGenerationConfiguration} with Kotlin DSL build system. + * + * @author Jean-Baptiste Nizet + */ +class GradleKtsProjectGenerationConfigurationTests { + + private ProjectAssetTester projectTester; + + @BeforeEach + void setup(@TempDir Path directory) { + this.projectTester = new ProjectAssetTester().withIndentingWriterFactory() + .withConfiguration(BuildProjectGenerationConfiguration.class, + GradleProjectGenerationConfiguration.class) + .withDirectory(directory) + .withBean(InitializrMetadata.class, + () -> InitializrMetadataTestBuilder.withDefaults().build()) + .withDescriptionCustomizer((description) -> description + .setBuildSystem(new GradleKtsBuildSystem())); + } + + static Stream supportedPlatformVersions() { + // previous versions use gradle < 5, where Kotlin DSL is not supported + return Stream.of(Arguments.arguments("2.1.3.RELEASE")); + } + + @ParameterizedTest(name = "Spring Boot {0}") + @MethodSource("supportedPlatformVersions") + void buildWriterIsContributed(String platformVersion) { + ProjectDescription description = new ProjectDescription(); + description.setPlatformVersion(Version.parse(platformVersion)); + description.setLanguage(new JavaLanguage()); + BuildWriter buildWriter = this.projectTester.generate(description, + (context) -> context.getBean(BuildWriter.class)); + assertThat(buildWriter) + .isInstanceOf(KotlinDslGradleBuildProjectContributor.class); + } + + static Stream gradleWrapperParameters() { + return Stream.of(Arguments.arguments("2.1.3.RELEASE", "5.2.1")); + } + + @ParameterizedTest(name = "Spring Boot {0}") + @MethodSource("gradleWrapperParameters") + void gradleWrapperIsContributedWhenGeneratingGradleKtsProject(String platformVersion, + String expectedGradleVersion) throws IOException { + ProjectDescription description = new ProjectDescription(); + description.setPlatformVersion(Version.parse(platformVersion)); + description.setLanguage(new JavaLanguage()); + ProjectStructure projectStructure = this.projectTester.generate(description); + List relativePaths = projectStructure.getRelativePathsOfProjectFiles(); + assertThat(relativePaths).contains("gradlew", "gradlew.bat", + "gradle/wrapper/gradle-wrapper.properties", + "gradle/wrapper/gradle-wrapper.jar"); + try (Stream lines = Files.lines( + projectStructure.resolve("gradle/wrapper/gradle-wrapper.properties"))) { + assertThat(lines.filter((line) -> line + .contains(String.format("gradle-%s-bin.zip", expectedGradleVersion)))) + .hasSize(1); + } + } + + @Test + void buildDotGradleDotKtsIsContributedWhenGeneratingGradleKtsProject() + throws IOException { + ProjectDescription description = new ProjectDescription(); + description.setPlatformVersion(Version.parse("2.1.0.RELEASE")); + description.setLanguage(new JavaLanguage("11")); + description.addDependency("acme", + new Dependency("com.example", "acme", DependencyScope.COMPILE)); + ProjectStructure projectStructure = this.projectTester.generate(description); + List relativePaths = projectStructure.getRelativePathsOfProjectFiles(); + assertThat(relativePaths).contains("build.gradle.kts"); + Path path = projectStructure.resolve("build.gradle.kts"); + String[] lines = readAllLines(path); + assertThat(lines).containsExactly("plugins {", + " id(\"org.springframework.boot\") version \"2.1.0.RELEASE\"", + " id(\"io.spring.dependency-management\") version \"1.0.6.RELEASE\"", + " java", "}", "", "group = \"com.example\"", + "version = \"0.0.1-SNAPSHOT\"", + "java.sourceCompatibility = JavaVersion.VERSION_11", "", "repositories {", + " mavenCentral()", "}", "", "dependencies {", + " implementation(\"org.springframework.boot:spring-boot-starter\")", + " implementation(\"com.example:acme\")", + " testImplementation(\"org.springframework.boot:spring-boot-starter-test\")", + "}"); + } + + @Test + void warPluginIsAppliedWhenBuildingProjectThatUsesWarPackaging() throws IOException { + ProjectDescription description = new ProjectDescription(); + description.setPlatformVersion(Version.parse("2.1.0.RELEASE")); + description.setLanguage(new JavaLanguage()); + description.setPackaging(new WarPackaging()); + ProjectStructure projectStructure = this.projectTester.generate(description); + List relativePaths = projectStructure.getRelativePathsOfProjectFiles(); + assertThat(relativePaths).contains("build.gradle.kts"); + try (Stream lines = Files + .lines(projectStructure.resolve("build.gradle.kts"))) { + assertThat(lines.filter((line) -> line.contains(" war"))).hasSize(1); + } + } + + private static String[] readAllLines(Path file) throws IOException { + String content = StreamUtils.copyToString( + new FileInputStream(new File(file.toString())), StandardCharsets.UTF_8); + String[] lines = content.split("\\r?\\n"); + assertThat(content).endsWith(System.lineSeparator()); + return lines; + } + +} diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleProjectGenerationConfigurationTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleProjectGenerationConfigurationTests.java index 627dce50..eb0973b4 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleProjectGenerationConfigurationTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleProjectGenerationConfigurationTests.java @@ -46,9 +46,10 @@ import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link GradleProjectGenerationConfiguration}. + * Tests for {@link GradleProjectGenerationConfiguration} with Groovy DSL build system. * * @author Stephane Nicoll + * @author Jean-Baptiste Nizet */ class GradleProjectGenerationConfigurationTests { @@ -81,6 +82,8 @@ class GradleProjectGenerationConfigurationTests { BuildWriter buildWriter = this.projectTester.generate(description, (context) -> context.getBean(BuildWriter.class)); assertThat(buildWriter).isInstanceOf(GradleBuildProjectContributor.class); + assertThat(buildWriter) + .isNotInstanceOf(KotlinDslGradleBuildProjectContributor.class); } static Stream gradleWrapperParameters() { diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleBuildProjectContributorTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslGradleBuildProjectContributorTests.java similarity index 85% rename from initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleBuildProjectContributorTests.java rename to initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslGradleBuildProjectContributorTests.java index 3132ea06..cabe2e84 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GradleBuildProjectContributorTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslGradleBuildProjectContributorTests.java @@ -22,7 +22,7 @@ import java.nio.file.Path; import java.util.List; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; -import io.spring.initializr.generator.buildsystem.gradle.GradleBuildWriter; +import io.spring.initializr.generator.buildsystem.gradle.GroovyDslGradleBuildWriter; import io.spring.initializr.generator.io.IndentingWriterFactory; import io.spring.initializr.generator.io.SimpleIndentStrategy; import io.spring.initializr.generator.test.io.TextTestUtils; @@ -32,19 +32,21 @@ import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link GradleBuildProjectContributor}. + * Tests for {@link GroovyDslGradleBuildProjectContributor}. * * @author Andy Wilkinson * @author Stephane Nicoll + * @author Jean-Baptiste Nizet */ -class GradleBuildProjectContributorTests { +class GroovyDslGradleBuildProjectContributorTests { @Test void gradleBuildIsContributedInProjectStructure(@TempDir Path projectDir) throws IOException { GradleBuild build = new GradleBuild(); - new GradleBuildProjectContributor(new GradleBuildWriter(), build, - IndentingWriterFactory.withDefaultSettings()).contribute(projectDir); + new GroovyDslGradleBuildProjectContributor(new GroovyDslGradleBuildWriter(), + build, IndentingWriterFactory.withDefaultSettings()) + .contribute(projectDir); Path buildGradle = projectDir.resolve("build.gradle"); assertThat(buildGradle).isRegularFile(); } @@ -81,8 +83,8 @@ class GradleBuildProjectContributorTests { private List generateBuild(GradleBuild build, IndentingWriterFactory indentingWriterFactory) throws IOException { StringWriter writer = new StringWriter(); - new GradleBuildProjectContributor(new GradleBuildWriter(), build, - indentingWriterFactory).writeBuild(writer); + new GroovyDslGradleBuildProjectContributor(new GroovyDslGradleBuildWriter(), + build, indentingWriterFactory).writeBuild(writer); return TextTestUtils.readAllLines(writer.toString()); } diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/SettingsGradleProjectContributorTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslSettingsGradleProjectContributorTests.java similarity index 93% rename from initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/SettingsGradleProjectContributorTests.java rename to initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslSettingsGradleProjectContributorTests.java index 2879ce69..f604af4c 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/SettingsGradleProjectContributorTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/GroovyDslSettingsGradleProjectContributorTests.java @@ -31,11 +31,12 @@ import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link SettingsGradleProjectContributor}. + * Tests for {@link GroovyDslSettingsGradleProjectContributor}. * * @author Andy Wilkinson + * @author Jean-Baptiste Nizet */ -class SettingsGradleProjectContributorTests { +class GroovyDslSettingsGradleProjectContributorTests { @TempDir Path directory; @@ -77,7 +78,7 @@ class SettingsGradleProjectContributorTests { private List generateSettings(GradleBuild build, IndentingWriterFactory indentingWriterFactory) throws IOException { Path projectDir = Files.createTempDirectory(this.directory, "project-"); - new SettingsGradleProjectContributor(build, indentingWriterFactory) + new GroovyDslSettingsGradleProjectContributor(build, indentingWriterFactory) .contribute(projectDir); return new ProjectStructure(projectDir).readAllLines("settings.gradle"); } diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslGradleBuildProjectContributorTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslGradleBuildProjectContributorTests.java new file mode 100644 index 00000000..f756cf34 --- /dev/null +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslGradleBuildProjectContributorTests.java @@ -0,0 +1,85 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.build.gradle; + +import java.io.IOException; +import java.io.StringWriter; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.KotlinDslGradleBuildWriter; +import io.spring.initializr.generator.io.IndentingWriterFactory; +import io.spring.initializr.generator.io.SimpleIndentStrategy; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link KotlinDslGradleBuildProjectContributor}. + * + * @author Jean-Baptiste Nizet + */ +class KotlinDslGradleBuildProjectContributorTests { + + @Test + void gradleBuildIsContributedInProjectStructure(@TempDir Path projectDir) + throws IOException { + GradleBuild build = new GradleBuild(); + new KotlinDslGradleBuildProjectContributor(new KotlinDslGradleBuildWriter(), + build, IndentingWriterFactory.withDefaultSettings()) + .contribute(projectDir); + Path buildGradleKts = projectDir.resolve("build.gradle.kts"); + assertThat(buildGradleKts).isRegularFile(); + } + + @Test + void gradleBuildIsContributedToProject() throws IOException { + GradleBuild build = new GradleBuild(); + build.setGroup("com.example"); + build.setVersion("1.0.0-SNAPSHOT"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("group = \"com.example\"", + "version = \"1.0.0-SNAPSHOT\""); + } + + @Test + void gradleBuildIsContributedUsingGradleContentId() throws IOException { + IndentingWriterFactory indentingWriterFactory = IndentingWriterFactory + .create(new SimpleIndentStrategy(" "), (factory) -> factory + .indentingStrategy("gradle", new SimpleIndentStrategy(" "))); + GradleBuild build = new GradleBuild(); + build.addPlugin("java"); + List lines = generateBuild(build, indentingWriterFactory); + assertThat(lines).containsSequence("plugins {", " java", "}"); + } + + private List generateBuild(GradleBuild build) throws IOException { + return generateBuild(build, IndentingWriterFactory.withDefaultSettings()); + } + + private List generateBuild(GradleBuild build, + IndentingWriterFactory indentingWriterFactory) throws IOException { + StringWriter writer = new StringWriter(); + new KotlinDslGradleBuildProjectContributor(new KotlinDslGradleBuildWriter(), + build, indentingWriterFactory).writeBuild(writer); + return Arrays.asList(writer.toString().split("\\r?\\n")); + } + +} diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslSettingsGradleProjectContributorTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslSettingsGradleProjectContributorTests.java new file mode 100644 index 00000000..84e3a013 --- /dev/null +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/gradle/KotlinDslSettingsGradleProjectContributorTests.java @@ -0,0 +1,86 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.build.gradle; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.io.IndentingWriterFactory; +import io.spring.initializr.generator.io.SimpleIndentStrategy; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link KotlinDslSettingsGradleProjectContributor}. + * + * @author Jean-Baptiste Nizet + */ +class KotlinDslSettingsGradleProjectContributorTests { + + @TempDir + Path directory; + + @Test + void gradleSettingsIsContributedToProject() throws IOException { + GradleBuild build = new GradleBuild(); + build.pluginRepositories().add("maven-central"); + List lines = generateSettings(build); + assertThat(lines).containsSequence("pluginManagement {", " repositories {", + " mavenCentral()", " gradlePluginPortal()", " }", "}"); + } + + @Test + void gradleSettingsIsContributedUsingGradleContentId() throws IOException { + IndentingWriterFactory indentingWriterFactory = IndentingWriterFactory + .create(new SimpleIndentStrategy(" "), (factory) -> factory + .indentingStrategy("gradle", new SimpleIndentStrategy(" "))); + GradleBuild build = new GradleBuild(); + build.pluginRepositories().add("maven-central"); + List lines = generateSettings(build, indentingWriterFactory); + assertThat(lines).containsSequence("pluginManagement {", " repositories {", + " mavenCentral()", " gradlePluginPortal()", " }", "}"); + } + + @Test + void gradleSettingsDoesNotUseRepositories() throws IOException { + GradleBuild build = new GradleBuild(); + build.repositories().add("maven-central"); + List lines = generateSettings(build); + assertThat(lines).containsSequence("pluginManagement {", " repositories {", + " gradlePluginPortal()", " }", "}"); + } + + private List generateSettings(GradleBuild build) throws IOException { + return generateSettings(build, IndentingWriterFactory.withDefaultSettings()); + } + + private List generateSettings(GradleBuild build, + IndentingWriterFactory indentingWriterFactory) throws IOException { + Path projectDir = Files.createTempDirectory(this.directory, "project-"); + new KotlinDslSettingsGradleProjectContributor(build, indentingWriterFactory) + .contribute(projectDir); + Path settingsGradle = projectDir.resolve("settings.gradle.kts"); + assertThat(settingsGradle).isRegularFile(); + return Files.readAllLines(settingsGradle); + } + +} diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizerTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizerTests.java new file mode 100644 index 00000000..bbe201f2 --- /dev/null +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizerTests.java @@ -0,0 +1,73 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.spring.code.kotlin; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild.TaskCustomization; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link GroovyDslKotlinGradleBuildCustomizer}. + * + * @author Andy Wilkinson <<<<<<< + * HEAD:initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizerTests.java + * @author Jean-Baptiste Nizet ======= >>>>>>> 7ec6a29a... Configure spring project + * generation using Gradle Kotlin + * DSL:initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/GroovyDslKotlinGradleBuildCustomizerTests.java + */ +class GroovyDslKotlinGradleBuildCustomizerTests { + + @Test + void kotlinPluginsAreConfigured() { + GradleBuild build = new GradleBuild(); + new GroovyDslKotlinGradleBuildCustomizer( + new SimpleKotlinProjectSettings("1.2.70")).customize(build); + assertThat(build.getPlugins()).hasSize(2); + assertThat(build.getPlugins().get(0).getId()) + .isEqualTo("org.jetbrains.kotlin.jvm"); + assertThat(build.getPlugins().get(0).getVersion()).isEqualTo("1.2.70"); + assertThat(build.getPlugins().get(1).getId()) + .isEqualTo("org.jetbrains.kotlin.plugin.spring"); + assertThat(build.getPlugins().get(1).getVersion()).isEqualTo("1.2.70"); + } + + @Test + void kotlinCompilationTasksAreCustomized() { + GradleBuild build = new GradleBuild(); + new GroovyDslKotlinGradleBuildCustomizer( + new SimpleKotlinProjectSettings("1.2.70")).customize(build); + assertThat(build.getTasksWithTypeCustomizations()).hasSize(1); + assertThat(build.getTasksWithTypeCustomizations()).containsKeys("KotlinCompile"); + assertKotlinOptions(build.getTasksWithTypeCustomizations().get("KotlinCompile")); + } + + private void assertKotlinOptions(TaskCustomization compileTask) { + assertThat(compileTask.getAssignments()).isEmpty(); + assertThat(compileTask.getInvocations()).isEmpty(); + assertThat(compileTask.getNested()).hasSize(1); + TaskCustomization kotlinOptions = compileTask.getNested().get("kotlinOptions"); + assertThat(kotlinOptions.getInvocations()).hasSize(0); + assertThat(kotlinOptions.getNested()).hasSize(0); + assertThat(kotlinOptions.getAssignments()).hasSize(2); + assertThat(kotlinOptions.getAssignments()) + .containsEntry("freeCompilerArgs", "['-Xjsr305=strict']") + .containsEntry("jvmTarget", "'1.8'"); + } + +} diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizerTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinDslKotlinGradleBuildCustomizerTests.java similarity index 81% rename from initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizerTests.java rename to initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinDslKotlinGradleBuildCustomizerTests.java index 4f315bbb..82c9b1bb 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinGradleBuildCustomizerTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinDslKotlinGradleBuildCustomizerTests.java @@ -23,17 +23,17 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link KotlinGradleBuildCustomizer}. + * Tests for {@link KotlinDslKotlinGradleBuildCustomizer}. * - * @author Andy Wilkinson + * @author Jean-Baptiste Nizet */ -class KotlinGradleBuildCustomizerTests { +class KotlinDslKotlinGradleBuildCustomizerTests { @Test void kotlinPluginsAreConfigured() { GradleBuild build = new GradleBuild(); - new KotlinGradleBuildCustomizer(new SimpleKotlinProjectSettings("1.2.70")) - .customize(build); + new KotlinDslKotlinGradleBuildCustomizer( + new SimpleKotlinProjectSettings("1.2.70")).customize(build); assertThat(build.getPlugins()).hasSize(2); assertThat(build.getPlugins().get(0).getId()) .isEqualTo("org.jetbrains.kotlin.jvm"); @@ -46,10 +46,8 @@ class KotlinGradleBuildCustomizerTests { @Test void kotlinCompilationTasksAreCustomized() { GradleBuild build = new GradleBuild(); - new KotlinGradleBuildCustomizer(new SimpleKotlinProjectSettings("1.2.70")) - .customize(build); - assertThat(build.getImportedTypes()) - .contains("org.jetbrains.kotlin.gradle.tasks.KotlinCompile"); + new KotlinDslKotlinGradleBuildCustomizer( + new SimpleKotlinProjectSettings("1.2.70")).customize(build); assertThat(build.getTasksWithTypeCustomizations()).hasSize(1); assertThat(build.getTasksWithTypeCustomizations()).containsKeys("KotlinCompile"); assertKotlinOptions(build.getTasksWithTypeCustomizations().get("KotlinCompile")); @@ -64,8 +62,8 @@ class KotlinGradleBuildCustomizerTests { assertThat(kotlinOptions.getNested()).hasSize(0); assertThat(kotlinOptions.getAssignments()).hasSize(2); assertThat(kotlinOptions.getAssignments()) - .containsEntry("freeCompilerArgs", "['-Xjsr305=strict']") - .containsEntry("jvmTarget", "'1.8'"); + .containsEntry("freeCompilerArgs", "listOf(\"-Xjsr305=strict\")") + .containsEntry("jvmTarget", "\"1.8\""); } } diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/test/InitializrMetadataTestBuilder.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/test/InitializrMetadataTestBuilder.java index 731ec88a..8de7c6a8 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/test/InitializrMetadataTestBuilder.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/test/InitializrMetadataTestBuilder.java @@ -80,7 +80,7 @@ public class InitializrMetadataTestBuilder { } public InitializrMetadataTestBuilder addAllDefaults() { - return addBasicDefaults().setGradleEnv("0.5.1.RELEASE").setKotlinEnv("1.1.1"); + return addBasicDefaults().setGradleEnv("1.0.6.RELEASE").setKotlinEnv("1.1.1"); } public InitializrMetadataTestBuilder addBasicDefaults() { diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/annotation-processor-dependency-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/annotation-processor-dependency-build.gradle.kts.gen new file mode 100644 index 00000000..6ade62aa --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/annotation-processor-dependency-build.gradle.kts.gen @@ -0,0 +1,26 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +configurations { + compileOnly { + extendsFrom(configurations.annotationProcessor.get()) + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-web") + annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/bom-ordering-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/bom-ordering-build.gradle.kts.gen new file mode 100644 index 00000000..7210e76b --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/bom-ordering-build.gradle.kts.gen @@ -0,0 +1,26 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.acme:foo") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} + +dependencyManagement { + imports { + mavenBom("org.acme:bar-bom:1.0") + mavenBom("org.acme:biz-bom:1.0") + mavenBom("org.acme:foo-bom:1.0") + } +} diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/bom-property-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/bom-property-build.gradle.kts.gen new file mode 100644 index 00000000..d87908ce --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/bom-property-build.gradle.kts.gen @@ -0,0 +1,26 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +extra["fooVersion"] = "1.3.3" + +dependencies { + implementation("org.acme:foo") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} + +dependencyManagement { + imports { + mavenBom("org.acme:foo-bom:${fooVersion}") + } +} diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/compile-only-dependency-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/compile-only-dependency-build.gradle.kts.gen new file mode 100644 index 00000000..3d04dce3 --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/compile-only-dependency-build.gradle.kts.gen @@ -0,0 +1,20 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-web") + compileOnly("org.acme:foo") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/gitignore.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/gitignore.gen new file mode 100644 index 00000000..d6819a47 --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/gitignore.gen @@ -0,0 +1,26 @@ +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/kotlin-java11-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/kotlin-java11-build.gradle.kts.gen new file mode 100644 index 00000000..ca3d47a7 --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/kotlin-java11-build.gradle.kts.gen @@ -0,0 +1,30 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + kotlin("jvm") version "1.1.1" + kotlin("plugin.spring") version "1.1.1" +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_11 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = listOf("-Xjsr305=strict") + jvmTarget = "1.8" + } +} diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/repositories-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/repositories-build.gradle.kts.gen new file mode 100644 index 00000000..9ab60d62 --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/repositories-build.gradle.kts.gen @@ -0,0 +1,21 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() + maven { url = uri("https://example.com/foo") } + maven { url = uri("https://example.com/bar") } +} + +dependencies { + implementation("org.acme:bar") + implementation("org.acme:foo") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/repositories-milestone-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/repositories-milestone-build.gradle.kts.gen new file mode 100644 index 00000000..522af7be --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/repositories-milestone-build.gradle.kts.gen @@ -0,0 +1,20 @@ +plugins { + id("org.springframework.boot") version "2.2.0.M1" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() + maven { url = uri("https://repo.spring.io/snapshot") } + maven { url = uri("https://repo.spring.io/milestone") } +} + +dependencies { + implementation("org.acme:foo") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/gradle-kts/version-override-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/gradle-kts/version-override-build.gradle.kts.gen new file mode 100644 index 00000000..af3180cb --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/gradle-kts/version-override-build.gradle.kts.gen @@ -0,0 +1,21 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +extra["springBarVersion"] = "0.2.0.RELEASE" +extra["spring-foo.version"] = "0.1.0.RELEASE" + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/groovy/standard/build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/groovy/standard/build.gradle.kts.gen new file mode 100644 index 00000000..2bbee42e --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/groovy/standard/build.gradle.kts.gen @@ -0,0 +1,19 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + groovy +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter") + implementation("org.codehaus.groovy:groovy") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/groovy/standard/war-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/groovy/standard/war-build.gradle.kts.gen new file mode 100644 index 00000000..b24dbc8b --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/groovy/standard/war-build.gradle.kts.gen @@ -0,0 +1,21 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + war + groovy +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.codehaus.groovy:groovy") + providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/java/standard/build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/java/standard/build.gradle.kts.gen new file mode 100644 index 00000000..da818e25 --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/java/standard/build.gradle.kts.gen @@ -0,0 +1,18 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/java/standard/war-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/java/standard/war-build.gradle.kts.gen new file mode 100644 index 00000000..09a79cb1 --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/java/standard/war-build.gradle.kts.gen @@ -0,0 +1,20 @@ +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + java + war +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web") + providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/initializr-generator-spring/src/test/resources/project/kotlin/standard/build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/kotlin/standard/build.gradle.kts.gen new file mode 100644 index 00000000..d2f468dc --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/kotlin/standard/build.gradle.kts.gen @@ -0,0 +1,30 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + kotlin("jvm") version "1.1.1" + kotlin("plugin.spring") version "1.1.1" +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = listOf("-Xjsr305=strict") + jvmTarget = "1.8" + } +} diff --git a/initializr-generator-spring/src/test/resources/project/kotlin/standard/war-build.gradle.kts.gen b/initializr-generator-spring/src/test/resources/project/kotlin/standard/war-build.gradle.kts.gen new file mode 100644 index 00000000..06d097e5 --- /dev/null +++ b/initializr-generator-spring/src/test/resources/project/kotlin/standard/war-build.gradle.kts.gen @@ -0,0 +1,32 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("org.springframework.boot") version "2.1.1.RELEASE" + id("io.spring.dependency-management") version "1.0.6.RELEASE" + war + kotlin("jvm") version "1.1.1" + kotlin("plugin.spring") version "1.1.1" +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = listOf("-Xjsr305=strict") + jvmTarget = "1.8" + } +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/Gradle3BuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/Gradle3BuildWriter.java index 301a957e..97b8c91a 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/Gradle3BuildWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/Gradle3BuildWriter.java @@ -19,11 +19,11 @@ package io.spring.initializr.generator.buildsystem.gradle; import io.spring.initializr.generator.buildsystem.DependencyScope; /** - * A {@link GradleBuildWriter} suitable for Gradle 3. + * A {@link GroovyDslGradleBuildWriter} suitable for Gradle 3. * * @author Stephane Nicoll */ -public class Gradle3BuildWriter extends GradleBuildWriter { +public class Gradle3BuildWriter extends GroovyDslGradleBuildWriter { protected String configurationForScope(DependencyScope type) { switch (type) { diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriter.java index 647c46d4..940fdc0e 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriter.java @@ -43,23 +43,26 @@ import io.spring.initializr.generator.version.VersionProperty; import io.spring.initializr.generator.version.VersionReference; /** - * A {@link GradleBuild} writer for {@code build.gradle}. + * A {@link GradleBuild} writer template for build.gradle and build.gradle.kts. A subclass + * of this class exists for the Groovy DSL and for the Kotlin DSL. * * @author Andy Wilkinson * @author Stephane Nicoll * @author Jean-Baptiste Nizet */ -public class GradleBuildWriter { +public abstract class GradleBuildWriter { - public void writeTo(IndentingWriter writer, GradleBuild build) throws IOException { + public final void writeTo(IndentingWriter writer, GradleBuild build) + throws IOException { writeImports(writer, build); - boolean buildScriptWritten = writeBuildscript(writer, build); - writePlugins(writer, build, buildScriptWritten); + writeBuildscript(writer, build); + writePlugins(writer, build); writeProperty(writer, "group", build.getGroup()); writeProperty(writer, "version", build.getVersion()); - writeProperty(writer, "sourceCompatibility", build.getSourceCompatibility()); + writeJavaSourceCompatibility(writer, build); + writer.println(); writeConfigurations(writer, build); - writeRepositories(writer, build, writer::println); + writeRepositories(writer, build); writeProperties(writer, build); writeDependencies(writer, build); writeBoms(writer, build); @@ -75,61 +78,12 @@ public class GradleBuildWriter { } } - private boolean writeBuildscript(IndentingWriter writer, GradleBuild build) { - List dependencies = build.getBuildscript().getDependencies(); - Map ext = build.getBuildscript().getExt(); - if (dependencies.isEmpty() && ext.isEmpty()) { - return false; - } - writer.println("buildscript {"); - writer.indented(() -> { - writeBuildscriptExt(writer, build); - writeBuildscriptRepositories(writer, build); - writeBuildscriptDependencies(writer, build); - }); - writer.println("}"); - return true; - } + protected abstract void writeBuildscript(IndentingWriter writer, GradleBuild build); - private void writeBuildscriptExt(IndentingWriter writer, GradleBuild build) { - writeNestedMap(writer, "ext", build.getBuildscript().getExt(), - (key, value) -> key + " = " + value); - } + protected abstract void writePlugins(IndentingWriter writer, GradleBuild build); - private void writeBuildscriptRepositories(IndentingWriter writer, GradleBuild build) { - writeRepositories(writer, build); - } - - private void writeBuildscriptDependencies(IndentingWriter writer, GradleBuild build) { - writeNestedCollection(writer, "dependencies", - build.getBuildscript().getDependencies(), - (dependency) -> "classpath '" + dependency + "'"); - } - - private void writePlugins(IndentingWriter writer, GradleBuild build, - boolean buildScriptWritten) { - writeNestedCollection(writer, "plugins", build.getPlugins(), this::pluginAsString, - determineBeforeWriting(buildScriptWritten, writer)); - writeCollection(writer, build.getAppliedPlugins(), - (plugin) -> "apply plugin: '" + plugin + "'", writer::println); - writer.println(); - } - - private Runnable determineBeforeWriting(boolean buildScriptWritten, - IndentingWriter writer) { - if (buildScriptWritten) { - return writer::println; - } - return null; - } - - private String pluginAsString(GradlePlugin plugin) { - String string = "id '" + plugin.getId() + "'"; - if (plugin.getVersion() != null) { - string += " version '" + plugin.getVersion() + "'"; - } - return string; - } + protected abstract void writeJavaSourceCompatibility(IndentingWriter writer, + GradleBuild build); private void writeConfigurations(IndentingWriter writer, GradleBuild build) { Map configurationCustomizations = build @@ -137,43 +91,24 @@ public class GradleBuildWriter { if (configurationCustomizations.isEmpty()) { return; } - writer.println(); writer.println("configurations {"); writer.indented(() -> configurationCustomizations.forEach((name, customization) -> writeConfiguration(writer, name, customization))); writer.println("}"); + writer.println(""); } - private void writeConfiguration(IndentingWriter writer, String configurationName, - ConfigurationCustomization configurationCustomization) { - if (configurationCustomization.getExtendsFrom().isEmpty()) { - writer.println(configurationName); - } - else { - writer.println(configurationName + " {"); - writer.indented(() -> writer.println(String.format("extendsFrom %s", - String.join(", ", configurationCustomization.getExtendsFrom())))); - writer.println("}"); - } - } + protected abstract void writeConfiguration(IndentingWriter writer, + String configurationName, + ConfigurationCustomization configurationCustomization); - private void writeRepositories(IndentingWriter writer, GradleBuild build) { - writeRepositories(writer, build, null); - } - - private void writeRepositories(IndentingWriter writer, GradleBuild build, - Runnable beforeWriting) { + protected final void writeRepositories(IndentingWriter writer, GradleBuild build) { writeNestedCollection(writer, "repositories", build.repositories().items().collect(Collectors.toList()), - this::repositoryAsString, beforeWriting); + this::repositoryAsString); } - private String repositoryAsString(MavenRepository repository) { - if (MavenRepository.MAVEN_CENTRAL.equals(repository)) { - return "mavenCentral()"; - } - return "maven { url '" + repository.getUrl() + "' }"; - } + protected abstract String repositoryAsString(MavenRepository repository); private void writeProperties(IndentingWriter writer, GradleBuild build) { if (build.getExt().isEmpty() && build.getVersionProperties().isEmpty()) { @@ -182,19 +117,17 @@ public class GradleBuildWriter { Map allProperties = new LinkedHashMap<>(build.getExt()); build.getVersionProperties().entrySet().forEach((entry) -> allProperties .put(getVersionPropertyKey(entry), "'" + entry.getValue() + "'")); - writeNestedCollection(writer, "ext", allProperties.entrySet(), - (e) -> getFormattedProperty(e.getKey(), e.getValue()), writer::println); + writeExtraProperties(writer, allProperties); } + protected abstract void writeExtraProperties(IndentingWriter writer, + Map allProperties); + private String getVersionPropertyKey(Entry entry) { return entry.getKey().isInternal() ? entry.getKey().toCamelCaseFormat() : entry.getKey().toStandardFormat(); } - private String getFormattedProperty(String key, String value) { - return String.format("set('%s', %s)", key, value); - } - private void writeDependencies(IndentingWriter writer, GradleBuild build) { Set sortedDependencies = new LinkedHashSet<>(); DependencyContainer dependencies = build.dependencies(); @@ -216,15 +149,7 @@ public class GradleBuildWriter { this::dependencyAsString, writer::println); } - private String dependencyAsString(Dependency dependency) { - String quoteStyle = determineQuoteStyle(dependency.getVersion()); - String version = determineVersion(dependency.getVersion()); - String type = dependency.getType(); - return configurationForScope(dependency.getScope()) + " " + quoteStyle - + dependency.getGroupId() + ":" + dependency.getArtifactId() - + ((version != null) ? ":" + version : "") - + ((type != null) ? "@" + type : "") + quoteStyle; - } + protected abstract String dependencyAsString(Dependency dependency); protected String configurationForScope(DependencyScope type) { switch (type) { @@ -263,23 +188,18 @@ public class GradleBuildWriter { } private String bomAsString(BillOfMaterials bom) { - String quoteStyle = determineQuoteStyle(bom.getVersion()); String version = determineVersion(bom.getVersion()); - return "mavenBom " + quoteStyle + bom.getGroupId() + ":" + bom.getArtifactId() - + ":" + version + quoteStyle; + return bomAsString(bom, version); } - private String determineQuoteStyle(VersionReference versionReference) { - return (versionReference != null && versionReference.isProperty()) ? "\"" : "'"; - } + protected abstract String bomAsString(BillOfMaterials bom, String version); - private String determineVersion(VersionReference versionReference) { + protected final String determineVersion(VersionReference versionReference) { if (versionReference != null) { if (versionReference.isProperty()) { VersionProperty property = versionReference.getProperty(); - return "${" - + (property.isInternal() ? property.toCamelCaseFormat() - : "property('" + property.toStandardFormat() + "')") + return "${" + (property.isInternal() ? property.toCamelCaseFormat() + : externalVersionPropertyAsString(property.toStandardFormat())) + "}"; } return versionReference.getValue(); @@ -287,33 +207,17 @@ public class GradleBuildWriter { return null; } - private void writeTasksWithTypeCustomizations(IndentingWriter writer, - GradleBuild build) { - Map tasksWithTypeCustomizations = build - .getTasksWithTypeCustomizations(); - tasksWithTypeCustomizations.forEach((typeName, customization) -> { - writer.println(); - writer.println("tasks.withType(" + typeName + ") {"); - writer.indented(() -> writeTaskCustomization(writer, customization)); - writer.println("}"); - }); - } + protected abstract String externalVersionPropertyAsString(String standardFormat); - private void writeTaskCustomizations(IndentingWriter writer, GradleBuild build) { - Map taskCustomizations = build.getTaskCustomizations(); - taskCustomizations.forEach((name, customization) -> { - writer.println(); - writer.println(name + " {"); - writer.indented(() -> writeTaskCustomization(writer, customization)); - writer.println("}"); - }); - } + protected abstract void writeTasksWithTypeCustomizations(IndentingWriter writer, + GradleBuild build); - private void writeTaskCustomization(IndentingWriter writer, + protected abstract void writeTaskCustomizations(IndentingWriter writer, + GradleBuild build); + + protected final void writeTaskCustomization(IndentingWriter writer, TaskCustomization customization) { - writeCollection(writer, customization.getInvocations(), - (invocation) -> invocation.getTarget() + " " - + String.join(", ", invocation.getArguments())); + writeCollection(writer, customization.getInvocations(), this::invocationAsString); writeMap(writer, customization.getAssignments(), (key, value) -> key + " = " + value); customization.getNested().forEach((property, nestedCustomization) -> { @@ -323,12 +227,14 @@ public class GradleBuildWriter { }); } - private void writeNestedCollection(IndentingWriter writer, String name, + protected abstract String invocationAsString(TaskCustomization.Invocation invocation); + + protected final void writeNestedCollection(IndentingWriter writer, String name, Collection collection, Function itemToStringConverter) { this.writeNestedCollection(writer, name, collection, itemToStringConverter, null); } - private void writeNestedCollection(IndentingWriter writer, String name, + protected final void writeNestedCollection(IndentingWriter writer, String name, Collection collection, Function converter, Runnable beforeWriting) { if (!collection.isEmpty()) { @@ -347,8 +253,9 @@ public class GradleBuildWriter { writeCollection(writer, collection, converter, null); } - private void writeCollection(IndentingWriter writer, Collection collection, - Function itemToStringConverter, Runnable beforeWriting) { + protected final void writeCollection(IndentingWriter writer, + Collection collection, Function itemToStringConverter, + Runnable beforeWriting) { if (!collection.isEmpty()) { if (beforeWriting != null) { beforeWriting.run(); @@ -357,25 +264,13 @@ public class GradleBuildWriter { } } - private void writeNestedMap(IndentingWriter writer, String name, Map map, - BiFunction converter) { - if (!map.isEmpty()) { - writer.println(name + " {"); - writer.indented(() -> writeMap(writer, map, converter)); - writer.println("}"); - } - } - - private void writeMap(IndentingWriter writer, Map map, + protected final void writeMap(IndentingWriter writer, Map map, BiFunction converter) { map.forEach((key, value) -> writer.println(converter.apply(key, value))); } - private void writeProperty(IndentingWriter writer, String name, String value) { - if (value != null) { - writer.println(String.format("%s = '%s'", name, value)); - } - } + protected abstract void writeProperty(IndentingWriter writer, String name, + String value); private static Collection filterDependencies( DependencyContainer dependencies, DependencyScope... types) { diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleSettingsWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleSettingsWriter.java index 93ba407e..76f31020 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleSettingsWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GradleSettingsWriter.java @@ -22,15 +22,19 @@ import io.spring.initializr.generator.buildsystem.MavenRepository; import io.spring.initializr.generator.io.IndentingWriter; /** - * A {@link GradleBuild} writer for {@code settings.gradle}. + * A {@link GradleBuild} writer template for {@code settings.gradle} and + * {@code settings.gradle.kts}. A subclass of this class exists for the Groovy DSL and for + * the Kotlin DSL. * * @author Andy Wilkinson + * @author Jean-Baptiste Nizet */ -public class GradleSettingsWriter { +public abstract class GradleSettingsWriter { - public void writeTo(IndentingWriter writer, GradleBuild build) throws IOException { + public final void writeTo(IndentingWriter writer, GradleBuild build) + throws IOException { writePluginManagement(writer, build); - writer.println("rootProject.name = '" + build.getArtifact() + "'"); + writer.println("rootProject.name = " + wrapWithQuotes(build.getArtifact())); } private void writePluginManagement(IndentingWriter writer, GradleBuild build) { @@ -62,7 +66,8 @@ public class GradleSettingsWriter { writer.indented(() -> { writer.println("eachPlugin {"); writer.indented(() -> { - writer.println("if (requested.id.id == 'org.springframework.boot') {"); + writer.println("if (requested.id.id == " + + wrapWithQuotes("org.springframework.boot") + ") {"); writer.indented(() -> writer.println( "useModule(\"org.springframework.boot:spring-boot-gradle-plugin:${requested.version}\")")); writer.println("}"); @@ -76,7 +81,11 @@ public class GradleSettingsWriter { if (MavenRepository.MAVEN_CENTRAL.equals(repository)) { return "mavenCentral()"; } - return "maven { url '" + repository.getUrl() + "' }"; + return "maven { " + urlAssignment(repository.getUrl()) + " }"; } + protected abstract String wrapWithQuotes(String value); + + protected abstract String urlAssignment(String url); + } diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriter.java new file mode 100644 index 00000000..44fd4824 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriter.java @@ -0,0 +1,202 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.buildsystem.gradle; + +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; + +import io.spring.initializr.generator.buildsystem.BillOfMaterials; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.MavenRepository; +import io.spring.initializr.generator.io.IndentingWriter; +import io.spring.initializr.generator.version.VersionReference; + +/** + * A {@link GradleBuild} writer for {@code build.gradle}. + * + * @author Jean-Baptiste Nizet + */ +public class GroovyDslGradleBuildWriter extends GradleBuildWriter { + + @Override + protected void writeBuildscript(IndentingWriter writer, GradleBuild build) { + List dependencies = build.getBuildscript().getDependencies(); + Map ext = build.getBuildscript().getExt(); + if (dependencies.isEmpty() && ext.isEmpty()) { + return; + } + writer.println("buildscript {"); + writer.indented(() -> { + writeBuildscriptExt(writer, build); + writeBuildscriptRepositories(writer, build); + writeBuildscriptDependencies(writer, build); + }); + writer.println("}"); + writer.println(); + } + + private void writeBuildscriptExt(IndentingWriter writer, GradleBuild build) { + writeNestedMap(writer, "ext", build.getBuildscript().getExt(), + (key, value) -> key + " = " + value); + } + + private void writeBuildscriptRepositories(IndentingWriter writer, GradleBuild build) { + writeRepositories(writer, build); + } + + private void writeBuildscriptDependencies(IndentingWriter writer, GradleBuild build) { + writeNestedCollection(writer, "dependencies", + build.getBuildscript().getDependencies(), + (dependency) -> "classpath '" + dependency + "'"); + } + + @Override + protected void writePlugins(IndentingWriter writer, GradleBuild build) { + writeNestedCollection(writer, "plugins", build.getPlugins(), + this::pluginAsString); + writeCollection(writer, build.getAppliedPlugins(), + (plugin) -> "apply plugin: '" + plugin + "'", writer::println); + writer.println(); + } + + private String pluginAsString(GradlePlugin plugin) { + String string = "id '" + plugin.getId() + "'"; + if (plugin.getVersion() != null) { + string += " version '" + plugin.getVersion() + "'"; + } + return string; + } + + @Override + protected void writeJavaSourceCompatibility(IndentingWriter writer, + GradleBuild build) { + writeProperty(writer, "sourceCompatibility", build.getSourceCompatibility()); + } + + @Override + protected void writeConfiguration(IndentingWriter writer, String configurationName, + GradleBuild.ConfigurationCustomization configurationCustomization) { + if (configurationCustomization.getExtendsFrom().isEmpty()) { + writer.println(configurationName); + } + else { + writer.println(configurationName + " {"); + writer.indented(() -> writer.println(String.format("extendsFrom %s", + String.join(", ", configurationCustomization.getExtendsFrom())))); + writer.println("}"); + } + } + + @Override + protected String repositoryAsString(MavenRepository repository) { + if (MavenRepository.MAVEN_CENTRAL.equals(repository)) { + return "mavenCentral()"; + } + return "maven { url '" + repository.getUrl() + "' }"; + } + + @Override + protected void writeExtraProperties(IndentingWriter writer, + Map allProperties) { + writeNestedCollection(writer, "ext", allProperties.entrySet(), + (e) -> getFormattedExtraProperty(e.getKey(), e.getValue()), + writer::println); + } + + private String getFormattedExtraProperty(String key, String value) { + return String.format("set('%s', '%s')", key, value); + } + + @Override + protected String dependencyAsString(Dependency dependency) { + String quoteStyle = determineQuoteStyle(dependency.getVersion()); + String version = determineVersion(dependency.getVersion()); + String type = dependency.getType(); + return configurationForScope(dependency.getScope()) + " " + quoteStyle + + dependency.getGroupId() + ":" + dependency.getArtifactId() + + ((version != null) ? ":" + version : "") + + ((type != null) ? "@" + type : "") + quoteStyle; + } + + private String determineQuoteStyle(VersionReference versionReference) { + return (versionReference != null && versionReference.isProperty()) ? "\"" : "'"; + } + + @Override + protected String bomAsString(BillOfMaterials bom, String version) { + String quoteStyle = determineQuoteStyle(bom.getVersion()); + return "mavenBom " + quoteStyle + bom.getGroupId() + ":" + bom.getArtifactId() + + ":" + version + quoteStyle; + } + + @Override + protected String externalVersionPropertyAsString(String standardFormat) { + return "property('" + standardFormat + "')"; + } + + @Override + protected void writeTasksWithTypeCustomizations(IndentingWriter writer, + GradleBuild build) { + Map tasksWithTypeCustomizations = build + .getTasksWithTypeCustomizations(); + + tasksWithTypeCustomizations.forEach((typeName, customization) -> { + writer.println(); + writer.println("tasks.withType(" + typeName + ") {"); + writer.indented(() -> writeTaskCustomization(writer, customization)); + writer.println("}"); + }); + } + + @Override + protected void writeTaskCustomizations(IndentingWriter writer, GradleBuild build) { + Map taskCustomizations = build + .getTaskCustomizations(); + + taskCustomizations.forEach((name, customization) -> { + writer.println(); + writer.println(name + " {"); + writer.indented(() -> writeTaskCustomization(writer, customization)); + writer.println("}"); + }); + } + + @Override + protected String invocationAsString( + GradleBuild.TaskCustomization.Invocation invocation) { + return invocation.getTarget() + " " + + String.join(", ", invocation.getArguments()); + } + + @Override + protected void writeProperty(IndentingWriter writer, String name, String value) { + if (value != null) { + writer.println(String.format("%s = '%s'", name, value)); + } + } + + private void writeNestedMap(IndentingWriter writer, String name, Map map, + BiFunction converter) { + if (!map.isEmpty()) { + writer.println(name + " {"); + writer.indented(() -> writeMap(writer, map, converter)); + writer.println("}"); + } + } + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleSettingsWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleSettingsWriter.java new file mode 100644 index 00000000..cb132a93 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleSettingsWriter.java @@ -0,0 +1,36 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.buildsystem.gradle; + +/** + * A {@link GradleBuild} writer for {@code settings.gradle}. + * + * @author Jean-Baptiste Nizet + */ +public class GroovyDslGradleSettingsWriter extends GradleSettingsWriter { + + @Override + protected String wrapWithQuotes(String value) { + return "'" + value + "'"; + } + + @Override + protected String urlAssignment(String url) { + return "url " + wrapWithQuotes(url); + } + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java new file mode 100644 index 00000000..bd809803 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java @@ -0,0 +1,203 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.buildsystem.gradle; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import io.spring.initializr.generator.buildsystem.BillOfMaterials; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.MavenRepository; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild.ConfigurationCustomization; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild.TaskCustomization; +import io.spring.initializr.generator.io.IndentingWriter; + +/** + * A {@link GradleBuild} writer for {@code build.gradle.kts}. + * + * @author Jean-Baptiste Nizet + */ +public class KotlinDslGradleBuildWriter extends GradleBuildWriter { + + private static final Map sourceCompatibilitiesToJavaVersion = createSourceCompatibilitiesToJavaVersion(); + + private static Map createSourceCompatibilitiesToJavaVersion() { + Map result = new HashMap<>(); + for (int version = 6; version <= 10; version++) { + result.put(Integer.toString(version), "VERSION_1_" + version); + result.put("1." + version, "VERSION_1_" + version); + } + for (int version = 11; version <= 12; version++) { + result.put(Integer.toString(version), "VERSION_" + version); + result.put("1." + version, "VERSION_" + version); + } + + return Collections.unmodifiableMap(result); + } + + @Override + protected void writeBuildscript(IndentingWriter writer, GradleBuild build) { + if (!(build.getBuildscript().getDependencies().isEmpty() + && build.getBuildscript().getExt().isEmpty())) { + throw new IllegalStateException( + "build.gradle.kts scripts shouldn't need a buildscript"); + } + } + + @Override + protected void writePlugins(IndentingWriter writer, GradleBuild build) { + writeNestedCollection(writer, "plugins", build.getPlugins(), this::pluginAsString, + null); + writer.println(); + + if (!build.getAppliedPlugins().isEmpty()) { + throw new IllegalStateException( + "build.gradle.kts scripts shouldn't apply plugins. They should use the plugins block instead."); + } + } + + private String pluginAsString(GradlePlugin plugin) { + String result = shortPluginNotation(plugin.getId()); + if (result == null) { + result = "id(\"" + plugin.getId() + "\")"; + } + if (plugin.getVersion() != null) { + result += " version \"" + plugin.getVersion() + "\""; + } + return result; + } + + private String shortPluginNotation(String pluginId) { + if (pluginId.equals("java") || pluginId.equals("war") + || pluginId.equals("groovy")) { + return pluginId; + } + + String kotlinPluginPrefix = "org.jetbrains.kotlin."; + if (pluginId.startsWith(kotlinPluginPrefix)) { + return "kotlin(\"" + pluginId.substring(kotlinPluginPrefix.length()) + "\")"; + } + + return null; + } + + @Override + protected void writeJavaSourceCompatibility(IndentingWriter writer, + GradleBuild build) { + writer.println("java.sourceCompatibility = JavaVersion." + + sourceCompatibilitiesToJavaVersion.get(build.getSourceCompatibility())); + } + + @Override + protected void writeConfiguration(IndentingWriter writer, String configurationName, + ConfigurationCustomization configurationCustomization) { + if (configurationCustomization.getExtendsFrom().isEmpty()) { + writer.println(configurationName); + } + else { + writer.println(configurationName + " {"); + writer.indented(() -> writer.println(String.format("extendsFrom(%s)", + configurationCustomization.getExtendsFrom().stream() + .map((c) -> "configurations." + c + ".get()") + .collect(Collectors.joining(", "))))); + writer.println("}"); + } + } + + @Override + protected String repositoryAsString(MavenRepository repository) { + if (MavenRepository.MAVEN_CENTRAL.equals(repository)) { + return "mavenCentral()"; + } + return "maven { url = uri(\"" + repository.getUrl() + "\") }"; + } + + @Override + protected String dependencyAsString(Dependency dependency) { + String version = determineVersion(dependency.getVersion()); + String type = dependency.getType(); + return configurationForScope(dependency.getScope()) + "(\"" + + dependency.getGroupId() + ":" + dependency.getArtifactId() + + ((version != null) ? ":" + version : "") + + ((type != null) ? "@" + type : "") + "\")"; + } + + @Override + protected void writeExtraProperties(IndentingWriter writer, + Map allProperties) { + writeCollection(writer, allProperties.entrySet(), + (e) -> getFormattedExtraProperty(e.getKey(), e.getValue()), + writer::println); + } + + private String getFormattedExtraProperty(String key, String value) { + return String.format("extra[\"%s\"] = \"%s\"", key, value); + } + + @Override + protected String bomAsString(BillOfMaterials bom, String version) { + return "mavenBom(\"" + bom.getGroupId() + ":" + bom.getArtifactId() + ":" + + version + "\")"; + } + + @Override + protected String externalVersionPropertyAsString(String standardFormat) { + return "property(\"" + standardFormat + "\")"; + } + + @Override + protected void writeTasksWithTypeCustomizations(IndentingWriter writer, + GradleBuild build) { + Map tasksWithTypeCustomizations = build + .getTasksWithTypeCustomizations(); + + tasksWithTypeCustomizations.forEach((typeName, customization) -> { + writer.println(); + writer.println("tasks.withType<" + typeName + "> {"); + writer.indented(() -> writeTaskCustomization(writer, customization)); + writer.println("}"); + }); + } + + @Override + protected void writeTaskCustomizations(IndentingWriter writer, GradleBuild build) { + Map taskCustomizations = build.getTaskCustomizations(); + + taskCustomizations.forEach((name, customization) -> { + writer.println(); + writer.println("tasks." + name + " {"); + writer.indented(() -> writeTaskCustomization(writer, customization)); + writer.println("}"); + }); + } + + @Override + protected String invocationAsString(TaskCustomization.Invocation invocation) { + return invocation.getTarget() + "(" + String.join(", ", invocation.getArguments()) + + ")"; + } + + @Override + protected void writeProperty(IndentingWriter writer, String name, String value) { + if (value != null) { + writer.println(String.format("%s = \"%s\"", name, value)); + } + } + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleSettingsWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleSettingsWriter.java new file mode 100644 index 00000000..be20d80d --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleSettingsWriter.java @@ -0,0 +1,36 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.buildsystem.gradle; + +/** + * A {@link GradleBuild} writer for {@code settings.gradle.kts}. + * + * @author Jean-Baptiste Nizet + */ +public class KotlinDslGradleSettingsWriter extends GradleSettingsWriter { + + @Override + protected String wrapWithQuotes(String value) { + return "\"" + value + "\""; + } + + @Override + protected String urlAssignment(String url) { + return "url = uri(\"" + url + "\")"; + } + +} diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriterTests.java similarity index 99% rename from initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriterTests.java rename to initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriterTests.java index 7ce940d0..172a188c 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleBuildWriterTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriterTests.java @@ -30,13 +30,13 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link GradleBuildWriter} + * Tests for {@link GroovyDslGradleBuildWriter} * * @author Andy Wilkinson * @author Jean-Baptiste Nizet * @author Stephane Nicoll */ -class GradleBuildWriterTests { +class GroovyDslGradleBuildWriterTests { @Test void gradleBuildWithCoordinates() throws IOException { @@ -426,7 +426,7 @@ class GradleBuildWriterTests { } private List generateBuild(GradleBuild build) throws IOException { - GradleBuildWriter writer = new GradleBuildWriter(); + GradleBuildWriter writer = new GroovyDslGradleBuildWriter(); StringWriter out = new StringWriter(); writer.writeTo(new IndentingWriter(out), build); return TextTestUtils.readAllLines(out.toString()); diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleSettingsWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleSettingsWriterTests.java similarity index 94% rename from initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleSettingsWriterTests.java rename to initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleSettingsWriterTests.java index d93bdfd3..8e03ffac 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GradleSettingsWriterTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleSettingsWriterTests.java @@ -27,11 +27,12 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link GradleSettingsWriter}. + * Tests for {@link GroovyDslGradleSettingsWriter}. * * @author Andy Wilkinson + * @author Jean-Baptiste Nizet */ -class GradleSettingsWriterTests { +class GroovyDslGradleSettingsWriterTests { @Test void gradleBuildWithMavenCentralPluginRepository() throws IOException { @@ -81,7 +82,7 @@ class GradleSettingsWriterTests { } private List generateSettings(GradleBuild build) throws IOException { - GradleSettingsWriter writer = new GradleSettingsWriter(); + GradleSettingsWriter writer = new GroovyDslGradleSettingsWriter(); StringWriter out = new StringWriter(); writer.writeTo(new IndentingWriter(out), build); return TextTestUtils.readAllLines(out.toString()); diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java new file mode 100644 index 00000000..89f38630 --- /dev/null +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java @@ -0,0 +1,457 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.buildsystem.gradle; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.List; + +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.io.IndentingWriter; +import io.spring.initializr.generator.version.VersionProperty; +import io.spring.initializr.generator.version.VersionReference; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +/** + * Tests for {@link KotlinDslGradleBuildWriter} + * + * @author Jean-Baptiste Nizet + */ +class KotlinDslGradleBuildWriterTests { + + @Test + void gradleBuildWithImports() throws IOException { + GradleBuild build = new GradleBuild(); + build.addImportedType( + "org.springframework.boot.gradle.tasks.buildinfo.BuildInfo"); + build.addImportedType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile"); + build.addImportedType("org.jetbrains.kotlin.gradle.tasks.KotlinCompile"); // same + // import + // added + // twice + + List lines = generateBuild(build); + assertThat(lines.subList(0, 3)).containsExactly( + "import org.jetbrains.kotlin.gradle.tasks.KotlinCompile", + "import org.springframework.boot.gradle.tasks.buildinfo.BuildInfo", ""); + } + + @Test + void gradleBuildWithCoordinates() throws IOException { + GradleBuild build = new GradleBuild(); + build.setGroup("com.example"); + build.setVersion("1.0.1-SNAPSHOT"); + List lines = generateBuild(build); + assertThat(lines).contains("group = \"com.example\"", + "version = \"1.0.1-SNAPSHOT\""); + } + + @Test + void gradleBuildWithSourceCompatibility11() throws IOException { + GradleBuild build = new GradleBuild(); + build.setSourceCompatibility("11"); + List lines = generateBuild(build); + assertThat(lines).contains("java.sourceCompatibility = JavaVersion.VERSION_11"); + } + + @Test + void gradleBuildWithSourceCompatibility1Dot8() throws IOException { + GradleBuild build = new GradleBuild(); + build.setSourceCompatibility("1.8"); + List lines = generateBuild(build); + assertThat(lines).contains("java.sourceCompatibility = JavaVersion.VERSION_1_8"); + } + + @Test + void gradleBuildWithBuildscriptDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.buildscript((buildscript) -> buildscript.dependency( + "org.springframework.boot:spring-boot-gradle-plugin:2.1.0.RELEASE")); + + assertThatIllegalStateException().isThrownBy(() -> { + generateBuild(build); + }); + } + + @Test + void gradleBuildWithBuildscriptExtProperty() throws IOException { + GradleBuild build = new GradleBuild(); + build.buildscript((buildscript) -> buildscript.ext("kotlinVersion", "\1.2.51\"")); + assertThatIllegalStateException().isThrownBy(() -> { + generateBuild(build); + }); + } + + @Test + void gradleBuildWithBuiltinPlugin() throws IOException { + GradleBuild build = new GradleBuild(); + build.addPlugin("java"); + build.addPlugin("war"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("plugins {", " java", " war", "}"); + } + + @Test + void gradleBuildWithKotlinPluginAndVersion() throws IOException { + GradleBuild build = new GradleBuild(); + build.addPlugin("org.jetbrains.kotlin.jvm", "1.3.21"); + build.addPlugin("org.jetbrains.kotlin.plugin.spring", "1.3.21"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("plugins {", + " kotlin(\"jvm\") version \"1.3.21\"", + " kotlin(\"plugin.spring\") version \"1.3.21\"", "}"); + } + + @Test + void gradleBuildWithPluginAndVersion() throws IOException { + GradleBuild build = new GradleBuild(); + build.addPlugin("org.springframework.boot", "2.1.0.RELEASE"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("plugins {", + " id(\"org.springframework.boot\") version \"2.1.0.RELEASE\"", "}"); + } + + @Test + void gradleBuildWithApplyPlugin() throws IOException { + GradleBuild build = new GradleBuild(); + build.applyPlugin("io.spring.dependency-management"); + + assertThatIllegalStateException().isThrownBy(() -> generateBuild(build)); + } + + @Test + void gradleBuildWithMavenCentralRepository() throws IOException { + GradleBuild build = new GradleBuild(); + build.repositories().add("maven-central"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("repositories {", " mavenCentral()", "}"); + } + + @Test + void gradleBuildWithRepository() throws IOException { + GradleBuild build = new GradleBuild(); + build.repositories().add("spring-milestones", "Spring Milestones", + "https://repo.spring.io/milestone"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("repositories {", + " maven { url = uri(\"https://repo.spring.io/milestone\") }", "}"); + } + + @Test + void gradleBuildWithSnapshotRepository() throws IOException { + GradleBuild build = new GradleBuild(); + build.repositories().add("spring-snapshots", "Spring Snapshots", + "https://repo.spring.io/snapshot", true); + List lines = generateBuild(build); + assertThat(lines).containsSequence("repositories {", + " maven { url = uri(\"https://repo.spring.io/snapshot\") }", "}"); + } + + @Test + void gradleBuildWithPluginRepository() throws IOException { + GradleBuild build = new GradleBuild(); + build.pluginRepositories().add("spring-milestones", "Spring Milestones", + "https://repo.spring.io/milestone"); + List lines = generateBuild(build); + assertThat(lines).doesNotContain("repositories {"); + } + + @Test + void gradleBuildWithTaskWithTypesCustomizedWithNestedAssignments() + throws IOException { + GradleBuild build = new GradleBuild(); + build.customizeTasksWithType("KotlinCompile", (task) -> { + task.nested("kotlinOptions", (kotlinOptions) -> { + kotlinOptions.set("freeCompilerArgs", "listOf(\"-Xjsr305=strict\")"); + kotlinOptions.set("jvmTarget", "\"1.8\""); + }); + }); + List lines = generateBuild(build); + assertThat(lines).containsSequence("tasks.withType {", + " kotlinOptions {", + " freeCompilerArgs = listOf(\"-Xjsr305=strict\")", + " jvmTarget = \"1.8\"", " }", "}"); + } + + @Test + void gradleBuildWithTaskCustomizedWithInvocations() throws IOException { + GradleBuild build = new GradleBuild(); + build.customizeTask("asciidoctor", (task) -> { + task.invoke("inputs.dir", "snippetsDir"); + task.invoke("dependsOn", "test"); + }); + List lines = generateBuild(build); + assertThat(lines).containsSequence("tasks.asciidoctor {", + " inputs.dir(snippetsDir)", " dependsOn(test)", "}"); + } + + @Test + void gradleBuildWithTaskCustomizedWithAssignments() throws IOException { + GradleBuild build = new GradleBuild(); + build.customizeTask("compileKotlin", (task) -> { + task.set("kotlinOptions.freeCompilerArgs", "listOf(\"-Xjsr305=strict\")"); + task.set("kotlinOptions.jvmTarget", "\"1.8\""); + }); + List lines = generateBuild(build); + assertThat(lines).containsSequence("tasks.compileKotlin {", + " kotlinOptions.freeCompilerArgs = listOf(\"-Xjsr305=strict\")", + " kotlinOptions.jvmTarget = \"1.8\"", "}"); + } + + @Test + void gradleBuildWithTaskCustomizedWithNestedCustomization() throws IOException { + GradleBuild build = new GradleBuild(); + build.customizeTask("compileKotlin", (compileKotlin) -> compileKotlin + .nested("kotlinOptions", (kotlinOptions) -> { + kotlinOptions.set("freeCompilerArgs", "listOf(\"-Xjsr305=strict\")"); + kotlinOptions.set("jvmTarget", "\"1.8\""); + })); + List lines = generateBuild(build); + assertThat(lines).containsSequence("tasks.compileKotlin {", " kotlinOptions {", + " freeCompilerArgs = listOf(\"-Xjsr305=strict\")", + " jvmTarget = \"1.8\"", " }", "}"); + } + + @Test + void gradleBuildWithExt() throws Exception { + GradleBuild build = new GradleBuild(); + build.setGroup("com.example.demo"); + build.setArtifact("demo"); + build.ext("java.version", "1.8").ext("alpha", "a"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("extra[\"alpha\"] = \"a\"", + "extra[\"java.version\"] = \"1.8\""); + } + + @Test + void gradleBuildWithVersionProperties() throws IOException { + GradleBuild build = new GradleBuild(); + build.addVersionProperty(VersionProperty.of("version.property"), "1.2.3"); + build.addInternalVersionProperty("internal.property", "4.5.6"); + build.addExternalVersionProperty("external.property", "7.8.9"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("extra[\"external.property\"] = \"7.8.9\"", + "extra[\"internalProperty\"] = \"4.5.6\"", + "extra[\"versionProperty\"] = \"1.2.3\""); + } + + @Test + void gradleBuildWithVersionedDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("kotlin-stdlib", "org.jetbrains.kotlin", + "kotlin-stdlib-jdk8", VersionReference.ofProperty("kotlin.version"), + DependencyScope.COMPILE); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " implementation(\"org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}\")", + "}"); + } + + @Test + void gradleBuildWithExternalVersionedDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("acme", "com.example", "acme", + VersionReference.ofProperty(VersionProperty.of("acme.version", false)), + DependencyScope.COMPILE); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " implementation(\"com.example:acme:${property(\"acme.version\")}\")", + "}"); + } + + @Test + void gradleBuildWithExtAndVersionProperties() throws Exception { + GradleBuild build = new GradleBuild(); + build.setGroup("com.example.demo"); + build.setArtifact("demo"); + build.addInternalVersionProperty("test-version", "1.0"); + build.addExternalVersionProperty("alpha-version", "0.1"); + build.ext("myProperty", "42"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("extra[\"myProperty\"] = \"42\"", + "extra[\"alpha-version\"] = \"0.1\"", "extra[\"testVersion\"] = \"1.0\""); + } + + @Test + void gradleBuildWithConfiguration() throws Exception { + GradleBuild build = new GradleBuild(); + build.addConfiguration("developmentOnly"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("configurations {", " developmentOnly", + "}"); + } + + @Test + void gradleBuildWithConfigurationCustomization() throws Exception { + GradleBuild build = new GradleBuild(); + build.customizeConfiguration("developmentOnly", + (configuration) -> configuration.extendsFrom("compile")); + build.customizeConfiguration("developmentOnly", + (configuration) -> configuration.extendsFrom("testCompile")); + List lines = generateBuild(build); + assertThat(lines).containsSequence("configurations {", " developmentOnly {", + " extendsFrom(configurations.compile.get(), configurations.testCompile.get())", + " }", "}"); + } + + @Test + void gradleBuildWithConfigurationCustomizations() throws Exception { + GradleBuild build = new GradleBuild(); + build.customizeConfiguration("developmentOnly", + (configuration) -> configuration.extendsFrom("compile")); + build.customizeConfiguration("testOnly", + (configuration) -> configuration.extendsFrom("testCompile")); + List lines = generateBuild(build); + assertThat(lines).containsSequence("configurations {", " developmentOnly {", + " extendsFrom(configurations.compile.get())", " }", + " testOnly {", " extendsFrom(configurations.testCompile.get())", + " }", "}"); + } + + @Test + void gradleBuildWithAnnotationProcessorDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("annotation-processor", "org.springframework.boot", + "spring-boot-configuration-processor", + DependencyScope.ANNOTATION_PROCESSOR); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " annotationProcessor(\"org.springframework.boot:spring-boot-configuration-processor\")", + "}"); + } + + @Test + void gradleBuildWithCompileDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("root", "org.springframework.boot", + "spring-boot-starter", DependencyScope.COMPILE); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " implementation(\"org.springframework.boot:spring-boot-starter\")", + "}"); + } + + @Test + void gradleBuildWithRuntimeDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("driver", "com.example", "jdbc-driver", + VersionReference.ofValue("1.0.0"), DependencyScope.RUNTIME); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " runtimeOnly(\"com.example:jdbc-driver:1.0.0\")", "}"); + } + + @Test + void gradleBuildWithProvidedRuntimeDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("tomcat", "org.springframework.boot", + "spring-boot-starter-tomcat", DependencyScope.PROVIDED_RUNTIME); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " providedRuntime(\"org.springframework.boot:spring-boot-starter-tomcat\")", + "}"); + } + + @Test + void gradleBuildWithTestCompileDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("test", "org.springframework.boot", + "spring-boot-starter-test", DependencyScope.TEST_COMPILE); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " testImplementation(\"org.springframework.boot:spring-boot-starter-test\")", + "}"); + } + + @Test + void gradleBuildWithCompileOnlyDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("test", "org.springframework.boot", + "spring-boot-starter-foobar", DependencyScope.COMPILE_ONLY); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " compileOnly(\"org.springframework.boot:spring-boot-starter-foobar\")", + "}"); + } + + @Test + void gradleBuildWithTestRuntimeDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("embed-mongo", "de.flapdoodle.embed", + "de.flapdoodle.embed.mongo", DependencyScope.TEST_RUNTIME); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " testRuntimeOnly(\"de.flapdoodle.embed:de.flapdoodle.embed.mongo\")", + "}"); + } + + @Test + void gradleBuildWithNonNullArtifactTypeDependency() throws IOException { + GradleBuild build = new GradleBuild(); + build.dependencies().add("root", "org.springframework.boot", + "spring-boot-starter", null, DependencyScope.COMPILE, "tar.gz"); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " implementation(\"org.springframework.boot:spring-boot-starter@tar.gz\")", + "}"); + } + + @Test + void gradleBuildWithBom() throws IOException { + GradleBuild build = new GradleBuild(); + build.boms().add("test", "com.example", "my-project-dependencies", + VersionReference.ofValue("1.0.0.RELEASE")); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencyManagement {", " imports {", + " mavenBom(\"com.example:my-project-dependencies:1.0.0.RELEASE\")", + " }", "}"); + } + + @Test + void gradleBuildWithOrderedBoms() throws IOException { + GradleBuild build = new GradleBuild(); + build.boms().add("bom1", "com.example", "my-project-dependencies", + VersionReference.ofValue("1.0.0.RELEASE"), 5); + build.boms().add("bom2", "com.example", "root-dependencies", + VersionReference.ofProperty("root.version"), 2); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencyManagement {", " imports {", + " mavenBom(\"com.example:my-project-dependencies:1.0.0.RELEASE\")", + " mavenBom(\"com.example:root-dependencies:${rootVersion}\")", + " }", "}"); + } + + @Test + void gradleBuildWithCustomVersion() throws IOException { + GradleBuild build = new GradleBuild(); + build.setVersion("1.2.4.RELEASE"); + List lines = generateBuild(build); + assertThat(lines).contains("version = \"1.2.4.RELEASE\""); + } + + private List generateBuild(GradleBuild build) throws IOException { + GradleBuildWriter writer = new KotlinDslGradleBuildWriter(); + StringWriter out = new StringWriter(); + writer.writeTo(new IndentingWriter(out), build); + return Arrays.asList(out.toString().split("\\r?\\n")); + } + +} diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleSettingsWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleSettingsWriterTests.java new file mode 100644 index 00000000..474add7a --- /dev/null +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleSettingsWriterTests.java @@ -0,0 +1,90 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.buildsystem.gradle; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.List; + +import io.spring.initializr.generator.io.IndentingWriter; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link KotlinDslGradleSettingsWriter}. + * + * @author Jean-Baptiste Nizet + */ +class KotlinDslGradleSettingsWriterTests { + + @Test + void gradleBuildWithMavenCentralPluginRepository() throws IOException { + GradleBuild build = new GradleBuild(); + build.pluginRepositories().add("maven-central"); + List lines = generateSettings(build); + assertThat(lines).containsSequence("pluginManagement {", " repositories {", + " mavenCentral()", " gradlePluginPortal()", " }", "}"); + } + + @Test + void gradleBuildWithPluginRepository() throws IOException { + GradleBuild build = new GradleBuild(); + build.pluginRepositories().add("spring-milestones", "Spring Milestones", + "https://repo.spring.io/milestone"); + List lines = generateSettings(build); + assertThat(lines).containsSequence("pluginManagement {", " repositories {", + " maven { url = uri(\"https://repo.spring.io/milestone\") }", + " gradlePluginPortal()", " }", " resolutionStrategy {", + " eachPlugin {", + " if (requested.id.id == \"org.springframework.boot\") {", + " useModule(\"org.springframework.boot:spring-boot-gradle-plugin:${requested.version}\")", + " }", " }", " }", "}"); + } + + @Test + void gradleBuildWithSnapshotPluginRepository() throws IOException { + GradleBuild build = new GradleBuild(); + build.pluginRepositories().add("spring-snapshots", "Spring Snapshots", + "https://repo.spring.io/snapshot", true); + List lines = generateSettings(build); + assertThat(lines).containsSequence("pluginManagement {", " repositories {", + " maven { url = uri(\"https://repo.spring.io/snapshot\") }", + " gradlePluginPortal()", " }", " resolutionStrategy {", + " eachPlugin {", + " if (requested.id.id == \"org.springframework.boot\") {", + " useModule(\"org.springframework.boot:spring-boot-gradle-plugin:${requested.version}\")", + " }", " }", " }", "}"); + } + + @Test + void artifactIdShouldBeUsedAsTheRootProjectName() throws Exception { + GradleBuild build = new GradleBuild(); + build.setArtifact("my-application"); + List lines = generateSettings(build); + assertThat(lines).containsSequence("rootProject.name = \"my-application\""); + } + + private List generateSettings(GradleBuild build) throws IOException { + GradleSettingsWriter writer = new KotlinDslGradleSettingsWriter(); + StringWriter out = new StringWriter(); + writer.writeTo(new IndentingWriter(out), build); + return Arrays.asList(out.toString().split("\\r?\\n")); + } + +} diff --git a/initializr-web/src/main/java/io/spring/initializr/web/project/MainController.java b/initializr-web/src/main/java/io/spring/initializr/web/project/MainController.java index f43b2d2e..1ea5014a 100644 --- a/initializr-web/src/main/java/io/spring/initializr/web/project/MainController.java +++ b/initializr-web/src/main/java/io/spring/initializr/web/project/MainController.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import io.spring.initializr.generator.buildsystem.BuildSystem; -import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.io.template.TemplateRenderer; import io.spring.initializr.generator.project.ResolvedProjectDescription; import io.spring.initializr.generator.version.Version; @@ -316,8 +316,7 @@ public class MainController extends AbstractInitializrController { private static String getWrapperScript(ResolvedProjectDescription description) { BuildSystem buildSystem = description.getBuildSystem(); - String script = buildSystem.id().equals(GradleBuildSystem.ID) ? "gradlew" - : "mvnw"; + String script = buildSystem.id().equals(MavenBuildSystem.ID) ? "mvnw" : "gradlew"; return (description.getBaseDirectory() != null) ? description.getBaseDirectory() + "/" + script : script; }