diff --git a/buildSrc/src/main/kotlin/prepare-config-resources.gradle.kts b/buildSrc/src/main/kotlin/prepare-config-resources.gradle.kts index 5b242dc0..37a7ae4d 100644 --- a/buildSrc/src/main/kotlin/prepare-config-resources.gradle.kts +++ b/buildSrc/src/main/kotlin/prepare-config-resources.gradle.kts @@ -55,7 +55,17 @@ tasks.processResources { val spineBaseVersion: String by extra val spineTimeVersion: String by extra val spineVersion: String by extra +val spineWebVersion: String by extra +val spineGCloudVersion: String by extra +/* + This task creates the `artifact-snapshot.properties` file which is later added to the classpath of + the Bootstrap plugin. The file contains versions, artifact notations, repositories, etc. used in + the Gradle scripts which should also be used in the runtime of the Bootstrap plugin. + + The keys for the `artifact-snapshot.properties` file are duplicated in + the `io.spine.tools.gradle.config.ArtifactSnapshot` class, where the file is parsed. + */ val writeDependencies by tasks.registering { group = taskGroup @@ -76,6 +86,8 @@ val writeDependencies by tasks.registering { artifacts.setProperty("spine.version.base", spineBaseVersion) artifacts.setProperty("spine.version.time", spineTimeVersion) artifacts.setProperty("spine.version.core", spineVersion) + artifacts.setProperty("spine.version.web", spineWebVersion) + artifacts.setProperty("spine.version.gcloud", spineWebVersion) artifacts.setProperty("protobuf.compiler", Deps.build.protoc) artifacts.setProperty("protobuf.java", Deps.build.protobuf[0]) artifacts.setProperty("grpc.stub", Deps.grpc.stub) diff --git a/license-report.md b/license-report.md index 004864d2..f3c7348a 100644 --- a/license-report.md +++ b/license-report.md @@ -1,6 +1,6 @@ -# Dependencies of `io.spine.tools:spine-plugin:1.5.27` +# Dependencies of `io.spine.tools:spine-plugin:1.5.28` ## Runtime 1. **Group:** com.google.code.findbugs **Name:** jsr305 **Version:** 3.0.2 @@ -338,4 +338,4 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Aug 28 17:52:22 EEST 2020** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). \ No newline at end of file +This report was generated on **Thu Sep 03 12:51:44 EEST 2020** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). \ No newline at end of file diff --git a/plugin/src/main/java/io/spine/tools/gradle/bootstrap/JavaExtension.java b/plugin/src/main/java/io/spine/tools/gradle/bootstrap/JavaExtension.java index c0eb6aaa..405a3659 100644 --- a/plugin/src/main/java/io/spine/tools/gradle/bootstrap/JavaExtension.java +++ b/plugin/src/main/java/io/spine/tools/gradle/bootstrap/JavaExtension.java @@ -26,11 +26,17 @@ import io.spine.tools.gradle.Artifact; import io.spine.tools.gradle.ConfigurationName; import io.spine.tools.gradle.GeneratedSourceRoot; +import io.spine.tools.gradle.compiler.Extension; import io.spine.tools.gradle.config.ArtifactSnapshot; import io.spine.tools.gradle.config.SpineDependency; import io.spine.tools.gradle.project.SourceSuperset; import org.gradle.api.Action; import org.gradle.api.Project; +import org.gradle.plugins.ide.idea.model.IdeaModel; +import org.gradle.plugins.ide.idea.model.IdeaModule; + +import java.io.File; +import java.util.Set; import static com.google.common.base.Preconditions.checkNotNull; import static io.spine.tools.gradle.ConfigurationName.implementation; @@ -69,6 +75,32 @@ void enableGeneration() { pluginTarget().apply(SpinePluginScripts.modelCompilerConfig()); addSourceSets(); excludeProtobufLite(); + pluginTarget().withIdeaPlugin(this::configureIdea); + } + + private void configureIdea(IdeaModel idea) { + IdeaModule module = idea.getModule(); + + Set mainSrc = module.getSourceDirs(); + Set mainGenerated = module.getGeneratedSourceDirs(); + add(mainSrc, Extension.getMainProtoSrcDir(project)); + add(mainGenerated, Extension.getMainGenProtoDir(project)); + add(mainGenerated, Extension.getMainGenGrpcDir(project)); + add(mainGenerated, Extension.getTargetGenColumnsRootDir(project)); + add(mainGenerated, Extension.getTargetGenRejectionsRootDir(project)); + + Set testSrc = module.getTestSourceDirs(); + add(testSrc, Extension.getTestProtoSrcDir(project)); + add(testSrc, Extension.getTestGenProtoDir(project)); + add(testSrc, Extension.getTestGenGrpcDir(project)); + + module.setDownloadJavadoc(true); + module.setDownloadSources(true); + } + + private static void add(Set files, String path) { + File file = new File(path); + files.add(file); } private void excludeProtobufLite() { @@ -83,7 +115,7 @@ public void codegen(Action config) { config.execute(codegen); } - public void codegen(Closure config) { + public void codegen(@SuppressWarnings("rawtypes") /* For Gradle API. */ Closure config) { configure(config, codegen); } @@ -109,6 +141,43 @@ public void server() { dependOnCore(SpineDependency.testUtilServer(), testImplementation); } + /** + * Marks this project as a part of a Java server and a Web server. + * + *

Additionally to the {@linkplain #server() server} dependencies, adds a dependency on + * {@code io.spine:spine-web}. + */ + public void webServer() { + dependOnWeb(SpineDependency.web()); + } + + /** + * Marks this project as a part of a Java server and a Web server based on the Firebase RDB. + * + *

Additionally to the {@linkplain #server() server} dependencies, adds a dependency on + * {@code io.spine.gcloud:spine-firebase-web}. + */ + public void firebaseWebServer() { + dependOnWeb(SpineDependency.firebaseWeb()); + } + + /** + * Marks this project as a part of a Java server and adds the Google Cloud Datastore storage + * dependency to the project. + */ + public void withDatastore() { + server(); + Artifact dependency = SpineDependency.datastore() + .ofVersion(artifacts.spineGCloudVersion()); + dependOn(dependency, implementation); + } + + private void dependOnWeb(SpineDependency dependency) { + server(); + String version = artifacts.spineWebVersion(); + dependOn(dependency.ofVersion(version), implementation); + } + private void dependOn(Artifact module, ConfigurationName configurationName) { dependant().depend(configurationName, module.notation()); } diff --git a/plugin/src/main/java/io/spine/tools/gradle/bootstrap/SpinePluginTarget.java b/plugin/src/main/java/io/spine/tools/gradle/bootstrap/SpinePluginTarget.java index 7a8dd7d1..95ea6895 100644 --- a/plugin/src/main/java/io/spine/tools/gradle/bootstrap/SpinePluginTarget.java +++ b/plugin/src/main/java/io/spine/tools/gradle/bootstrap/SpinePluginTarget.java @@ -26,7 +26,13 @@ import io.spine.tools.gradle.PluginScript; import io.spine.tools.gradle.compiler.ModelCompilerPlugin; import io.spine.tools.gradle.project.PluginTarget; +import org.gradle.api.Plugin; +import org.gradle.api.Project; import org.gradle.api.plugins.JavaPlugin; +import org.gradle.plugins.ide.idea.IdeaPlugin; +import org.gradle.plugins.ide.idea.model.IdeaModel; + +import java.util.function.Consumer; import static com.google.common.base.Preconditions.checkNotNull; @@ -45,7 +51,12 @@ public SpinePluginTarget(PluginTarget delegate) { } @Override - public void apply(GradlePlugin plugin) { + public

> void with(GradlePlugin

plugin, Consumer

action) { + delegate.with(plugin, action); + } + + @Override + public void apply(GradlePlugin plugin) { delegate.apply(plugin); } @@ -55,7 +66,7 @@ public void apply(PluginScript pluginScript) { } @Override - public boolean isApplied(GradlePlugin plugin) { + public boolean isApplied(GradlePlugin plugin) { return delegate.isApplied(plugin); } @@ -63,7 +74,7 @@ public boolean isApplied(GradlePlugin plugin) { * Applies the standard {@link JavaPlugin}. */ public void applyJavaPlugin() { - GradlePlugin javaPlugin = GradlePlugin.implementedIn(JavaPlugin.class); + GradlePlugin javaPlugin = GradlePlugin.implementedIn(JavaPlugin.class); apply(javaPlugin); } @@ -74,7 +85,7 @@ public void applyJavaPlugin() { */ public void applyProtobufPlugin() { applyJavaPlugin(); - GradlePlugin protoPlugin = GradlePlugin.implementedIn(ProtobufPlugin.class); + GradlePlugin protoPlugin = GradlePlugin.implementedIn(ProtobufPlugin.class); apply(protoPlugin); } @@ -82,7 +93,7 @@ public void applyProtobufPlugin() { * Applies the {@link ModelCompilerPlugin}. */ public void applyModelCompiler() { - GradlePlugin plugin = GradlePlugin.implementedIn(ModelCompilerPlugin.class); + GradlePlugin plugin = GradlePlugin.implementedIn(ModelCompilerPlugin.class); apply(plugin); } @@ -90,7 +101,15 @@ public void applyModelCompiler() { * Applies the {@link ProtoJsPlugin}. */ public void applyProtoJsPlugin() { - GradlePlugin plugin = GradlePlugin.implementedIn(ProtoJsPlugin.class); + GradlePlugin plugin = GradlePlugin.implementedIn(ProtoJsPlugin.class); apply(plugin); } + + /** + * Checks if the {@code idea} plugin is applied to this project. + */ + public void withIdeaPlugin(Consumer action) { + GradlePlugin plugin = GradlePlugin.implementedIn(IdeaPlugin.class); + with(plugin, idea -> action.accept(idea.getModel())); + } } diff --git a/plugin/src/main/java/io/spine/tools/gradle/config/ArtifactSnapshot.java b/plugin/src/main/java/io/spine/tools/gradle/config/ArtifactSnapshot.java index 239d69b8..7e31b60f 100644 --- a/plugin/src/main/java/io/spine/tools/gradle/config/ArtifactSnapshot.java +++ b/plugin/src/main/java/io/spine/tools/gradle/config/ArtifactSnapshot.java @@ -44,6 +44,8 @@ public final class ArtifactSnapshot { private final String spineBaseVersion; private final String spineTimeVersion; private final String spineCoreVersion; + private final String spineWebVersion; + private final String spineGCloudVersion; private final String protoc; private final String protobufJava; @@ -60,6 +62,8 @@ private ArtifactSnapshot(Builder builder) { this.spineBaseVersion = checkNotNull(builder.spineBaseVersion); this.spineTimeVersion = checkNotNull(builder.spineTimeVersion); this.spineCoreVersion = checkNotNull(builder.spineCoreVersion); + this.spineWebVersion = checkNotNull(builder.spineWebVersion); + this.spineGCloudVersion = checkNotNull(builder.spineGCloudVersion); this.protoc = checkNotNull(builder.protoc); this.protobufJava = checkNotNull(builder.protobufJava); this.grpcProtobuf = checkNotNull(builder.grpcProtobuf); @@ -68,6 +72,14 @@ private ArtifactSnapshot(Builder builder) { this.spineSnapshotRepository = checkNotNull(builder.spineSnapshotRepository); } + /** + * Loads the values from the {@code artifact-snapshot.properties} file from classpath. + * + *

The keys for the {@code artifact-snapshot.properties} file are duplicated in + * the {@code prepare-config-resources.gradle.kts} Gradle script, where the file is generated. + * + * @return loaded {@code ArtifactSnapshot} + */ private static ArtifactSnapshot load() { Resource file = Resource.file("artifact-snapshot.properties"); Properties properties = new Properties(); @@ -80,6 +92,8 @@ private static ArtifactSnapshot load() { .setSpineCoreVersion(properties.getProperty("spine.version.core")) .setSpineBaseVersion(properties.getProperty("spine.version.base")) .setSpineTimeVersion(properties.getProperty("spine.version.time")) + .setSpineWebVersion(properties.getProperty("spine.version.web")) + .setSpineGCloudVersion(properties.getProperty("spine.version.gcloud")) .setProtoc(properties.getProperty("protobuf.compiler")) .setProtobufJava(properties.getProperty("protobuf.java")) .setGrpcProtobuf(properties.getProperty("grpc.protobuf")) @@ -120,6 +134,20 @@ public String spineTimeVersion() { return spineTimeVersion; } + /** + * Obtains the current version of Spine {@code web} API. + */ + public String spineWebVersion() { + return spineWebVersion; + } + + /** + * Obtains the current version of Spine GCloud. + */ + public String spineGCloudVersion() { + return spineGCloudVersion; + } + /** * Obtains the Maven repository which hosts Spine artifacts with release versions. */ @@ -173,6 +201,8 @@ public static final class Builder { private String spineBaseVersion; private String spineTimeVersion; private String spineCoreVersion; + private String spineWebVersion; + private String spineGCloudVersion; private String protoc; private String protobufJava; private String grpcProtobuf; @@ -201,6 +231,16 @@ public Builder setSpineCoreVersion(String version) { return this; } + public Builder setSpineWebVersion(String spineWebVersion) { + this.spineWebVersion = checkNotNull(spineWebVersion); + return this; + } + + public Builder setSpineGCloudVersion(String spineGCloudVersion) { + this.spineGCloudVersion = checkNotNull(spineGCloudVersion); + return this; + } + public Builder setProtoc(String artifact) { this.protoc = checkNotNull(artifact); return this; diff --git a/plugin/src/main/java/io/spine/tools/gradle/config/SpineDependency.java b/plugin/src/main/java/io/spine/tools/gradle/config/SpineDependency.java index 9545a825..2c619f7a 100644 --- a/plugin/src/main/java/io/spine/tools/gradle/config/SpineDependency.java +++ b/plugin/src/main/java/io/spine/tools/gradle/config/SpineDependency.java @@ -27,20 +27,43 @@ */ public final class SpineDependency implements Dependency { - private static final String SPINE_PREFIX = "spine-"; + private static final String DEFAULT_GROUP = "io.spine"; + private static final String G_CLOUD_GROUP = DEFAULT_GROUP + ".gcloud"; - private static final SpineDependency BASE = new SpineDependency("base"); - private static final SpineDependency TIME = new SpineDependency("time"); - private static final SpineDependency CLIENT = new SpineDependency("client"); - private static final SpineDependency SERVER = new SpineDependency("server"); - private static final SpineDependency TEST_UTIL_SERVER = new SpineDependency("testutil-server"); - private static final SpineDependency TEST_UTIL_CLIENT = new SpineDependency("testutil-client"); - private static final SpineDependency TESTLIB = new SpineDependency("testlib"); - private static final SpineDependency TEST_UTIL_TIME = new SpineDependency("testutil-time"); + private static final String SPINE_PREFIX = "spine-"; + private static final SpineDependency BASE = + new SpineDependency("base"); + private static final SpineDependency TIME = + new SpineDependency("time"); + private static final SpineDependency CLIENT = + new SpineDependency("client"); + private static final SpineDependency SERVER = + new SpineDependency("server"); + private static final SpineDependency TEST_UTIL_SERVER = + new SpineDependency("testutil-server"); + private static final SpineDependency TEST_UTIL_CLIENT = + new SpineDependency("testutil-client"); + private static final SpineDependency TESTLIB = + new SpineDependency("testlib"); + private static final SpineDependency TEST_UTIL_TIME = + new SpineDependency("testutil-time"); + private static final SpineDependency WEB = + new SpineDependency("web"); + private static final SpineDependency FIREBASE_WEB = + new SpineDependency(G_CLOUD_GROUP, "firebase-web"); + private static final SpineDependency DATASTORE = + new SpineDependency(G_CLOUD_GROUP, "datastore"); + + private final String group; private final String shortName; private SpineDependency(String name) { + this(DEFAULT_GROUP, name); + } + + private SpineDependency(String group, String name) { + this.group = group; this.shortName = name; } @@ -100,6 +123,18 @@ public static SpineDependency testUtilTime() { return TEST_UTIL_TIME; } + public static SpineDependency web() { + return WEB; + } + + public static SpineDependency firebaseWeb() { + return FIREBASE_WEB; + } + + public static SpineDependency datastore() { + return DATASTORE; + } + @Override public String name() { return SPINE_PREFIX + shortName; @@ -107,7 +142,7 @@ public String name() { @Override public String groupId() { - return "io.spine"; + return group; } @Override diff --git a/plugin/src/test/build.gradle.template b/plugin/src/test/build.gradle.template index 2a5939a0..f977bb57 100644 --- a/plugin/src/test/build.gradle.template +++ b/plugin/src/test/build.gradle.template @@ -22,6 +22,10 @@ plugins { id 'io.spine.tools.gradle.bootstrap' version '@spine-version@' } +repositories { + mavenLocal() +} + // This script file is created at a test runtime by the `GradleProject`. // // If Spine Bootstrap plugin requires a configuration, specific to a test case, the test case diff --git a/plugin/src/test/java/io/spine/tools/gradle/bootstrap/ExtensionTest.java b/plugin/src/test/java/io/spine/tools/gradle/bootstrap/ExtensionTest.java index 25e3937f..c51bd15d 100644 --- a/plugin/src/test/java/io/spine/tools/gradle/bootstrap/ExtensionTest.java +++ b/plugin/src/test/java/io/spine/tools/gradle/bootstrap/ExtensionTest.java @@ -55,7 +55,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -@DisplayName("`spine` extension øshould") +@DisplayName("`spine` extension should") class ExtensionTest { private PluginTarget pluginTarget; @@ -174,6 +174,31 @@ void addTestUtilTimeDependecy() { .contains(testUtilTimeDependency()); } + @Test + @DisplayName("add `web` dependencies to a Java project") + void addWebDependency() { + extension.enableJava(JavaExtension::webServer); + assertThat(dependencyTarget.dependencies()) + .contains(webDependency()); + } + + @Test + @DisplayName("add `firebase-web` dependencies to a Java project") + void addFirebaseWebDependency() { + extension.enableJava(JavaExtension::firebaseWebServer); + assertThat(dependencyTarget.dependencies()) + .contains(firebaseWebDependency()); + } + + @Test + @DisplayName("add `gcloud` dependency to a Java project") + void addGCloudDependency() { + extension.enableJava(JavaExtension::withDatastore); + IterableSubject assertDependencies = assertThat(dependencyTarget.dependencies()); + assertDependencies + .contains(datastoreDependency()); + } + @Test @DisplayName("apply `com.google.protobuf` plugin to a Java project") void applyProtoForJava() { @@ -376,6 +401,18 @@ private String testUtilTimeDependency() { return "io.spine:spine-testutil-time:" + spineVersion; } + private String webDependency() { + return "io.spine:spine-web:" + spineVersion; + } + + private String firebaseWebDependency() { + return "io.spine.gcloud:spine-firebase-web:" + spineVersion; + } + + private String datastoreDependency() { + return "io.spine.gcloud:spine-datastore:" + spineVersion; + } + private void assertApplied(Class> pluginClass) { GradlePlugin plugin = GradlePlugin.implementedIn(pluginClass); assertTrue(pluginTarget.isApplied(plugin), diff --git a/plugin/src/test/java/io/spine/tools/gradle/bootstrap/given/FakeArtifacts.java b/plugin/src/test/java/io/spine/tools/gradle/bootstrap/given/FakeArtifacts.java index 8ac84b04..183ffe24 100644 --- a/plugin/src/test/java/io/spine/tools/gradle/bootstrap/given/FakeArtifacts.java +++ b/plugin/src/test/java/io/spine/tools/gradle/bootstrap/given/FakeArtifacts.java @@ -41,6 +41,8 @@ public static ArtifactSnapshot snapshot() { .setSpineBaseVersion(spineVersion) .setSpineTimeVersion(spineVersion) .setSpineCoreVersion(spineVersion) + .setSpineWebVersion(spineVersion) + .setSpineGCloudVersion(spineVersion) .setGrpcProtobuf(GRPC_PROTO_DEPENDENCY) .setGrpcStub(GRPC_STUB_DEPENDENCY) .setProtoc("com.google.protobuf:protoc:3.6.1") diff --git a/pom.xml b/pom.xml index 150b79a7..00bd1740 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ all modules and does not describe the project structure per-subproject. io.spine.tools spine-bootstrap -1.5.27 +1.5.28 2015 @@ -52,25 +52,25 @@ all modules and does not describe the project structure per-subproject. io.spine spine-base - 1.5.29 + 1.5.31 compile io.spine.tools spine-model-compiler - 1.5.29 + 1.5.31 compile io.spine.tools spine-plugin-base - 1.5.29 + 1.5.31 compile io.spine.tools spine-proto-js-plugin - 1.5.29 + 1.5.31 compile @@ -106,13 +106,13 @@ all modules and does not describe the project structure per-subproject. io.spine spine-testlib - 1.5.29 + 1.5.31 test io.spine.tools spine-plugin-testlib - 1.5.29 + 1.5.31 test @@ -152,7 +152,7 @@ all modules and does not describe the project structure per-subproject. io.spine.tools spine-protoc-plugin - 1.5.29 + 1.5.31 net.sourceforge.pmd diff --git a/version.gradle.kts b/version.gradle.kts index 4c8a0a97..e33b6b7c 100644 --- a/version.gradle.kts +++ b/version.gradle.kts @@ -29,7 +29,9 @@ * already in the root directory. */ -val spineBaseVersion: String by extra("1.5.29") +val spineBaseVersion: String by extra("1.5.31") val spineTimeVersion: String by extra("1.5.24") -val spineVersion: String by extra("1.5.26") -val pluginVersion: String by extra("1.5.27") +val spineVersion: String by extra("1.5.27") +val spineWebVersion: String by extra("1.5.25") +val spineGCloudVersion: String by extra("1.5.22") +val pluginVersion: String by extra("1.5.28")