Correct Kotlin DSL syntax for adding and customizing configurations

Fixes gh-917
This commit is contained in:
Andy Wilkinson
2019-06-06 09:51:20 +01:00
parent a79a9ae101
commit 04b2777b32
7 changed files with 66 additions and 48 deletions

View File

@@ -18,7 +18,6 @@ package io.spring.initializr.generator.spring.build.gradle;
import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.buildsystem.DependencyScope;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuild.ConfigurationCustomization;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@@ -37,11 +36,7 @@ class GradleConfigurationBuildCustomizerTests {
build.dependencies().add("servlet", "javax.servlet", "servlet-api", build.dependencies().add("servlet", "javax.servlet", "servlet-api",
DependencyScope.PROVIDED_RUNTIME); DependencyScope.PROVIDED_RUNTIME);
customize(build); customize(build);
assertThat(build.getConfigurationCustomizations()) assertThat(build.getConfigurations()).containsOnly("providedRuntime");
.containsOnlyKeys("providedRuntime");
ConfigurationCustomization providedRuntime = build
.getConfigurationCustomizations().get("providedRuntime");
assertThat(providedRuntime.getExtendsFrom()).isEmpty();
} }
@Test @Test

View File

@@ -10,7 +10,7 @@ java.sourceCompatibility = JavaVersion.VERSION_1_8
configurations { configurations {
compileOnly { compileOnly {
extendsFrom(configurations.annotationProcessor.get()) extendsFrom(annotationProcessor)
} }
} }

View File

@@ -50,6 +50,8 @@ public class GradleBuild extends Build {
private final List<String> appliedPlugins = new ArrayList<>(); private final List<String> appliedPlugins = new ArrayList<>();
private final List<String> configurations = new ArrayList<>();
private final Map<String, ConfigurationCustomization> configurationCustomizations = new LinkedHashMap<>(); private final Map<String, ConfigurationCustomization> configurationCustomizations = new LinkedHashMap<>();
private final Map<String, TaskCustomization> taskCustomizations = new LinkedHashMap<>(); private final Map<String, TaskCustomization> taskCustomizations = new LinkedHashMap<>();
@@ -122,14 +124,17 @@ public class GradleBuild extends Build {
} }
public void addConfiguration(String configurationName) { public void addConfiguration(String configurationName) {
customizeConfiguration(configurationName, (configuration) -> { this.configurations.add(configurationName);
});
} }
public Map<String, ConfigurationCustomization> getConfigurationCustomizations() { public Map<String, ConfigurationCustomization> getConfigurationCustomizations() {
return Collections.unmodifiableMap(this.configurationCustomizations); return Collections.unmodifiableMap(this.configurationCustomizations);
} }
public List<String> getConfigurations() {
return Collections.unmodifiableList(this.configurations);
}
public Set<String> getImportedTypes() { public Set<String> getImportedTypes() {
return Collections.unmodifiableSet(this.importedTypes); return Collections.unmodifiableSet(this.importedTypes);
} }

View File

