From 3f288583d1400ed2018a7a03f431a3e7c8c94ea3 Mon Sep 17 00:00:00 2001 From: lWarne Date: Mon, 5 Jul 2021 19:16:14 +0100 Subject: [PATCH] Add abstractEffectType as a cmdline option Add --abstractEffectType as a command line option and add tests to check it's parsed correctly. --- .../scala/caliban/codegen/CalibanCli.scala | 5 ++- .../main/scala/caliban/tools/Codegen.scala | 19 ++++++----- .../main/scala/caliban/tools/Options.scala | 9 +++-- .../scala/caliban/tools/OptionsSpec.scala | 34 +++++++++++++++++-- 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/codegen-sbt/src/main/scala/caliban/codegen/CalibanCli.scala b/codegen-sbt/src/main/scala/caliban/codegen/CalibanCli.scala index dfda5eef31..5d2829f057 100644 --- a/codegen-sbt/src/main/scala/caliban/codegen/CalibanCli.scala +++ b/codegen-sbt/src/main/scala/caliban/codegen/CalibanCli.scala @@ -51,7 +51,7 @@ object CalibanCli { private val genSchemaHelpMsg = s""" - |calibanGenSchema schemaPath outputPath [--scalafmtPath path] [--headers name:value,name2:value2] [--packageName name] [--effect fqdn.Effect] + |calibanGenSchema schemaPath outputPath [--scalafmtPath path] [--headers name:value,name2:value2] [--packageName name] [--effect fqdn.Effect] [--abstractEffectType] | |This command will create a Scala file in `outputPath` containing all the types |defined in the provided GraphQL schema defined at `schemaPath`. Instead of a path, @@ -61,6 +61,9 @@ object CalibanCli { | |By default, each Query and Mutation will be wrapped into a `zio.UIO` effect. |This can be overridden by providing an alternative effect with the `--effect` option. + |The --abstractEffectType flag can also be used to indicate that the effect + |type is abstract, so that it will be added as a type parameter to the generated + |Query and Mutation classes (if applicable). |""".stripMargin private val genClientHelpMsg = diff --git a/tools/src/main/scala/caliban/tools/Codegen.scala b/tools/src/main/scala/caliban/tools/Codegen.scala index 89a353b838..36d6cb22c4 100644 --- a/tools/src/main/scala/caliban/tools/Codegen.scala +++ b/tools/src/main/scala/caliban/tools/Codegen.scala @@ -19,18 +19,21 @@ object Codegen { arguments: Options, genType: GenType ): Task[Unit] = { - val s = ".*/scala[^/]*/(.*)/(.*).scala".r.findFirstMatchIn(arguments.toPath) - val packageName = arguments.packageName.orElse(s.map(_.group(1).split("/").mkString("."))) - val objectName = s.map(_.group(2)).getOrElse("Client") - val effect = arguments.effect.getOrElse("zio.UIO") - val genView = arguments.genView.getOrElse(false) - val scalarMappings = arguments.scalarMappings - val loader = getSchemaLoader(arguments.schemaPath, arguments.headers) + val s = ".*/scala[^/]*/(.*)/(.*).scala".r.findFirstMatchIn(arguments.toPath) + val packageName = arguments.packageName.orElse(s.map(_.group(1).split("/").mkString("."))) + val objectName = s.map(_.group(2)).getOrElse("Client") + val effect = arguments.effect.getOrElse("zio.UIO") + val genView = arguments.genView.getOrElse(false) + val scalarMappings = arguments.scalarMappings + val loader = getSchemaLoader(arguments.schemaPath, arguments.headers) + val abstractEffectType = arguments.abstractEffectType.getOrElse(false) for { schema <- loader.load code = genType match { case GenType.Schema => - SchemaWriter.write(schema, packageName, effect, arguments.imports)(ScalarMappings(scalarMappings)) + SchemaWriter.write(schema, packageName, effect, arguments.imports, abstractEffectType)( + ScalarMappings(scalarMappings) + ) case GenType.Client => ClientWriter.write(schema, objectName, packageName, genView, arguments.imports)( ScalarMappings(scalarMappings) diff --git a/tools/src/main/scala/caliban/tools/Options.scala b/tools/src/main/scala/caliban/tools/Options.scala index 8df0876a08..5d6aca1b34 100644 --- a/tools/src/main/scala/caliban/tools/Options.scala +++ b/tools/src/main/scala/caliban/tools/Options.scala @@ -12,7 +12,8 @@ final case class Options( genView: Option[Boolean], effect: Option[String], scalarMappings: Option[Map[String, String]], - imports: Option[List[String]] + imports: Option[List[String]], + abstractEffectType: Option[Boolean] ) object Options { @@ -24,7 +25,8 @@ object Options { genView: Option[Boolean], effect: Option[String], scalarMappings: Option[List[String]], - imports: Option[List[String]] + imports: Option[List[String]], + abstractEffectType: Option[Boolean] ) def fromArgs(args: List[String]): Option[Options] = @@ -62,7 +64,8 @@ object Options { } }.toMap }, - rawOpts.imports + rawOpts.imports, + rawOpts.abstractEffectType ) } case _ => None diff --git a/tools/src/test/scala/caliban/tools/OptionsSpec.scala b/tools/src/test/scala/caliban/tools/OptionsSpec.scala index 2b9d6e3597..5dbbf53052 100644 --- a/tools/src/test/scala/caliban/tools/OptionsSpec.scala +++ b/tools/src/test/scala/caliban/tools/OptionsSpec.scala @@ -23,6 +23,7 @@ object OptionsSpec extends DefaultRunnableSpec { None, None, None, + None, None ) ) @@ -44,6 +45,7 @@ object OptionsSpec extends DefaultRunnableSpec { None, None, None, + None, None ) ) @@ -56,7 +58,7 @@ object OptionsSpec extends DefaultRunnableSpec { assert(result)( equalTo( Some( - Options("schema", "output", None, None, None, None, None, None, None) + Options("schema", "output", None, None, None, None, None, None, None, None) ) ) ) @@ -90,6 +92,7 @@ object OptionsSpec extends DefaultRunnableSpec { None, None, None, + None, None ) ) @@ -111,6 +114,7 @@ object OptionsSpec extends DefaultRunnableSpec { None, Some("cats.effect.IO"), None, + None, None ) ) @@ -132,6 +136,7 @@ object OptionsSpec extends DefaultRunnableSpec { Some(true), None, None, + None, None ) ) @@ -153,6 +158,7 @@ object OptionsSpec extends DefaultRunnableSpec { None, None, Some(Map("Long" -> "scala.Long")), + None, None ) ) @@ -174,7 +180,30 @@ object OptionsSpec extends DefaultRunnableSpec { None, None, None, - Some(List("a.b.Clazz", "b.c._")) + Some(List("a.b.Clazz", "b.c._")), + None + ) + ) + ) + ) + }, + test("provide abstractEffectType") { + val input = List("schema", "output", "--effect", "F", "--abstractEffectType", "true") + val result = Options.fromArgs(input) + assert(result)( + equalTo( + Some( + Options( + "schema", + "output", + None, + None, + None, + None, + Some("F"), + None, + None, + Some(true) ) ) ) @@ -195,6 +224,7 @@ object OptionsSpec extends DefaultRunnableSpec { None, None, None, + None, None ) )