Skip to content

Commit

Permalink
Implement new CompileTimeCalibanClientPlugin `ctCalibanClientsVersi…
Browse files Browse the repository at this point in the history
…onedCode` option
  • Loading branch information
guizmaii committed Oct 13, 2021
1 parent 7c7d7f0 commit 9f458f2
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,12 @@ object CompileTimeCalibanClientPlugin extends AutoPlugin {
"(Required) List of projects being configured with the `CompileTimeCalibanServerPlugin` plugin for which we want to generate client(s)"
)

// ## Optional Plugin configurations
lazy val ctCalibanClientsVersionedCode: SettingKey[Boolean] =
settingKey[Boolean](
"(Optional) If true, the generated client will be in the `src/main/scala` of your sbt module. If false, the code will be generated in `target/scala_x.xx/src_managed`. Default: `true`"
)

// ## Plugin task
lazy val ctCalibanClientGenerate: TaskKey[Seq[File]] = taskKey[Seq[File]](
"Generate Caliban Client(s) code at compile time. Automatically configured to be triggered when compilation is triggered"
Expand All @@ -230,6 +236,7 @@ object CompileTimeCalibanClientPlugin extends AutoPlugin {
inTask(ctCalibanClient)(
Seq(
ctCalibanClientsSettings := Seq.empty,
ctCalibanClientsVersionedCode := true,
ctCalibanClientGenerate := {
// That helped: https://stackoverflow.com/q/26244115/2431728
Def.taskDyn {
Expand All @@ -240,7 +247,12 @@ object CompileTimeCalibanClientPlugin extends AutoPlugin {
val clientsSettings: Seq[Project] = (ctCalibanClient / ctCalibanClientsSettings).value
if (clientsSettings.isEmpty) Def.task { log.error(helpMsg); Seq.empty[File] }
else {
val baseDirValue: String = (thisProject / baseDirectory).value.absolutePath
val (baseDirValue: String, isVersioned: Boolean) =
Def.settingDyn {
val isVersioned: Boolean = (ctCalibanClient / ctCalibanClientsVersionedCode).value
(if (isVersioned) (thisProject / baseDirectory) else (thisProject / sourceManaged))
.map(_.absolutePath -> isVersioned)
}.value

def generateSources: Def.Initialize[Task[Seq[File]]] =
Def.taskDyn {
Expand Down Expand Up @@ -326,7 +338,8 @@ object CompileTimeCalibanClientPlugin extends AutoPlugin {
caliban.codegen.BuildInfo.version,
zio.BuildInfo.version,
clientsSettings.map(_.id).mkString,
serverProjectSettings.mkString
serverProjectSettings.mkString,
isVersioned.toString
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ ThisBuild / homepage := Some(url("https://www.conduktor.io/"))
ThisBuild / licenses := List("Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0"))
ThisBuild / version := "0.0.1"
ThisBuild / scalaVersion := "2.12.14" // Must stay 2.12 in these tests because the plugin is compiled with 2.12
ThisBuild / resolvers += Resolver.mavenLocal
ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots")

// ### Dependencies ###

Expand Down Expand Up @@ -37,7 +39,8 @@ lazy val root =
posts,
potatoes,
clients,
calibanClients
postsClients,
potatoesClients
)
.settings(
// Additional scripted tests commands
Expand Down Expand Up @@ -109,13 +112,23 @@ lazy val clients =
project
.in(file("modules/clients"))
.settings(libraryDependencies ++= sttp)
.dependsOn(calibanClients)
.dependsOn(postsClients, potatoesClients)

lazy val calibanClients =
lazy val postsClients =
project
.withId("caliban-clients")
.in(file("modules/caliban-clients"))
.withId("posts-clients")
.in(file("modules/posts-clients"))
.enablePlugins(CompileTimeCalibanClientPlugin)
.settings(
Compile / ctCalibanClient / ctCalibanClientsSettings := Seq(posts, potatoes)
Compile / ctCalibanClient / ctCalibanClientsSettings := Seq(posts),
Compile / ctCalibanClient / ctCalibanClientsVersionedCode := false
)

lazy val potatoesClients =
project
.withId("potatoes-clients")
.in(file("modules/potatoes-clients"))
.enablePlugins(CompileTimeCalibanClientPlugin)
.settings(
Compile / ctCalibanClient / ctCalibanClientsSettings := Seq(potatoes)
)
Empty file.
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import sbt.librarymanagement.Resolver

resolvers += Resolver.mavenLocal
resolvers += Resolver.sonatypeRepo("snapshots")

sys.props.get("plugin.version") match {
case Some(x) => addSbtPlugin("com.github.ghostdogpr" % "caliban-codegen-sbt" % x)
case _ => sys.error("""|The system property 'plugin.version' is not defined.
Expand Down
78 changes: 39 additions & 39 deletions codegen-sbt/src/sbt-test/compiletime-codegen/test-compile/test
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
# 1. Test code generation
# ## From the 'posts' "default" config
$ absent modules/caliban-clients/src/main/scala/generated/Client.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/generated/Client.scala

# ## From the 'posts' "CalibanClient" config
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala

# ## From the 'posts' "split" config
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/package.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/AuthorName.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/AuthorNameInput.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/Mutation.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/Post.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostContent.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostContentInput.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostId.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostTitle.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostTitleInput.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/Query.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/Subscription.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/package.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/AuthorName.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/AuthorNameInput.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/Mutation.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/Post.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostContent.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostContentInput.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostId.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostTitle.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostTitleInput.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/Query.scala
$ absent modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/Subscription.scala

# ## From the 'potatoes' "split" config
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/package.scala
Expand Down Expand Up @@ -46,24 +46,24 @@ $ absent modules/potatoes/target/ctCalibanServer/CalibanClientGenerator_0.scala

# Code that was be generated
# ## From the 'posts' "default" config
$ exists modules/caliban-clients/src/main/scala/generated/Client.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/generated/Client.scala

# ## From the 'posts' "CalibanClient" config
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala

# ## From the 'posts' "split" config
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/package.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/AuthorName.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/AuthorNameInput.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/Mutation.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/Post.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostContent.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostContentInput.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostId.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostTitle.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/PostTitleInput.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/Query.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/split/Subscription.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/package.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/AuthorName.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/AuthorNameInput.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/Mutation.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/Post.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostContent.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostContentInput.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostId.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostTitle.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/PostTitleInput.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/Query.scala
$ exists modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/split/Subscription.scala

# ## From the 'potatoes' "split" config
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/package.scala
Expand Down Expand Up @@ -115,20 +115,20 @@ $ newer modules/posts/target/ctCalibanServer/touch modules/posts/target/ctCaliba


# 4. Prove that the client generated classes are not uselessly re-generated all the time.
> copyFileWithOptions true true true modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/caliban/client/generated/posts/CalibanClient.scala_old
> copyFileWithOptions true true true modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/caliban/client/generated/posts/CalibanClient.scala_old
> copyFileWithOptions true true true modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/package.scala modules/caliban-clients/tmp/poc/caliban/client/generated/potatoes/package.scala_old
# ## Meta-tests proving that the `copyFileWithOptions` effectively copy the files attributes
-$ newer modules/caliban-clients/tmp/caliban/client/generated/posts/CalibanClient.scala_old modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala
-$ newer modules/caliban-clients/tmp/caliban/client/generated/posts/CalibanClient.scala_old modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala
-$ newer modules/caliban-clients/tmp/poc/caliban/client/generated/potatoes/package.scala_old modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/package.scala

# ## Actual tests for this point 4.
> reload;compile
-$ newer modules/caliban-clients/tmp/caliban/client/generated/posts/CalibanClient.scala_old modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala
-$ newer modules/caliban-clients/tmp/caliban/client/generated/posts/CalibanClient.scala_old modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala
-$ newer modules/caliban-clients/tmp/poc/caliban/client/generated/potatoes/package.scala_old modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/package.scala

> clean
> reload;compile
$ newer modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/caliban/client/generated/posts/CalibanClient.scala_old
$ newer modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/caliban/client/generated/posts/CalibanClient.scala_old
$ newer modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/package.scala modules/caliban-clients/tmp/poc/caliban/client/generated/potatoes/package.scala_old


Expand Down Expand Up @@ -158,8 +158,8 @@ $ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/pot
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/moved/Query.scala
$ absent modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/moved/Subscription.scala

> copyFileWithOptions true true true modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
-$ newer modules/caliban-clients/tmp/CalibanClient.scala.old modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala
> copyFileWithOptions true true true modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
-$ newer modules/caliban-clients/tmp/CalibanClient.scala.old modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala

> sedInPlace poc.caliban.client.generated.potatoes poc.caliban.client.generated.potatoes.moved build.sbt
> reload;compile
Expand All @@ -175,19 +175,19 @@ $ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/pot
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/moved/Query.scala
$ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/potatoes/moved/Subscription.scala

-$ newer modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
-$ newer modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old

# 6. (Not working, for now) When client settings are modified, the client classes are re-generated.
> copyFileWithOptions true true true modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
-$ newer modules/caliban-clients/tmp/CalibanClient.scala.old modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala
> copyFileWithOptions true true true modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
-$ newer modules/caliban-clients/tmp/CalibanClient.scala.old modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala

> copyFileWithOptions true true true modules/potatoes/target/ctCalibanServer/touch modules/potatoes/target/ctCalibanServer/touch_old
> copyFileWithOptions true true true modules/posts/target/ctCalibanServer/touch modules/posts/target/ctCalibanServer/touch_old
-$ newer modules/potatoes/target/ctCalibanServer/touch_old modules/potatoes/target/ctCalibanServer/touch
-$ newer modules/posts/target/ctCalibanServer/touch_old modules/posts/target/ctCalibanServer/touch

> reload;compile
-$ newer modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
-$ newer modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
-$ newer modules/potatoes/target/ctCalibanServer/touch modules/potatoes/target/ctCalibanServer/touch_old
-$ newer modules/posts/target/ctCalibanServer/touch modules/posts/target/ctCalibanServer/touch_old

Expand All @@ -196,4 +196,4 @@ $ exists modules/caliban-clients/src/main/scala/poc/caliban/client/generated/pot
-$ newer modules/potatoes/target/ctCalibanServer/touch modules/potatoes/target/ctCalibanServer/touch_old
-$ newer modules/posts/target/ctCalibanServer/touch modules/posts/target/ctCalibanServer/touch_old
# TODO: This should be newer, sadly I don't find how to make it work.
-$ newer modules/caliban-clients/src/main/scala/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
-$ newer modules/posts-clients/target/scala-2.12/src_managed/main/poc/caliban/client/generated/posts/CalibanClient.scala modules/caliban-clients/tmp/CalibanClient.scala.old
8 changes: 6 additions & 2 deletions tools/src/main/scala/caliban/tools/compiletime/Utils.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@ package caliban.tools.compiletime

private[caliban] object Utils {

def packagePath(packageName: String): String = packageName.split('.').mkString(java.io.File.separator)
def toPathDir(baseDir: String, packageName: String): String = s"$baseDir/src/main/scala/${packagePath(packageName)}"
def packagePath(packageName: String): String = packageName.split('.').mkString(java.io.File.separator)
def toPathDir(baseDir: String, packageName: String): String = {
val isVersioned = !baseDir.contains("src_managed")
if (isVersioned) s"$baseDir/src/main/scala/${packagePath(packageName)}"
else s"$baseDir/${packagePath(packageName)}"
}

def toScalaCode[A](l: List[A])(asScalaCode: A => String): String =
if (l.isEmpty) "List.empty" else s"List(${l.map(asScalaCode).mkString(",")})"
Expand Down

0 comments on commit 9f458f2

Please sign in to comment.