@@ -85,18 +85,8 @@ public abstract class GradleBuildWriter {
protected abstract void writeJavaSourceCompatibility(IndentingWriter writer, protected abstract void writeJavaSourceCompatibility(IndentingWriter writer,
GradleBuild build); GradleBuild build);
private void writeConfigurations(IndentingWriter writer, GradleBuild build) { protected abstract void writeConfigurations(IndentingWriter writer,
Map<String, ConfigurationCustomization> configurationCustomizations = build GradleBuild build);
.getConfigurationCustomizations();
if (configurationCustomizations.isEmpty()) {
return;
}
writer.println("configurations {");
writer.indented(() -> configurationCustomizations.forEach((name,
customization) -> writeConfiguration(writer, name, customization)));
writer.println("}");
writer.println("");
}
protected abstract void writeConfiguration(IndentingWriter writer, protected abstract void writeConfiguration(IndentingWriter writer,
String configurationName, String configurationName,

View File

@@ -24,6 +24,7 @@ import io.spring.initializr.generator.buildsystem.BillOfMaterials;
import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.Dependency;
import io.spring.initializr.generator.buildsystem.Dependency.Exclusion; import io.spring.initializr.generator.buildsystem.Dependency.Exclusion;
import io.spring.initializr.generator.buildsystem.MavenRepository; import io.spring.initializr.generator.buildsystem.MavenRepository;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuild.ConfigurationCustomization;
import io.spring.initializr.generator.io.IndentingWriter; import io.spring.initializr.generator.io.IndentingWriter;
import io.spring.initializr.generator.version.VersionProperty; import io.spring.initializr.generator.version.VersionProperty;
import io.spring.initializr.generator.version.VersionReference; import io.spring.initializr.generator.version.VersionReference;
@@ -93,15 +94,10 @@ public class GroovyDslGradleBuildWriter extends GradleBuildWriter {
@Override @Override
protected void writeConfiguration(IndentingWriter writer, String configurationName, protected void writeConfiguration(IndentingWriter writer, String configurationName,
GradleBuild.ConfigurationCustomization configurationCustomization) { GradleBuild.ConfigurationCustomization configurationCustomization) {
if (configurationCustomization.getExtendsFrom().isEmpty()) { writer.println(configurationName + " {");
writer.println(configurationName); writer.indented(() -> writer.println(String.format("extendsFrom %s",
} String.join(", ", configurationCustomization.getExtendsFrom()))));
else { writer.println("}");
writer.println(configurationName + " {");
writer.indented(() -> writer.println(String.format("extendsFrom %s",
String.join(", ", configurationCustomization.getExtendsFrom()))));
writer.println("}");
}
} }
@Override @Override
@@ -124,6 +120,24 @@ public class GroovyDslGradleBuildWriter extends GradleBuildWriter {
return String.format("set('%s', %s)", key, value); return String.format("set('%s', %s)", key, value);
} }
@Override
protected void writeConfigurations(IndentingWriter writer, GradleBuild build) {
Map<String, ConfigurationCustomization> configurationCustomizations = build
.getConfigurationCustomizations();
List<String> configurations = build.getConfigurations();
if (configurations.isEmpty() && configurationCustomizations.isEmpty()) {
return;
}
writer.println("configurations {");
writer.indented(() -> {
configurations.forEach(writer::println);
configurationCustomizations.forEach((name,
customization) -> writeConfiguration(writer, name, customization));
});
writer.println("}");
writer.println("");
}
@Override @Override
protected void writeDependency(IndentingWriter writer, Dependency dependency) { protected void writeDependency(IndentingWriter writer, Dependency dependency) {
String quoteStyle = determineQuoteStyle(dependency.getVersion()); String quoteStyle = determineQuoteStyle(dependency.getVersion());

View File

@@ -117,7 +117,6 @@ public class KotlinDslGradleBuildWriter extends GradleBuildWriter {
writer.println(configurationName + " {"); writer.println(configurationName + " {");
writer.indented(() -> writer.println(String.format("extendsFrom(%s)", writer.indented(() -> writer.println(String.format("extendsFrom(%s)",
configurationCustomization.getExtendsFrom().stream() configurationCustomization.getExtendsFrom().stream()
.map((c) -> "configurations." + c + ".get()")
.collect(Collectors.joining(", "))))); .collect(Collectors.joining(", ")))));
writer.println("}"); writer.println("}");
} }
@@ -131,6 +130,23 @@ public class KotlinDslGradleBuildWriter extends GradleBuildWriter {
return "maven { url = uri(\"" + repository.getUrl() + "\") }"; return "maven { url = uri(\"" + repository.getUrl() + "\") }";
} }
@Override
protected void writeConfigurations(IndentingWriter writer, GradleBuild build) {
Map<String, ConfigurationCustomization> configurationCustomizations = build
.getConfigurationCustomizations();
for (String configuration : build.getConfigurations()) {
writer.println("val " + configuration + " by configurations.creating");
}
if (configurationCustomizations.isEmpty()) {
return;
}
writer.println("configurations {");
writer.indented(() -> configurationCustomizations.forEach((name,
customization) -> writeConfiguration(writer, name, customization)));
writer.println("}");
writer.println("");
}
@Override @Override
protected void writeDependency(IndentingWriter writer, Dependency dependency) { protected void writeDependency(IndentingWriter writer, Dependency dependency) {
String version = determineVersion(dependency.getVersion()); String version = determineVersion(dependency.getVersion());

View File

@@ -290,35 +290,33 @@ class KotlinDslGradleBuildWriterTests {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.addConfiguration("developmentOnly"); build.addConfiguration("developmentOnly");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).containsSequence("configurations {", " developmentOnly", assertThat(lines)
"}"); .containsSequence("val developmentOnly by configurations.creating");
} }
@Test @Test
void gradleBuildWithConfigurationCustomization() throws Exception { void gradleBuildWithConfigurationCustomization() throws Exception {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.customizeConfiguration("developmentOnly", build.customizeConfiguration("runtimeClasspath",
(configuration) -> configuration.extendsFrom("compile")); (configuration) -> configuration.extendsFrom("custom1"));
build.customizeConfiguration("developmentOnly", build.customizeConfiguration("runtimeClasspath",
(configuration) -> configuration.extendsFrom("testCompile")); (configuration) -> configuration.extendsFrom("custom2"));
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).containsSequence("configurations {", " developmentOnly {", assertThat(lines).containsSequence("configurations {", " runtimeClasspath {",
" extendsFrom(configurations.compile.get(), configurations.testCompile.get())", " extendsFrom(custom1, custom2)", " }", "}");
" }", "}");
} }
@Test @Test
void gradleBuildWithConfigurationCustomizations() throws Exception { void gradleBuildWithConfigurationCustomizations() throws Exception {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.customizeConfiguration("developmentOnly", build.customizeConfiguration("runtimeClasspath",
(configuration) -> configuration.extendsFrom("compile")); (configuration) -> configuration.extendsFrom("custom1"));
build.customizeConfiguration("testOnly", build.customizeConfiguration("testRuntimeClasspath",
(configuration) -> configuration.extendsFrom("testCompile")); (configuration) -> configuration.extendsFrom("custom2"));
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).containsSequence("configurations {", " developmentOnly {", assertThat(lines).containsSequence("configurations {", " runtimeClasspath {",
" extendsFrom(configurations.compile.get())", " }", " extendsFrom(custom1)", " }", " testRuntimeClasspath {",
" testOnly {", " extendsFrom(configurations.testCompile.get())", " extendsFrom(custom2)", " }", "}");
" }", "}");
} }
@Test @Test