From 32d807139de9c558dfd7fa288087c63452c01c0d Mon Sep 17 00:00:00 2001 From: Oliver Marienfeld Date: Sat, 30 Nov 2024 11:26:18 +0100 Subject: [PATCH 1/2] Add Scala/Maven starter --- .../java/io/vertx/starter/model/Language.java | 5 +- src/main/resources/templates/pom.xml.ftl | 90 ++++++++++++++++++- .../src/main/scala/MainVerticle.scala.ftl | 28 ++++++ .../src/test/scala/TestMainVerticle.scala.ftl | 24 +++++ 4 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl create mode 100644 src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl diff --git a/src/main/java/io/vertx/starter/model/Language.java b/src/main/java/io/vertx/starter/model/Language.java index 530e7507..d28cb632 100644 --- a/src/main/java/io/vertx/starter/model/Language.java +++ b/src/main/java/io/vertx/starter/model/Language.java @@ -25,7 +25,10 @@ public enum Language { JAVA("java", ".java"), @JsonProperty("kotlin") - KOTLIN("kotlin", ".kt", "vertx-lang-kotlin"); + KOTLIN("kotlin", ".kt", "vertx-lang-kotlin"), + + @JsonProperty("scala") + SCALA("scala", ".scala"); private final String name; private final String extension; diff --git a/src/main/resources/templates/pom.xml.ftl b/src/main/resources/templates/pom.xml.ftl index 8c6cbf90..ae365352 100644 --- a/src/main/resources/templates/pom.xml.ftl +++ b/src/main/resources/templates/pom.xml.ftl @@ -18,6 +18,9 @@ 1.7.21 +<#elseif language == "scala"> + 3.5.2 + 3.2.19 <#else> 3.8.1 @@ -89,6 +92,20 @@ + +<#elseif language == "scala"> +<#noparse> + + org.scala-lang + scala3-library_3 + ${scala.version} + + + io.vertx + vertx-lang-scala_3 + ${vertx.version} + + <#if hasPgClient> @@ -98,7 +115,22 @@ -<#if hasVertxJUnit5> +<#if language == "scala"> +<#noparse> + + io.vertx + vertx-lang-scala-test_3 + ${vertx.version} + test + + + org.scalatest + scalatest_3 + ${scalatest.version} + test + + +<#elseif hasVertxJUnit5> io.vertx vertx-junit5 @@ -141,6 +173,11 @@ ${project.basedir}/src/main/kotlin ${project.basedir}/src/test/kotlin +<#elseif language == "scala"> +<#noparse> + ${project.basedir}/src/main/scala + ${project.basedir}/src/test/scala + <#if language == "kotlin"> @@ -172,6 +209,52 @@ +<#elseif language == "scala"> + + net.alchim31.maven + scala-maven-plugin + 4.9.2 + + + -feature + -deprecation + + + + + compile + + compile + + + + test-compile + + testCompile + + + + + + org.scalatest + scalatest-maven-plugin + 2.2.0 + +<#noparse> + ${project.build.directory}/surefire-reports + + . + WDF TestSuite.txt + + + + test + + test + + + + <#else> maven-compiler-plugin @@ -220,6 +303,11 @@ <#noparse> ${maven-surefire-plugin.version} +<#if language == "scala"> + + true + + org.codehaus.mojo diff --git a/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl b/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl new file mode 100644 index 00000000..3adb897d --- /dev/null +++ b/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl @@ -0,0 +1,28 @@ +package ${packageName} + +import io.vertx.core.{AbstractVerticle, Promise} +import io.vertx.lang.scala.ScalaVerticle +import io.vertx.lang.scala.ImplicitConversions.vertxFutureToScalaFuture + +import scala.concurrent.Future +import scala.language.implicitConversions + +class MainVerticle extends AbstractVerticle: + + override def start(startPromise: Promise[Void]): Unit = + vertx + .deployVerticle(HttpVerticle().asJava) + .onSuccess(_ => startPromise.complete) + .onFailure(e => startPromise.fail(e)) + + +class HttpVerticle extends ScalaVerticle: + + override def asyncStart: Future[Unit] = + vertx + .createHttpServer() + .requestHandler(_.response + .putHeader("content-type", "text/plain") + .end("Hello from Vert.x!")) + .listen(8888) + .mapEmpty[Unit]() \ No newline at end of file diff --git a/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl b/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl new file mode 100644 index 00000000..994898d0 --- /dev/null +++ b/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl @@ -0,0 +1,24 @@ +package ${packageName} + +import io.vertx.core.http.HttpMethod + +import io.vertx.lang.scala.ImplicitConversions.vertxFutureToScalaFuture +import io.vertx.lang.scala.testing.VerticleTesting + +import org.scalatest.matchers.should.Matchers + +import scala.language.implicitConversions + + +class MainVerticleSpec extends VerticleTesting[HttpVerticle], Matchers: + + "HttpVerticle" should "bind to 8888 and answer with 'Hello from Vert.x!'" in { + val httpClient = vertx.createHttpClient() + + for { + req <- httpClient.request(HttpMethod.GET, 8888, "127.0.0.1", "/") + res <- req.send() + body <- res.body.map(_.toString) + assertion = body should equal("Hello from Vert.x!") + } yield assertion + } \ No newline at end of file From d9bbb992cdae0b51742c333404a4f6146e0fb243 Mon Sep 17 00:00:00 2001 From: Oliver Marienfeld Date: Sun, 1 Dec 2024 15:30:18 +0100 Subject: [PATCH 2/2] Add Scala/Gradle starter --- src/main/resources/templates/build.gradle.kts.ftl | 15 +++++++++++++-- .../src/main/scala/MainVerticle.scala.ftl | 1 + .../src/test/scala/TestMainVerticle.scala.ftl | 2 +- .../io/vertx/starter/service/GeneratorTest.java | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/resources/templates/build.gradle.kts.ftl b/src/main/resources/templates/build.gradle.kts.ftl index 33b8f4cd..a90ab308 100644 --- a/src/main/resources/templates/build.gradle.kts.ftl +++ b/src/main/resources/templates/build.gradle.kts.ftl @@ -17,6 +17,8 @@ plugins { <#else> kotlin ("jvm") version "1.7.21" +<#elseif language == "scala"> + scala <#else> java @@ -71,11 +73,18 @@ dependencies { <#if language == "kotlin" && vertxVersion?starts_with("4.")> implementation(kotlin("stdlib-jdk8")) +<#elseif language == "scala"> + implementation("org.scala-lang:scala3-library_3:3.5.2") + implementation("io.vertx:vertx-lang-scala_3:${vertxVersion}") <#if hasPgClient> implementation("com.ongres.scram:client:2.1") -<#if hasVertxJUnit5> +<#if language == "scala"> + testImplementation("io.vertx:vertx-lang-scala-test_3:${vertxVersion}") + testImplementation("org.scalatest:scalatest_3:3.2.19") + testRuntimeOnly("org.scalatestplus:junit-5-11_3:3.2.19.0") +<#elseif hasVertxJUnit5> testImplementation("io.vertx:vertx-junit5") testImplementation("org.junit.jupiter:junit-jupiter:$junitJupiterVersion") <#elseif hasVertxUnit> @@ -111,7 +120,9 @@ tasks.withType { } tasks.withType { -<#if hasVertxJUnit5> +<#if language == "scala"> + useJUnitPlatform() +<#elseif hasVertxJUnit5> useJUnitPlatform() <#elseif hasVertxUnit> useJUnit() diff --git a/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl b/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl index 3adb897d..05c95f77 100644 --- a/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl +++ b/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl @@ -25,4 +25,5 @@ class HttpVerticle extends ScalaVerticle: .putHeader("content-type", "text/plain") .end("Hello from Vert.x!")) .listen(8888) + .onSuccess(_ => println("HTTP server started on port 8888")) .mapEmpty[Unit]() \ No newline at end of file diff --git a/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl b/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl index 994898d0..e5a56ca3 100644 --- a/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl +++ b/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl @@ -10,7 +10,7 @@ import org.scalatest.matchers.should.Matchers import scala.language.implicitConversions -class MainVerticleSpec extends VerticleTesting[HttpVerticle], Matchers: +class TestMainVerticle extends VerticleTesting[HttpVerticle], Matchers: "HttpVerticle" should "bind to 8888 and answer with 'Hello from Vert.x!'" in { val httpClient = vertx.createHttpClient() diff --git a/src/test/java/io/vertx/starter/service/GeneratorTest.java b/src/test/java/io/vertx/starter/service/GeneratorTest.java index d3f1a440..761c8798 100644 --- a/src/test/java/io/vertx/starter/service/GeneratorTest.java +++ b/src/test/java/io/vertx/starter/service/GeneratorTest.java @@ -292,7 +292,7 @@ private void verifyMavenFiles() { private void verifyMavenOutputFiles() throws IOException { try (Stream pathStream = Files.walk(workdir)) { - Optional testResult = pathStream.filter(p -> p.toString().endsWith("TestMainVerticle.txt")).findFirst(); + Optional testResult = pathStream.filter(p -> p.toString().endsWith("TestMainVerticle.xml")).findFirst(); assertThat(testResult).isPresent().hasValueSatisfying(p -> assertThat(p).isRegularFile()); assertThat(workdir.resolve("target/demo-1.0.0-SNAPSHOT-fat.jar")).isRegularFile(); }