From 5fde09900da0968492cc9f3b9c2722e2f6028349 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sun, 11 Sep 2022 10:29:37 -0400 Subject: [PATCH 01/25] Update to next development version: 5.5.1-SNAPSHOT --- build.gradle | 2 +- plugins/gradle/example-client-kotlin/build.gradle | 6 +++--- plugins/gradle/example-client/build.gradle | 4 ++-- plugins/gradle/example-server/build.gradle | 2 +- .../gradle/graphql-java-codegen-gradle-plugin/build.gradle | 2 +- plugins/maven/example-client/pom.xml | 2 +- plugins/maven/example-server/pom.xml | 2 +- plugins/maven/graphql-java-codegen-maven-plugin/pom.xml | 4 ++-- .../example-client-scala/project/plugins.sbt | 2 +- .../example-client-scala/version.sbt | 2 +- .../example-client/project/plugins.sbt | 2 +- .../graphql-codegen-sbt-plugin/example-client/version.sbt | 2 +- .../graphql-codegen-sbt-plugin/simple/project/plugins.sbt | 2 +- .../sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt | 2 +- plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt | 2 +- 15 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index c8105c553..7b6595024 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id "org.sonarqube" version "3.2.0" } -def graphqlCodegenVersion = '5.5.0' // This variable used in the automatic release process +def graphqlCodegenVersion = '5.5.1-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenVersion diff --git a/plugins/gradle/example-client-kotlin/build.gradle b/plugins/gradle/example-client-kotlin/build.gradle index 193db58cf..12998fb7a 100644 --- a/plugins/gradle/example-client-kotlin/build.gradle +++ b/plugins/gradle/example-client-kotlin/build.gradle @@ -4,10 +4,10 @@ import io.github.kobylynskyi.graphql.codegen.gradle.GraphQLCodegenGradleTask plugins { id "java" id "org.jetbrains.kotlin.jvm" version "1.6.21" - id "io.github.kobylynskyi.graphql.codegen" version "5.5.0" + id "io.github.kobylynskyi.graphql.codegen" version "5.5.1-SNAPSHOT" } -def graphqlCodegenClientKotlinVersion = '5.5.0' // Variable used in the automatic release process +def graphqlCodegenClientKotlinVersion = '5.5.1-SNAPSHOT' // Variable used in the automatic release process group = 'io.github.dreamylost' version = graphqlCodegenClientKotlinVersion @@ -29,7 +29,7 @@ repositories { dependencies { - implementation "io.github.kobylynskyi:graphql-java-codegen:5.5.0" + implementation "io.github.kobylynskyi:graphql-java-codegen:5.5.1-SNAPSHOT" implementation "javax.validation:validation-api:2.0.1.Final" implementation "com.squareup.okhttp3:okhttp:4.2.2" implementation "com.fasterxml.jackson.core:jackson-core:2.13.3" diff --git a/plugins/gradle/example-client/build.gradle b/plugins/gradle/example-client/build.gradle index 556007b93..f8943b336 100644 --- a/plugins/gradle/example-client/build.gradle +++ b/plugins/gradle/example-client/build.gradle @@ -7,7 +7,7 @@ plugins { // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "5.5.0" + id "io.github.kobylynskyi.graphql.codegen" version "5.5.1-SNAPSHOT" } mainClassName = "io.github.kobylynskyi.order.Application" @@ -22,7 +22,7 @@ dependencies { // use the latest available version: // https://search.maven.org/artifact/io.github.kobylynskyi/graphql-java-codegen - implementation "io.github.kobylynskyi:graphql-java-codegen:5.5.0" + implementation "io.github.kobylynskyi:graphql-java-codegen:5.5.1-SNAPSHOT" implementation "org.apache.httpcomponents:httpclient:4.5.13" implementation "javax.validation:validation-api:2.0.1.Final" diff --git a/plugins/gradle/example-server/build.gradle b/plugins/gradle/example-server/build.gradle index 76487c044..6a3922f7a 100644 --- a/plugins/gradle/example-server/build.gradle +++ b/plugins/gradle/example-server/build.gradle @@ -6,7 +6,7 @@ plugins { // // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "5.5.0" + id "io.github.kobylynskyi.graphql.codegen" version "5.5.1-SNAPSHOT" } mainClassName = "io.github.kobylynskyi.product.Application" diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle index d0382ea4a..751f0f812 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle @@ -16,7 +16,7 @@ apply plugin: "java" apply plugin: "idea" apply plugin: "maven-publish" -def graphqlCodegenGradlePluginVersion = '5.5.0' // This variable used in the automatic release process +def graphqlCodegenGradlePluginVersion = '5.5.1-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenGradlePluginVersion diff --git a/plugins/maven/example-client/pom.xml b/plugins/maven/example-client/pom.xml index 5233e0fb1..418c422cb 100644 --- a/plugins/maven/example-client/pom.xml +++ b/plugins/maven/example-client/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin-example-client - 5.5.0 + 5.5.1-SNAPSHOT graphql-codegen-maven-plugin-example-client diff --git a/plugins/maven/example-server/pom.xml b/plugins/maven/example-server/pom.xml index 3c5590302..5f5d85d11 100644 --- a/plugins/maven/example-server/pom.xml +++ b/plugins/maven/example-server/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin-example-server - 5.5.0 + 5.5.1-SNAPSHOT graphql-codegen-maven-plugin-example-server diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml index 86fbdbd9a..ba76048c6 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -3,7 +3,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin - 5.5.0 + 5.5.1-SNAPSHOT maven-plugin graphql-codegen-maven-plugin @@ -72,7 +72,7 @@ 3.0.1 3.3.4 - 5.5.0 + 5.5.1-SNAPSHOT diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt index bf73b807b..8b61a3547 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.5.0") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.5.1-SNAPSHOT") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt index 0c4d8d6ff..4be577733 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.5.0" +version in ThisBuild := "5.5.1-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt index bf73b807b..8b61a3547 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.5.0") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.5.1-SNAPSHOT") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt index 0c4d8d6ff..4be577733 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.5.0" +version in ThisBuild := "5.5.1-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt index 74a6413bb..7f80e8527 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt @@ -1,4 +1,4 @@ -sys.props.get("plugin.version").orElse(Some("5.5.0")) match { +sys.props.get("plugin.version").orElse(Some("5.5.1-SNAPSHOT")) match { case Some(x) => addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt index 0c4d8d6ff..4be577733 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.5.0" +version in ThisBuild := "5.5.1-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt index 0c4d8d6ff..4be577733 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.5.0" +version in ThisBuild := "5.5.1-SNAPSHOT" From ef8baafc2dd72750301f0dc5d4649dfd66bf4581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= Date: Sun, 11 Sep 2022 23:29:44 +0800 Subject: [PATCH 02/25] Upgrade versions of SBT project (#1001) Co-authored-by: Bogdan Kobylynskyi <92bogdan@gmail.com> --- plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt | 2 +- .../project/Publishing.scala | 2 +- .../project/build.properties | 2 +- .../graphql-java-codegen-sbt-plugin/project/plugins.sbt | 8 ++++---- .../io/github/dreamylost/graphql/codegen/Compat.scala | 2 +- .../dreamylost/graphql/codegen/GraphQLCodegenKeys.scala | 9 ++++----- .../graphql/codegen/GraphQLCodegenPlugin.scala | 4 ++-- .../graphql/codegen/ParentInterfacesConfig.scala | 4 ++-- .../dreamylost/graphql/codegen/SchemaFinderConfig.scala | 4 ++-- .../graphql/test/api/impl/GetUserQueryResolverImpl.scala | 2 +- .../src/test/scala/test/Test.scala | 2 +- 11 files changed, 20 insertions(+), 21 deletions(-) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt index 880b5be96..7d62cfb62 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt @@ -35,7 +35,7 @@ lazy val `graphql-codegen-sbt-plugin` = Project(id = "graphql-codegen-sbt-plugin "org.freemarker" % "freemarker" % "2.3.31", "com.graphql-java" % "graphql-java" % "16.2", "com.fasterxml.jackson.core" % "jackson-databind" % "2.12.1", - "com.typesafe" % "config" % "1.4.1" + "com.typesafe" % "config" % "1.4.2" ), buildInfoKeys := Seq[BuildInfoKey](name, version, sbtVersion, jValidationVersion), buildInfoPackage := "io.github.dreamylost.graphql.codegen" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Publishing.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Publishing.scala index 4f2a19f0c..a9829b54b 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Publishing.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Publishing.scala @@ -5,7 +5,7 @@ import xerial.sbt.Sonatype.autoImport.sonatypeProfileName /** * sbt publish setting * - * @author 梦境迷离 dreamylost + * @author 梦境迷离 * @since 2020-07-19 * @version v1.0 */ diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/build.properties b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/build.properties index 862afa5f2..b1e589d9f 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/build.properties +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/build.properties @@ -1 +1 @@ -sbt.version=1.4.7 \ No newline at end of file +sbt.version=1.7.1 \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/plugins.sbt index 1ac901cf6..85b9d39d9 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/plugins.sbt @@ -1,5 +1,5 @@ addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.8.3") -addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.3") -addSbtPlugin("com.jsuereth" % "sbt-pgp" % "2.0.1") -addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.13") -addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.10.0") \ No newline at end of file +addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") +addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.13") +addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2") +addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.13") \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/Compat.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/Compat.scala index 4c83b9b2e..fa589fcb5 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/Compat.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/Compat.scala @@ -9,7 +9,7 @@ import sbt.Configuration /** * - * @author 梦境迷离 dreamylost + * @author 梦境迷离 * @since 2020-07-18 * @version v1.0 */ diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala index a62a58f6d..da32112bd 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala @@ -2,13 +2,12 @@ package io.github.dreamylost.graphql.codegen import java.util -import com.kobylynskyi.graphql.codegen.model.{ ApiInterfaceStrategy, ApiNamePrefixStrategy, ApiRootInterfaceStrategy, RelayConfig } +import com.kobylynskyi.graphql.codegen.model._ import sbt._ -import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage /** * - * @author liguobin@growingio.com + * @author 梦境迷离 * @version 1.0,2020/7/15 */ trait GraphQLCodegenKeys { @@ -126,11 +125,11 @@ trait GraphQLCodegenKeys { val generateSealedInterfaces = settingKey[Boolean]("If true, generate sealed interfaces for GraphQL unions and interfaces, else generate normal interfaces.") - val generateJacksonTypeIdResolver = settingKey[Boolean]("Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package") + val generateJacksonTypeIdResolver = settingKey[Boolean]("Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package.") //for version val javaxValidationApiVersion = settingKey[Option[String]]("javax-validation-api version") - val graphqlJavaCodegenVersion = settingKey[Option[String]]("graphql java codegen version") + val graphqlJavaCodegenVersion = settingKey[Option[String]]("graphql-java-codegen version") //some others for sbt val generateCodegenTargetPath = settingKey[File]("Where to store generated files and add the generated code to the classpath, so that they can be referenced.") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index 6c5a80481..52edf7fec 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -6,7 +6,7 @@ import com.kobylynskyi.graphql.codegen.model._ import com.kobylynskyi.graphql.codegen.model.exception.LanguageNotSupportedException import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage._ import com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLCodegen -import com.kobylynskyi.graphql.codegen.supplier.{ MergeableMappingConfigSupplier, SchemaFinder } +import com.kobylynskyi.graphql.codegen.supplier._ import sbt.{ AutoPlugin, PluginTrigger, _ } import sbt.Keys.{ sLog, sourceManaged, _ } import sbt.internal.util.complete.DefaultParsers.spaceDelimited @@ -19,7 +19,7 @@ import sbt.Def /** * - * @author liguobin@growingio.com + * @author 梦境迷离 * @version 1.0,2020/7/15 */ object GraphQLCodegenPlugin extends GraphQLCodegenPlugin(Compile, configurationPostfix = "-main") { diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/ParentInterfacesConfig.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/ParentInterfacesConfig.scala index 152e9d36b..1ac52001d 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/ParentInterfacesConfig.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/ParentInterfacesConfig.scala @@ -2,10 +2,10 @@ package io.github.dreamylost.graphql.codegen /** * - * @author liguobin@growingio.com + * @author 梦境迷离 * @version 1.0,2020/7/15 */ -case class ParentInterfacesConfig( +final case class ParentInterfacesConfig( queryResolver: String = null, mutationResolver: String = null, subscriptionResolver: String = null, diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/SchemaFinderConfig.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/SchemaFinderConfig.scala index 95b01ec27..68ba1cbd6 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/SchemaFinderConfig.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/SchemaFinderConfig.scala @@ -4,10 +4,10 @@ import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder /** * - * @author liguobin@growingio.com + * @author 梦境迷离 * @version 1.0,2020/7/15 */ -case class SchemaFinderConfig( +final case class SchemaFinderConfig( rootDir: String, recursive: Boolean = SchemaFinder.DEFAULT_RECURSIVE, includePattern: String = SchemaFinder.DEFAULT_INCLUDE_PATTERN, diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/src/main/scala/io/github/kobylynskyi/graphql/test/api/impl/GetUserQueryResolverImpl.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/src/main/scala/io/github/kobylynskyi/graphql/test/api/impl/GetUserQueryResolverImpl.scala index c4735add1..a9cbc4225 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/src/main/scala/io/github/kobylynskyi/graphql/test/api/impl/GetUserQueryResolverImpl.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/src/main/scala/io/github/kobylynskyi/graphql/test/api/impl/GetUserQueryResolverImpl.scala @@ -8,7 +8,7 @@ import scala.concurrent.Future /** * example, use a async api * - * @author 梦境迷离 dreamylost + * @author 梦境迷离 * @since 2020-07-19 * @version v1.0 */ diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/test/scala/test/Test.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/test/scala/test/Test.scala index 1effb0f7f..e94859ede 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/test/scala/test/Test.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/test/scala/test/Test.scala @@ -2,7 +2,7 @@ package test /** * - * @author liguobin@growingio.com + * @author 梦境迷离 * @version 1.0,2020/7/15 */ object Test { From a0d82441a57a19e681323c85dc014d740e3685d3 Mon Sep 17 00:00:00 2001 From: msl-at-fcb <96451448+msl-at-fcb@users.noreply.github.com> Date: Tue, 13 Sep 2022 22:49:37 +1000 Subject: [PATCH 03/25] Added support for annotations in generated kotlin operations #1002 (#1003) --- .../templates/kotlin-lang/operations.ftl | 2 +- .../kotlin/GraphQLCodegenGitHubTest.java | 50 ++++++++++++++++++- ...picSuggestionMutationWithAnnotation.kt.txt | 13 +++++ ...icSuggestionMutationWithAnnotations.kt.txt | 13 +++++ 4 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionMutationWithAnnotation.kt.txt create mode 100644 src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionMutationWithAnnotations.kt.txt diff --git a/src/main/resources/templates/kotlin-lang/operations.ftl b/src/main/resources/templates/kotlin-lang/operations.ftl index b84121916..859744daa 100755 --- a/src/main/resources/templates/kotlin-lang/operations.ftl +++ b/src/main/resources/templates/kotlin-lang/operations.ftl @@ -38,7 +38,7 @@ interface ${className}<#if implements?has_content> : <#list implements as interf <#if operation.throwsException> @Throws(Exception::class) - fun ${operation.name}(<#list operation.parameters as param>${param.name}: ${param.type}<#if param_has_next>, ): ${operation.type} + fun ${operation.name}(<#list operation.parameters as param><#list param.annotations as paramAnnotation>@${paramAnnotation}<#if param.annotations?has_content> ${param.name}: ${param.type}<#if param_has_next>, ): ${operation.type} } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java index 3d3040c50..c3d92c1ab 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java @@ -12,10 +12,13 @@ import java.io.File; import java.io.IOException; import java.util.Collections; +import java.util.HashSet; import java.util.Objects; +import java.util.Set; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; +import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static org.hamcrest.MatcherAssert.assertThat; @@ -188,6 +191,51 @@ void generate_CustomFieldsResolvers() throws Exception { getFileByName(files, "AcceptTopicSuggestionPayloadResolver.kt")); } + @Test + void generate_CustomFieldsResolversWithAnnotation() throws Exception { + mappingConfig.setModelNamePrefix("Github"); + mappingConfig.setModelNameSuffix("TO"); + mappingConfig.setApiNameSuffix("WithAnnotation"); + mappingConfig.setResolverArgumentAnnotations(singleton("some.Annotation")); + mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); + mappingConfig.setFieldsWithResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic")); + + new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); + + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/kt/field-resolver/" + + "AcceptTopicSuggestionMutationWithAnnotation.kt.txt"), + getFileByName(files, "AcceptTopicSuggestionMutationWithAnnotation.kt")); + } + + @Test + void generate_CustomFieldsResolversWithMultipleAnnotations() throws Exception { + + Set annotations = new HashSet<>(); + annotations.add("some.Annotation"); + annotations.add("another.Annotation"); + + mappingConfig.setModelNamePrefix("Github"); + mappingConfig.setModelNameSuffix("TO"); + mappingConfig.setApiNameSuffix("WithAnnotations"); + mappingConfig.setResolverArgumentAnnotations(annotations); + mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); + mappingConfig.setFieldsWithResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic")); + + new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); + + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/kt/field-resolver/" + + "AcceptTopicSuggestionMutationWithAnnotations.kt.txt"), + getFileByName(files, "AcceptTopicSuggestionMutationWithAnnotations.kt")); + } + @Test void generate_RequestWithDefaultValue() throws Exception { mappingConfig.setGenerateBuilder(true); @@ -200,4 +248,4 @@ void generate_RequestWithDefaultValue() throws Exception { getFileByName(files, "FriendsQueryRequest.kt")); } -} \ No newline at end of file +} diff --git a/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionMutationWithAnnotation.kt.txt b/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionMutationWithAnnotation.kt.txt new file mode 100644 index 000000000..f80fa2253 --- /dev/null +++ b/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionMutationWithAnnotation.kt.txt @@ -0,0 +1,13 @@ +package com.github.graphql + + +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface AcceptTopicSuggestionMutationWithAnnotation { + + @Throws(Exception::class) + fun acceptTopicSuggestion(@some.Annotation input: GithubAcceptTopicSuggestionInputTO, env: graphql.schema.DataFetchingEnvironment): GithubAcceptTopicSuggestionPayloadTO? + +} diff --git a/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionMutationWithAnnotations.kt.txt b/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionMutationWithAnnotations.kt.txt new file mode 100644 index 000000000..36d4f51b4 --- /dev/null +++ b/src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionMutationWithAnnotations.kt.txt @@ -0,0 +1,13 @@ +package com.github.graphql + + +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface AcceptTopicSuggestionMutationWithAnnotations { + + @Throws(Exception::class) + fun acceptTopicSuggestion(@another.Annotation @some.Annotation input: GithubAcceptTopicSuggestionInputTO, env: graphql.schema.DataFetchingEnvironment): GithubAcceptTopicSuggestionPayloadTO? + +} From ec6d30d239cdf835207ab9a0d0b4fd82a6791c64 Mon Sep 17 00:00:00 2001 From: esfomeado Date: Sun, 19 Feb 2023 02:06:40 +0000 Subject: [PATCH 04/25] Fix failing tests on some OS (#1027) --- .../scala/GraphQLCodegenAnnotationsTest.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java index f5a288791..7fe7db10b 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java @@ -58,7 +58,7 @@ void generate_CustomAnnotationMappings() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.scala", " @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[com.example.json.DateTimeScalarDeserializer])\n" + + "classOf[com.example.json.DateTimeScalarDeserializer])" + System.lineSeparator() + " createdDateTime: org.joda.time.DateTime,"); } @@ -91,23 +91,23 @@ void generate_CustomAnnotationMappings_Class() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionInput.scala", "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[AcceptTopicSuggestionInputDeserializer])\n" + + "classOf[AcceptTopicSuggestionInputDeserializer])" + System.lineSeparator() + "case class AcceptTopicSuggestionInput"); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[AcceptTopicSuggestionPayloadDeserializer])\n" + + "classOf[AcceptTopicSuggestionPayloadDeserializer])" + System.lineSeparator() + "case class AcceptTopicSuggestionPayload"); assertFileContainsElements(files, "Actor.scala", "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[ActorDeserializer])\n" + + "classOf[ActorDeserializer])" + System.lineSeparator() + "trait Actor"); assertFileContainsElements(files, "Assignee.scala", "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[AssigneeDeserializer])\n" + + "classOf[AssigneeDeserializer])" + System.lineSeparator() + "trait Assignee"); assertFileContainsElements(files, "DeploymentOrderField.scala", "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[DeploymentOrderFieldDeserializer])\n" + + "classOf[DeploymentOrderFieldDeserializer])" + System.lineSeparator() + "object DeploymentOrderField extends Enumeration"); } @@ -128,9 +128,10 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson" + - ".annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")\n" + + ".annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")" + System.lineSeparator() + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github" + - ".kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])\n" + + ".kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])" + + System.lineSeparator() + "case class AcceptTopicSuggestionPayload"); } @@ -154,11 +155,11 @@ void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "CodeOfConductQueryRequest.scala", "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[CodeOfConductQueryRequestDeserializer])\n" + + "classOf[CodeOfConductQueryRequestDeserializer])" + System.lineSeparator() + "class CodeOfConductQueryRequest"); assertFileContainsElements(files, "CodeOfConductQueryResponse.scala", "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[CodeOfConductQueryResponseDeserializer])\n" + + "classOf[CodeOfConductQueryResponseDeserializer])" + System.lineSeparator() + "class CodeOfConductQueryResponse extends GraphQLResult[JMap[String, " + "CodeOfConduct]]"); } From 76e0471677c996b3ad2ec6c53fc6ba4fa4553250 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sun, 19 Feb 2023 20:49:41 -0500 Subject: [PATCH 05/25] Fix generation of Interface when return type of the method has a list of Unions #1018 (#1030) --- .../codegen/java/JavaGraphQLTypeMapper.java | 2 +- .../codegen/mapper/GraphQLTypeMapper.java | 10 ++++++++-- .../graphql/codegen/model/MappingContext.java | 6 ++++++ .../codegen/model/NamedDefinition.java | 14 +++++++------- .../model/definitions/ExtendedDocument.java | 6 ++++++ .../GraphQLCodegenUnionResolverTest.java | 19 ++++++++++--------- .../GraphQLCodegenUnionResolverTest.java | 19 ++++++++++--------- .../GraphQLCodegenUnionResolverTest.java | 19 ++++++++++--------- .../ResultObject.java.txt | 12 ++++++++++++ .../MyResultObjectSuffix.java.txt | 9 +++++++++ .../ResultObject.kt.txt | 12 ++++++++++++ .../MyResultObjectSuffix.kt.txt | 9 +++++++++ .../ResultObject.scala.txt | 12 ++++++++++++ .../MyResultObjectSuffix.scala.txt | 9 +++++++++ .../resources/schemas/union-resolver.graphqls | 4 ++++ 15 files changed, 125 insertions(+), 37 deletions(-) create mode 100644 src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt create mode 100644 src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt create mode 100644 src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt create mode 100644 src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt create mode 100644 src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt create mode 100644 src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java index 08499e6d0..177e74fe5 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java @@ -101,7 +101,7 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, String gra serializeUsingObjectMapper = true; } - return new NamedDefinition(langTypeName, graphQLType, mappingContext.getInterfacesName().contains(graphQLType), + return new NamedDefinition(langTypeName, graphQLType, isInterfaceOrUnion(mappingContext, graphQLType), mandatory, primitiveCanBeUsed, serializeUsingObjectMapper); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java index c2baadbdf..b83360aee 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java @@ -177,7 +177,8 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, Type gr } else if (graphqlType instanceof ListType) { NamedDefinition mappedCollectionType = getLanguageType(mappingContext, ((ListType) graphqlType).getType(), name, parentTypeName, false, true); - if (mappedCollectionType.isInterface() && mappingContext.getInterfacesName().contains(parentTypeName)) { + if (mappedCollectionType.isInterfaceOrUnion() && + isInterfaceOrUnion(mappingContext, parentTypeName)) { mappedCollectionType.setJavaName( wrapSuperTypeIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); } else { @@ -223,7 +224,7 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, String gra serializeFieldsUsingObjectMapper.contains(graphQLType) || serializeFieldsUsingObjectMapper.contains(parentTypeName + "." + name); - return new NamedDefinition(langTypeName, graphQLType, mappingContext.getInterfacesName().contains(graphQLType), + return new NamedDefinition(langTypeName, graphQLType, isInterfaceOrUnion(mappingContext, graphQLType), mandatory, primitiveCanBeUsed, serializeUsingObjectMapper); } @@ -247,4 +248,9 @@ public String getResponseReturnType(MappingContext mappingContext, return computedTypeName; } + protected boolean isInterfaceOrUnion(MappingContext mappingContext, String graphQLType) { + return mappingContext.getInterfacesName().contains(graphQLType) || + mappingContext.getUnionsNames().contains(graphQLType); + } + } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 2bd3a17d1..557e73d6e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -29,6 +29,7 @@ public class MappingContext implements GraphQLCodegenConfiguration { private final ExtendedDocument document; private final Set typesUnionsInterfacesNames; private final Set interfacesName; + private final Set unionsName; private final Set operationsName; private final Map> interfaceChildren; private final GeneratedInformation generatedInformation; @@ -47,6 +48,7 @@ private MappingContext(File outputDirectory, this.document = document; this.typesUnionsInterfacesNames = document.getTypesUnionsInterfacesNames(); this.interfacesName = document.getInterfacesNames(); + this.unionsName = document.getUnionsNames(); this.interfaceChildren = document.getInterfaceChildren(); this.generatedInformation = generatedInformation; this.operationsName = document.getOperationsNames(); @@ -346,6 +348,10 @@ public Set getInterfacesName() { return interfacesName; } + public Set getUnionsNames() { + return unionsName; + } + public Set getOperationsName() { return operationsName; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java index ab8658dde..def48a797 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java @@ -7,17 +7,17 @@ public class NamedDefinition { private String javaName; private String graphqlTypeName; - private boolean isInterface; + private boolean isInterfaceOrUnion; private boolean mandatory; private boolean primitiveCanBeUsed; private boolean serializeUsingObjectMapper; public NamedDefinition(String javaName, String graphqlTypeName, - boolean isInterface, boolean mandatory, + boolean isInterfaceOrUnion, boolean mandatory, boolean primitiveCanBeUsed, boolean serializeUsingObjectMapper) { this.javaName = javaName; this.graphqlTypeName = graphqlTypeName; - this.isInterface = isInterface; + this.isInterfaceOrUnion = isInterfaceOrUnion; this.mandatory = mandatory; this.primitiveCanBeUsed = primitiveCanBeUsed; this.serializeUsingObjectMapper = serializeUsingObjectMapper; @@ -39,12 +39,12 @@ public void setGraphqlTypeName(String graphqlTypeName) { this.graphqlTypeName = graphqlTypeName; } - public boolean isInterface() { - return isInterface; + public boolean isInterfaceOrUnion() { + return isInterfaceOrUnion; } - public void setInterface(boolean anInterface) { - isInterface = anInterface; + public void setInterfaceOrUnion(boolean interfaceOrUnion) { + isInterfaceOrUnion = interfaceOrUnion; } public boolean isMandatory() { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java index 7a694c7dd..dbe2deb4c 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java @@ -88,6 +88,12 @@ public Set getInterfacesNames() { .collect(Collectors.toSet()); } + public Set getUnionsNames() { + return unionDefinitions.stream() + .map(ExtendedDefinition::getName) + .collect(Collectors.toSet()); + } + public Set getOperationsNames() { return operationDefinitions.stream() .map(ExtendedObjectTypeDefinition::getFieldDefinitions) diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java index 97784f456..bdfbf6a1c 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java @@ -30,11 +30,6 @@ void init() { mappingConfig.setGenerateJacksonTypeIdResolver(true); } - private List generate(String s) throws IOException { - return new JavaGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); - } - @AfterEach void cleanup() { Utils.deleteDir(outputBuildDir); @@ -48,8 +43,8 @@ void generate_CheckFiles_with_model_package() throws Exception { File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "UnionMemberA.java", - "UnionMemberB.java", "UnionToResolve.java"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "ResultObject.java", + "UnionMemberA.java", "UnionMemberB.java", "UnionToResolve.java"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -70,8 +65,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "MyUnionMemberASuffix.java", - "MyUnionMemberBSuffix.java", "MyUnionToResolveSuffix.java"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "MyResultObjectSuffix.java", + "MyUnionMemberASuffix.java", "MyUnionMemberBSuffix.java", "MyUnionToResolveSuffix.java"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -82,4 +77,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro file); } } + + private void generate(String path) throws IOException { + new JavaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java index e33c2f5ab..efe5fe257 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java @@ -32,11 +32,6 @@ void init() { mappingConfig.setGeneratedLanguage(GeneratedLanguage.KOTLIN); } - private List generate(String s) throws IOException { - return new KotlinGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); - } - @AfterEach void cleanup() { Utils.deleteDir(outputBuildDir); @@ -50,8 +45,8 @@ void generate_CheckFiles_with_model_package() throws Exception { File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "UnionMemberA.kt", - "UnionMemberB.kt", "UnionToResolve.kt"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "ResultObject.kt", + "UnionMemberA.kt", "UnionMemberB.kt", "UnionToResolve.kt"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -72,8 +67,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "MyUnionMemberASuffix.kt", - "MyUnionMemberBSuffix.kt", "MyUnionToResolveSuffix.kt"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "MyResultObjectSuffix.kt", + "MyUnionMemberASuffix.kt", "MyUnionMemberBSuffix.kt", "MyUnionToResolveSuffix.kt"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -85,4 +80,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro file); } } + + private void generate(String path) throws IOException { + new KotlinGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java index c585ccd0c..1efa8b065 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java @@ -32,11 +32,6 @@ void init() { mappingConfig.setGeneratedLanguage(GeneratedLanguage.SCALA); } - private List generate(String s) throws IOException { - return new ScalaGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); - } - @AfterEach void cleanup() { Utils.deleteDir(outputBuildDir); @@ -50,8 +45,8 @@ void generate_CheckFiles_with_model_package() throws Exception { File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "UnionMemberA.scala", - "UnionMemberB.scala", "UnionToResolve.scala"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "ResultObject.scala", + "UnionMemberA.scala", "UnionMemberB.scala", "UnionToResolve.scala"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -72,8 +67,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "MyUnionMemberASuffix.scala", - "MyUnionMemberBSuffix.scala", "MyUnionToResolveSuffix.scala"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "MyResultObjectSuffix.scala", + "MyUnionMemberASuffix.scala", "MyUnionMemberBSuffix.scala", "MyUnionToResolveSuffix.scala"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -85,4 +80,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro file); } } + + private void generate(String path) throws IOException { + new ScalaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); + } + } diff --git a/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt b/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt new file mode 100644 index 000000000..a4aa0ed2d --- /dev/null +++ b/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt @@ -0,0 +1,12 @@ +package com.kobylynskyi.graphql.unionresolver; + + +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public interface ResultObject { + + java.util.List getList(); + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt b/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt new file mode 100644 index 000000000..2ee4011e0 --- /dev/null +++ b/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt @@ -0,0 +1,9 @@ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public interface MyResultObjectSuffix { + + java.util.List getList(); + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt b/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt new file mode 100644 index 000000000..e09549ab7 --- /dev/null +++ b/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt @@ -0,0 +1,12 @@ +package com.kobylynskyi.graphql.unionresolver + + +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface ResultObject { + + val list: List? + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt b/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt new file mode 100644 index 000000000..71f2ad729 --- /dev/null +++ b/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt @@ -0,0 +1,9 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface MyResultObjectSuffix { + + val list: List? + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt b/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt new file mode 100644 index 000000000..f9ad137de --- /dev/null +++ b/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt @@ -0,0 +1,12 @@ +package com.kobylynskyi.graphql.unionresolver + + +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +trait ResultObject { + + val list: scala.Seq[_ <: UnionToResolve] + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt b/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt new file mode 100644 index 000000000..19d9d82d5 --- /dev/null +++ b/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt @@ -0,0 +1,9 @@ +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +trait MyResultObjectSuffix { + + val list: scala.Seq[_ <: MyUnionToResolveSuffix] + +} \ No newline at end of file diff --git a/src/test/resources/schemas/union-resolver.graphqls b/src/test/resources/schemas/union-resolver.graphqls index 914317336..2f12f328c 100644 --- a/src/test/resources/schemas/union-resolver.graphqls +++ b/src/test/resources/schemas/union-resolver.graphqls @@ -1,3 +1,7 @@ +interface ResultObject { + list: [UnionToResolve!] +} + type UnionMemberA { someField: Int } From b6dfc63e629558061327c4d8a86aa99a06ab48c3 Mon Sep 17 00:00:00 2001 From: esfomeado Date: Tue, 21 Feb 2023 20:16:57 +0000 Subject: [PATCH 06/25] Generate Jackson annotations for interfaces #1033 #1034 --- .../graphql/codegen/mapper/AnnotationsMapper.java | 3 ++- .../graphql/codegen/GraphQLCodegenTest.java | 10 +++++----- .../jackson-resolver-union/ResultObject.java.txt | 4 +++- .../MyResultObjectSuffix.java.txt | 4 +++- .../kt/jackson-resolver-union/ResultObject.kt.txt | 4 +++- .../without-model-package/MyResultObjectSuffix.kt.txt | 4 +++- .../jackson-resolver-union/ResultObject.scala.txt | 4 +++- .../MyResultObjectSuffix.scala.txt | 4 +++- 8 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java index ecc6a103e..fbfb2453f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java @@ -8,6 +8,7 @@ import graphql.language.Argument; import graphql.language.Directive; import graphql.language.InputValueDefinition; +import graphql.language.InterfaceTypeDefinition; import graphql.language.ListType; import graphql.language.NamedNode; import graphql.language.NonNullType; @@ -204,7 +205,7 @@ public List getAnnotationsForDirective(MappingContext mappingContext, public List getJacksonTypeIdAnnotations(MappingContext mappingContext, NamedNode def) { List defaults = new ArrayList<>(); if (Boolean.TRUE.equals(mappingContext.getGenerateJacksonTypeIdResolver()) - && def instanceof UnionTypeDefinition) { + && (def instanceof UnionTypeDefinition || def instanceof InterfaceTypeDefinition)) { defaults.add("com.fasterxml.jackson.annotation.JsonTypeInfo(use = " + "com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")"); String modelPackageName = DataModelMapper.getModelPackageName(mappingContext); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java index bce94a841..ce083407f 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java @@ -21,6 +21,7 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.assertFileContainsElements; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; +import static java.lang.System.lineSeparator; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; @@ -141,11 +142,10 @@ void generate_NoPackage() throws Exception { generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputBuildDir.listFiles()); - assertFileContainsElements(files, "Event.java", System.lineSeparator() + - "/**" + System.lineSeparator() + - " * An event that describes a thing that happens" + System - .lineSeparator() + - " */" + System.lineSeparator()); + assertFileContainsElements(files, "Event.java", lineSeparator() + + "/**" + lineSeparator() + + " * An event that describes a thing that happens" + lineSeparator() + + " */" + lineSeparator()); } @Test diff --git a/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt b/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt index a4aa0ed2d..ccaceef42 100644 --- a/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt +++ b/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt @@ -5,8 +5,10 @@ package com.kobylynskyi.graphql.unionresolver; value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", date = "2020-12-31T23:59:59-0500" ) +@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "__typename") +@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(com.kobylynskyi.graphql.unionresolver.GraphqlJacksonTypeIdResolver.class) public interface ResultObject { java.util.List getList(); -} \ No newline at end of file +} diff --git a/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt b/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt index 2ee4011e0..4acd42053 100644 --- a/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt +++ b/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt @@ -2,8 +2,10 @@ value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", date = "2020-12-31T23:59:59-0500" ) +@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "__typename") +@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(GraphqlJacksonTypeIdResolver.class) public interface MyResultObjectSuffix { java.util.List getList(); -} \ No newline at end of file +} diff --git a/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt b/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt index e09549ab7..ce3847886 100644 --- a/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt +++ b/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt @@ -5,8 +5,10 @@ package com.kobylynskyi.graphql.unionresolver value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], date = "2020-12-31T23:59:59-0500" ) +@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "__typename") +@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(com.kobylynskyi.graphql.unionresolver.GraphqlJacksonTypeIdResolver::class) interface ResultObject { val list: List? -} \ No newline at end of file +} diff --git a/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt b/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt index 71f2ad729..a4a619cca 100644 --- a/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt +++ b/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt @@ -2,8 +2,10 @@ value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], date = "2020-12-31T23:59:59-0500" ) +@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "__typename") +@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(GraphqlJacksonTypeIdResolver::class) interface MyResultObjectSuffix { val list: List? -} \ No newline at end of file +} diff --git a/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt b/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt index f9ad137de..7cc67ab11 100644 --- a/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt +++ b/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt @@ -5,8 +5,10 @@ package com.kobylynskyi.graphql.unionresolver value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) +@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "__typename") +@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[com.kobylynskyi.graphql.unionresolver.GraphqlJacksonTypeIdResolver]) trait ResultObject { val list: scala.Seq[_ <: UnionToResolve] -} \ No newline at end of file +} diff --git a/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt b/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt index 19d9d82d5..b921de8d0 100644 --- a/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt +++ b/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt @@ -2,8 +2,10 @@ value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) +@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "__typename") +@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[GraphqlJacksonTypeIdResolver]) trait MyResultObjectSuffix { val list: scala.Seq[_ <: MyUnionToResolveSuffix] -} \ No newline at end of file +} From e06d69b89f641768a408f35e290b0fa6d8813120 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Wed, 22 Feb 2023 07:15:58 -0500 Subject: [PATCH 07/25] Ability to combine multiple response projections #985 (#1031) --- .../graphql/GraphQLParametrizedInput.java | 2 + .../model/graphql/GraphQLResponseField.java | 19 ++ .../graphql/GraphQLResponseProjection.java | 76 ++++++- .../graphql/codegen/model/graphql/Pair.java | 50 +++++ .../java-lang/parametrized_input.ftl | 11 + .../java-lang/response_projection.ftl | 18 +- .../kotlin-lang/parametrized_input.ftl | 13 ++ .../kotlin-lang/response_projection.ftl | 14 +- .../scala-lang/parametrized_input.ftl | 12 + .../scala-lang/response_projection.ftl | 31 ++- .../resources/templates/templates.properties | 0 .../GraphQLResponseProjectionTest.java | 209 ++++++++++++++++++ .../EventPropertyChildParametrizedInput.java | 7 + .../EventPropertyParentParametrizedInput.java | 7 + .../data/EventPropertyResponseProjection.java | 36 ++- .../graphql/data/EventResponseProjection.java | 31 ++- .../graphql/data/IssueResponseProjection.java | 18 +- .../data/OrganizationResponseProjection.java | 18 +- .../UpdateIssuePayloadResponseProjection.java | 23 +- .../UpdateNodeUnionResponseProjection.java | 22 +- .../empty/EventResponseProjection.java.txt | 18 +- .../request/AssetResponseProjection.java.txt | 26 ++- .../request/EventResponseProjection.java.txt | 28 ++- .../ProductResponseProjection.java.txt | 32 ++- ...ultItemConnectionResponseProjection.kt.txt | 30 ++- .../SearchResultItemResponseProjection.kt.txt | 28 ++- .../kt/empty/EventResponseProjection.kt.txt | 14 +- .../CharResponseProjection.kt.txt | 14 +- .../QueryFunParametrizedInput.kt.txt | 7 + .../QueryPrivateParametrizedInput.kt.txt | 10 + .../LocationResponseProjection.java.txt | 26 ++- .../VehicleResponseProjection.java.txt | 24 +- .../ClientDataParametrizedInput.java.txt | 9 +- .../CodeOfConductResponseProjection.java.txt | 30 ++- ...entPropertyChildParametrizedInput.java.txt | 8 + ...rametrizedInput_withoutPrimitives.java.txt | 8 + ...ntPropertyParentParametrizedInput.java.txt | 10 +- ...ParametrizedInput_withModelSuffix.java.txt | 10 +- .../EventPropertyResponseProjection.java.txt | 36 ++- .../request/EventResponseProjection.java.txt | 34 ++- ...ventResponseProjection.java_withoutAll.txt | 34 ++- .../ProductLinkCodeParametrizedInput.java.txt | 7 + .../LocationResponseProjection.java.txt | 26 ++- ...tItemConnectionResponseProjection.java.txt | 34 ++- ...earchResultItemResponseProjection.java.txt | 32 ++- .../VehicleResponseProjection.java.txt | 24 +- .../CharResponseProjection.java.txt | 18 +- .../QueryCaseParametrizedInput.java.txt | 9 +- .../QueryPrivateParametrizedInput.java.txt | 9 + .../QueryResponseProjection.java.txt | 28 ++- .../SynchronizedResponseProjection.java.txt | 22 +- ...ItemConnectionResponseProjection.scala.txt | 47 +++- ...archResultItemResponseProjection.scala.txt | 45 +++- .../empty/EventResponseProjection.scala.txt | 31 ++- .../request/AssetResponseProjection.scala.txt | 39 +++- .../request/EventResponseProjection.scala.txt | 41 +++- .../QueryPrivateParametrizedInput.scala.txt | 12 + 57 files changed, 1253 insertions(+), 224 deletions(-) create mode 100644 src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/Pair.java delete mode 100644 src/main/resources/templates/templates.properties create mode 100644 src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjectionTest.java diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLParametrizedInput.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLParametrizedInput.java index aca3d7992..b3bbf9030 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLParametrizedInput.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLParametrizedInput.java @@ -5,4 +5,6 @@ */ public interface GraphQLParametrizedInput { + GraphQLParametrizedInput deepCopy(); + } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseField.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseField.java index e42a5099b..9ca1cad2d 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseField.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseField.java @@ -86,4 +86,23 @@ public boolean equals(Object obj) { public int hashCode() { return Objects.hash(name, alias, parameters, projection); } + + /** + * Returns a clone of the instance, having a deep copy of the parameters and projection. + * + * @return a clone (deep copy) + */ + public GraphQLResponseField deepCopy() { + GraphQLResponseField deepCopy = new GraphQLResponseField(this.name); + if (this.alias != null) { + deepCopy.alias = this.alias; + } + if (this.parameters != null) { + deepCopy.parameters = this.parameters.deepCopy(); + } + if (this.projection != null) { + deepCopy.projection = this.projection.deepCopy$(); + } + return deepCopy; + } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjection.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjection.java index 4162b1e1b..27e95978b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjection.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjection.java @@ -1,16 +1,79 @@ package com.kobylynskyi.graphql.codegen.model.graphql; -import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.StringJoiner; /** - * The implementation class should basically contain the fields of the particular type which - * should be returned back to the client. + * The implementation class should contain the fields of the particular type that should be returned to the client. */ public abstract class GraphQLResponseProjection { - protected final List fields = new ArrayList<>(); + /** + * Contains all response projection fields, where: + * key - is the name+alias pair (where alias is nullable) + * value - is GraphQLResponseField which represents the response projection field + */ + protected final Map, GraphQLResponseField> fields = new LinkedHashMap<>(); + + protected GraphQLResponseProjection() { + } + + protected GraphQLResponseProjection(GraphQLResponseProjection projection) { + if (projection == null) { + return; + } + projection.fields.values().forEach(this::add$); + } + + protected GraphQLResponseProjection(List projections) { + if (projections == null) { + return; + } + for (GraphQLResponseProjection projection : projections) { + if (projection == null) { + continue; + } + projection.fields.values().forEach(this::add$); + } + } + + @SuppressWarnings({"checkstyle:MethodName", "java:S100"}) + public abstract GraphQLResponseProjection deepCopy$(); + + @SuppressWarnings({"checkstyle:MethodName", "java:S100", "java:S3824"}) + protected void add$(GraphQLResponseField responseField) { + Pair nameAndAlias = new Pair<>(responseField.getName(), responseField.getAlias()); + GraphQLResponseField existingResponseField = fields.get(nameAndAlias); + if (existingResponseField == null) { + fields.put(nameAndAlias, responseField.deepCopy()); + return; + } + + if (!Objects.equals(responseField.getParameters(), existingResponseField.getParameters())) { + throw new IllegalArgumentException( + String.format("Field '%s' has an argument conflict", existingResponseField.getName())); + } + + if (responseField.getAlias() != null) { + existingResponseField.alias(responseField.getAlias()); + } + if (responseField.getParameters() != null) { + existingResponseField.parameters(responseField.getParameters().deepCopy()); + } + if (responseField.getProjection() != null) { + GraphQLResponseProjection projectionCopy = responseField.getProjection().deepCopy$(); + if (existingResponseField.getProjection() != null) { + for (GraphQLResponseField field : projectionCopy.fields.values()) { + existingResponseField.getProjection().add$(field); + } + } else { + existingResponseField.projection(projectionCopy); + } + } + } @Override public String toString() { @@ -18,7 +81,10 @@ public String toString() { return ""; } StringJoiner joiner = new StringJoiner(" ", "{ ", " }"); - fields.forEach(field -> joiner.add(field.toString())); + for (GraphQLResponseField value : fields.values()) { + joiner.add(value.toString()); + } return joiner.toString(); } + } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/Pair.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/Pair.java new file mode 100644 index 000000000..3b9bba27e --- /dev/null +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/Pair.java @@ -0,0 +1,50 @@ +package com.kobylynskyi.graphql.codegen.model.graphql; + +import java.util.Objects; + +/** + * Class that represents a key-value pair. + * + * @param key + * @param value + */ +public class Pair { + + private final K key; + private final V value; + + public K getKey() { + return key; + } + + public V getValue() { + return value; + } + + public Pair(K key, V value) { + this.key = key; + this.value = value; + } + + @Override + public String toString() { + return key + "=" + value; + } + + @Override + public int hashCode() { + return key.hashCode() * 13 + (value == null ? 0 : value.hashCode()); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o instanceof Pair) { + Pair pair = (Pair) o; + return Objects.equals(key, pair.key) && Objects.equals(value, pair.value); + } + return false; + } +} diff --git a/src/main/resources/templates/java-lang/parametrized_input.ftl b/src/main/resources/templates/java-lang/parametrized_input.ftl index 3b2927154..97eb06fd2 100644 --- a/src/main/resources/templates/java-lang/parametrized_input.ftl +++ b/src/main/resources/templates/java-lang/parametrized_input.ftl @@ -70,6 +70,17 @@ public class ${className} implements GraphQLParametrizedInput { + @Override + public ${className} deepCopy() { + ${className} parametrizedInput = new ${className}(); + <#if fields?has_content> + <#list fields as field> + parametrizedInput.${field.name}(this.${field.name}); + + + return parametrizedInput; + } + <#if equalsAndHashCode> @Override public boolean equals(Object obj) { diff --git a/src/main/resources/templates/java-lang/response_projection.ftl b/src/main/resources/templates/java-lang/response_projection.ftl index 939d21ec5..7f23e48c9 100644 --- a/src/main/resources/templates/java-lang/response_projection.ftl +++ b/src/main/resources/templates/java-lang/response_projection.ftl @@ -8,6 +8,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; <#if equalsAndHashCode> import java.util.Objects; @@ -36,6 +37,14 @@ public class ${className} extends GraphQLResponseProjection { public ${className}() { } + + public ${className}(${className} projection) { + super(projection); + } + + public ${className}(List<${className}> projections) { + super(projections); + } <#if fields?has_content && generateAllMethodInProjection> public ${className} all$() { @@ -76,7 +85,7 @@ public class ${className} extends GraphQLResponseProjection { } public ${className} ${field.methodName}(String alias<#if field.type?has_content>, ${field.type} subProjection) { - fields.add(new GraphQLResponseField("${field.name}").alias(alias)<#if field.type?has_content>.projection(subProjection)); + add$(new GraphQLResponseField("${field.name}").alias(alias)<#if field.type?has_content>.projection(subProjection)); return this; } @@ -86,13 +95,18 @@ public class ${className} extends GraphQLResponseProjection { } public ${className} ${field.methodName}(String alias, ${field.parametrizedInputClassName} input<#if field.type?has_content>, ${field.type} subProjection) { - fields.add(new GraphQLResponseField("${field.name}").alias(alias).parameters(input)<#if field.type?has_content>.projection(subProjection)); + add$(new GraphQLResponseField("${field.name}").alias(alias).parameters(input)<#if field.type?has_content>.projection(subProjection)); return this; } + @Override + public ${className} deepCopy$() { + return new ${className}(this); + } + <#if equalsAndHashCode> @Override public boolean equals(Object obj) { diff --git a/src/main/resources/templates/kotlin-lang/parametrized_input.ftl b/src/main/resources/templates/kotlin-lang/parametrized_input.ftl index 7d11b654b..6057672bd 100755 --- a/src/main/resources/templates/kotlin-lang/parametrized_input.ftl +++ b/src/main/resources/templates/kotlin-lang/parametrized_input.ftl @@ -38,6 +38,19 @@ data class ${className}( ) : GraphQLParametrizedInput { + override fun deepCopy(): ${className} { + <#if fields?has_content> + return ${className}( + <#list fields as field> + this.${field.name}<#if field_has_next>, + + ) + <#else> + return ${className}() + + + } + override fun toString(): String { val joiner = StringJoiner(", ", "( ", " )") <#list fields as field> diff --git a/src/main/resources/templates/kotlin-lang/response_projection.ftl b/src/main/resources/templates/kotlin-lang/response_projection.ftl index c4f501116..8c76cb09b 100755 --- a/src/main/resources/templates/kotlin-lang/response_projection.ftl +++ b/src/main/resources/templates/kotlin-lang/response_projection.ftl @@ -24,7 +24,13 @@ import java.util.Objects <#list annotations as annotation> @${annotation} -open class ${className} : GraphQLResponseProjection() { +open class ${className} : GraphQLResponseProjection { + + constructor(): super() + + constructor(projection: ${className}): super(projection) + + constructor(projections: List<${className}>): super(projections) <#if fields?has_content && generateAllMethodInProjection> private val projectionDepthOnFields: MutableMap by lazy { mutableMapOf() } @@ -63,7 +69,7 @@ open class ${className} : GraphQLResponseProjection() { fun ${field.methodName}(<#if field.type?has_content>subProjection: ${field.type}): ${className} = ${field.methodName}(<#if field.parametrizedInputClassName?has_content>null<#if field.type?has_content>, subProjection) fun ${field.methodName}(alias: String?<#if field.type?has_content>, subProjection: ${field.type}): ${className} { - fields.add(GraphQLResponseField("${field.name}").alias(alias)<#if field.type?has_content>.projection(subProjection)) + `add$`(GraphQLResponseField("${field.name}").alias(alias)<#if field.type?has_content>.projection(subProjection)) return this } @@ -71,13 +77,15 @@ open class ${className} : GraphQLResponseProjection() { fun ${field.methodName}(input: ${field.parametrizedInputClassName}<#if field.type?has_content>, subProjection: ${field.type}): ${className} = ${field.methodName}(null, input<#if field.type?has_content>, subProjection) fun ${field.methodName}(alias: String?, input: ${field.parametrizedInputClassName}<#if field.type?has_content>, subProjection: ${field.type}): ${className} { - fields.add(GraphQLResponseField("${field.name}").alias(alias).parameters(input)<#if field.type?has_content>.projection(subProjection)) + `add$`(GraphQLResponseField("${field.name}").alias(alias).parameters(input)<#if field.type?has_content>.projection(subProjection)) return this } + override fun `deepCopy$`(): ${className} = ${className}(this) + <#if equalsAndHashCode> override fun equals(other: Any?): Boolean { if (this === other) { diff --git a/src/main/resources/templates/scala-lang/parametrized_input.ftl b/src/main/resources/templates/scala-lang/parametrized_input.ftl index 71103289d..c6fd907a0 100644 --- a/src/main/resources/templates/scala-lang/parametrized_input.ftl +++ b/src/main/resources/templates/scala-lang/parametrized_input.ftl @@ -54,6 +54,18 @@ case class ${className}( ) extends GraphQLParametrizedInput { + override def deepCopy(): ${className} = { + <#if fields?has_content> + ${className}( + <#list fields as field> + this.${field.name}<#if field_has_next>, + + ) + <#else> + ${className}() + + } + override def toString(): String = {<#--There is no Option[Seq[T]], Format is not supported in the generated code, so it is very difficult to write template for this format.--> <#if fields?has_content> scala.Seq(<#list fields as field><#assign getMethod = ".get"><#assign asJava = ".asJava"> diff --git a/src/main/resources/templates/scala-lang/response_projection.ftl b/src/main/resources/templates/scala-lang/response_projection.ftl index a52fa69a2..42e4c3a14 100644 --- a/src/main/resources/templates/scala-lang/response_projection.ftl +++ b/src/main/resources/templates/scala-lang/response_projection.ftl @@ -10,6 +10,7 @@ import java.util.Objects <#if fields?has_content && generateAllMethodInProjection> import scala.collection.mutable.HashMap +import scala.collection.JavaConverters._ <#if javaDoc?has_content> /** @@ -27,7 +28,29 @@ import scala.collection.mutable.HashMap <#list annotations as annotation> @${annotation} -class ${className} extends GraphQLResponseProjection { +class ${className}() extends GraphQLResponseProjection() { + + def this(projection: ${className}) = { + this() + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + + def this(projections: scala.Seq[${className}]) = { + this() + if (projections != null) { + for (projection <- projections) { + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + } + } <#if fields?has_content && generateAllMethodInProjection> private final lazy val projectionDepthOnFields = new HashMap[String, Int] @@ -68,7 +91,7 @@ class ${className} extends GraphQLResponseProjection { } def ${field.methodName}(alias: String<#if field.type?has_content>, subProjection: ${field.type}): ${className} = { - fields.add(new GraphQLResponseField("${field.name}").alias(alias)<#if field.type?has_content>.projection(subProjection)) + add$(new GraphQLResponseField("${field.name}").alias(alias)<#if field.type?has_content>.projection(subProjection)) this } @@ -78,13 +101,15 @@ class ${className} extends GraphQLResponseProjection { } def ${field.methodName}(alias: String, input: ${field.parametrizedInputClassName} <#if field.type?has_content>, subProjection: ${field.type}): ${className} = { - fields.add(new GraphQLResponseField("${field.name}").alias(alias).parameters(input)<#if field.type?has_content>.projection(subProjection)) + add$(new GraphQLResponseField("${field.name}").alias(alias).parameters(input)<#if field.type?has_content>.projection(subProjection)) this } + override def deepCopy$(): ${className} = new ${className}(this) + <#if equalsAndHashCode> override def equals(obj: Any): Boolean = { if (this == obj) { diff --git a/src/main/resources/templates/templates.properties b/src/main/resources/templates/templates.properties deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjectionTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjectionTest.java new file mode 100644 index 000000000..67335f8c6 --- /dev/null +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjectionTest.java @@ -0,0 +1,209 @@ +package com.kobylynskyi.graphql.codegen.model.graphql; + +import com.kobylynskyi.graphql.codegen.model.graphql.data.EventPropertyChildParametrizedInput; +import com.kobylynskyi.graphql.codegen.model.graphql.data.EventPropertyResponseProjection; +import com.kobylynskyi.graphql.codegen.model.graphql.data.EventResponseProjection; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +class GraphQLResponseProjectionTest { + + @Test + public void deepCopy_empty() { + EventResponseProjection original = new EventResponseProjection(); + EventResponseProjection deepCopy = original.deepCopy$(); + assertTrue(deepCopy.fields.isEmpty()); + } + + @Test + public void deepCopy_null() { + assertTrue(new EventResponseProjection((EventResponseProjection) null).fields.isEmpty()); + } + + @Test + public void deepCopy_null_list() { + assertTrue(new EventResponseProjection((List) null).fields.isEmpty()); + } + + @Test + public void deepCopy_empty_list() { + assertTrue(new EventResponseProjection(new ArrayList<>()).fields.isEmpty()); + } + + @Test + public void deepCopy_list_with_null_element() { + assertTrue(new EventResponseProjection(new ArrayList<>(singletonList(null))).fields.isEmpty()); + } + + @Test + public void deepCopy() { + EventResponseProjection original = new EventResponseProjection(); + original.id(); + original.status("state"); + original.properties(new EventPropertyResponseProjection() + .intVal() + .stringVal() + .child(new EventPropertyChildParametrizedInput(1, 2), + new EventPropertyResponseProjection() + .booleanVal())); + + EventResponseProjection deepCopy = original.deepCopy$(); + + assertEquals("{ id state : status properties { intVal stringVal child (first: 1, last: 2) { booleanVal } } }", + original.toString()); + assertEquals("{ id state : status properties { intVal stringVal child (first: 1, last: 2) { booleanVal } } }", + deepCopy.toString()); + + // check that original and deepcopy are not modified + + original.active(); + deepCopy.rating(); + + assertEquals( + "{ id state : status properties { intVal stringVal child (first: 1, last: 2) { booleanVal } } active }", + original.toString()); + assertEquals( + "{ id state : status properties { intVal stringVal child (first: 1, last: 2) { booleanVal } } rating }", + deepCopy.toString()); + } + + @Test + public void join() { + EventResponseProjection projection1 = new EventResponseProjection(); + projection1.id(); + projection1.status("state"); + projection1.rating(); + projection1.properties(new EventPropertyResponseProjection() + .intVal() + .stringVal() + .child("child12", new EventPropertyChildParametrizedInput(1, 2), + new EventPropertyResponseProjection() + .booleanVal())); + + EventResponseProjection projection2 = new EventResponseProjection(); + projection2.id("uid"); + projection2.status(); + projection2.active(); + projection2.properties(new EventPropertyResponseProjection() + .floatVal() + .child("child34", new EventPropertyChildParametrizedInput(3, 4), + new EventPropertyResponseProjection() + .intVal())); + + EventResponseProjection projection12 = new EventResponseProjection(asList(projection1, projection2)); + assertEquals("{ id state : status rating " + + "properties { intVal stringVal child12 : child (first: 1, last: 2) { booleanVal } " + + "floatVal child34 : child (first: 3, last: 4) { intVal } } uid : id status active }", + projection12.toString()); + } + + @Test + public void join_same_aliases_different_inputs() { + EventResponseProjection projection1 = new EventResponseProjection() + .properties(new EventPropertyResponseProjection() + .child(new EventPropertyChildParametrizedInput(1, 2), + new EventPropertyResponseProjection().intVal())); + + EventResponseProjection projection2 = new EventResponseProjection() + .properties(new EventPropertyResponseProjection() + .child(new EventPropertyChildParametrizedInput(3, 4), + new EventPropertyResponseProjection().intVal())); + + try { + new EventResponseProjection(asList(projection1, projection2)); + fail(); + } catch (IllegalArgumentException e) { + assertEquals("Field 'child' has an argument conflict", e.getMessage()); + } + } + + @Test + public void join_same_aliases_different_inputs2() { + EventResponseProjection projection1 = new EventResponseProjection() + .properties(new EventPropertyResponseProjection() + .child("children", new EventPropertyChildParametrizedInput(1, 2), + new EventPropertyResponseProjection().intVal())); + + EventResponseProjection projection2 = new EventResponseProjection() + .properties(new EventPropertyResponseProjection() + .child("children", new EventPropertyChildParametrizedInput(3, 4), + new EventPropertyResponseProjection().intVal())); + + try { + new EventResponseProjection(asList(projection1, projection2)); + fail(); + } catch (IllegalArgumentException e) { + assertEquals("Field 'child' has an argument conflict", e.getMessage()); + } + } + + @Test + public void join_same_aliases_different_inputs3() { + EventResponseProjection projection1 = new EventResponseProjection() + .properties(new EventPropertyResponseProjection() + .child("children", new EventPropertyChildParametrizedInput(1, 2), + null)); + + EventResponseProjection projection2 = new EventResponseProjection() + .properties(new EventPropertyResponseProjection() + .child("children", new EventPropertyChildParametrizedInput(3, 4), + new EventPropertyResponseProjection().intVal())); + + try { + new EventResponseProjection(asList(projection1, projection2)); + fail(); + } catch (IllegalArgumentException e) { + assertEquals("Field 'child' has an argument conflict", e.getMessage()); + } + } + + @Test + public void join_same_aliases_different_inputs4() { + EventResponseProjection projection1 = new EventResponseProjection() + .properties(new EventPropertyResponseProjection() + .child("children", new EventPropertyChildParametrizedInput(1, 2), + new EventPropertyResponseProjection().intVal())); + + EventResponseProjection projection2 = new EventResponseProjection() + .properties(new EventPropertyResponseProjection() + .child("children", new EventPropertyChildParametrizedInput(3, 4), + null)); + + try { + new EventResponseProjection(asList(projection1, projection2)); + fail(); + } catch (IllegalArgumentException e) { + assertEquals("Field 'child' has an argument conflict", e.getMessage()); + } + } + + @Test + public void join_null_values() { + EventResponseProjection projection1 = new EventResponseProjection(); + projection1.id(null); + projection1.properties(null); + + EventResponseProjection projection2 = new EventResponseProjection(); + projection2.properties(new EventPropertyResponseProjection() + .child(null)); + + EventResponseProjection projection3 = new EventResponseProjection(); + projection2.properties(new EventPropertyResponseProjection() + .child(null, null, new EventPropertyResponseProjection() + .child(null))); + + EventResponseProjection projection123 = new EventResponseProjection( + asList(projection1, projection2, projection3)); + assertEquals("{ id properties { child { child } } }", + projection123.toString()); + } + +} \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyChildParametrizedInput.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyChildParametrizedInput.java index b8a4f6f26..2179eff54 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyChildParametrizedInput.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyChildParametrizedInput.java @@ -62,4 +62,11 @@ public String toString() { return joiner.toString(); } + @Override + public EventPropertyChildParametrizedInput deepCopy() { + EventPropertyChildParametrizedInput parametrizedInput = new EventPropertyChildParametrizedInput(); + parametrizedInput.first(this.first); + parametrizedInput.last(this.last); + return parametrizedInput; + } } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyParentParametrizedInput.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyParentParametrizedInput.java index c07845db8..5f40cb22c 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyParentParametrizedInput.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyParentParametrizedInput.java @@ -62,4 +62,11 @@ public String toString() { return joiner.toString(); } + @Override + public EventPropertyParentParametrizedInput deepCopy() { + EventPropertyParentParametrizedInput parametrizedInput = new EventPropertyParentParametrizedInput(); + parametrizedInput.withStatus(this.withStatus); + parametrizedInput.createdAfter(this.createdAfter); + return parametrizedInput; + } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyResponseProjection.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyResponseProjection.java index 16eefa0b7..12b64815f 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyResponseProjection.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyResponseProjection.java @@ -3,12 +3,27 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * Response projection for EventProperty */ public class EventPropertyResponseProjection extends GraphQLResponseProjection { + private final Map projectionDepthOnFields = new HashMap<>(); + public EventPropertyResponseProjection() { + super(); + } + + public EventPropertyResponseProjection(EventPropertyResponseProjection projection) { + super(projection); + } + + public EventPropertyResponseProjection(List projections) { + super(projections); } public EventPropertyResponseProjection floatVal() { @@ -16,7 +31,7 @@ public EventPropertyResponseProjection floatVal() { } public EventPropertyResponseProjection floatVal(String alias) { - fields.add(new GraphQLResponseField("floatVal").alias(alias)); + add$(new GraphQLResponseField("floatVal").alias(alias)); return this; } @@ -25,7 +40,7 @@ public EventPropertyResponseProjection booleanVal() { } public EventPropertyResponseProjection booleanVal(String alias) { - fields.add(new GraphQLResponseField("booleanVal").alias(alias)); + add$(new GraphQLResponseField("booleanVal").alias(alias)); return this; } @@ -34,7 +49,7 @@ public EventPropertyResponseProjection intVal() { } public EventPropertyResponseProjection intVal(String alias) { - fields.add(new GraphQLResponseField("intVal").alias(alias)); + add$(new GraphQLResponseField("intVal").alias(alias)); return this; } @@ -43,7 +58,7 @@ public EventPropertyResponseProjection stringVal() { } public EventPropertyResponseProjection stringVal(String alias) { - fields.add(new GraphQLResponseField("stringVal").alias(alias)); + add$(new GraphQLResponseField("stringVal").alias(alias)); return this; } @@ -52,7 +67,7 @@ public EventPropertyResponseProjection child(EventPropertyResponseProjection sub } public EventPropertyResponseProjection child(String alias, EventPropertyResponseProjection subProjection) { - fields.add(new GraphQLResponseField("child").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("child").alias(alias).projection(subProjection)); return this; } @@ -63,7 +78,7 @@ public EventPropertyResponseProjection child(EventPropertyChildParametrizedInput public EventPropertyResponseProjection child(String alias, EventPropertyChildParametrizedInput input, EventPropertyResponseProjection subProjection) { - fields.add(new GraphQLResponseField("child").alias(alias).parameters(input).projection(subProjection)); + add$(new GraphQLResponseField("child").alias(alias).parameters(input).projection(subProjection)); return this; } @@ -72,7 +87,7 @@ public EventPropertyResponseProjection parent(EventResponseProjection subProject } public EventPropertyResponseProjection parent(String alias, EventResponseProjection subProjection) { - fields.add(new GraphQLResponseField("parent").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("parent").alias(alias).projection(subProjection)); return this; } @@ -83,7 +98,7 @@ public EventPropertyResponseProjection parent(EventPropertyParentParametrizedInp public EventPropertyResponseProjection parent(String alias, EventPropertyParentParametrizedInput input, EventResponseProjection subProjection) { - fields.add(new GraphQLResponseField("parent").alias(alias).parameters(input).projection(subProjection)); + add$(new GraphQLResponseField("parent").alias(alias).parameters(input).projection(subProjection)); return this; } @@ -94,4 +109,9 @@ public EventPropertyResponseProjection parent(String alias, EventPropertyParentP public GraphQLResponseProjection all$(int maxDepth) { return null; } + + @Override + public GraphQLResponseProjection deepCopy$() { + return new EventPropertyResponseProjection(this); + } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventResponseProjection.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventResponseProjection.java index e45a94cef..f7693102a 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventResponseProjection.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventResponseProjection.java @@ -3,6 +3,8 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; +import java.util.List; + /** * Response projection for Event */ @@ -11,12 +13,20 @@ public class EventResponseProjection extends GraphQLResponseProjection { public EventResponseProjection() { } + public EventResponseProjection(EventResponseProjection projection) { + super(projection); + } + + public EventResponseProjection(List projections) { + super(projections); + } + public EventResponseProjection id() { return id(null); } public EventResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -25,7 +35,7 @@ public EventResponseProjection categoryId() { } public EventResponseProjection categoryId(String alias) { - fields.add(new GraphQLResponseField("categoryId").alias(alias)); + add$(new GraphQLResponseField("categoryId").alias(alias)); return this; } @@ -34,7 +44,7 @@ public EventResponseProjection properties(EventPropertyResponseProjection subPro } public EventResponseProjection properties(String alias, EventPropertyResponseProjection subProjection) { - fields.add(new GraphQLResponseField("properties").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("properties").alias(alias).projection(subProjection)); return this; } @@ -43,7 +53,7 @@ public EventResponseProjection status() { } public EventResponseProjection status(String alias) { - fields.add(new GraphQLResponseField("status").alias(alias)); + add$(new GraphQLResponseField("status").alias(alias)); return this; } @@ -52,7 +62,7 @@ public EventResponseProjection createdBy() { } public EventResponseProjection createdBy(String alias) { - fields.add(new GraphQLResponseField("createdBy").alias(alias)); + add$(new GraphQLResponseField("createdBy").alias(alias)); return this; } @@ -61,7 +71,7 @@ public EventResponseProjection createdDateTime() { } public EventResponseProjection createdDateTime(String alias) { - fields.add(new GraphQLResponseField("createdDateTime").alias(alias)); + add$(new GraphQLResponseField("createdDateTime").alias(alias)); return this; } @@ -70,7 +80,7 @@ public EventResponseProjection active() { } public EventResponseProjection active(String alias) { - fields.add(new GraphQLResponseField("active").alias(alias)); + add$(new GraphQLResponseField("active").alias(alias)); return this; } @@ -79,7 +89,7 @@ public EventResponseProjection rating() { } public EventResponseProjection rating(String alias) { - fields.add(new GraphQLResponseField("rating").alias(alias)); + add$(new GraphQLResponseField("rating").alias(alias)); return this; } @@ -90,4 +100,9 @@ public EventResponseProjection rating(String alias) { public GraphQLResponseProjection all$(int maxDepth) { return null; } + + @Override + public EventResponseProjection deepCopy$() { + return new EventResponseProjection(this); + } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/IssueResponseProjection.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/IssueResponseProjection.java index ff698abab..ddaa5cc9e 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/IssueResponseProjection.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/IssueResponseProjection.java @@ -3,17 +3,27 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; +import java.util.List; + public class IssueResponseProjection extends GraphQLResponseProjection { public IssueResponseProjection() { } + public IssueResponseProjection(IssueResponseProjection projection) { + super(projection); + } + + public IssueResponseProjection(List projections) { + super(projections); + } + public IssueResponseProjection activeLockReason() { return activeLockReason(null); } public IssueResponseProjection activeLockReason(String alias) { - fields.add(new GraphQLResponseField("activeLockReason").alias(alias)); + add$(new GraphQLResponseField("activeLockReason").alias(alias)); return this; } @@ -24,6 +34,12 @@ public IssueResponseProjection activeLockReason(String alias) { public GraphQLResponseProjection all$(int maxDepth) { return null; } + + @Override + public IssueResponseProjection deepCopy$() { + return new IssueResponseProjection(this); + } + // REST OF THE STUFF WAS REMOVED } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/OrganizationResponseProjection.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/OrganizationResponseProjection.java index a7340e2c3..29e0cdc02 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/OrganizationResponseProjection.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/OrganizationResponseProjection.java @@ -3,17 +3,27 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; +import java.util.List; + public class OrganizationResponseProjection extends GraphQLResponseProjection { public OrganizationResponseProjection() { } + public OrganizationResponseProjection(OrganizationResponseProjection projection) { + super(projection); + } + + public OrganizationResponseProjection(List projections) { + super(projections); + } + public OrganizationResponseProjection name() { return name(null); } public OrganizationResponseProjection name(String alias) { - fields.add(new GraphQLResponseField("name").alias(alias)); + add$(new GraphQLResponseField("name").alias(alias)); return this; } @@ -24,6 +34,12 @@ public OrganizationResponseProjection name(String alias) { public GraphQLResponseProjection all$(int maxDepth) { return null; } + + @Override + public GraphQLResponseProjection deepCopy$() { + return new OrganizationResponseProjection(this); + } + // REST OF THE STUFF WAS REMOVED } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssuePayloadResponseProjection.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssuePayloadResponseProjection.java index b59f0e878..f8481e02e 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssuePayloadResponseProjection.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssuePayloadResponseProjection.java @@ -3,17 +3,27 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; +import java.util.List; + public class UpdateIssuePayloadResponseProjection extends GraphQLResponseProjection { public UpdateIssuePayloadResponseProjection() { } + public UpdateIssuePayloadResponseProjection(UpdateIssuePayloadResponseProjection projection) { + super(projection); + } + + public UpdateIssuePayloadResponseProjection(List projections) { + super(projections); + } + public UpdateIssuePayloadResponseProjection clientMutationId() { return clientMutationId(null); } public UpdateIssuePayloadResponseProjection clientMutationId(String alias) { - fields.add(new GraphQLResponseField("clientMutationId").alias(alias)); + add$(new GraphQLResponseField("clientMutationId").alias(alias)); return this; } @@ -22,7 +32,7 @@ public UpdateIssuePayloadResponseProjection issue(IssueResponseProjection subPro } public UpdateIssuePayloadResponseProjection issue(String alias, IssueResponseProjection subProjection) { - fields.add(new GraphQLResponseField("issue").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("issue").alias(alias).projection(subProjection)); return this; } @@ -31,7 +41,7 @@ public UpdateIssuePayloadResponseProjection union(UpdateNodeUnionResponseProject } public UpdateIssuePayloadResponseProjection union(String alias, UpdateNodeUnionResponseProjection subProjection) { - fields.add(new GraphQLResponseField("union").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("union").alias(alias).projection(subProjection)); return this; } @@ -42,4 +52,11 @@ public UpdateIssuePayloadResponseProjection union(String alias, UpdateNodeUnionR public GraphQLResponseProjection all$(int maxDepth) { return null; } + + + @Override + public UpdateIssuePayloadResponseProjection deepCopy$() { + return new UpdateIssuePayloadResponseProjection(this); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateNodeUnionResponseProjection.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateNodeUnionResponseProjection.java index df12f818e..447f983f8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateNodeUnionResponseProjection.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateNodeUnionResponseProjection.java @@ -3,6 +3,8 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; +import java.util.List; + /** * Response projection for SearchResultItem */ @@ -11,12 +13,20 @@ public class UpdateNodeUnionResponseProjection extends GraphQLResponseProjection public UpdateNodeUnionResponseProjection() { } + public UpdateNodeUnionResponseProjection(UpdateNodeUnionResponseProjection projection) { + super(projection); + } + + public UpdateNodeUnionResponseProjection(List projections) { + super(projections); + } + public UpdateNodeUnionResponseProjection onIssue(IssueResponseProjection subProjection) { return onIssue(null, subProjection); } public UpdateNodeUnionResponseProjection onIssue(String alias, IssueResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on Issue").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on Issue").alias(alias).projection(subProjection)); return this; } @@ -26,7 +36,7 @@ public UpdateNodeUnionResponseProjection onOrganization(OrganizationResponseProj public UpdateNodeUnionResponseProjection onOrganization(String alias, OrganizationResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)); return this; } @@ -36,7 +46,7 @@ public UpdateNodeUnionResponseProjection typename() { } public UpdateNodeUnionResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } @@ -47,4 +57,10 @@ public UpdateNodeUnionResponseProjection typename(String alias) { public GraphQLResponseProjection all$(int maxDepth) { return null; } + + @Override + public UpdateNodeUnionResponseProjection deepCopy$() { + return new UpdateNodeUnionResponseProjection(this); + } + } diff --git a/src/test/resources/expected-classes/empty/EventResponseProjection.java.txt b/src/test/resources/expected-classes/empty/EventResponseProjection.java.txt index 6a3b27772..ffcd71920 100644 --- a/src/test/resources/expected-classes/empty/EventResponseProjection.java.txt +++ b/src/test/resources/expected-classes/empty/EventResponseProjection.java.txt @@ -2,6 +2,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for Event @@ -17,6 +18,14 @@ public class EventResponseProjection extends GraphQLResponseProjection { public EventResponseProjection() { } + public EventResponseProjection(EventResponseProjection projection) { + super(projection); + } + + public EventResponseProjection(List projections) { + super(projections); + } + public EventResponseProjection all$() { return all$(3); } @@ -31,9 +40,14 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public EventResponseProjection deepCopy$() { + return new EventResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend/request/AssetResponseProjection.java.txt b/src/test/resources/expected-classes/extend/request/AssetResponseProjection.java.txt index a6a8bb3b2..f4d26b019 100644 --- a/src/test/resources/expected-classes/extend/request/AssetResponseProjection.java.txt +++ b/src/test/resources/expected-classes/extend/request/AssetResponseProjection.java.txt @@ -2,6 +2,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for Asset @@ -17,6 +18,14 @@ public class AssetResponseProjection extends GraphQLResponseProjection { public AssetResponseProjection() { } + public AssetResponseProjection(AssetResponseProjection projection) { + super(projection); + } + + public AssetResponseProjection(List projections) { + super(projections); + } + public AssetResponseProjection all$() { return all$(3); } @@ -35,7 +44,7 @@ public class AssetResponseProjection extends GraphQLResponseProjection { } public AssetResponseProjection name(String alias) { - fields.add(new GraphQLResponseField("name").alias(alias)); + add$(new GraphQLResponseField("name").alias(alias)); return this; } @@ -44,7 +53,7 @@ public class AssetResponseProjection extends GraphQLResponseProjection { } public AssetResponseProjection status(String alias) { - fields.add(new GraphQLResponseField("status").alias(alias)); + add$(new GraphQLResponseField("status").alias(alias)); return this; } @@ -53,7 +62,7 @@ public class AssetResponseProjection extends GraphQLResponseProjection { } public AssetResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -62,7 +71,7 @@ public class AssetResponseProjection extends GraphQLResponseProjection { } public AssetResponseProjection createdBy(String alias) { - fields.add(new GraphQLResponseField("createdBy").alias(alias)); + add$(new GraphQLResponseField("createdBy").alias(alias)); return this; } @@ -71,9 +80,14 @@ public class AssetResponseProjection extends GraphQLResponseProjection { } public AssetResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public AssetResponseProjection deepCopy$() { + return new AssetResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/extend/request/EventResponseProjection.java.txt b/src/test/resources/expected-classes/extend/request/EventResponseProjection.java.txt index ee75de8c3..e2a104929 100644 --- a/src/test/resources/expected-classes/extend/request/EventResponseProjection.java.txt +++ b/src/test/resources/expected-classes/extend/request/EventResponseProjection.java.txt @@ -2,6 +2,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for Event @@ -17,6 +18,14 @@ public class EventResponseProjection extends GraphQLResponseProjection { public EventResponseProjection() { } + public EventResponseProjection(EventResponseProjection projection) { + super(projection); + } + + public EventResponseProjection(List projections) { + super(projections); + } + public EventResponseProjection all$() { return all$(3); } @@ -39,7 +48,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection status(String alias) { - fields.add(new GraphQLResponseField("status").alias(alias)); + add$(new GraphQLResponseField("status").alias(alias)); return this; } @@ -48,7 +57,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection createdDateTime(String alias) { - fields.add(new GraphQLResponseField("createdDateTime").alias(alias)); + add$(new GraphQLResponseField("createdDateTime").alias(alias)); return this; } @@ -57,7 +66,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection assets(String alias, AssetResponseProjection subProjection) { - fields.add(new GraphQLResponseField("assets").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("assets").alias(alias).projection(subProjection)); return this; } @@ -66,7 +75,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -75,7 +84,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection createdBy(String alias) { - fields.add(new GraphQLResponseField("createdBy").alias(alias)); + add$(new GraphQLResponseField("createdBy").alias(alias)); return this; } @@ -84,9 +93,14 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public EventResponseProjection deepCopy$() { + return new EventResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/from-introspection-result/ProductResponseProjection.java.txt b/src/test/resources/expected-classes/from-introspection-result/ProductResponseProjection.java.txt index 35a0a4b1c..e8f81f34c 100644 --- a/src/test/resources/expected-classes/from-introspection-result/ProductResponseProjection.java.txt +++ b/src/test/resources/expected-classes/from-introspection-result/ProductResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for Product @@ -19,6 +20,14 @@ public class ProductResponseProjection extends GraphQLResponseProjection { public ProductResponseProjection() { } + public ProductResponseProjection(ProductResponseProjection projection) { + super(projection); + } + + public ProductResponseProjection(List projections) { + super(projections); + } + public ProductResponseProjection all$() { return all$(3); } @@ -40,7 +49,7 @@ public class ProductResponseProjection extends GraphQLResponseProjection { } public ProductResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -49,7 +58,7 @@ public class ProductResponseProjection extends GraphQLResponseProjection { } public ProductResponseProjection title(String alias) { - fields.add(new GraphQLResponseField("title").alias(alias)); + add$(new GraphQLResponseField("title").alias(alias)); return this; } @@ -58,7 +67,7 @@ public class ProductResponseProjection extends GraphQLResponseProjection { } public ProductResponseProjection description(String alias) { - fields.add(new GraphQLResponseField("description").alias(alias)); + add$(new GraphQLResponseField("description").alias(alias)); return this; } @@ -67,7 +76,7 @@ public class ProductResponseProjection extends GraphQLResponseProjection { } public ProductResponseProjection price(String alias) { - fields.add(new GraphQLResponseField("price").alias(alias)); + add$(new GraphQLResponseField("price").alias(alias)); return this; } @@ -76,7 +85,7 @@ public class ProductResponseProjection extends GraphQLResponseProjection { } public ProductResponseProjection sku(String alias) { - fields.add(new GraphQLResponseField("sku").alias(alias)); + add$(new GraphQLResponseField("sku").alias(alias)); return this; } @@ -85,7 +94,7 @@ public class ProductResponseProjection extends GraphQLResponseProjection { } public ProductResponseProjection stockStatus(String alias) { - fields.add(new GraphQLResponseField("stockStatus").alias(alias)); + add$(new GraphQLResponseField("stockStatus").alias(alias)); return this; } @@ -94,7 +103,7 @@ public class ProductResponseProjection extends GraphQLResponseProjection { } public ProductResponseProjection addedDateTime(String alias) { - fields.add(new GraphQLResponseField("addedDateTime").alias(alias)); + add$(new GraphQLResponseField("addedDateTime").alias(alias)); return this; } @@ -103,9 +112,14 @@ public class ProductResponseProjection extends GraphQLResponseProjection { } public ProductResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public ProductResponseProjection deepCopy$() { + return new ProductResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/SearchResultItemConnectionResponseProjection.kt.txt b/src/test/resources/expected-classes/kt/SearchResultItemConnectionResponseProjection.kt.txt index b21735ecc..cdaf038e7 100644 --- a/src/test/resources/expected-classes/kt/SearchResultItemConnectionResponseProjection.kt.txt +++ b/src/test/resources/expected-classes/kt/SearchResultItemConnectionResponseProjection.kt.txt @@ -11,7 +11,13 @@ import java.util.Objects value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], date = "2020-12-31T23:59:59-0500" ) -open class SearchResultItemConnectionResponseProjection : GraphQLResponseProjection() { +open class SearchResultItemConnectionResponseProjection : GraphQLResponseProjection { + + constructor(): super() + + constructor(projection: SearchResultItemConnectionResponseProjection): super(projection) + + constructor(projections: List): super(projections) private val projectionDepthOnFields: MutableMap by lazy { mutableMapOf() } @@ -42,66 +48,68 @@ open class SearchResultItemConnectionResponseProjection : GraphQLResponseProject fun codeCount(): SearchResultItemConnectionResponseProjection = codeCount(null) fun codeCount(alias: String?): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("codeCount").alias(alias)) + `add$`(GraphQLResponseField("codeCount").alias(alias)) return this } fun edges(subProjection: SearchResultItemEdgeResponseProjection): SearchResultItemConnectionResponseProjection = edges(null, subProjection) fun edges(alias: String?, subProjection: SearchResultItemEdgeResponseProjection): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("edges").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("edges").alias(alias).projection(subProjection)) return this } fun issueCount(): SearchResultItemConnectionResponseProjection = issueCount(null) fun issueCount(alias: String?): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("issueCount").alias(alias)) + `add$`(GraphQLResponseField("issueCount").alias(alias)) return this } fun nodes(subProjection: SearchResultItemResponseProjection): SearchResultItemConnectionResponseProjection = nodes(null, subProjection) fun nodes(alias: String?, subProjection: SearchResultItemResponseProjection): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("nodes").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("nodes").alias(alias).projection(subProjection)) return this } fun pageInfo(subProjection: PageInfoResponseProjection): SearchResultItemConnectionResponseProjection = pageInfo(null, subProjection) fun pageInfo(alias: String?, subProjection: PageInfoResponseProjection): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("pageInfo").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("pageInfo").alias(alias).projection(subProjection)) return this } fun repositoryCount(): SearchResultItemConnectionResponseProjection = repositoryCount(null) fun repositoryCount(alias: String?): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("repositoryCount").alias(alias)) + `add$`(GraphQLResponseField("repositoryCount").alias(alias)) return this } fun userCount(): SearchResultItemConnectionResponseProjection = userCount(null) fun userCount(alias: String?): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("userCount").alias(alias)) + `add$`(GraphQLResponseField("userCount").alias(alias)) return this } fun wikiCount(): SearchResultItemConnectionResponseProjection = wikiCount(null) fun wikiCount(alias: String?): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("wikiCount").alias(alias)) + `add$`(GraphQLResponseField("wikiCount").alias(alias)) return this } fun typename(): SearchResultItemConnectionResponseProjection = typename(null) fun typename(alias: String?): SearchResultItemConnectionResponseProjection { - fields.add(GraphQLResponseField("__typename").alias(alias)) + `add$`(GraphQLResponseField("__typename").alias(alias)) return this } + override fun `deepCopy$`(): SearchResultItemConnectionResponseProjection = SearchResultItemConnectionResponseProjection(this) + override fun equals(other: Any?): Boolean { if (this === other) { return true @@ -115,4 +123,4 @@ open class SearchResultItemConnectionResponseProjection : GraphQLResponseProject override fun hashCode(): Int = Objects.hash(fields) -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt b/src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt index 615a7f878..4585bafe1 100644 --- a/src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt +++ b/src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt @@ -11,7 +11,13 @@ import java.util.Objects value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], date = "2020-12-31T23:59:59-0500" ) -open class SearchResultItemResponseProjection : GraphQLResponseProjection() { +open class SearchResultItemResponseProjection : GraphQLResponseProjection { + + constructor(): super() + + constructor(projection: SearchResultItemResponseProjection): super(projection) + + constructor(projections: List): super(projections) private val projectionDepthOnFields: MutableMap by lazy { mutableMapOf() } @@ -25,59 +31,61 @@ open class SearchResultItemResponseProjection : GraphQLResponseProjection() { fun onApp(subProjection: AppResponseProjection): SearchResultItemResponseProjection = onApp(null, subProjection) fun onApp(alias: String?, subProjection: AppResponseProjection): SearchResultItemResponseProjection { - fields.add(GraphQLResponseField("...on App").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("...on App").alias(alias).projection(subProjection)) return this } fun onRepository(subProjection: RepositoryResponseProjection): SearchResultItemResponseProjection = onRepository(null, subProjection) fun onRepository(alias: String?, subProjection: RepositoryResponseProjection): SearchResultItemResponseProjection { - fields.add(GraphQLResponseField("...on Repository").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("...on Repository").alias(alias).projection(subProjection)) return this } fun onIssue(subProjection: IssueResponseProjection): SearchResultItemResponseProjection = onIssue(null, subProjection) fun onIssue(alias: String?, subProjection: IssueResponseProjection): SearchResultItemResponseProjection { - fields.add(GraphQLResponseField("...on Issue").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("...on Issue").alias(alias).projection(subProjection)) return this } fun onOrganization(subProjection: OrganizationResponseProjection): SearchResultItemResponseProjection = onOrganization(null, subProjection) fun onOrganization(alias: String?, subProjection: OrganizationResponseProjection): SearchResultItemResponseProjection { - fields.add(GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)) return this } fun onUser(subProjection: UserResponseProjection): SearchResultItemResponseProjection = onUser(null, subProjection) fun onUser(alias: String?, subProjection: UserResponseProjection): SearchResultItemResponseProjection { - fields.add(GraphQLResponseField("...on User").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("...on User").alias(alias).projection(subProjection)) return this } fun onMarketplaceListing(subProjection: MarketplaceListingResponseProjection): SearchResultItemResponseProjection = onMarketplaceListing(null, subProjection) fun onMarketplaceListing(alias: String?, subProjection: MarketplaceListingResponseProjection): SearchResultItemResponseProjection { - fields.add(GraphQLResponseField("...on MarketplaceListing").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("...on MarketplaceListing").alias(alias).projection(subProjection)) return this } fun onPullRequest(subProjection: PullRequestResponseProjection): SearchResultItemResponseProjection = onPullRequest(null, subProjection) fun onPullRequest(alias: String?, subProjection: PullRequestResponseProjection): SearchResultItemResponseProjection { - fields.add(GraphQLResponseField("...on PullRequest").alias(alias).projection(subProjection)) + `add$`(GraphQLResponseField("...on PullRequest").alias(alias).projection(subProjection)) return this } fun typename(): SearchResultItemResponseProjection = typename(null) fun typename(alias: String?): SearchResultItemResponseProjection { - fields.add(GraphQLResponseField("__typename").alias(alias)) + `add$`(GraphQLResponseField("__typename").alias(alias)) return this } + override fun `deepCopy$`(): SearchResultItemResponseProjection = SearchResultItemResponseProjection(this) + override fun equals(other: Any?): Boolean { if (this === other) { return true @@ -91,4 +99,4 @@ open class SearchResultItemResponseProjection : GraphQLResponseProjection() { override fun hashCode(): Int = Objects.hash(fields) -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/empty/EventResponseProjection.kt.txt b/src/test/resources/expected-classes/kt/empty/EventResponseProjection.kt.txt index 75c42178b..f60516975 100644 --- a/src/test/resources/expected-classes/kt/empty/EventResponseProjection.kt.txt +++ b/src/test/resources/expected-classes/kt/empty/EventResponseProjection.kt.txt @@ -8,7 +8,13 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], date = "2020-12-31T23:59:59-0500" ) -open class EventResponseProjection : GraphQLResponseProjection() { +open class EventResponseProjection : GraphQLResponseProjection { + + constructor(): super() + + constructor(projection: EventResponseProjection): super(projection) + + constructor(projections: List): super(projections) private val projectionDepthOnFields: MutableMap by lazy { mutableMapOf() } @@ -22,9 +28,11 @@ open class EventResponseProjection : GraphQLResponseProjection() { fun typename(): EventResponseProjection = typename(null) fun typename(alias: String?): EventResponseProjection { - fields.add(GraphQLResponseField("__typename").alias(alias)) + `add$`(GraphQLResponseField("__typename").alias(alias)) return this } + override fun `deepCopy$`(): EventResponseProjection = EventResponseProjection(this) + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/restricted-words/CharResponseProjection.kt.txt b/src/test/resources/expected-classes/kt/restricted-words/CharResponseProjection.kt.txt index 42d33e7fe..73519c1a3 100644 --- a/src/test/resources/expected-classes/kt/restricted-words/CharResponseProjection.kt.txt +++ b/src/test/resources/expected-classes/kt/restricted-words/CharResponseProjection.kt.txt @@ -11,7 +11,13 @@ import java.util.Objects value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], date = "2020-12-31T23:59:59-0500" ) -open class CharResponseProjection : GraphQLResponseProjection() { +open class CharResponseProjection : GraphQLResponseProjection { + + constructor(): super() + + constructor(projection: CharResponseProjection): super(projection) + + constructor(projections: List): super(projections) private val projectionDepthOnFields: MutableMap by lazy { mutableMapOf() } @@ -25,10 +31,12 @@ open class CharResponseProjection : GraphQLResponseProjection() { fun typename(): CharResponseProjection = typename(null) fun typename(alias: String?): CharResponseProjection { - fields.add(GraphQLResponseField("__typename").alias(alias)) + `add$`(GraphQLResponseField("__typename").alias(alias)) return this } + override fun `deepCopy$`(): CharResponseProjection = CharResponseProjection(this) + override fun equals(other: Any?): Boolean { if (this === other) { return true @@ -42,4 +50,4 @@ open class CharResponseProjection : GraphQLResponseProjection() { override fun hashCode(): Int = Objects.hash(fields) -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/restricted-words/QueryFunParametrizedInput.kt.txt b/src/test/resources/expected-classes/kt/restricted-words/QueryFunParametrizedInput.kt.txt index 1ff7dae2f..44fa206e5 100644 --- a/src/test/resources/expected-classes/kt/restricted-words/QueryFunParametrizedInput.kt.txt +++ b/src/test/resources/expected-classes/kt/restricted-words/QueryFunParametrizedInput.kt.txt @@ -14,6 +14,13 @@ data class QueryFunParametrizedInput( val final: Int? ) : GraphQLParametrizedInput { + override fun deepCopy(): QueryFunParametrizedInput { + return QueryFunParametrizedInput( + this.final + ) + + } + override fun toString(): String { val joiner = StringJoiner(", ", "( ", " )") if (final != null) { diff --git a/src/test/resources/expected-classes/kt/restricted-words/QueryPrivateParametrizedInput.kt.txt b/src/test/resources/expected-classes/kt/restricted-words/QueryPrivateParametrizedInput.kt.txt index 63367fbb4..70abf58d6 100644 --- a/src/test/resources/expected-classes/kt/restricted-words/QueryPrivateParametrizedInput.kt.txt +++ b/src/test/resources/expected-classes/kt/restricted-words/QueryPrivateParametrizedInput.kt.txt @@ -17,6 +17,16 @@ data class QueryPrivateParametrizedInput( val createdAfter: java.time.ZonedDateTime? ) : GraphQLParametrizedInput { + override fun deepCopy(): QueryPrivateParametrizedInput { + return QueryPrivateParametrizedInput( + this.int, + this.new, + this.enum, + this.createdAfter + ) + + } + override fun toString(): String { val joiner = StringJoiner(", ", "( ", " )") if (int != null) { diff --git a/src/test/resources/expected-classes/projection-with-selectAll/LocationResponseProjection.java.txt b/src/test/resources/expected-classes/projection-with-selectAll/LocationResponseProjection.java.txt index 09147b077..0a31b1522 100644 --- a/src/test/resources/expected-classes/projection-with-selectAll/LocationResponseProjection.java.txt +++ b/src/test/resources/expected-classes/projection-with-selectAll/LocationResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for Location @@ -19,6 +20,14 @@ public class LocationResponseProjection extends GraphQLResponseProjection { public LocationResponseProjection() { } + public LocationResponseProjection(LocationResponseProjection projection) { + super(projection); + } + + public LocationResponseProjection(List projections) { + super(projections); + } + public LocationResponseProjection all$() { return all$(3); } @@ -35,7 +44,7 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -44,7 +53,7 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection locationType(String alias) { - fields.add(new GraphQLResponseField("locationType").alias(alias)); + add$(new GraphQLResponseField("locationType").alias(alias)); return this; } @@ -53,7 +62,7 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection onCustomerLocation(String alias, CustomerLocationResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on CustomerLocation").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on CustomerLocation").alias(alias).projection(subProjection)); return this; } @@ -62,7 +71,7 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection onDealerLocation(String alias, DealerLocationResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on DealerLocation").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on DealerLocation").alias(alias).projection(subProjection)); return this; } @@ -71,9 +80,14 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public LocationResponseProjection deepCopy$() { + return new LocationResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/projection-with-selectAll/VehicleResponseProjection.java.txt b/src/test/resources/expected-classes/projection-with-selectAll/VehicleResponseProjection.java.txt index b8027a9f8..40831cca3 100644 --- a/src/test/resources/expected-classes/projection-with-selectAll/VehicleResponseProjection.java.txt +++ b/src/test/resources/expected-classes/projection-with-selectAll/VehicleResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for Vehicle @@ -19,6 +20,14 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { public VehicleResponseProjection() { } + public VehicleResponseProjection(VehicleResponseProjection projection) { + super(projection); + } + + public VehicleResponseProjection(List projections) { + super(projections); + } + public VehicleResponseProjection all$() { return all$(3); } @@ -39,7 +48,7 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { } public VehicleResponseProjection vehicleId(String alias) { - fields.add(new GraphQLResponseField("vehicleId").alias(alias)); + add$(new GraphQLResponseField("vehicleId").alias(alias)); return this; } @@ -48,7 +57,7 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { } public VehicleResponseProjection registrationNumber(String alias) { - fields.add(new GraphQLResponseField("registrationNumber").alias(alias)); + add$(new GraphQLResponseField("registrationNumber").alias(alias)); return this; } @@ -57,7 +66,7 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { } public VehicleResponseProjection location(String alias, LocationResponseProjection subProjection) { - fields.add(new GraphQLResponseField("location").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("location").alias(alias).projection(subProjection)); return this; } @@ -66,9 +75,14 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { } public VehicleResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public VehicleResponseProjection deepCopy$() { + return new VehicleResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/request/ClientDataParametrizedInput.java.txt b/src/test/resources/expected-classes/request/ClientDataParametrizedInput.java.txt index 3bc9a2b8e..3f57ec7b4 100644 --- a/src/test/resources/expected-classes/request/ClientDataParametrizedInput.java.txt +++ b/src/test/resources/expected-classes/request/ClientDataParametrizedInput.java.txt @@ -28,6 +28,13 @@ public class ClientDataParametrizedInput implements GraphQLParametrizedInput { return this; } + @Override + public ClientDataParametrizedInput deepCopy() { + ClientDataParametrizedInput parametrizedInput = new ClientDataParametrizedInput(); + parametrizedInput.ID(this.ID); + return parametrizedInput; + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -52,4 +59,4 @@ public class ClientDataParametrizedInput implements GraphQLParametrizedInput { return joiner.toString(); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/request/CodeOfConductResponseProjection.java.txt b/src/test/resources/expected-classes/request/CodeOfConductResponseProjection.java.txt index dd838e951..f82517af5 100644 --- a/src/test/resources/expected-classes/request/CodeOfConductResponseProjection.java.txt +++ b/src/test/resources/expected-classes/request/CodeOfConductResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; import java.util.Objects; /** @@ -20,6 +21,14 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { public CodeOfConductResponseProjection() { } + public CodeOfConductResponseProjection(CodeOfConductResponseProjection projection) { + super(projection); + } + + public CodeOfConductResponseProjection(List projections) { + super(projections); + } + public CodeOfConductResponseProjection all$() { return all$(3); } @@ -40,7 +49,7 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { } public CodeOfConductResponseProjection body(String alias) { - fields.add(new GraphQLResponseField("body").alias(alias)); + add$(new GraphQLResponseField("body").alias(alias)); return this; } @@ -49,7 +58,7 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { } public CodeOfConductResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -58,7 +67,7 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { } public CodeOfConductResponseProjection key(String alias) { - fields.add(new GraphQLResponseField("key").alias(alias)); + add$(new GraphQLResponseField("key").alias(alias)); return this; } @@ -67,7 +76,7 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { } public CodeOfConductResponseProjection name(String alias) { - fields.add(new GraphQLResponseField("name").alias(alias)); + add$(new GraphQLResponseField("name").alias(alias)); return this; } @@ -76,7 +85,7 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { } public CodeOfConductResponseProjection resourcePath(String alias) { - fields.add(new GraphQLResponseField("resourcePath").alias(alias)); + add$(new GraphQLResponseField("resourcePath").alias(alias)); return this; } @@ -85,7 +94,7 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { } public CodeOfConductResponseProjection url(String alias) { - fields.add(new GraphQLResponseField("url").alias(alias)); + add$(new GraphQLResponseField("url").alias(alias)); return this; } @@ -94,10 +103,15 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { } public CodeOfConductResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public CodeOfConductResponseProjection deepCopy$() { + return new CodeOfConductResponseProjection(this); + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -115,4 +129,4 @@ public class CodeOfConductResponseProjection extends GraphQLResponseProjection { return Objects.hash(fields); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput.java.txt b/src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput.java.txt index 428f0fbc7..269788aef 100644 --- a/src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput.java.txt +++ b/src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput.java.txt @@ -35,6 +35,14 @@ public class EventPropertyChildParametrizedInput implements GraphQLParametrizedI return this; } + @Override + public EventPropertyChildParametrizedInput deepCopy() { + EventPropertyChildParametrizedInput parametrizedInput = new EventPropertyChildParametrizedInput(); + parametrizedInput.first(this.first); + parametrizedInput.last(this.last); + return parametrizedInput; + } + @Override public boolean equals(Object obj) { if (this == obj) { diff --git a/src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput_withoutPrimitives.java.txt b/src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput_withoutPrimitives.java.txt index 428f0fbc7..269788aef 100644 --- a/src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput_withoutPrimitives.java.txt +++ b/src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput_withoutPrimitives.java.txt @@ -35,6 +35,14 @@ public class EventPropertyChildParametrizedInput implements GraphQLParametrizedI return this; } + @Override + public EventPropertyChildParametrizedInput deepCopy() { + EventPropertyChildParametrizedInput parametrizedInput = new EventPropertyChildParametrizedInput(); + parametrizedInput.first(this.first); + parametrizedInput.last(this.last); + return parametrizedInput; + } + @Override public boolean equals(Object obj) { if (this == obj) { diff --git a/src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput.java.txt b/src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput.java.txt index aa04aac82..0de644fae 100644 --- a/src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput.java.txt +++ b/src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput.java.txt @@ -35,6 +35,14 @@ public class EventPropertyParentParametrizedInput implements GraphQLParametrized return this; } + @Override + public EventPropertyParentParametrizedInput deepCopy() { + EventPropertyParentParametrizedInput parametrizedInput = new EventPropertyParentParametrizedInput(); + parametrizedInput.withStatus(this.withStatus); + parametrizedInput.createdAfter(this.createdAfter); + return parametrizedInput; + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -65,4 +73,4 @@ public class EventPropertyParentParametrizedInput implements GraphQLParametrized return joiner.toString(); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput_withModelSuffix.java.txt b/src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput_withModelSuffix.java.txt index 9b9604ab5..2014ecffa 100644 --- a/src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput_withModelSuffix.java.txt +++ b/src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput_withModelSuffix.java.txt @@ -35,6 +35,14 @@ public class EventPropertyParentParametrizedInput implements GraphQLParametrized return this; } + @Override + public EventPropertyParentParametrizedInput deepCopy() { + EventPropertyParentParametrizedInput parametrizedInput = new EventPropertyParentParametrizedInput(); + parametrizedInput.withStatus(this.withStatus); + parametrizedInput.createdAfter(this.createdAfter); + return parametrizedInput; + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -65,4 +73,4 @@ public class EventPropertyParentParametrizedInput implements GraphQLParametrized return joiner.toString(); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/request/EventPropertyResponseProjection.java.txt b/src/test/resources/expected-classes/request/EventPropertyResponseProjection.java.txt index 4b3f05622..0c0442ed0 100644 --- a/src/test/resources/expected-classes/request/EventPropertyResponseProjection.java.txt +++ b/src/test/resources/expected-classes/request/EventPropertyResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; import java.util.Objects; /** @@ -20,6 +21,14 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { public EventPropertyResponseProjection() { } + public EventPropertyResponseProjection(EventPropertyResponseProjection projection) { + super(projection); + } + + public EventPropertyResponseProjection(List projections) { + super(projections); + } + public EventPropertyResponseProjection all$() { return all$(3); } @@ -47,7 +56,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection floatVal(String alias) { - fields.add(new GraphQLResponseField("floatVal").alias(alias)); + add$(new GraphQLResponseField("floatVal").alias(alias)); return this; } @@ -56,7 +65,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection booleanVal(String alias) { - fields.add(new GraphQLResponseField("booleanVal").alias(alias)); + add$(new GraphQLResponseField("booleanVal").alias(alias)); return this; } @@ -65,7 +74,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection intVal(String alias) { - fields.add(new GraphQLResponseField("intVal").alias(alias)); + add$(new GraphQLResponseField("intVal").alias(alias)); return this; } @@ -74,7 +83,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection intVals(String alias) { - fields.add(new GraphQLResponseField("intVals").alias(alias)); + add$(new GraphQLResponseField("intVals").alias(alias)); return this; } @@ -83,7 +92,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection stringVal(String alias) { - fields.add(new GraphQLResponseField("stringVal").alias(alias)); + add$(new GraphQLResponseField("stringVal").alias(alias)); return this; } @@ -92,7 +101,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection child(String alias, EventPropertyResponseProjection subProjection) { - fields.add(new GraphQLResponseField("child").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("child").alias(alias).projection(subProjection)); return this; } @@ -101,7 +110,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection child(String alias, EventPropertyChildParametrizedInput input, EventPropertyResponseProjection subProjection) { - fields.add(new GraphQLResponseField("child").alias(alias).parameters(input).projection(subProjection)); + add$(new GraphQLResponseField("child").alias(alias).parameters(input).projection(subProjection)); return this; } @@ -110,7 +119,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection parent(String alias, EventResponseProjection subProjection) { - fields.add(new GraphQLResponseField("parent").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("parent").alias(alias).projection(subProjection)); return this; } @@ -119,7 +128,7 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection parent(String alias, EventPropertyParentParametrizedInput input, EventResponseProjection subProjection) { - fields.add(new GraphQLResponseField("parent").alias(alias).parameters(input).projection(subProjection)); + add$(new GraphQLResponseField("parent").alias(alias).parameters(input).projection(subProjection)); return this; } @@ -128,10 +137,15 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { } public EventPropertyResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public EventPropertyResponseProjection deepCopy$() { + return new EventPropertyResponseProjection(this); + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -149,4 +163,4 @@ public class EventPropertyResponseProjection extends GraphQLResponseProjection { return Objects.hash(fields); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/request/EventResponseProjection.java.txt b/src/test/resources/expected-classes/request/EventResponseProjection.java.txt index 710bae7c1..d5280c7c7 100644 --- a/src/test/resources/expected-classes/request/EventResponseProjection.java.txt +++ b/src/test/resources/expected-classes/request/EventResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; import java.util.Objects; /** @@ -20,6 +21,14 @@ public class EventResponseProjection extends GraphQLResponseProjection { public EventResponseProjection() { } + public EventResponseProjection(EventResponseProjection projection) { + super(projection); + } + + public EventResponseProjection(List projections) { + super(projections); + } + public EventResponseProjection all$() { return all$(3); } @@ -45,7 +54,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -54,7 +63,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection categoryId(String alias) { - fields.add(new GraphQLResponseField("categoryId").alias(alias)); + add$(new GraphQLResponseField("categoryId").alias(alias)); return this; } @@ -63,7 +72,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection properties(String alias, EventPropertyResponseProjection subProjection) { - fields.add(new GraphQLResponseField("properties").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("properties").alias(alias).projection(subProjection)); return this; } @@ -72,7 +81,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection status(String alias) { - fields.add(new GraphQLResponseField("status").alias(alias)); + add$(new GraphQLResponseField("status").alias(alias)); return this; } @@ -81,7 +90,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection createdBy(String alias) { - fields.add(new GraphQLResponseField("createdBy").alias(alias)); + add$(new GraphQLResponseField("createdBy").alias(alias)); return this; } @@ -90,7 +99,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection createdDateTime(String alias) { - fields.add(new GraphQLResponseField("createdDateTime").alias(alias)); + add$(new GraphQLResponseField("createdDateTime").alias(alias)); return this; } @@ -99,7 +108,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection active(String alias) { - fields.add(new GraphQLResponseField("active").alias(alias)); + add$(new GraphQLResponseField("active").alias(alias)); return this; } @@ -108,7 +117,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection rating(String alias) { - fields.add(new GraphQLResponseField("rating").alias(alias)); + add$(new GraphQLResponseField("rating").alias(alias)); return this; } @@ -117,10 +126,15 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public EventResponseProjection deepCopy$() { + return new EventResponseProjection(this); + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -138,4 +152,4 @@ public class EventResponseProjection extends GraphQLResponseProjection { return Objects.hash(fields); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/request/EventResponseProjection.java_withoutAll.txt b/src/test/resources/expected-classes/request/EventResponseProjection.java_withoutAll.txt index 53dcfe6fc..772d3eccc 100644 --- a/src/test/resources/expected-classes/request/EventResponseProjection.java_withoutAll.txt +++ b/src/test/resources/expected-classes/request/EventResponseProjection.java_withoutAll.txt @@ -2,6 +2,7 @@ package com.github.graphql; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; +import java.util.List; import java.util.Objects; /** @@ -16,12 +17,20 @@ public class EventResponseProjection extends GraphQLResponseProjection { public EventResponseProjection() { } + public EventResponseProjection(EventResponseProjection projection) { + super(projection); + } + + public EventResponseProjection(List projections) { + super(projections); + } + public EventResponseProjection id() { return id(null); } public EventResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -30,7 +39,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection categoryId(String alias) { - fields.add(new GraphQLResponseField("categoryId").alias(alias)); + add$(new GraphQLResponseField("categoryId").alias(alias)); return this; } @@ -39,7 +48,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection properties(String alias, EventPropertyResponseProjection subProjection) { - fields.add(new GraphQLResponseField("properties").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("properties").alias(alias).projection(subProjection)); return this; } @@ -48,7 +57,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection status(String alias) { - fields.add(new GraphQLResponseField("status").alias(alias)); + add$(new GraphQLResponseField("status").alias(alias)); return this; } @@ -57,7 +66,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection createdBy(String alias) { - fields.add(new GraphQLResponseField("createdBy").alias(alias)); + add$(new GraphQLResponseField("createdBy").alias(alias)); return this; } @@ -66,7 +75,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection createdDateTime(String alias) { - fields.add(new GraphQLResponseField("createdDateTime").alias(alias)); + add$(new GraphQLResponseField("createdDateTime").alias(alias)); return this; } @@ -75,7 +84,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection active(String alias) { - fields.add(new GraphQLResponseField("active").alias(alias)); + add$(new GraphQLResponseField("active").alias(alias)); return this; } @@ -84,7 +93,7 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection rating(String alias) { - fields.add(new GraphQLResponseField("rating").alias(alias)); + add$(new GraphQLResponseField("rating").alias(alias)); return this; } @@ -93,10 +102,15 @@ public class EventResponseProjection extends GraphQLResponseProjection { } public EventResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public EventResponseProjection deepCopy$() { + return new EventResponseProjection(this); + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -114,4 +128,4 @@ public class EventResponseProjection extends GraphQLResponseProjection { return Objects.hash(fields); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt b/src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt index 6f51a4c69..2e415922c 100644 --- a/src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt +++ b/src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt @@ -28,6 +28,13 @@ public class ProductLinkCodeParametrizedInput implements GraphQLParametrizedInpu return this; } + @Override + public ProductLinkCodeParametrizedInput deepCopy() { + ProductLinkCodeParametrizedInput parametrizedInput = new ProductLinkCodeParametrizedInput(); + parametrizedInput.pid(this.pid); + return parametrizedInput; + } + @Override public String toString() { diff --git a/src/test/resources/expected-classes/response/LocationResponseProjection.java.txt b/src/test/resources/expected-classes/response/LocationResponseProjection.java.txt index 09147b077..0a31b1522 100644 --- a/src/test/resources/expected-classes/response/LocationResponseProjection.java.txt +++ b/src/test/resources/expected-classes/response/LocationResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for Location @@ -19,6 +20,14 @@ public class LocationResponseProjection extends GraphQLResponseProjection { public LocationResponseProjection() { } + public LocationResponseProjection(LocationResponseProjection projection) { + super(projection); + } + + public LocationResponseProjection(List projections) { + super(projections); + } + public LocationResponseProjection all$() { return all$(3); } @@ -35,7 +44,7 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection id(String alias) { - fields.add(new GraphQLResponseField("id").alias(alias)); + add$(new GraphQLResponseField("id").alias(alias)); return this; } @@ -44,7 +53,7 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection locationType(String alias) { - fields.add(new GraphQLResponseField("locationType").alias(alias)); + add$(new GraphQLResponseField("locationType").alias(alias)); return this; } @@ -53,7 +62,7 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection onCustomerLocation(String alias, CustomerLocationResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on CustomerLocation").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on CustomerLocation").alias(alias).projection(subProjection)); return this; } @@ -62,7 +71,7 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection onDealerLocation(String alias, DealerLocationResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on DealerLocation").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on DealerLocation").alias(alias).projection(subProjection)); return this; } @@ -71,9 +80,14 @@ public class LocationResponseProjection extends GraphQLResponseProjection { } public LocationResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public LocationResponseProjection deepCopy$() { + return new LocationResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/response/SearchResultItemConnectionResponseProjection.java.txt b/src/test/resources/expected-classes/response/SearchResultItemConnectionResponseProjection.java.txt index 953291fe4..05adac560 100644 --- a/src/test/resources/expected-classes/response/SearchResultItemConnectionResponseProjection.java.txt +++ b/src/test/resources/expected-classes/response/SearchResultItemConnectionResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for SearchResultItemConnection @@ -19,6 +20,14 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons public SearchResultItemConnectionResponseProjection() { } + public SearchResultItemConnectionResponseProjection(SearchResultItemConnectionResponseProjection projection) { + super(projection); + } + + public SearchResultItemConnectionResponseProjection(List projections) { + super(projections); + } + public SearchResultItemConnectionResponseProjection all$() { return all$(3); } @@ -50,7 +59,7 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection codeCount(String alias) { - fields.add(new GraphQLResponseField("codeCount").alias(alias)); + add$(new GraphQLResponseField("codeCount").alias(alias)); return this; } @@ -59,7 +68,7 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection edges(String alias, SearchResultItemEdgeResponseProjection subProjection) { - fields.add(new GraphQLResponseField("edges").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("edges").alias(alias).projection(subProjection)); return this; } @@ -68,7 +77,7 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection issueCount(String alias) { - fields.add(new GraphQLResponseField("issueCount").alias(alias)); + add$(new GraphQLResponseField("issueCount").alias(alias)); return this; } @@ -77,7 +86,7 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection nodes(String alias, SearchResultItemResponseProjection subProjection) { - fields.add(new GraphQLResponseField("nodes").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("nodes").alias(alias).projection(subProjection)); return this; } @@ -86,7 +95,7 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection pageInfo(String alias, PageInfoResponseProjection subProjection) { - fields.add(new GraphQLResponseField("pageInfo").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("pageInfo").alias(alias).projection(subProjection)); return this; } @@ -95,7 +104,7 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection repositoryCount(String alias) { - fields.add(new GraphQLResponseField("repositoryCount").alias(alias)); + add$(new GraphQLResponseField("repositoryCount").alias(alias)); return this; } @@ -104,7 +113,7 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection userCount(String alias) { - fields.add(new GraphQLResponseField("userCount").alias(alias)); + add$(new GraphQLResponseField("userCount").alias(alias)); return this; } @@ -113,7 +122,7 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection wikiCount(String alias) { - fields.add(new GraphQLResponseField("wikiCount").alias(alias)); + add$(new GraphQLResponseField("wikiCount").alias(alias)); return this; } @@ -122,9 +131,14 @@ public class SearchResultItemConnectionResponseProjection extends GraphQLRespons } public SearchResultItemConnectionResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public SearchResultItemConnectionResponseProjection deepCopy$() { + return new SearchResultItemConnectionResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt b/src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt index a0ae71590..61fa7fee5 100644 --- a/src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt +++ b/src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for SearchResultItem @@ -19,6 +20,14 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio public SearchResultItemResponseProjection() { } + public SearchResultItemResponseProjection(SearchResultItemResponseProjection projection) { + super(projection); + } + + public SearchResultItemResponseProjection(List projections) { + super(projections); + } + public SearchResultItemResponseProjection all$() { return all$(3); } @@ -33,7 +42,7 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio } public SearchResultItemResponseProjection onApp(String alias, AppResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on App").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on App").alias(alias).projection(subProjection)); return this; } @@ -42,7 +51,7 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio } public SearchResultItemResponseProjection onRepository(String alias, RepositoryResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on Repository").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on Repository").alias(alias).projection(subProjection)); return this; } @@ -51,7 +60,7 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio } public SearchResultItemResponseProjection onIssue(String alias, IssueResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on Issue").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on Issue").alias(alias).projection(subProjection)); return this; } @@ -60,7 +69,7 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio } public SearchResultItemResponseProjection onOrganization(String alias, OrganizationResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)); return this; } @@ -69,7 +78,7 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio } public SearchResultItemResponseProjection onUser(String alias, UserResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on User").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on User").alias(alias).projection(subProjection)); return this; } @@ -78,7 +87,7 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio } public SearchResultItemResponseProjection onMarketplaceListing(String alias, MarketplaceListingResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on MarketplaceListing").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on MarketplaceListing").alias(alias).projection(subProjection)); return this; } @@ -87,7 +96,7 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio } public SearchResultItemResponseProjection onPullRequest(String alias, PullRequestResponseProjection subProjection) { - fields.add(new GraphQLResponseField("...on PullRequest").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("...on PullRequest").alias(alias).projection(subProjection)); return this; } @@ -96,9 +105,14 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio } public SearchResultItemResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public SearchResultItemResponseProjection deepCopy$() { + return new SearchResultItemResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/response/VehicleResponseProjection.java.txt b/src/test/resources/expected-classes/response/VehicleResponseProjection.java.txt index b8027a9f8..40831cca3 100644 --- a/src/test/resources/expected-classes/response/VehicleResponseProjection.java.txt +++ b/src/test/resources/expected-classes/response/VehicleResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * Response projection for Vehicle @@ -19,6 +20,14 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { public VehicleResponseProjection() { } + public VehicleResponseProjection(VehicleResponseProjection projection) { + super(projection); + } + + public VehicleResponseProjection(List projections) { + super(projections); + } + public VehicleResponseProjection all$() { return all$(3); } @@ -39,7 +48,7 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { } public VehicleResponseProjection vehicleId(String alias) { - fields.add(new GraphQLResponseField("vehicleId").alias(alias)); + add$(new GraphQLResponseField("vehicleId").alias(alias)); return this; } @@ -48,7 +57,7 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { } public VehicleResponseProjection registrationNumber(String alias) { - fields.add(new GraphQLResponseField("registrationNumber").alias(alias)); + add$(new GraphQLResponseField("registrationNumber").alias(alias)); return this; } @@ -57,7 +66,7 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { } public VehicleResponseProjection location(String alias, LocationResponseProjection subProjection) { - fields.add(new GraphQLResponseField("location").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("location").alias(alias).projection(subProjection)); return this; } @@ -66,9 +75,14 @@ public class VehicleResponseProjection extends GraphQLResponseProjection { } public VehicleResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public VehicleResponseProjection deepCopy$() { + return new VehicleResponseProjection(this); + } + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/restricted-words/CharResponseProjection.java.txt b/src/test/resources/expected-classes/restricted-words/CharResponseProjection.java.txt index 11fa4b04c..001932785 100644 --- a/src/test/resources/expected-classes/restricted-words/CharResponseProjection.java.txt +++ b/src/test/resources/expected-classes/restricted-words/CharResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; import java.util.Objects; /** @@ -20,6 +21,14 @@ public class CharResponseProjection extends GraphQLResponseProjection { public CharResponseProjection() { } + public CharResponseProjection(CharResponseProjection projection) { + super(projection); + } + + public CharResponseProjection(List projections) { + super(projections); + } + public CharResponseProjection all$() { return all$(3); } @@ -34,10 +43,15 @@ public class CharResponseProjection extends GraphQLResponseProjection { } public CharResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public CharResponseProjection deepCopy$() { + return new CharResponseProjection(this); + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -55,4 +69,4 @@ public class CharResponseProjection extends GraphQLResponseProjection { return Objects.hash(fields); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/restricted-words/QueryCaseParametrizedInput.java.txt b/src/test/resources/expected-classes/restricted-words/QueryCaseParametrizedInput.java.txt index 783a99a83..4f8586f20 100644 --- a/src/test/resources/expected-classes/restricted-words/QueryCaseParametrizedInput.java.txt +++ b/src/test/resources/expected-classes/restricted-words/QueryCaseParametrizedInput.java.txt @@ -28,6 +28,13 @@ public class QueryCaseParametrizedInput implements GraphQLParametrizedInput { return this; } + @Override + public QueryCaseParametrizedInput deepCopy() { + QueryCaseParametrizedInput parametrizedInput = new QueryCaseParametrizedInput(); + parametrizedInput.Final(this.Final); + return parametrizedInput; + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -54,4 +61,4 @@ public class QueryCaseParametrizedInput implements GraphQLParametrizedInput { return joiner.toString(); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/restricted-words/QueryPrivateParametrizedInput.java.txt b/src/test/resources/expected-classes/restricted-words/QueryPrivateParametrizedInput.java.txt index b0b8cacc1..300789a5c 100644 --- a/src/test/resources/expected-classes/restricted-words/QueryPrivateParametrizedInput.java.txt +++ b/src/test/resources/expected-classes/restricted-words/QueryPrivateParametrizedInput.java.txt @@ -42,6 +42,15 @@ public class QueryPrivateParametrizedInput implements GraphQLParametrizedInput { return this; } + @Override + public QueryPrivateParametrizedInput deepCopy() { + QueryPrivateParametrizedInput parametrizedInput = new QueryPrivateParametrizedInput(); + parametrizedInput.Int(this.Int); + parametrizedInput.New(this.New); + parametrizedInput.Enum(this.Enum); + return parametrizedInput; + } + @Override public boolean equals(Object obj) { if (this == obj) { diff --git a/src/test/resources/expected-classes/restricted-words/QueryResponseProjection.java.txt b/src/test/resources/expected-classes/restricted-words/QueryResponseProjection.java.txt index 310ee9c16..a2cbd0e07 100644 --- a/src/test/resources/expected-classes/restricted-words/QueryResponseProjection.java.txt +++ b/src/test/resources/expected-classes/restricted-words/QueryResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; import java.util.Objects; /** @@ -20,6 +21,14 @@ public class QueryResponseProjection extends GraphQLResponseProjection { public QueryResponseProjection() { } + public QueryResponseProjection(QueryResponseProjection projection) { + super(projection); + } + + public QueryResponseProjection(List projections) { + super(projections); + } + public QueryResponseProjection all$() { return all$(3); } @@ -40,7 +49,7 @@ public class QueryResponseProjection extends GraphQLResponseProjection { } public QueryResponseProjection Native(String alias) { - fields.add(new GraphQLResponseField("native").alias(alias)); + add$(new GraphQLResponseField("native").alias(alias)); return this; } @@ -49,7 +58,7 @@ public class QueryResponseProjection extends GraphQLResponseProjection { } public QueryResponseProjection Private(String alias, SynchronizedResponseProjection subProjection) { - fields.add(new GraphQLResponseField("private").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("private").alias(alias).projection(subProjection)); return this; } @@ -58,7 +67,7 @@ public class QueryResponseProjection extends GraphQLResponseProjection { } public QueryResponseProjection Private(String alias, QueryPrivateParametrizedInput input, SynchronizedResponseProjection subProjection) { - fields.add(new GraphQLResponseField("private").alias(alias).parameters(input).projection(subProjection)); + add$(new GraphQLResponseField("private").alias(alias).parameters(input).projection(subProjection)); return this; } @@ -67,7 +76,7 @@ public class QueryResponseProjection extends GraphQLResponseProjection { } public QueryResponseProjection Case(String alias) { - fields.add(new GraphQLResponseField("case").alias(alias)); + add$(new GraphQLResponseField("case").alias(alias)); return this; } @@ -76,7 +85,7 @@ public class QueryResponseProjection extends GraphQLResponseProjection { } public QueryResponseProjection Case(String alias, QueryCaseParametrizedInput input) { - fields.add(new GraphQLResponseField("case").alias(alias).parameters(input)); + add$(new GraphQLResponseField("case").alias(alias).parameters(input)); return this; } @@ -85,10 +94,15 @@ public class QueryResponseProjection extends GraphQLResponseProjection { } public QueryResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public QueryResponseProjection deepCopy$() { + return new QueryResponseProjection(this); + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -106,4 +120,4 @@ public class QueryResponseProjection extends GraphQLResponseProjection { return Objects.hash(fields); } -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/restricted-words/SynchronizedResponseProjection.java.txt b/src/test/resources/expected-classes/restricted-words/SynchronizedResponseProjection.java.txt index 709b6a507..13927c861 100644 --- a/src/test/resources/expected-classes/restricted-words/SynchronizedResponseProjection.java.txt +++ b/src/test/resources/expected-classes/restricted-words/SynchronizedResponseProjection.java.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import java.util.HashMap; import java.util.Map; +import java.util.List; import java.util.Objects; /** @@ -20,6 +21,14 @@ public class SynchronizedResponseProjection extends GraphQLResponseProjection { public SynchronizedResponseProjection() { } + public SynchronizedResponseProjection(SynchronizedResponseProjection projection) { + super(projection); + } + + public SynchronizedResponseProjection(List projections) { + super(projections); + } + public SynchronizedResponseProjection all$() { return all$(3); } @@ -40,7 +49,7 @@ public class SynchronizedResponseProjection extends GraphQLResponseProjection { } public SynchronizedResponseProjection Void(String alias) { - fields.add(new GraphQLResponseField("void").alias(alias)); + add$(new GraphQLResponseField("void").alias(alias)); return this; } @@ -49,7 +58,7 @@ public class SynchronizedResponseProjection extends GraphQLResponseProjection { } public SynchronizedResponseProjection Wait(String alias, CharResponseProjection subProjection) { - fields.add(new GraphQLResponseField("wait").alias(alias).projection(subProjection)); + add$(new GraphQLResponseField("wait").alias(alias).projection(subProjection)); return this; } @@ -58,7 +67,7 @@ public class SynchronizedResponseProjection extends GraphQLResponseProjection { } public SynchronizedResponseProjection Class(String alias) { - fields.add(new GraphQLResponseField("class").alias(alias)); + add$(new GraphQLResponseField("class").alias(alias)); return this; } @@ -67,10 +76,15 @@ public class SynchronizedResponseProjection extends GraphQLResponseProjection { } public SynchronizedResponseProjection typename(String alias) { - fields.add(new GraphQLResponseField("__typename").alias(alias)); + add$(new GraphQLResponseField("__typename").alias(alias)); return this; } + @Override + public SynchronizedResponseProjection deepCopy$() { + return new SynchronizedResponseProjection(this); + } + @Override public boolean equals(Object obj) { if (this == obj) { diff --git a/src/test/resources/expected-classes/scala/SearchResultItemConnectionResponseProjection.scala.txt b/src/test/resources/expected-classes/scala/SearchResultItemConnectionResponseProjection.scala.txt index ae5328c2c..4cfc5a3c9 100644 --- a/src/test/resources/expected-classes/scala/SearchResultItemConnectionResponseProjection.scala.txt +++ b/src/test/resources/expected-classes/scala/SearchResultItemConnectionResponseProjection.scala.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection import java.util.Objects import scala.collection.mutable.HashMap +import scala.collection.JavaConverters._ /** * Response projection for SearchResultItemConnection @@ -12,7 +13,29 @@ import scala.collection.mutable.HashMap value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) -class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjection { +class SearchResultItemConnectionResponseProjection() extends GraphQLResponseProjection() { + + def this(projection: SearchResultItemConnectionResponseProjection) = { + this() + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + + def this(projections: scala.Seq[SearchResultItemConnectionResponseProjection]) = { + this() + if (projections != null) { + for (projection <- projections) { + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + } + } private final lazy val projectionDepthOnFields = new HashMap[String, Int] @@ -45,7 +68,7 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def codeCount(alias: String): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("codeCount").alias(alias)) + add$(new GraphQLResponseField("codeCount").alias(alias)) this } @@ -54,7 +77,7 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def edges(alias: String, subProjection: SearchResultItemEdgeResponseProjection): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("edges").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("edges").alias(alias).projection(subProjection)) this } @@ -63,7 +86,7 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def issueCount(alias: String): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("issueCount").alias(alias)) + add$(new GraphQLResponseField("issueCount").alias(alias)) this } @@ -72,7 +95,7 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def nodes(alias: String, subProjection: SearchResultItemResponseProjection): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("nodes").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("nodes").alias(alias).projection(subProjection)) this } @@ -81,7 +104,7 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def pageInfo(alias: String, subProjection: PageInfoResponseProjection): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("pageInfo").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("pageInfo").alias(alias).projection(subProjection)) this } @@ -90,7 +113,7 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def repositoryCount(alias: String): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("repositoryCount").alias(alias)) + add$(new GraphQLResponseField("repositoryCount").alias(alias)) this } @@ -99,7 +122,7 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def userCount(alias: String): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("userCount").alias(alias)) + add$(new GraphQLResponseField("userCount").alias(alias)) this } @@ -108,7 +131,7 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def wikiCount(alias: String): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("wikiCount").alias(alias)) + add$(new GraphQLResponseField("wikiCount").alias(alias)) this } @@ -117,10 +140,12 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec } def typename(alias: String): SearchResultItemConnectionResponseProjection = { - fields.add(new GraphQLResponseField("__typename").alias(alias)) + add$(new GraphQLResponseField("__typename").alias(alias)) this } + override def deepCopy$(): SearchResultItemConnectionResponseProjection = new SearchResultItemConnectionResponseProjection(this) + override def equals(obj: Any): Boolean = { if (this == obj) { return true @@ -134,4 +159,4 @@ class SearchResultItemConnectionResponseProjection extends GraphQLResponseProjec override def hashCode(): Int = Objects.hash(fields) -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/SearchResultItemResponseProjection.scala.txt b/src/test/resources/expected-classes/scala/SearchResultItemResponseProjection.scala.txt index 6b0f6ed80..2bf268c22 100644 --- a/src/test/resources/expected-classes/scala/SearchResultItemResponseProjection.scala.txt +++ b/src/test/resources/expected-classes/scala/SearchResultItemResponseProjection.scala.txt @@ -4,6 +4,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection import java.util.Objects import scala.collection.mutable.HashMap +import scala.collection.JavaConverters._ /** * Response projection for SearchResultItem @@ -12,7 +13,29 @@ import scala.collection.mutable.HashMap value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) -class SearchResultItemResponseProjection extends GraphQLResponseProjection { +class SearchResultItemResponseProjection() extends GraphQLResponseProjection() { + + def this(projection: SearchResultItemResponseProjection) = { + this() + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + + def this(projections: scala.Seq[SearchResultItemResponseProjection]) = { + this() + if (projections != null) { + for (projection <- projections) { + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + } + } private final lazy val projectionDepthOnFields = new HashMap[String, Int] @@ -28,7 +51,7 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { } def onApp(alias: String, subProjection: AppResponseProjection): SearchResultItemResponseProjection = { - fields.add(new GraphQLResponseField("...on App").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("...on App").alias(alias).projection(subProjection)) this } @@ -37,7 +60,7 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { } def onRepository(alias: String, subProjection: RepositoryResponseProjection): SearchResultItemResponseProjection = { - fields.add(new GraphQLResponseField("...on Repository").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("...on Repository").alias(alias).projection(subProjection)) this } @@ -46,7 +69,7 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { } def onIssue(alias: String, subProjection: IssueResponseProjection): SearchResultItemResponseProjection = { - fields.add(new GraphQLResponseField("...on Issue").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("...on Issue").alias(alias).projection(subProjection)) this } @@ -55,7 +78,7 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { } def onOrganization(alias: String, subProjection: OrganizationResponseProjection): SearchResultItemResponseProjection = { - fields.add(new GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)) this } @@ -64,7 +87,7 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { } def onUser(alias: String, subProjection: UserResponseProjection): SearchResultItemResponseProjection = { - fields.add(new GraphQLResponseField("...on User").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("...on User").alias(alias).projection(subProjection)) this } @@ -73,7 +96,7 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { } def onMarketplaceListing(alias: String, subProjection: MarketplaceListingResponseProjection): SearchResultItemResponseProjection = { - fields.add(new GraphQLResponseField("...on MarketplaceListing").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("...on MarketplaceListing").alias(alias).projection(subProjection)) this } @@ -82,7 +105,7 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { } def onPullRequest(alias: String, subProjection: PullRequestResponseProjection): SearchResultItemResponseProjection = { - fields.add(new GraphQLResponseField("...on PullRequest").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("...on PullRequest").alias(alias).projection(subProjection)) this } @@ -91,10 +114,12 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { } def typename(alias: String): SearchResultItemResponseProjection = { - fields.add(new GraphQLResponseField("__typename").alias(alias)) + add$(new GraphQLResponseField("__typename").alias(alias)) this } + override def deepCopy$(): SearchResultItemResponseProjection = new SearchResultItemResponseProjection(this) + override def equals(obj: Any): Boolean = { if (this == obj) { return true @@ -108,4 +133,4 @@ class SearchResultItemResponseProjection extends GraphQLResponseProjection { override def hashCode(): Int = Objects.hash(fields) -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/empty/EventResponseProjection.scala.txt b/src/test/resources/expected-classes/scala/empty/EventResponseProjection.scala.txt index 372ac4910..37a91a039 100644 --- a/src/test/resources/expected-classes/scala/empty/EventResponseProjection.scala.txt +++ b/src/test/resources/expected-classes/scala/empty/EventResponseProjection.scala.txt @@ -1,6 +1,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection import scala.collection.mutable.HashMap +import scala.collection.JavaConverters._ /** * Response projection for Event @@ -9,7 +10,29 @@ import scala.collection.mutable.HashMap value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) -class EventResponseProjection extends GraphQLResponseProjection { +class EventResponseProjection() extends GraphQLResponseProjection() { + + def this(projection: EventResponseProjection) = { + this() + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + + def this(projections: scala.Seq[EventResponseProjection]) = { + this() + if (projections != null) { + for (projection <- projections) { + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + } + } private final lazy val projectionDepthOnFields = new HashMap[String, Int] @@ -25,9 +48,11 @@ class EventResponseProjection extends GraphQLResponseProjection { } def typename(alias: String): EventResponseProjection = { - fields.add(new GraphQLResponseField("__typename").alias(alias)) + add$(new GraphQLResponseField("__typename").alias(alias)) this } + override def deepCopy$(): EventResponseProjection = new EventResponseProjection(this) + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/request/AssetResponseProjection.scala.txt b/src/test/resources/expected-classes/scala/extend/request/AssetResponseProjection.scala.txt index f6cb74a64..fbbefc84c 100644 --- a/src/test/resources/expected-classes/scala/extend/request/AssetResponseProjection.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/request/AssetResponseProjection.scala.txt @@ -1,6 +1,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection import scala.collection.mutable.HashMap +import scala.collection.JavaConverters._ /** * Response projection for Asset @@ -9,7 +10,29 @@ import scala.collection.mutable.HashMap value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) -class AssetResponseProjection extends GraphQLResponseProjection { +class AssetResponseProjection() extends GraphQLResponseProjection() { + + def this(projection: AssetResponseProjection) = { + this() + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + + def this(projections: scala.Seq[AssetResponseProjection]) = { + this() + if (projections != null) { + for (projection <- projections) { + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + } + } private final lazy val projectionDepthOnFields = new HashMap[String, Int] @@ -29,7 +52,7 @@ class AssetResponseProjection extends GraphQLResponseProjection { } def name(alias: String): AssetResponseProjection = { - fields.add(new GraphQLResponseField("name").alias(alias)) + add$(new GraphQLResponseField("name").alias(alias)) this } @@ -38,7 +61,7 @@ class AssetResponseProjection extends GraphQLResponseProjection { } def status(alias: String): AssetResponseProjection = { - fields.add(new GraphQLResponseField("status").alias(alias)) + add$(new GraphQLResponseField("status").alias(alias)) this } @@ -47,7 +70,7 @@ class AssetResponseProjection extends GraphQLResponseProjection { } def id(alias: String): AssetResponseProjection = { - fields.add(new GraphQLResponseField("id").alias(alias)) + add$(new GraphQLResponseField("id").alias(alias)) this } @@ -56,7 +79,7 @@ class AssetResponseProjection extends GraphQLResponseProjection { } def createdBy(alias: String): AssetResponseProjection = { - fields.add(new GraphQLResponseField("createdBy").alias(alias)) + add$(new GraphQLResponseField("createdBy").alias(alias)) this } @@ -65,9 +88,11 @@ class AssetResponseProjection extends GraphQLResponseProjection { } def typename(alias: String): AssetResponseProjection = { - fields.add(new GraphQLResponseField("__typename").alias(alias)) + add$(new GraphQLResponseField("__typename").alias(alias)) this } + override def deepCopy$(): AssetResponseProjection = new AssetResponseProjection(this) + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/request/EventResponseProjection.scala.txt b/src/test/resources/expected-classes/scala/extend/request/EventResponseProjection.scala.txt index 1e25331b1..8a8020f3e 100644 --- a/src/test/resources/expected-classes/scala/extend/request/EventResponseProjection.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/request/EventResponseProjection.scala.txt @@ -1,6 +1,7 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection import scala.collection.mutable.HashMap +import scala.collection.JavaConverters._ /** * Response projection for Event @@ -9,7 +10,29 @@ import scala.collection.mutable.HashMap value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) -class EventResponseProjection extends GraphQLResponseProjection { +class EventResponseProjection() extends GraphQLResponseProjection() { + + def this(projection: EventResponseProjection) = { + this() + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + + def this(projections: scala.Seq[EventResponseProjection]) = { + this() + if (projections != null) { + for (projection <- projections) { + if (projection != null) { + for (field <- projection.fields.values.asScala) { + add$(field) + } + } + } + } + } private final lazy val projectionDepthOnFields = new HashMap[String, Int] @@ -33,7 +56,7 @@ class EventResponseProjection extends GraphQLResponseProjection { } def status(alias: String): EventResponseProjection = { - fields.add(new GraphQLResponseField("status").alias(alias)) + add$(new GraphQLResponseField("status").alias(alias)) this } @@ -42,7 +65,7 @@ class EventResponseProjection extends GraphQLResponseProjection { } def createdDateTime(alias: String): EventResponseProjection = { - fields.add(new GraphQLResponseField("createdDateTime").alias(alias)) + add$(new GraphQLResponseField("createdDateTime").alias(alias)) this } @@ -51,7 +74,7 @@ class EventResponseProjection extends GraphQLResponseProjection { } def assets(alias: String, subProjection: AssetResponseProjection): EventResponseProjection = { - fields.add(new GraphQLResponseField("assets").alias(alias).projection(subProjection)) + add$(new GraphQLResponseField("assets").alias(alias).projection(subProjection)) this } @@ -60,7 +83,7 @@ class EventResponseProjection extends GraphQLResponseProjection { } def id(alias: String): EventResponseProjection = { - fields.add(new GraphQLResponseField("id").alias(alias)) + add$(new GraphQLResponseField("id").alias(alias)) this } @@ -69,7 +92,7 @@ class EventResponseProjection extends GraphQLResponseProjection { } def createdBy(alias: String): EventResponseProjection = { - fields.add(new GraphQLResponseField("createdBy").alias(alias)) + add$(new GraphQLResponseField("createdBy").alias(alias)) this } @@ -78,9 +101,11 @@ class EventResponseProjection extends GraphQLResponseProjection { } def typename(alias: String): EventResponseProjection = { - fields.add(new GraphQLResponseField("__typename").alias(alias)) + add$(new GraphQLResponseField("__typename").alias(alias)) this } + override def deepCopy$(): EventResponseProjection = new EventResponseProjection(this) + -} +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt b/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt index 4d9c1d104..ebe9915cb 100644 --- a/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt +++ b/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt @@ -22,6 +22,18 @@ case class QueryPrivateParametrizedInput( createdAfter: java.time.ZonedDateTime ) extends GraphQLParametrizedInput { + override def deepCopy(): QueryPrivateParametrizedInput = { + QueryPrivateParametrizedInput( + this.int, + this.intOpt, + this.seq1, + this.seq2, + this.`new`, + this.enum, + this.createdAfter + ) + } + override def toString(): String = { scala.Seq( "int: " + GraphQLRequestSerializer.getEntry(int), From bea0364b2bb5746515ef3a8b85fe99faac10b5f8 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Thu, 23 Feb 2023 10:13:12 -0500 Subject: [PATCH 08/25] New config to specify custom @Generated annotation #1016 (#1036) --- docs/codegen-options.md | 125 +++++++++--------- .../gradle/GraphQLCodegenGradleTask.java | 25 +++- .../graphql/codegen/GraphQLCodegenMojo.java | 19 ++- .../graphql/codegen/GraphQLCodegenKeys.scala | 2 + .../codegen/GraphQLCodegenPlugin.scala | 2 + .../graphql/codegen/GraphQLCodegen.java | 2 +- .../codegen/model/GeneratedInformation.java | 31 +++-- .../model/GraphQLCodegenConfiguration.java | 11 ++ .../graphql/codegen/model/MappingConfig.java | 20 ++- .../codegen/model/MappingConfigConstants.java | 17 +++ .../graphql/codegen/model/MappingContext.java | 5 + .../GraphQLCodegenAnnotationsTest.java | 58 ++++---- .../codegen/GraphQLCodegenApisTest.java | 65 +++++---- ...GraphQLCodegenCustomScalarMappingTest.java | 17 ++- .../codegen/GraphQLCodegenDefaultsTest.java | 32 ++--- .../codegen/GraphQLCodegenEmptyTest.java | 13 +- .../codegen/GraphQLCodegenExtendTest.java | 29 ++-- .../GraphQLCodegenFieldsResolversTest.java | 24 ++-- .../GraphQLCodegenFileCreatorTest.java | 4 +- .../codegen/GraphQLCodegenGitHubTest.java | 20 +-- .../codegen/GraphQLCodegenImmutableTest.java | 2 +- .../codegen/GraphQLCodegenInterfacesTest.java | 2 +- ...GraphQLCodegenIntrospectionResultTest.java | 14 +- .../GraphQLCodegenModelsForRootTypesTest.java | 11 +- .../codegen/GraphQLCodegenMultiFilesTest.java | 3 +- .../codegen/GraphQLCodegenOptionalTest.java | 16 ++- .../GraphQLCodegenParentInterfacesTest.java | 2 +- .../codegen/GraphQLCodegenRelayTest.java | 13 +- .../codegen/GraphQLCodegenRequestTest.java | 58 ++++---- .../codegen/GraphQLCodegenResponseTest.java | 21 +-- .../GraphQLCodegenRestrictedWordsTest.java | 2 +- .../graphql/codegen/GraphQLCodegenTest.java | 6 +- .../GraphQLCodegenTypesAsInterfacesTest.java | 21 +-- .../GraphQLCodegenUnionResolverTest.java | 13 +- .../GraphQLCodegenUnionWithEnumTest.java | 2 +- .../graphql/codegen/TestUtils.java | 7 +- ...GraphQLCodegenCustomScalarMappingTest.java | 21 +-- .../kotlin/GraphQLCodegenDeprecatedTest.java | 2 +- .../kotlin/GraphQLCodegenEmptyTest.java | 4 +- .../kotlin/GraphQLCodegenGitHubTest.java | 56 +++----- ...hQLCodegenInitializeNullableTypesTest.java | 2 +- .../kotlin/GraphQLCodegenInterfacesTest.java | 2 +- .../kotlin/GraphQLCodegenNullableTest.java | 19 ++- .../kotlin/GraphQLCodegenOpenclassesTest.java | 2 +- .../kotlin/GraphQLCodegenRelayTest.java | 13 +- ...nRestrictedWordsAndParameterInputTest.java | 3 +- .../GraphQLCodegenSealedInterfacesTest.java | 2 +- .../GraphQLCodegenTypesAsInterfacesTest.java | 17 ++- .../GraphQLCodegenUnionResolverTest.java | 13 +- .../GraphQLCodegenUnionWithEnumTest.java | 3 +- .../codegen/model/MappingConfigTest.java | 5 + .../scala/GraphQLCodegenAnnotationsTest.java | 21 +-- ...GraphQLCodegenCustomScalarMappingTest.java | 16 ++- .../scala/GraphQLCodegenDeprecatedTest.java | 2 +- .../scala/GraphQLCodegenEmptyTest.java | 5 +- .../scala/GraphQLCodegenExtendTest.java | 42 +++--- .../scala/GraphQLCodegenGitHubTest.java | 35 +++-- .../scala/GraphQLCodegenOpenclassesTest.java | 15 ++- .../scala/GraphQLCodegenRelayTest.java | 13 +- ...CodegenRestrictedWordsAndToStringTest.java | 48 ++++--- .../GraphQLCodegenTypesAsInterfacesTest.java | 20 +-- .../GraphQLCodegenUnionResolverTest.java | 13 +- 62 files changed, 635 insertions(+), 473 deletions(-) diff --git a/docs/codegen-options.md b/docs/codegen-options.md index df36cf87d..a863c69e7 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -1,67 +1,68 @@ # Codegen Options -| Option | Data Type | Default value | Description | -|:-----------------------------------------------------:|:---------------------------------------------------------------------:|:------------------------------------------------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `graphqlSchemaPaths` | List(String) | (falls back to `graphqlSchemas`) | GraphQL schema locations. You can supply multiple paths to GraphQL schemas. To include many schemas from a folder hierarchy, use the `graphqlSchemas` block instead. | -| `graphqlSchemas` | *See
[graphqlSchemas](#option-graphqlschemas)* | All
`.graphqls`/`.graphql`
files in
resources | Block to define the input GraphQL schemas, when exact paths are too cumbersome. See table below for a list of options. *See [graphqlSchemas](#option-graphqlschemas)* | -| `graphqlQueryIntrospectionResu`
`ltPath` | String | None | Path to GraphQL Introspection Query result in json format (with root object `__schema` or `data.__schema`). Sample: [sample-introspection-query-result.json](../src/test/resources/introspection-result/sample-introspection-query-result.json) | -| `outputDir` | String | None | The output target directory into which code will be generated. | -| `configurationFiles` | List(String) | Empty | Paths to the files with mapping configurations. Supported formats. JSON, HOCON. Order of specified configuration files matters, so the default configuration should be placed at the end. | -| `packageName` | String | Empty | Java package for generated classes. | -| `apiPackageName` | String | Empty | Java package for generated api classes (Query, Mutation, Subscription). | -| `modelPackageName` | String | Empty | Java package for generated model classes (type, input, interface, enum, union). | -| `generateBuilder` | Boolean | True | Specifies whether generated model classes should have builder. | -| `generateApis` | Boolean | True | Specifies whether api classes should be generated as well as model classes. | -| `generateDataFetchingEnvironme`
`ntArgumentInApis` | Boolean | False | If true, then `graphql.schema.DataFetchingEnvironment env` will be added as a last argument to all methods of root type resolvers and field resolvers. | -| `generateEqualsAndHashCode` | Boolean | False | Specifies whether generated model classes should have equals and hashCode methods defined. | -| `generateParameterizedFieldsResolvers` | Boolean | True | Specifies whether separate `Resolver` interface for parametrized fields should be generated. If `false`, then add parametrized field to the type definition and ignore field parameters. If `true` then separate `Resolver` interface for parametrized fields will be generated. | -| `generateImmutableModels` | Boolean | False | Specifies whether generated model classes should be immutable. | -| `generateToString` | Boolean | False | Specifies whether generated model classes should have toString method defined. | -| `addGeneratedAnnotation` | Boolean | True | Specifies whether generated classes should have `@Generated` annotation. | -| `generateJacksonTypeIdResolver` | Boolean | False | Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package. | -| `apiNamePrefix` | String | Empty | Sets the prefix for GraphQL api classes (query, mutation, subscription). | -| `apiNameSuffix` | String | `Resolver` | Sets the suffix for GraphQL api classes (query, mutation, subscription). | -| `apiInterfaceStrategy` | *See
[ApiInterfaceStrategy](#option-apiinterfacestrategy)* | `INTERFACE_PER_OPERATION` | *See [ApiInterfaceStrategy](#option-apiinterfacestrategy)* | -| `apiRootInterfaceStrategy` | *See
[ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | `SINGLE_INTERFACE` | *See [ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | -| `apiNamePrefixStrategy` | *See
[ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | `CONSTANT` | *See [ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | -| `modelNamePrefix` | String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). | -| `modelNameSuffix` | String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). | -| `modelValidationAnnotation` | String | `@javax.validation.`
`constraints.NotNull` | Annotation for mandatory (NonNull) fields. Can be null/empty. | -| `typeResolverPrefix` | String | Empty | Sets the prefix for GraphQL type resolver classes. | -| `typeResolverSuffix` | String | `Resolver` | Sets the suffix for GraphQL type resolver classes. | -| `customTypesMapping` | Map(String,String) | Empty | *See [CustomTypesMapping](#option-customtypesmapping)* | -| `customAnnotationsMapping` | Map(String,String[]) | Empty | *See [CustomAnnotationsMapping](#option-customannotationsmapping)* | -| `directiveAnnotationsMapping` | Map(String,String[]) | Empty | *See [DirectiveAnnotationsMapping](#option-directiveannotationsmapping)* | -| `fieldsWithResolvers` | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. E.g.: `Person`, `Person.friends`, `@customResolver`. | -| `fieldsWithoutResolvers` | Set(String) | Empty | Fields that DO NOT require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. Can be used in conjunction with `generateExtensionFieldsResolvers` option. E.g.: `Person`, `Person.friends`, `@noResolver`. | -| `resolverArgumentAnnotations` | Set(String) | Empty | Annotations that will be added to all resolver arguments. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.Argument` | -| `parametrizedResolverAnnotations` | Set(String) | Empty | Annotations that will be added to all parametrized resolver methods. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.SchemaMapping(typeName="{{TYPE_NAME}}")` | -| `generateParameterizedFieldsR`
`esolvers` | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. | -| `generateExtensionFieldsResol`
`vers` | Boolean | False | Specifies whether all fields in extensions (`extend type` and `extend interface`) should be present in Resolver interface instead of the type class itself. | -| `generateModelsForRootTypes` | Boolean | False | Specifies whether model classes should be generated for `type Query`, `type Subscription`, `type Mutation`. | -| `useOptionalForNullableReturn`
`Types` | Boolean | False | Specifies whether nullable return types of api methods should be wrapped into [`java.util.Optional<>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Optional.html). Lists will not be wrapped. | -| `generateApisWithThrowsExcept`
`ion` | Boolean | True | Specifies whether api interface methods should have `throws Exception` in signature. | -| `apiReturnType` | String | Empty | Return type for api methods (query/mutation). For example: `reactor.core.publisher.Mono`, etc. | -| `apiReturnListType` | String | Empty | Return type for api methods (query/mutation) having list type. For example: `reactor.core.publisher.Flux`, etc. By default is empty, so `apiReturnType` will be used. | -| `subscriptionReturnType` | String | Empty | Return type for subscription methods. For example: `org.reactivestreams.Publisher`, `io.reactivex.Observable`, etc. | -| `relayConfig` | *See
[RelayConfig](#option-relayconfig)* | `@connection(for: ...)` | *See [RelayConfig](#option-relayconfig)* | -| `generateClient` | Boolean | False | Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: `Request` classes (contain input data), `ResponseProjection` classes for each type (contain response fields) and `Response` classes (contain response data). | -| `requestSuffix` | String | Request | Sets the suffix for `Request` classes. | -| `responseSuffix` | String | Response | Sets the suffix for `Response` classes. | -| `responseProjectionSuffix` | String | ResponseProjection | Sets the suffix for `ResponseProjection` classes. | -| `parametrizedInputSuffix` | String | ParametrizedInput | Sets the suffix for `ParametrizedInput` classes. | -| `parentInterfaces` | *See
[parentInterfaces](#option-parentinterfaces)* | Empty | Block to define parent interfaces for generated interfaces (query / mutation / subscription / type resolver). *See [parentInterfaces](#option-parentinterfaces)* | -| `generateAllMethodInProjection` | Boolean | True | Enables whether the `all$()` method should be generated in the projection classes. Disabling enforces the client to select the fields manually. | -| `responseProjectionMaxDepth` | Integer | 3 | Sets max depth when use `all$()` which for facilitating the construction of projection automatically, the fields on all projections are provided when it be invoked. This is a global configuration, of course, you can use `all$(max)` to set for each method. For self recursive types, too big depth may result in a large number of returned data! | -| `generatedLanguage` | Enum | GeneratedLanguage.JAVA | Choose which language you want to generate, Java,Scala,Kotlin were supported. Note that due to language features, there are slight differences in default values between languages. | -| `generateModelOpenClasses` | Boolean | False | The class type of the generated model. If true, generate normal classes, else generate data classes. It only support in kotlin(```data class```) and scala(```case class```). Maybe we will consider to support Java ```record``` in the future. | -| `initializeNullableTypes` | Boolean | False | Adds a default null value to nullable arguments. Only supported in Kotlin. | -| `generateSealedInterfaces` | Boolean | False | This applies to generated interfaces on unions and interfaces. If true, generate sealed interfaces, else generate normal ones. It is only supported in Kotlin. | -| `typesAsInterfaces` | Set(String) | Empty | Types that must generated as interfaces should be defined here in format: `TypeName` or `@directive`. E.g.: `User`, `@asInterface`. | -| `useObjectMapperForRequestSerialization` | Set(String) | Empty | Fields that require serialization using `com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)`. Values should be defined here in the following format: `GraphqlObjectName.fieldName` or `GraphqlTypeName`. If just type is specified, then all fields of this type will be serialized using ObjectMapper. E.g.: `["Person.createdDateTime", ZonedDateTime"]` | -| `supportUnknownFields` | Boolean | False | Specifies whether api classes should support unknown fields during serialization or deserialization. If `true`, classes will include a property of type [`java.util.Map`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html) that will store unknown fields. | -| `unknownFieldsPropertyName` | String | userDefinedFields | Specifies the name of the property to be included in api classes to support unknown fields during serialization or deserialization | -| `skip` | Boolean | False | If true, then code generation will not happen | +| Option | Data Type | Default value | Description | +|:-----------------------------------------------------:|:---------------------------------------------------------------------:|:--------------------------------------------------------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `graphqlSchemaPaths` | List(String) | (falls back to `graphqlSchemas`) | GraphQL schema locations. You can supply multiple paths to GraphQL schemas. To include many schemas from a folder hierarchy, use the `graphqlSchemas` block instead. | +| `graphqlSchemas` | *See
[graphqlSchemas](#option-graphqlschemas)* | All
`.graphqls`/`.graphql`
files in
resources | Block to define the input GraphQL schemas, when exact paths are too cumbersome. See table below for a list of options. *See [graphqlSchemas](#option-graphqlschemas)* | +| `graphqlQueryIntrospectionResu`
`ltPath` | String | None | Path to GraphQL Introspection Query result in json format (with root object `__schema` or `data.__schema`). Sample: [sample-introspection-query-result.json](../src/test/resources/introspection-result/sample-introspection-query-result.json) | +| `outputDir` | String | None | The output target directory into which code will be generated. | +| `configurationFiles` | List(String) | Empty | Paths to the files with mapping configurations. Supported formats. JSON, HOCON. Order of specified configuration files matters, so the default configuration should be placed at the end. | +| `packageName` | String | Empty | Java package for generated classes. | +| `apiPackageName` | String | Empty | Java package for generated api classes (Query, Mutation, Subscription). | +| `modelPackageName` | String | Empty | Java package for generated model classes (type, input, interface, enum, union). | +| `generateBuilder` | Boolean | True | Specifies whether generated model classes should have builder. | +| `generateApis` | Boolean | True | Specifies whether api classes should be generated as well as model classes. | +| `generateDataFetchingEnvironme`
`ntArgumentInApis` | Boolean | False | If true, then `graphql.schema.DataFetchingEnvironment env` will be added as a last argument to all methods of root type resolvers and field resolvers. | +| `generateEqualsAndHashCode` | Boolean | False | Specifies whether generated model classes should have equals and hashCode methods defined. | +| `generateParameterizedFieldsResolvers` | Boolean | True | Specifies whether separate `Resolver` interface for parametrized fields should be generated. If `false`, then add parametrized field to the type definition and ignore field parameters. If `true` then separate `Resolver` interface for parametrized fields will be generated. | +| `generateImmutableModels` | Boolean | False | Specifies whether generated model classes should be immutable. | +| `generateToString` | Boolean | False | Specifies whether generated model classes should have toString method defined. | +| `generateJacksonTypeIdResolver` | Boolean | False | Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package. | +| `addGeneratedAnnotation` | Boolean | True | Specifies whether generated classes should have `@Generated` annotation. | +| `generatedAnnotation` | String | `jakarta.annotation.Generated`
`javax.annotation.Generated` | Qualified class name (with package) of the `@Generated` annotation that will be added on top of every generated class (if `addGeneratedAnnotation` is **true**) | +| `apiNamePrefix` | String | Empty | Sets the prefix for GraphQL api classes (query, mutation, subscription). | +| `apiNameSuffix` | String | `Resolver` | Sets the suffix for GraphQL api classes (query, mutation, subscription). | +| `apiInterfaceStrategy` | *See
[ApiInterfaceStrategy](#option-apiinterfacestrategy)* | `INTERFACE_PER_OPERATION` | *See [ApiInterfaceStrategy](#option-apiinterfacestrategy)* | +| `apiRootInterfaceStrategy` | *See
[ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | `SINGLE_INTERFACE` | *See [ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | +| `apiNamePrefixStrategy` | *See
[ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | `CONSTANT` | *See [ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | +| `modelNamePrefix` | String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). | +| `modelNameSuffix` | String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). | +| `modelValidationAnnotation` | String | `@javax.validation.`
`constraints.NotNull` | Annotation for mandatory (NonNull) fields. Can be null/empty. | +| `typeResolverPrefix` | String | Empty | Sets the prefix for GraphQL type resolver classes. | +| `typeResolverSuffix` | String | `Resolver` | Sets the suffix for GraphQL type resolver classes. | +| `customTypesMapping` | Map(String,String) | Empty | *See [CustomTypesMapping](#option-customtypesmapping)* | +| `customAnnotationsMapping` | Map(String,String[]) | Empty | *See [CustomAnnotationsMapping](#option-customannotationsmapping)* | +| `directiveAnnotationsMapping` | Map(String,String[]) | Empty | *See [DirectiveAnnotationsMapping](#option-directiveannotationsmapping)* | +| `fieldsWithResolvers` | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. E.g.: `Person`, `Person.friends`, `@customResolver`. | +| `fieldsWithoutResolvers` | Set(String) | Empty | Fields that DO NOT require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. Can be used in conjunction with `generateExtensionFieldsResolvers` option. E.g.: `Person`, `Person.friends`, `@noResolver`. | +| `resolverArgumentAnnotations` | Set(String) | Empty | Annotations that will be added to all resolver arguments. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.Argument` | +| `parametrizedResolverAnnotations` | Set(String) | Empty | Annotations that will be added to all parametrized resolver methods. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.SchemaMapping(typeName="{{TYPE_NAME}}")` | +| `generateParameterizedFieldsR`
`esolvers` | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. | +| `generateExtensionFieldsResol`
`vers` | Boolean | False | Specifies whether all fields in extensions (`extend type` and `extend interface`) should be present in Resolver interface instead of the type class itself. | +| `generateModelsForRootTypes` | Boolean | False | Specifies whether model classes should be generated for `type Query`, `type Subscription`, `type Mutation`. | +| `useOptionalForNullableReturn`
`Types` | Boolean | False | Specifies whether nullable return types of api methods should be wrapped into [`java.util.Optional<>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Optional.html). Lists will not be wrapped. | +| `generateApisWithThrowsExcept`
`ion` | Boolean | True | Specifies whether api interface methods should have `throws Exception` in signature. | +| `apiReturnType` | String | Empty | Return type for api methods (query/mutation). For example: `reactor.core.publisher.Mono`, etc. | +| `apiReturnListType` | String | Empty | Return type for api methods (query/mutation) having list type. For example: `reactor.core.publisher.Flux`, etc. By default is empty, so `apiReturnType` will be used. | +| `subscriptionReturnType` | String | Empty | Return type for subscription methods. For example: `org.reactivestreams.Publisher`, `io.reactivex.Observable`, etc. | +| `relayConfig` | *See
[RelayConfig](#option-relayconfig)* | `@connection(for: ...)` | *See [RelayConfig](#option-relayconfig)* | +| `generateClient` | Boolean | False | Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: `Request` classes (contain input data), `ResponseProjection` classes for each type (contain response fields) and `Response` classes (contain response data). | +| `requestSuffix` | String | Request | Sets the suffix for `Request` classes. | +| `responseSuffix` | String | Response | Sets the suffix for `Response` classes. | +| `responseProjectionSuffix` | String | ResponseProjection | Sets the suffix for `ResponseProjection` classes. | +| `parametrizedInputSuffix` | String | ParametrizedInput | Sets the suffix for `ParametrizedInput` classes. | +| `parentInterfaces` | *See
[parentInterfaces](#option-parentinterfaces)* | Empty | Block to define parent interfaces for generated interfaces (query / mutation / subscription / type resolver). *See [parentInterfaces](#option-parentinterfaces)* | +| `generateAllMethodInProjection` | Boolean | True | Enables whether the `all$()` method should be generated in the projection classes. Disabling enforces the client to select the fields manually. | +| `responseProjectionMaxDepth` | Integer | 3 | Sets max depth when use `all$()` which for facilitating the construction of projection automatically, the fields on all projections are provided when it be invoked. This is a global configuration, of course, you can use `all$(max)` to set for each method. For self recursive types, too big depth may result in a large number of returned data! | +| `generatedLanguage` | Enum | GeneratedLanguage.JAVA | Choose which language you want to generate, Java,Scala,Kotlin were supported. Note that due to language features, there are slight differences in default values between languages. | +| `generateModelOpenClasses` | Boolean | False | The class type of the generated model. If true, generate normal classes, else generate data classes. It only support in kotlin(```data class```) and scala(```case class```). Maybe we will consider to support Java ```record``` in the future. | +| `initializeNullableTypes` | Boolean | False | Adds a default null value to nullable arguments. Only supported in Kotlin. | +| `generateSealedInterfaces` | Boolean | False | This applies to generated interfaces on unions and interfaces. If true, generate sealed interfaces, else generate normal ones. It is only supported in Kotlin. | +| `typesAsInterfaces` | Set(String) | Empty | Types that must generated as interfaces should be defined here in format: `TypeName` or `@directive`. E.g.: `User`, `@asInterface`. | +| `useObjectMapperForRequestSerialization` | Set(String) | Empty | Fields that require serialization using `com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)`. Values should be defined here in the following format: `GraphqlObjectName.fieldName` or `GraphqlTypeName`. If just type is specified, then all fields of this type will be serialized using ObjectMapper. E.g.: `["Person.createdDateTime", ZonedDateTime"]` | +| `supportUnknownFields` | Boolean | False | Specifies whether api classes should support unknown fields during serialization or deserialization. If `true`, classes will include a property of type [`java.util.Map`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html) that will store unknown fields. | +| `unknownFieldsPropertyName` | String | userDefinedFields | Specifies the name of the property to be included in api classes to support unknown fields during serialization or deserialization | +| `skip` | Boolean | False | If true, then code generation will not happen | ### Option `graphqlSchemas` diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java index e3159fd55..e63d529c0 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java @@ -82,8 +82,9 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode private Boolean generateModelsForRootTypes = MappingConfigConstants.DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES; private Boolean useOptionalForNullableReturnTypes = MappingConfigConstants.DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES; private Boolean generateApisWithThrowsException = MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION; - private Boolean addGeneratedAnnotation = MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION; private Boolean generateJacksonTypeIdResolver = MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER; + private Boolean addGeneratedAnnotation = MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION; + private String generatedAnnotation; private Set fieldsWithResolvers = new HashSet<>(); private Set fieldsWithoutResolvers = new HashSet<>(); private Set typesAsInterfaces = new HashSet<>(); @@ -153,8 +154,9 @@ public void generate() throws Exception { mappingConfig.setGenerateToString(generateToString); mappingConfig.setUseOptionalForNullableReturnTypes(useOptionalForNullableReturnTypes); mappingConfig.setGenerateApisWithThrowsException(generateApisWithThrowsException); - mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation); mappingConfig.setGenerateJacksonTypeIdResolver(generateJacksonTypeIdResolver); + mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation); + mappingConfig.setGeneratedAnnotation(generatedAnnotation); mappingConfig.setApiReturnType(apiReturnType); mappingConfig.setApiReturnListType(apiReturnListType); mappingConfig.setSubscriptionReturnType(subscriptionReturnType); @@ -647,6 +649,17 @@ public void setGenerateApisWithThrowsException(Boolean generateApisWithThrowsExc this.generateApisWithThrowsException = generateApisWithThrowsException; } + @Input + @Optional + @Override + public Boolean getGenerateJacksonTypeIdResolver() { + return generateJacksonTypeIdResolver; + } + + public void setGenerateJacksonTypeIdResolver(Boolean generateJacksonTypeIdResolver) { + this.generateJacksonTypeIdResolver = generateJacksonTypeIdResolver; + } + @Input @Optional @Override @@ -661,12 +674,12 @@ public void setAddGeneratedAnnotation(Boolean addGeneratedAnnotation) { @Input @Optional @Override - public Boolean getGenerateJacksonTypeIdResolver() { - return generateJacksonTypeIdResolver; + public String getGeneratedAnnotation() { + return generatedAnnotation; } - public void setGenerateJacksonTypeIdResolver(Boolean generateJacksonTypeIdResolver) { - this.generateJacksonTypeIdResolver = generateJacksonTypeIdResolver; + public void setGeneratedAnnotation(String generatedAnnotation) { + this.generatedAnnotation = generatedAnnotation; } @Input diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java index 06ad87923..796f49099 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java @@ -149,11 +149,14 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo @Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION_STRING) private boolean generateApisWithThrowsException; + @Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER_STRING) + private boolean generateJacksonTypeIdResolver; + @Parameter(defaultValue = MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION_STRING) private boolean addGeneratedAnnotation; - @Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER_STRING) - private boolean generateJacksonTypeIdResolver; + @Parameter + private String generatedAnnotation; @Parameter private String[] fieldsWithResolvers; @@ -265,8 +268,9 @@ public void execute() throws MojoExecutionException { mappingConfig.setGenerateModelsForRootTypes(generateModelsForRootTypes); mappingConfig.setUseOptionalForNullableReturnTypes(useOptionalForNullableReturnTypes); mappingConfig.setGenerateApisWithThrowsException(generateApisWithThrowsException); - mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation); mappingConfig.setGenerateJacksonTypeIdResolver(generateJacksonTypeIdResolver); + mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation); + mappingConfig.setGeneratedAnnotation(generatedAnnotation); mappingConfig.setFieldsWithResolvers(mapToHashSet(fieldsWithResolvers)); mappingConfig.setFieldsWithoutResolvers(mapToHashSet(fieldsWithoutResolvers)); mappingConfig.setRelayConfig(relayConfig); @@ -526,14 +530,19 @@ public Boolean getGenerateApisWithThrowsException() { return generateApisWithThrowsException; } + @Override + public Boolean getGenerateJacksonTypeIdResolver() { + return generateJacksonTypeIdResolver; + } + @Override public Boolean getAddGeneratedAnnotation() { return addGeneratedAnnotation; } @Override - public Boolean getGenerateJacksonTypeIdResolver() { - return generateJacksonTypeIdResolver; + public String getGeneratedAnnotation() { + return generatedAnnotation; } @Override diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala index da32112bd..c85eab40f 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala @@ -60,6 +60,8 @@ trait GraphQLCodegenKeys { val addGeneratedAnnotation = settingKey[Boolean]("Specifies whether generated classes should be annotated with @Generated") + val generatedAnnotation = settingKey[Option[String]]("Qualified class name (with package) of the @Generated annotation that will be added on top of every generated class (if addGeneratedAnnotation is true)") + val generateDataFetchingEnvironmentArgumentInApis = settingKey[Boolean]("If true, then graphql.schema.DataFetchingEnvironment env will be added as a last argument to all methods of root type resolvers and field resolvers.") val generateModelsForRootTypes = settingKey[Boolean]("generateModelsForRootTypes") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index 52edf7fec..e6d597a46 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -94,6 +94,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co useOptionalForNullableReturnTypes := MappingConfigConstants.DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES, generateApisWithThrowsException := MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION, addGeneratedAnnotation := MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION, + generatedAnnotation := None, typesAsInterfaces := new JHashSet[String](), relayConfig := defaultRelayConfig, // package name configs: @@ -171,6 +172,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co mappingConfig.setUseOptionalForNullableReturnTypes((useOptionalForNullableReturnTypes in GraphQLCodegenConfig).value) mappingConfig.setGenerateApisWithThrowsException((generateApisWithThrowsException in GraphQLCodegenConfig).value) mappingConfig.setAddGeneratedAnnotation((addGeneratedAnnotation in GraphQLCodegenConfig).value) + mappingConfig.setGeneratedAnnotation((generatedAnnotation in GraphQLCodegenConfig).value.orNull) mappingConfig.setGenerateAllMethodInProjection((generateAllMethodInProjection in GraphQLCodegenConfig).value) mappingConfig.setResponseProjectionMaxDepth((responseProjectionMaxDepth in GraphQLCodegenConfig).value) mappingConfig.setRelayConfig((relayConfig in GraphQLCodegenConfig).value) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java index 2a59423e3..dcdd43606 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java @@ -69,7 +69,7 @@ protected GraphQLCodegen(List schemas, MappingConfigSupplier externalMappingConfigSupplier, MapperFactory mapperFactory) { this(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, - new GeneratedInformation(), mapperFactory); + new GeneratedInformation(mappingConfig), mapperFactory); } // used by other constructors diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java index b47024c09..79ff2f93f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java @@ -10,26 +10,37 @@ public class GeneratedInformation { public static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); + private final String generatedType; private Supplier dateTimeSupplier; - public GeneratedInformation() { - this(ZonedDateTime::now); + public GeneratedInformation(MappingConfig mappingConfig) { + this(ZonedDateTime::now, mappingConfig); } - public GeneratedInformation(Supplier dateTimeSupplier) { + public GeneratedInformation(Supplier dateTimeSupplier, MappingConfig mappingConfig) { this.dateTimeSupplier = dateTimeSupplier; - this.generatedType = initGeneratedType(); + this.generatedType = initGeneratedType(mappingConfig); } - private static String initGeneratedType() { + private static String initGeneratedType(MappingConfig mappingConfig) { + if (mappingConfig != null && + mappingConfig.getGeneratedAnnotation() != null && + !mappingConfig.getGeneratedAnnotation().isEmpty()) { + return mappingConfig.getGeneratedAnnotation(); + } + // default logic if mapping config doesn't have a specific annotation try { - return Class.forName("javax.annotation.processing.Generated").getCanonicalName(); - } catch (ClassNotFoundException ignored1) { + return Class.forName("jakarta.annotation.Generated").getCanonicalName(); + } catch (ClassNotFoundException ignored0) { try { - return Class.forName("javax.annotation.Generated").getCanonicalName(); - } catch (ClassNotFoundException ignored2) { - // class is not available + return Class.forName("javax.annotation.processing.Generated").getCanonicalName(); + } catch (ClassNotFoundException ignored1) { + try { + return Class.forName("javax.annotation.Generated").getCanonicalName(); + } catch (ClassNotFoundException ignored2) { + // class is not available + } } } return null; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java index fd6d74cdf..e44ca1529 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java @@ -502,5 +502,16 @@ public interface GraphQLCodegenConfiguration { */ String getUnknownFieldsPropertyName(); + /** + * Returns a qualified class name (with package) of the Generated annotation that will be added on top of every + * generated class. + * + * @return The name of the class for @Generated annotation + * @see "jakarta.annotation.Generated" + * @see "javax.annotation.processing.Generated" + * @see "javax.annotation.Generated" + */ + String getGeneratedAnnotation(); + } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java index de814f805..c5a503d8e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java @@ -20,7 +20,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable T getValueOrDefaultToThis(MappingConfig source, Function getValueFunction) { @@ -689,6 +694,15 @@ public void setUnknownFieldsPropertyName(String unknownFieldsPropertyName) { this.unknownFieldsPropertyName = unknownFieldsPropertyName; } + @Override + public String getGeneratedAnnotation() { + return generatedAnnotation; + } + + public void setGeneratedAnnotation(String generatedAnnotation) { + this.generatedAnnotation = generatedAnnotation; + } + @Override public Boolean isSupportUnknownFields() { return supportUnknownFields; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java index 8bd113789..62bcfe1ca 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java @@ -9,40 +9,57 @@ public class MappingConfigConstants { public static final String DEFAULT_VALIDATION_ANNOTATION = "javax.validation.constraints.NotNull"; public static final String PARENT_INTERFACE_TYPE_PLACEHOLDER = "{{TYPE}}"; public static final String TYPE_NAME_PLACEHOLDER = "{{TYPE_NAME}}"; + public static final boolean DEFAULT_GENERATE_APIS = true; public static final String DEFAULT_GENERATE_APIS_STRING = "true"; + public static final boolean DEFAULT_BUILDER = true; public static final String DEFAULT_BUILDER_STRING = "true"; + public static final boolean DEFAULT_EQUALS_AND_HASHCODE = false; public static final String DEFAULT_EQUALS_AND_HASHCODE_STRING = "false"; + public static final boolean DEFAULT_GENERATE_IMMUTABLE_MODELS = false; public static final String DEFAULT_GENERATE_IMMUTABLE_MODELS_STRING = "false"; + public static final boolean DEFAULT_TO_STRING = false; public static final String DEFAULT_TO_STRING_STRING = "false"; + public static final boolean DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS = true; public static final String DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS_STRING = "true"; + public static final boolean DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS = false; public static final String DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS_STRING = "false"; + public static final boolean DEFAULT_GENERATE_DATA_FETCHING_ENV = false; public static final String DEFAULT_GENERATE_DATA_FETCHING_ENV_STRING = "false"; + public static final boolean DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES = false; public static final String DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES_STRING = "false"; + public static final boolean DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION = true; public static final String DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION_STRING = "true"; + public static final boolean DEFAULT_ADD_GENERATED_ANNOTATION = true; public static final String DEFAULT_ADD_GENERATED_ANNOTATION_STRING = "true"; + public static final boolean DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER = false; public static final String DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER_STRING = "false"; + public static final boolean DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES = false; public static final String DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES_STRING = "false"; + public static final ApiNamePrefixStrategy DEFAULT_API_NAME_PREFIX_STRATEGY = ApiNamePrefixStrategy.CONSTANT; public static final String DEFAULT_API_NAME_PREFIX_STRATEGY_STRING = "CONSTANT"; + public static final ApiRootInterfaceStrategy DEFAULT_API_ROOT_INTERFACE_STRATEGY = ApiRootInterfaceStrategy.SINGLE_INTERFACE; public static final String DEFAULT_API_ROOT_INTERFACE_STRATEGY_STRING = "SINGLE_INTERFACE"; + public static final ApiInterfaceStrategy DEFAULT_API_INTERFACE_STRATEGY = ApiInterfaceStrategy.INTERFACE_PER_OPERATION; public static final String DEFAULT_API_INTERFACE_STRATEGY_STRING = "INTERFACE_PER_OPERATION"; + public static final boolean DEFAULT_GENERATE_CLIENT = false; public static final String DEFAULT_GENERATE_CLIENT_STRING = "false"; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 557e73d6e..479591039 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -336,6 +336,11 @@ public String getUnknownFieldsPropertyName() { return config.getUnknownFieldsPropertyName(); } + @Override + public String getGeneratedAnnotation() { + return config.getGeneratedAnnotation(); + } + public ExtendedDocument getDocument() { return document; } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java index 66cc42fcf..811224722 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -48,8 +49,7 @@ void generate_CustomAnnotationMappings() throws Exception { singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + "using = com.example.json.DateTimeScalarDeserializer.class)")))); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", @@ -65,8 +65,7 @@ void generate_CustomAnnotationMappings_Type() throws Exception { singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + "using = com.example.json.DateTimeScalarDeserializer.class)")))); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", @@ -82,8 +81,7 @@ void generate_CustomAnnotationMappings_Regexp() throws Exception { singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + "using = com.example.json.DateTimeScalarDeserializer.class)")))); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", @@ -99,8 +97,7 @@ void generate_CustomAnnotationMappings_FieldType() throws Exception { singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + "using = com.example.json.DateTimeScalarDeserializer.class)")))); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", @@ -116,8 +113,7 @@ void generate_CustomAnnotationMappings_FieldType_Regexp() throws Exception { singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + "using = com.example.json.DateTimeScalarDeserializer.class)")))); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", @@ -151,8 +147,7 @@ void generate_CustomAnnotationMappings_Class() throws Exception { "using = DeploymentOrderFieldDeserializer.class)")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionInput.java", @@ -189,8 +184,7 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { "AcceptTopicSuggestionPayloadTypeResolver.class)")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java", System.lineSeparator() + @@ -209,8 +203,7 @@ void generate_ResolverArgumentAnnotations() throws Exception { mappingConfig.setResolverArgumentAnnotations(singleton( "@org.springframework.graphql.data.method.annotation.Argument")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/annotation/" + @@ -228,8 +221,7 @@ void generate_ParametrizedResolverAnnotations() throws Exception { mappingConfig.setParametrizedResolverAnnotations(singleton( "@org.springframework.graphql.data.method.annotation.SchemaMapping(typeName=\"{{TYPE_NAME}}\")")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/annotation/" + @@ -251,8 +243,7 @@ void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "CodeOfConductQueryRequest.java", @@ -283,8 +274,7 @@ void generate_Directives() throws Exception { singletonList("@com.example.Relationship(type = {{type}}, direction = {{direction}})")); mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( @@ -303,9 +293,7 @@ void generate_Directives() throws Exception { @Test void generate_ModelValidationAnnotationForSubType() throws Exception { - new JavaGraphQLCodegen(singletonList( - "src/test/resources/schemas/nullable-list-type-with-nullable-sub-types.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/nullable-list-type-with-nullable-sub-types.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( @@ -317,4 +305,24 @@ void generate_ModelValidationAnnotationForSubType() throws Exception { getFileByName(files, "TypeWithNullableListType.java")); } + @Test + void generate_GeneratedAnnotation() throws Exception { + mappingConfig.setGeneratedAnnotation("jakarta.annotation.Generated"); + + generate("src/test/resources/schemas/test.graphqls"); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + assertFileContainsElements(files, "Event.java", " */" + System.lineSeparator() + + "@jakarta.annotation.Generated(" + System.lineSeparator() + + " value = \"com.kobylynskyi.graphql.codegen.GraphQLCodegen\"," + System.lineSeparator() + + " date = \"2020-12-31T23:59:59-0500\"" + System.lineSeparator() + + ")" + System.lineSeparator() + + "public class Event implements java.io.Serializable {"); + } + + private void generate(String path) throws IOException { + new JavaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java index aa4f2186b..c4c05a316 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java @@ -9,7 +9,6 @@ import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder; import com.kobylynskyi.graphql.codegen.utils.Utils; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.io.File; @@ -27,6 +26,7 @@ import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toSet; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class GraphQLCodegenApisTest { @@ -44,9 +44,8 @@ void cleanup() { void generate_FileNameAsPrefix() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FILE_NAME_AS_PREFIX); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -58,9 +57,8 @@ void generate_FileNameAsPrefix() throws Exception { void generate_FolderNameAsPrefix() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -72,9 +70,8 @@ void generate_FolderNameAsPrefix() throws Exception { void generate_Constant() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.CONSTANT); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -87,14 +84,13 @@ void generate_InterfacePerSchemaAndFolderNameAsPrefix() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); assertEquals(new HashSet<>(asList("SubProj1PingQueryResolver.java", "SubProj2PongQueryResolver.java", - "SubProj1QueryResolver.java", "SubProj2QueryResolver.java")), + "SubProj1QueryResolver.java", "SubProj2QueryResolver.java")), generatedFileNames); } @@ -103,14 +99,13 @@ void generate_InterfacePerSchemaAndFileNameAsPrefix() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FILE_NAME_AS_PREFIX); mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); assertEquals(new HashSet<>(asList("SubSchema1PingQueryResolver.java", "SubSchema2PongQueryResolver.java", - "SubSchema1QueryResolver.java", "SubSchema2QueryResolver.java")), + "SubSchema1QueryResolver.java", "SubSchema2QueryResolver.java")), generatedFileNames); } @@ -119,9 +114,9 @@ void generate_InterfacePerSchemaAndConstantPrefix() throws IOException { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.CONSTANT); mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA); - GeneratedInformation generatedInformation = TestUtils.getStaticGeneratedInfo(); + GeneratedInformation generatedInformation = TestUtils.getStaticGeneratedInfo(mappingConfig); List schemas = schemaFinder.findSchemas(); - Assertions.assertThrows(IllegalArgumentException.class, + assertThrows(IllegalArgumentException.class, () -> new JavaGraphQLCodegen(schemas, outputBuildDir, mappingConfig, generatedInformation)); } @@ -131,14 +126,12 @@ void generate_DoNotGenerateApiInterfaceForOperations() throws IOException { schemaFinder.setIncludePattern("test.*\\.graphqls"); mappingConfig.setApiInterfaceStrategy(ApiInterfaceStrategy.DO_NOT_GENERATE); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertEquals(Arrays.asList( - "Event.java", "EventProperty.java", "EventPropertyResolver.java", "EventStatus.java", - "MutationResolver.java", "QueryResolver.java", "SubscriptionResolver.java", "User.java"), + "Event.java", "EventProperty.java", "EventPropertyResolver.java", "EventStatus.java", + "MutationResolver.java", "QueryResolver.java", "SubscriptionResolver.java", "User.java"), Arrays.stream(files).map(File::getName).sorted().collect(toList())); } @@ -147,16 +140,14 @@ void generate_DoNotGenerateRootApiInterfaces() throws IOException { schemaFinder.setIncludePattern("test.*\\.graphqls"); mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.DO_NOT_GENERATE); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertEquals(Arrays.asList( - "CreateEventMutationResolver.java", "Event.java", "EventByIdQueryResolver.java", "EventProperty.java", - "EventPropertyResolver.java", "EventStatus.java", "EventsByCategoryAndStatusQueryResolver.java", - "EventsByIdsQueryResolver.java", "EventsCreatedSubscriptionResolver.java", "User.java", - "VersionQueryResolver.java"), + "CreateEventMutationResolver.java", "Event.java", "EventByIdQueryResolver.java", + "EventProperty.java", "EventPropertyResolver.java", "EventStatus.java", + "EventsByCategoryAndStatusQueryResolver.java", "EventsByIdsQueryResolver.java", + "EventsCreatedSubscriptionResolver.java", "User.java", "VersionQueryResolver.java"), Arrays.stream(files).map(File::getName).sorted().collect(toList())); } @@ -165,9 +156,7 @@ void generate_WithoutThrowsException() throws IOException { schemaFinder.setIncludePattern("github.*\\.graphqls"); mappingConfig.setGenerateApisWithThrowsException(false); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -179,4 +168,10 @@ void generate_WithoutThrowsException() throws IOException { getFileByName(files, "MutationResolver.java")); } + private void generate() throws IOException { + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomScalarMappingTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomScalarMappingTest.java index 834673869..9a6654278 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomScalarMappingTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomScalarMappingTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.Objects; @@ -28,7 +29,6 @@ void init() { mappingConfig = new MappingConfig(); mappingConfig.setPackageName("com.kobylynskyi.graphql.test1"); mappingConfig.setGenerateClient(true); - } @AfterEach @@ -40,8 +40,7 @@ void cleanup() { void generate_CustomTypeMapping_WholeScalar() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("ZonedDateTime", "String"))); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/date-scalar.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -57,8 +56,7 @@ void generate_CustomTypeMapping_ScalarOnQueryOnly() throws Exception { customTypesMapping.put("ZonedDateTime", "java.time.ZonedDateTime"); mappingConfig.setCustomTypesMapping(customTypesMapping); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/date-scalar.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -79,8 +77,7 @@ void generate_CustomTypeMapping_ForExtensionProperty() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("External", "com.example.External"))); mappingConfig.setGenerateClient(false); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/external-type-extend.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/external-type-extend.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -89,4 +86,10 @@ void generate_CustomTypeMapping_ForExtensionProperty() throws Exception { getFileByName(files, "ExternalResolver.java")); } + private void generate(String path) throws IOException { + new JavaGraphQLCodegen(singletonList(path), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java index 900e8aad4..fac00d6c8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -39,8 +40,7 @@ void cleanup() { @Test void generate_CheckFiles() throws Exception { - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/defaults.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/defaults.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); @@ -48,8 +48,7 @@ void generate_CheckFiles() throws Exception { for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", - file.getName())), - file); + file.getName())), file); } } @@ -58,8 +57,7 @@ void generate_UnkonwnFields() throws Exception { mappingConfig.setSupportUnknownFields(true); mappingConfig.setUnknownFieldsPropertyName("userDefinedFields"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/defaults.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/defaults.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); @@ -67,8 +65,7 @@ void generate_UnkonwnFields() throws Exception { for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/unknown-fields/%s.txt", - file.getName())), - file); + file.getName())), file); } } @@ -76,8 +73,7 @@ void generate_UnkonwnFields() throws Exception { void generate_CheckFiles_WithPrefixSuffix() throws Exception { mappingConfig.setModelNameSuffix("TO"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/defaults.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/defaults.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); @@ -85,8 +81,7 @@ void generate_CheckFiles_WithPrefixSuffix() throws Exception { for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", - file.getName())), - file); + file.getName())), file); } } @@ -94,16 +89,21 @@ void generate_CheckFiles_WithPrefixSuffix() throws Exception { void generate_CheckFiles_OnLongDefault() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("Long", "java.lang.Long"))); mappingConfig.setModelNameSuffix("DTO"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/defaults-with-Long.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/defaults-with-Long.graphqls"); + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); assertEquals(asList("InputWithDefaultsDTO.java", "MyEnumDTO.java", "SomeObjectDTO.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", - file.getName())), - file); + file.getName())), file); } } + + private void generate(String path) throws IOException { + new JavaGraphQLCodegen(singletonList(path), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java index 02866ace9..26f1eb0a3 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashSet; @@ -40,8 +41,7 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -60,8 +60,8 @@ void generateServerSideClasses() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -70,4 +70,9 @@ void generateClientSideClasses() throws Exception { getFileByName(files, "EventResponseProjection.java")); } + private void generate() throws IOException { + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java index 5a64dd72e..8deff685f 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashSet; @@ -40,8 +41,7 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -61,8 +61,8 @@ void generateServerSideClasses() throws Exception { @Test void generate_onlyExtend() throws Exception { schemaFinder.setIncludePattern("only-extend-queries.*\\.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); assertEquals(new HashSet<>(asList("SubscriptionResolver.java", "UserQueryResolver.java", "User.java", "UsersCreatedSubscriptionResolver.java", "CreateUserMutationResolver.java", @@ -75,8 +75,8 @@ void generate_onlyExtend() throws Exception { @Test void generateServerSideClasses_ExtensionFieldsResolvers() throws Exception { mappingConfig.setGenerateExtensionFieldsResolvers(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -99,8 +99,8 @@ void generateServerSideClasses_ExtensionFieldsResolvers() throws Exception { void generateServerSideClasses_ExtensionFieldsResolvers_WithExclusions() throws Exception { mappingConfig.setGenerateExtensionFieldsResolvers(true); mappingConfig.setFieldsWithoutResolvers(new HashSet<>(asList("Node", "Event.assets"))); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -121,8 +121,8 @@ void generateServerSideClasses_ExtensionFieldsResolvers_WithExclusions() throws void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -138,8 +138,8 @@ void generateClientSideClasses() throws Exception { @Test void generateServerSideClasses_EmptyTypes() throws Exception { schemaFinder.setIncludePattern("empty-types-with-extend\\.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -156,4 +156,9 @@ void generateServerSideClasses_EmptyTypes() throws Exception { } } + private void generate() throws IOException { + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java index 2cc9cadf9..0c8dcecfb 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Objects; @@ -41,8 +42,7 @@ void generate_ParametrizedFields() throws Exception { singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + "using = com.example.json.DateTimeScalarDeserializer.class)")))); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -57,8 +57,7 @@ void generate_ParametrizedFieldsInInterface() throws Exception { mappingConfig.setGenerateClient(true); mappingConfig.setGenerateApis(false); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/parametrized-input-client.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/parametrized-input-client.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + @@ -72,8 +71,7 @@ void generate_ParametrizedFieldsInInterface_DoNotGenerateResolvers() throws Exce mappingConfig.setGenerateApis(false); mappingConfig.setGenerateParameterizedFieldsResolvers(false); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/parametrized-input-client.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/parametrized-input-client.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/A.java.txt"), @@ -89,8 +87,7 @@ void generate_CustomFieldsResolvers() throws Exception { mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); mappingConfig.setFieldsWithResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -106,8 +103,7 @@ void generate_CustomFieldsResolvers() throws Exception { void generate_ResolverForWholeType() throws Exception { mappingConfig.setFieldsWithResolvers(Collections.singleton("CommentDeletedEvent")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -122,8 +118,7 @@ void generate_FieldResolversViaDirective() throws Exception { mappingConfig.setFieldsWithResolvers(Collections.singleton("@customResolver")); mappingConfig.setFieldsWithoutResolvers(Collections.singleton("@noResolver")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -139,4 +134,9 @@ void generate_FieldResolversViaDirective() throws Exception { getFileByName(files, "EventProperty.java")); } + private void generate(String o) throws IOException { + new JavaGraphQLCodegen(singletonList(o), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java index eadfebb54..63a568d05 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java @@ -47,12 +47,12 @@ void generateFile() throws IOException { dataModel.put(DataModelFields.CLASS_NAME, "Class1"); dataModel.put(DataModelFields.ANNOTATIONS, Collections.emptyList()); dataModel.put(DataModelFields.GENERATED_ANNOTATION, false); - dataModel.put(DataModelFields.GENERATED_INFO, new GeneratedInformation()); + dataModel.put(DataModelFields.GENERATED_INFO, new GeneratedInformation(mappingConfig)); MappingContext mappingContext = MappingContext.builder() .setMappingConfig(mappingConfig) .setDocument(extendedDocument) - .setGeneratedInformation(new GeneratedInformation()) + .setGeneratedInformation(new GeneratedInformation(mappingConfig)) .setDataModelMapperFactory(new DataModelMapperFactory(MAPPER_FACTORY)) .setOutputDirectory(OUTPUT_DIR) .build(); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java index 5e6a70437..673f42d4d 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java @@ -40,8 +40,7 @@ void cleanup() { @Test void generate_MultipleInterfacesPerType() throws Exception { - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -57,8 +56,7 @@ void generate_ClassNameWithSuffix_Prefix() throws Exception { mappingConfig.setModelNamePrefix("Github"); mappingConfig.setModelNameSuffix("TO"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -88,8 +86,7 @@ void generate_ClassNameWithSuffix_Prefix() throws Exception { void generate_NoValidationAnnotation() throws Exception { mappingConfig.setModelValidationAnnotation(""); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File commitFile = getFileByName(Objects.requireNonNull(outputJavaClassesDir.listFiles()), "Commit.java"); assertSameTrimmedContent(new File("src/test/resources/expected-classes/Commit_noValidationAnnotation.java.txt"), @@ -101,8 +98,7 @@ void generate_Client_ConditionalFragments() throws Exception { mappingConfig.setGenerateClient(true); mappingConfig.setGenerateApis(false); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent(new File( @@ -121,12 +117,16 @@ void generate_NoPrimitives() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Boolean!", "Boolean"); mappingConfig.setUseOptionalForNullableReturnTypes(true); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/Commit_withoutPrimitives.java.txt"), getFileByName(files, "Commit.java")); } + private void generate() throws IOException { + new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenImmutableTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenImmutableTest.java index 8771b8a0e..4f040f5cf 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenImmutableTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenImmutableTest.java @@ -31,7 +31,7 @@ void generate_CheckFiles() throws Exception { mappingConfig.setGenerateImmutableModels(true); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java index eecd2afc5..6e32b0481 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java @@ -28,7 +28,7 @@ class GraphQLCodegenInterfacesTest { void init() { mappingConfig.setPackageName("com.kobylynskyi.graphql.interfaces"); generator = new JavaGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/interfaces.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)); } @AfterEach diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java index 5872a05f6..a4ff42be9 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java @@ -40,16 +40,14 @@ void cleanup() { @Test void generateClientFromIntrospectionResult() throws Exception { - new JavaGraphQLCodegen("src/test/resources/introspection-result/sample-introspection-query-result.json", - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/introspection-result/sample-introspection-query-result.json"); checkGeneratedFiles(); } @Test void generateClientFromIntrospectionResultWrappedInData() throws Exception { - new JavaGraphQLCodegen("src/test/resources/introspection-result/sample-introspection-query-result-wrapped.json", - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/introspection-result/sample-introspection-query-result-wrapped.json"); checkGeneratedFiles(); } @@ -59,12 +57,16 @@ void generateClientFromIntrospectionResult_SetApiStrategies() throws Exception { mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); - new JavaGraphQLCodegen("src/test/resources/introspection-result/sample-introspection-query-result.json", - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/introspection-result/sample-introspection-query-result.json"); checkGeneratedFiles(); } + private void generate(String path) throws IOException { + new JavaGraphQLCodegen(path, + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + private void checkGeneratedFiles() throws IOException { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java index b2a6f4ea4..e4333a65a 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -22,7 +23,7 @@ class GraphQLCodegenModelsForRootTypesTest { public static final List SCHEMAS = singletonList("src/test/resources/schemas/test.graphqls"); private final MappingConfig mappingConfig = new MappingConfig(); - private final GeneratedInformation staticGeneratedInfo = TestUtils.getStaticGeneratedInfo(); + private final GeneratedInformation staticGeneratedInfo = TestUtils.getStaticGeneratedInfo(mappingConfig); private final File outputBuildDir = new File("build/generated"); private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/rootmodels"); @@ -67,7 +68,7 @@ void generate_sameResolverSuffixes() { void generate_CheckFiles_generateApisFalse() throws Exception { mappingConfig.setGenerateApis(false); - new JavaGraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); @@ -80,7 +81,7 @@ void generate_CheckFiles_generateApisFalse() throws Exception { void generate_CheckFiles_generateApisTrue_CustomTypeResolverSuffix() throws Exception { mappingConfig.setTypeResolverSuffix("TypeResolver"); - new JavaGraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); @@ -93,4 +94,8 @@ void generate_CheckFiles_generateApisTrue_CustomTypeResolverSuffix() throws Exce generatedFileNames); } + private void generate() throws IOException { + new JavaGraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenMultiFilesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenMultiFilesTest.java index bb45ce98b..35e8d2b8f 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenMultiFilesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenMultiFilesTest.java @@ -31,7 +31,8 @@ void init() { "src/test/resources/schemas/multi1.graphqls", "src/test/resources/schemas/multi2.graphqls" ); - generator = new JavaGraphQLCodegen(schemas, outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()); + generator = new JavaGraphQLCodegen(schemas, outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)); } @AfterEach diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java index 7a24c7ca6..b36831dca 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.Objects; @@ -35,8 +36,8 @@ void cleanup() { @Test void generate_Optional() throws Exception { schemaFinder.setIncludePattern("github.*\\.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -63,8 +64,7 @@ void generate_OptionalWithCustomApiReturnType() throws Exception { mappingConfig.setApiReturnType("reactor.core.publisher.Mono"); mappingConfig.setApiReturnListType("reactor.core.publisher.Flux"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -84,8 +84,7 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setGenerateEqualsAndHashCode(true); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -97,4 +96,9 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { getFileByName(files, "TypeWithMandatoryField.java")); } + private void generate() throws IOException { + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java index 29344841f..9df11bfd8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java @@ -37,7 +37,7 @@ void generate_CheckFiles() throws Exception { mappingConfig.setResolverParentInterface("graphql.kickstart.tools.GraphQLResolver<{{TYPE}}>"); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java index 7cc4826bc..c3c51df21 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashSet; @@ -41,8 +42,7 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -60,8 +60,8 @@ void generateServerSideRelayClasses() throws Exception { void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Exception { mappingConfig.getRelayConfig() .setConnectionType("reactor.core.publisher.Mono>"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -71,4 +71,9 @@ void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Except } + private void generate() throws IOException { + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java index d04c1f5d8..e2b790a2b 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; @@ -42,8 +43,7 @@ void cleanup() { @Test void generate_RequestAndResponseProjections() throws Exception { - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -73,8 +73,7 @@ void generate_RequestAndResponseProjections() throws Exception { @Test void generate_WithModelSuffix() throws Exception { mappingConfig.setModelNameSuffix("TO"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -92,20 +91,18 @@ void generate_WithModelSuffix() throws Exception { @Test void generate_WithOutAllMethods() throws Exception { mappingConfig.setGenerateAllMethodInProjection(false); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + - "EventResponseProjection.java_withoutAll.txt"), - getFileByName(files, "EventResponseProjection.java")); + "EventResponseProjection.java_withoutAll.txt"), + getFileByName(files, "EventResponseProjection.java")); } @Test void generate_PrimitivesInsideParametrizedInput() throws Exception { - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/parametrized-input-client.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/parametrized-input-client.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -116,8 +113,7 @@ void generate_PrimitivesInsideParametrizedInput() throws Exception { @Test void generate_RequestAndResponseProjections_github() throws Exception { - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -132,8 +128,7 @@ void generate_RequestAndResponseProjections_github() throws Exception { @Test void generate_ToStringIsEnabledForInput() throws Exception { - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -145,8 +140,7 @@ void generate_ToStringIsEnabledForInput() throws Exception { @Test void generate_emptyRequestSuffix() throws Exception { mappingConfig.setRequestSuffix(""); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -157,8 +151,7 @@ void generate_emptyRequestSuffix() throws Exception { void generate_noApiImportForModelClasses() throws Exception { mappingConfig.setApiPackageName("com.github.graphql.api"); mappingConfig.setModelPackageName("com.github.graphql"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -170,8 +163,7 @@ void generate_apiImportForModelClassesIfResolverIsPresent() throws Exception { mappingConfig.setApiPackageName("com.github.graphql.api"); mappingConfig.setModelPackageName("com.github.graphql"); mappingConfig.setFieldsWithResolvers(singleton("Event")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -185,8 +177,7 @@ void generate_apiImportForModelClassesIfResolversExtensions() throws Exception { mappingConfig.setApiPackageName("com.github.graphql.api"); mappingConfig.setModelPackageName("com.github.graphql"); mappingConfig.setGenerateExtensionFieldsResolvers(true); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -197,8 +188,7 @@ void generate_apiImportForModelClassesIfResolversExtensions() throws Exception { @Test void generate_QueriesWithSameName() throws Exception { - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/queries-same-name.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/queries-same-name.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -214,8 +204,7 @@ void generate_QueriesWithSameName() throws Exception { @Test void generate_ClassesWithoutPrimitiveTypes() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Integer"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -228,8 +217,7 @@ void generate_ClassesWithoutPrimitiveTypes() throws Exception { void generate_UseObjectMapperToSerializeFields_Type() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("DateTime", "java.time.ZonedDateTime"); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("DateTime")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -242,8 +230,8 @@ void generate_UseObjectMapperToSerializeFields_Type() throws Exception { void generate_UseObjectMapperToSerializeFields_Field() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Event.createdDateTime", "java.time.ZonedDateTime"); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("DateTime")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -255,8 +243,8 @@ void generate_UseObjectMapperToSerializeFields_Field() throws Exception { @Test void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { mappingConfig.setUseObjectMapperForRequestSerialization(singleton("ZonedDateTime")); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/date-scalar.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -265,4 +253,10 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { getFileByName(files, "QueryINeedQueryRequest.java")); } + private void generate(String o) throws IOException { + new JavaGraphQLCodegen(singletonList(o), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java index 32fb4e604..ee93f962f 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; @@ -36,8 +37,8 @@ void cleanup() { @Test void generate_RequestAndResponseProjections() throws Exception { mappingConfig.setModelNameSuffix("TO"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -55,8 +56,8 @@ void generate_RequestAndResponseProjections() throws Exception { @Test void generate_RequestAndResponseProjections_Interfaces() throws Exception { mappingConfig.setModelNameSuffix("TO"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/projection-interfaces.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/projection-interfaces.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -71,8 +72,8 @@ void generate_RequestAndResponseProjections_Interfaces() throws Exception { @Test void generate_projections_with_selectAll() throws Exception { mappingConfig.setModelNameSuffix("TO"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/projection-interfaces.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/projection-interfaces.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -86,8 +87,7 @@ void generate_projections_with_selectAll() throws Exception { @Test void generate_ResponseWithPrimitiveType() throws Exception { - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/primitive-query-response-type.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/primitive-query-response-type.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -96,4 +96,9 @@ void generate_ResponseWithPrimitiveType() throws Exception { getFileByName(files, "VersionQueryResponse.java")); } + private void generate(String o) throws IOException { + new JavaGraphQLCodegen(singletonList(o), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java index 9def4f494..c10e985c2 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java @@ -39,7 +39,7 @@ void generate() throws Exception { mappingConfig.setApiNameSuffix("API"); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/restricted-words.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java index ce083407f..7b1b08b6a 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java @@ -250,7 +250,7 @@ void generate_GeneratedAnnotation() throws Exception { @Test void generate_NoSchemas() { - GeneratedInformation staticGeneratedInfo = TestUtils.getStaticGeneratedInfo(); + GeneratedInformation staticGeneratedInfo = TestUtils.getStaticGeneratedInfo(mappingConfig); List schemas = emptyList(); JavaGraphQLCodegen codegen = new JavaGraphQLCodegen( schemas, outputBuildDir, mappingConfig, staticGeneratedInfo); @@ -261,7 +261,7 @@ void generate_NoSchemas() { void generate_WrongSchema() { GraphQLCodegen graphQLCodegen = new JavaGraphQLCodegen( singletonList("src/test/resources/schemas/wrong.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)); assertThrows(NoSuchFileException.class, graphQLCodegen::generate); @@ -401,7 +401,7 @@ void generate_InterfaceAndTypeHavingDuplicateFields1() throws Exception { private List generate(String s) throws IOException { return new JavaGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTypesAsInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTypesAsInterfacesTest.java index 5eeff536d..50cb752dd 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTypesAsInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTypesAsInterfacesTest.java @@ -8,12 +8,12 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.HashSet; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; -import static java.util.Arrays.asList; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; @@ -40,8 +40,7 @@ void cleanup() { void generate_typesAsInterfaces() throws Exception { mappingConfig.getTypesAsInterfaces().add("Order"); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/types-as-interfaces.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/types-as-interfaces.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -59,11 +58,9 @@ void generate_typesAsInterfaces() throws Exception { @Test void generate_typesAsInterfacesExtendsInterface() throws Exception { - mappingConfig.setTypesAsInterfaces(new HashSet<>(asList("@asInterface"))); + mappingConfig.setTypesAsInterfaces(new HashSet<>(singletonList("@asInterface"))); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/" + - "types-as-interfaces-extends-interface.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/types-as-interfaces-extends-interface.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -86,9 +83,7 @@ void generate_typesAsInterfacesExtendsInterface() throws Exception { void generate_typeAsInterfaceParametrized() throws Exception { mappingConfig.setGenerateParameterizedFieldsResolvers(true); - new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/" + - "types-as-interfaces-parametrized.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/types-as-interfaces-parametrized.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -97,4 +92,10 @@ void generate_typeAsInterfaceParametrized() throws Exception { getFileByName(files, "Foo.java")); } + private void generate(String o) throws IOException { + new JavaGraphQLCodegen(singletonList(o), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java index bdfbf6a1c..25dbdc3e8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java @@ -38,7 +38,8 @@ void cleanup() { @Test void generate_CheckFiles_with_model_package() throws Exception { mappingConfig.setPackageName("com.kobylynskyi.graphql.unionresolver"); - generate("src/test/resources/schemas/union-resolver.graphqls"); + + generate(); File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -60,7 +61,8 @@ void generate_CheckFiles_with_model_package() throws Exception { void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() throws Exception { mappingConfig.setModelNamePrefix("My"); mappingConfig.setModelNameSuffix("Suffix"); - generate("src/test/resources/schemas/union-resolver.graphqls"); + + generate(); File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -78,9 +80,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro } } - private void generate(String path) throws IOException { - new JavaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + private void generate() throws IOException { + new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/union-resolver.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionWithEnumTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionWithEnumTest.java index b4905f841..10f3b99fb 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionWithEnumTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionWithEnumTest.java @@ -32,7 +32,7 @@ void cleanup() { void generate_CheckFiles() throws Exception { mappingConfig.setPackageName("com.kobylynskyi.graphql.enumunion"); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/union-with-enum.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/TestUtils.java b/src/test/java/com/kobylynskyi/graphql/codegen/TestUtils.java index 3635f262d..ba87e3f44 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/TestUtils.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/TestUtils.java @@ -1,6 +1,7 @@ package com.kobylynskyi.graphql.codegen; import com.kobylynskyi.graphql.codegen.model.GeneratedInformation; +import com.kobylynskyi.graphql.codegen.model.MappingConfig; import com.kobylynskyi.graphql.codegen.utils.Utils; import org.hamcrest.Matchers; @@ -53,10 +54,8 @@ private static boolean atLeastJava9() { } } - public static GeneratedInformation getStaticGeneratedInfo() { - GeneratedInformation generatedInformation = new GeneratedInformation(); - generatedInformation.setDateTimeSupplier(() -> GENERATED_DATE_TIME); - return generatedInformation; + public static GeneratedInformation getStaticGeneratedInfo(MappingConfig mappingConfig) { + return new GeneratedInformation(() -> GENERATED_DATE_TIME, mappingConfig); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java index d1486986a..8277ee1b7 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.Objects; @@ -43,8 +44,7 @@ void cleanup() { void generate_CustomTypeMapping_WholeScalar() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("ZonedDateTime", "String"))); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/date-scalar.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -61,8 +61,7 @@ void generate_CustomTypeMapping_ScalarOnQueryOnly() throws Exception { customTypesMapping.put("ZonedDateTime", "java.time.ZonedDateTime"); mappingConfig.setCustomTypesMapping(customTypesMapping); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/date-scalar.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -81,8 +80,8 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { customTypesMapping.put("ZonedDateTime", "java.time.ZonedDateTime"); mappingConfig.setCustomTypesMapping(customTypesMapping); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("ZonedDateTime")); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/date-scalar.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -95,8 +94,8 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { void generate_UseObjectMapperToSerializeFields_Type() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("DateTime", "java.time.LocalDateTime"); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("DateTime")); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -104,4 +103,10 @@ void generate_UseObjectMapperToSerializeFields_Type() throws Exception { "Event_useObjectMapperForRequestSerialization.kt.txt"), getFileByName(files, "Event.kt")); } + + private void generate(String path) throws IOException { + new KotlinGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java index 7662cd652..6c0ebe076 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java @@ -40,7 +40,7 @@ void cleanup() { @Test void generate_deprecated() throws Exception { new KotlinGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/deprecated-with-msg.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java index 8124f7757..34bbe65b7 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java @@ -45,7 +45,7 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -65,7 +65,7 @@ void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java index c3d92c1ab..1a7016415 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java @@ -4,7 +4,6 @@ import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; import com.kobylynskyi.graphql.codegen.utils.Utils; -import org.hamcrest.core.StringContains; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -16,12 +15,11 @@ import java.util.Objects; import java.util.Set; +import static com.kobylynskyi.graphql.codegen.TestUtils.assertFileContainsElements; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; -import static org.hamcrest.MatcherAssert.assertThat; - class GraphQLCodegenGitHubTest { @@ -29,10 +27,6 @@ class GraphQLCodegenGitHubTest { private final File outputktClassesDir = new File("build/generated/com/github/graphql"); private final MappingConfig mappingConfig = new MappingConfig(); - private static String getFileContent(File[] files, String fileName) throws IOException { - return Utils.getFileContent(getFileByName(files, fileName).getPath()); - } - @BeforeEach void init() { mappingConfig.setGenerateParameterizedFieldsResolvers(false); @@ -55,8 +49,8 @@ void generate_MultipleInterfacesPerType() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Boolean!", "Boolean"); mappingConfig.setUseOptionalForNullableReturnTypes(true); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); + File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/Commit.kt.txt"), @@ -76,22 +70,18 @@ void generate_ClassNameWithSuffix_Prefix() throws Exception { mappingConfig.setModelNameSuffix("TO"); mappingConfig.setGenerateImmutableModels(false); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); // verify proper class name for GraphQL interface - assertThat(getFileContent(files, "GithubActorTO.kt"), - StringContains.containsString("interface GithubActorTO")); + assertFileContainsElements(files, "GithubActorTO.kt", "interface GithubActorTO"); // verify proper class name for GraphQL enum - assertThat(getFileContent(files, "GithubIssueStateTO.kt"), - StringContains.containsString("enum class GithubIssueStateTO")); + assertFileContainsElements(files, "GithubIssueStateTO.kt", "enum class GithubIssueStateTO"); // verify proper class name for GraphQL union - assertThat(getFileContent(files, "GithubAssigneeTO.kt"), - StringContains.containsString("interface GithubAssigneeTO")); + assertFileContainsElements(files, "GithubAssigneeTO.kt", "interface GithubAssigneeTO"); // verify proper class name for GraphQL input assertSameTrimmedContent( @@ -108,8 +98,7 @@ void generate_Client_ConditionalFragments() throws Exception { mappingConfig.setGenerateClient(true); mappingConfig.setGenerateApis(false); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); assertSameTrimmedContent( @@ -124,8 +113,7 @@ void generate_Client_ConditionalFragments() throws Exception { void generate_ResponseWithPrimitiveType() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); mappingConfig.putCustomTypeMappingIfAbsent("Int", "Int?"); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/primitive-query-response-type.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/primitive-query-response-type.graphqls"); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); @@ -135,8 +123,7 @@ void generate_ResponseWithPrimitiveType() throws Exception { @Test void generate_ktList() throws Exception { - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableInput.kt.txt"), @@ -161,8 +148,7 @@ void generate_ktList() throws Exception { void generate_Var_Field() throws Exception { mappingConfig.setGenerateImmutableModels(false); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/Commit_Var_Field.kt.txt"), @@ -176,8 +162,7 @@ void generate_CustomFieldsResolvers() throws Exception { mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); mappingConfig.setFieldsWithResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic")); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); @@ -200,8 +185,7 @@ void generate_CustomFieldsResolversWithAnnotation() throws Exception { mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); mappingConfig.setFieldsWithResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic")); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); @@ -213,7 +197,6 @@ void generate_CustomFieldsResolversWithAnnotation() throws Exception { @Test void generate_CustomFieldsResolversWithMultipleAnnotations() throws Exception { - Set annotations = new HashSet<>(); annotations.add("some.Annotation"); annotations.add("another.Annotation"); @@ -225,8 +208,7 @@ void generate_CustomFieldsResolversWithMultipleAnnotations() throws Exception { mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); mappingConfig.setFieldsWithResolvers(Collections.singleton("AcceptTopicSuggestionPayload.topic")); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); @@ -240,12 +222,18 @@ void generate_CustomFieldsResolversWithMultipleAnnotations() throws Exception { void generate_RequestWithDefaultValue() throws Exception { mappingConfig.setGenerateBuilder(true); mappingConfig.setGenerateClient(true); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/kt/default.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/kt/default.graphqls"); + File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/default/" + "FriendsQueryRequest.kt.txt"), getFileByName(files, "FriendsQueryRequest.kt")); } + private void generate(String path) throws IOException { + new KotlinGraphQLCodegen(singletonList(path), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInitializeNullableTypesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInitializeNullableTypesTest.java index ee4460dc6..369554f46 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInitializeNullableTypesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInitializeNullableTypesTest.java @@ -42,7 +42,7 @@ void cleanup() { @Test void generate_InitializeNullableTypes() throws Exception { new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent( diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java index 805680375..30c7da047 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java @@ -32,7 +32,7 @@ void init() { mappingConfig.setPackageName("com.kobylynskyi.graphql.interfaces"); generator = new KotlinGraphQLCodegen( Collections.singletonList("src/test/resources/schemas/interfaces.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)); } @AfterEach diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java index 5809ac722..60815e0a8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java @@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.Objects; @@ -38,8 +39,8 @@ void generatePrimitiveTypesResponseResolverClasses_nullable() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); schemaFinder.setIncludePattern("nullable-extend.graphqls"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -79,8 +80,8 @@ void generatePrimitiveTypesResponseResolverClasses_nullable_With_Prefix_Suffix() mappingConfig.setModelNamePrefix("Test"); mappingConfig.setModelNameSuffix("DTO"); schemaFinder.setIncludePattern("nullable-extend.graphqls"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( @@ -98,9 +99,7 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setGenerateEqualsAndHashCode(true); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -111,4 +110,10 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { new File("src/test/resources/expected-classes/kt/optional/TypeWithMandatoryField.kt.txt"), getFileByName(files, "TypeWithMandatoryField.kt")); } + + private void generate() throws IOException { + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenOpenclassesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenOpenclassesTest.java index 6b8c81609..c7d59a5ae 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenOpenclassesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenOpenclassesTest.java @@ -42,7 +42,7 @@ void cleanup() { @Test void generate_MultipleInterfacesPerType() throws Exception { new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/Commit_no_final_class.kt.txt"), diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java index fc5d62209..aa21056e9 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java @@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashSet; @@ -43,8 +44,7 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -62,8 +62,8 @@ void generateServerSideRelayClasses() throws Exception { void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Exception { mappingConfig.getRelayConfig() .setConnectionType("reactor.core.publisher.Mono>"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -73,4 +73,9 @@ void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Except } + private void generate() throws IOException { + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java index 04d6dd345..3d342d680 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java @@ -42,8 +42,9 @@ void generate() throws Exception { mappingConfig.setApiNameSuffix("API"); mappingConfig.putCustomTypeMappingIfAbsent("DateTime", "java.time.ZonedDateTime"); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("DateTime")); + new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/kt/restricted-words.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List filters = Arrays diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenSealedInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenSealedInterfacesTest.java index 0fb0f4b03..84ffce0c0 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenSealedInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenSealedInterfacesTest.java @@ -41,7 +41,7 @@ void cleanup() { @Test void generate_MultipleInterfacesPerType() throws Exception { new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/Comment_sealed_interfaces.kt.txt"), diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenTypesAsInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenTypesAsInterfacesTest.java index 943935420..cabef34e0 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenTypesAsInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenTypesAsInterfacesTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Collections; import java.util.HashSet; import java.util.Objects; @@ -40,8 +41,7 @@ void cleanup() { void generate_typesAsInterfaces() throws Exception { mappingConfig.setTypesAsInterfaces(new HashSet<>(asList("@asInterface", "Order"))); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/types-as-interfaces.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/types-as-interfaces.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -61,9 +61,7 @@ void generate_typesAsInterfaces() throws Exception { void generate_typesAsInterfacesExtendsInterface() throws Exception { mappingConfig.setTypesAsInterfaces(new HashSet<>(asList("@asInterface"))); - new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/" + - "types-as-interfaces-extends-interface.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/types-as-interfaces-extends-interface.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -72,13 +70,18 @@ void generate_typesAsInterfacesExtendsInterface() throws Exception { assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/" + "types-as-interfaces-extends-interface/Profile.kt.txt"), getFileByName(files, "Profile.kt")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/" + - "types-as-interfaces-extends-interface/QueryResolver.kt.txt"), + "types-as-interfaces-extends-interface/QueryResolver.kt.txt"), getFileByName(files, "QueryResolver.kt")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/" + "types-as-interfaces-extends-interface/User.kt.txt"), getFileByName(files, "User.kt")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/" + - "types-as-interfaces-extends-interface/UserCurrentQueryResolver.kt.txt"), + "types-as-interfaces-extends-interface/UserCurrentQueryResolver.kt.txt"), getFileByName(files, "UserCurrentQueryResolver.kt")); } + private void generate(String o) throws IOException { + new KotlinGraphQLCodegen(singletonList(o), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java index efe5fe257..640e89cb9 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java @@ -40,7 +40,8 @@ void cleanup() { @Test void generate_CheckFiles_with_model_package() throws Exception { mappingConfig.setPackageName("com.kobylynskyi.graphql.unionresolver"); - generate("src/test/resources/schemas/union-resolver.graphqls"); + + generate(); File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -62,7 +63,8 @@ void generate_CheckFiles_with_model_package() throws Exception { void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() throws Exception { mappingConfig.setModelNamePrefix("My"); mappingConfig.setModelNameSuffix("Suffix"); - generate("src/test/resources/schemas/union-resolver.graphqls"); + + generate(); File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -81,9 +83,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro } } - private void generate(String path) throws IOException { - new KotlinGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + private void generate() throws IOException { + new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/union-resolver.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionWithEnumTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionWithEnumTest.java index bdd04a8a8..61569f518 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionWithEnumTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionWithEnumTest.java @@ -34,8 +34,9 @@ void cleanup() { void generate_CheckFiles() throws Exception { mappingConfig.setGeneratedLanguage(GeneratedLanguage.KOTLIN); mappingConfig.setPackageName("com.kobylynskyi.graphql.enumunion"); + new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/union-with-enum.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java index 4afc8adc5..46b2452c6 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java @@ -58,6 +58,7 @@ private static MappingConfig buildMappingConfig() { config.setGenerateModelsForRootTypes(false); config.setGenerateApisWithThrowsException(true); config.setAddGeneratedAnnotation(true); + config.setGeneratedAnnotation("jakarta.annotation.Generated"); config.setParametrizedInputSuffix("9"); config.setTypeResolverPrefix("11"); config.setTypeResolverSuffix("12"); @@ -104,6 +105,7 @@ private static MappingConfig buildMappingConfig2() { config.setGenerateModelsForRootTypes(true); config.setGenerateApisWithThrowsException(false); config.setAddGeneratedAnnotation(false); + config.setGeneratedAnnotation("javax.annotation.Generated"); config.setParametrizedInputSuffix("99"); config.setTypeResolverPrefix("1111"); config.setTypeResolverSuffix("1212"); @@ -227,6 +229,7 @@ void combineDefaultWithCustom() { assertFalse(mappingConfig.getGenerateModelsForRootTypes()); assertTrue(mappingConfig.getGenerateApisWithThrowsException()); assertTrue(mappingConfig.getAddGeneratedAnnotation()); + assertEquals("jakarta.annotation.Generated", mappingConfig.getGeneratedAnnotation()); assertEquals("11", mappingConfig.getTypeResolverPrefix()); assertEquals("12", mappingConfig.getTypeResolverSuffix()); assertEquals("key", mappingConfig.getRelayConfig().getDirectiveArgumentName()); @@ -272,6 +275,7 @@ void combineCustomWithDefault() { assertFalse(mappingConfig.getGenerateModelsForRootTypes()); assertTrue(mappingConfig.getGenerateApisWithThrowsException()); assertTrue(mappingConfig.getAddGeneratedAnnotation()); + assertEquals("jakarta.annotation.Generated", mappingConfig.getGeneratedAnnotation()); assertEquals("9", mappingConfig.getParametrizedInputSuffix()); assertEquals("11", mappingConfig.getTypeResolverPrefix()); assertEquals("12", mappingConfig.getTypeResolverSuffix()); @@ -323,6 +327,7 @@ void combineCustomWithCustom() { assertTrue(mappingConfig.getGenerateModelsForRootTypes()); assertFalse(mappingConfig.getGenerateApisWithThrowsException()); assertFalse(mappingConfig.getAddGeneratedAnnotation()); + assertEquals("javax.annotation.Generated", mappingConfig.getGeneratedAnnotation()); assertEquals("99", mappingConfig.getParametrizedInputSuffix()); assertEquals("1111", mappingConfig.getTypeResolverPrefix()); assertEquals("1212", mappingConfig.getTypeResolverSuffix()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java index 7fe7db10b..76e52ce55 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -52,8 +53,7 @@ void generate_CustomAnnotationMappings() throws Exception { " classOf[com.example.json" + ".DateTimeScalarDeserializer])")))); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.scala", @@ -85,8 +85,7 @@ void generate_CustomAnnotationMappings_Class() throws Exception { "classOf[DeploymentOrderFieldDeserializer])")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionInput.scala", @@ -122,8 +121,7 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { + ".external.starwars.AcceptTopicSuggestionPayloadTypeResolver])")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", @@ -149,8 +147,7 @@ void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); mappingConfig.setGenerateClient(true); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "CodeOfConductQueryRequest.scala", @@ -176,8 +173,7 @@ void generate_Directives() throws Exception { singletonList("@com.example.Relationship(type = {{type}}, direction = {{direction}})")); mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( @@ -191,4 +187,9 @@ void generate_Directives() throws Exception { getFileByName(files, "User.scala")); } + private void generate(String path) throws IOException { + new ScalaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java index edfd19d0d..e62d04e98 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.Objects; @@ -43,8 +44,7 @@ void cleanup() { void generate_CustomTypeMapping_WholeScalar() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("ZonedDateTime", "String"))); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -61,8 +61,7 @@ void generate_CustomTypeMapping_ScalarOnQueryOnly() throws Exception { customTypesMapping.put("ZonedDateTime", "java.time.ZonedDateTime"); mappingConfig.setCustomTypesMapping(customTypesMapping); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -81,8 +80,8 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { customTypesMapping.put("ZonedDateTime", "java.time.ZonedDateTime"); mappingConfig.setCustomTypesMapping(customTypesMapping); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("ZonedDateTime")); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -91,4 +90,9 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { "QueryINeedQueryRequest_custom_serializer.scala.txt"), getFileByName(files, "QueryINeedQueryRequest.scala")); } + + private void generate() throws IOException { + new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/date-scalar.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java index 37c0828a8..7a427e1b9 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java @@ -40,7 +40,7 @@ void cleanup() { @Test void generate_deprecated() throws Exception { new ScalaGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/deprecated-with-msg.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java index e23c86c10..c76ac12b0 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java @@ -44,7 +44,7 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -64,8 +64,9 @@ void generateServerSideClasses() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java index cad60cdf5..26bc33075 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java @@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashMap; @@ -44,8 +45,7 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -66,8 +66,8 @@ void generateServerSideClasses() throws Exception { void generateServerSideClasses_ExtensionFieldsResolvers_WithExclusions() throws Exception { mappingConfig.setGenerateExtensionFieldsResolvers(true); mappingConfig.setFieldsWithoutResolvers(new HashSet<>(asList("Node", "Event.assets"))); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -88,8 +88,8 @@ void generateServerSideClasses_ExtensionFieldsResolvers_WithExclusions() throws @Test void generateServerSideClasses_EmptyTypes() throws Exception { schemaFinder.setIncludePattern("empty-types-with-extend\\.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -110,8 +110,8 @@ void generateServerSideClasses_EmptyTypes() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -129,8 +129,8 @@ void generatePrimitiveTypesResponseResolverClasses() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); schemaFinder.setIncludePattern("null-extend1.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -164,8 +164,8 @@ void generatePrimitiveTypesResponseResolverClasses_With_SetUseOptionalForNullabl // is mandatory. mappingConfig.setUseOptionalForNullableReturnTypes(true); schemaFinder.setIncludePattern("null-extend2.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -184,8 +184,8 @@ void generatePrimitiveTypesResponseResolverClasses_Without_SetUseOptionalForNull mappingConfig.setGenerateClient(true); mappingConfig.setUseOptionalForNullableReturnTypes(false); schemaFinder.setIncludePattern("null-extend2.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); //Therefore, when the return type is a primitive type, the return option is automatically turned on, and this @@ -212,8 +212,8 @@ void generatePrimitiveTypesResponseResolverClasses_nullable() throws Exception { mappingConfig.setGenerateClient(true); mappingConfig.setUseOptionalForNullableReturnTypes(true); schemaFinder.setIncludePattern("null-extend3.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -252,9 +252,7 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setCustomTypesMapping(maps); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()) - .generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -265,4 +263,10 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { new File("src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt"), getFileByName(files, "TypeWithMandatoryField.scala")); } + + private void generate() throws IOException { + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java index 4d8f9cdef..e5a9c91fa 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java @@ -49,8 +49,8 @@ void generate_MultipleInterfacesPerType() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); mappingConfig.putCustomTypeMappingIfAbsent("Boolean!", "Boolean"); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); + File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/Commit.scala.txt"), @@ -65,8 +65,7 @@ void generate_ClassNameWithSuffix_Prefix() throws Exception { mappingConfig.setModelNamePrefix("Github"); mappingConfig.setModelNameSuffix("TO"); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); @@ -96,8 +95,7 @@ void generate_ClassNameWithSuffix_Prefix() throws Exception { void generate_NoValidationAnnotation() throws Exception { mappingConfig.setModelValidationAnnotation(""); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File commitFile = getFileByName(Objects.requireNonNull(outputScalaClassesDir.listFiles()), "Commit.scala"); assertSameTrimmedContent( @@ -110,8 +108,7 @@ void generate_Client_ConditionalFragments() throws Exception { mappingConfig.setGenerateClient(true); mappingConfig.setGenerateApis(false); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent(new File( @@ -130,8 +127,7 @@ void generate_NoPrimitives() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Boolean!", "java.lang.Boolean"); mappingConfig.setUseOptionalForNullableReturnTypes(true); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent( @@ -146,8 +142,7 @@ void generate_Primitives() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Boolean!", "Boolean"); mappingConfig.setUseOptionalForNullableReturnTypes(true); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt"), @@ -158,8 +153,8 @@ void generate_Primitives() throws Exception { void generate_ResponseWithPrimitiveType() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); mappingConfig.putCustomTypeMappingIfAbsent("Int", "Int"); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/primitive-query-response-type.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate("src/test/resources/schemas/primitive-query-response-type.graphqls"); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); @@ -170,8 +165,7 @@ void generate_ResponseWithPrimitiveType() throws Exception { @Test void generate_ScalaList() throws Exception { - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent( @@ -199,13 +193,18 @@ void generate_ScalaList() throws Exception { void generate_Var_Field() throws Exception { mappingConfig.setGenerateImmutableModels(false); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt"), getFileByName(files, "Commit.scala")); } + private void generate(String path) throws IOException { + new ScalaGraphQLCodegen(singletonList(path), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenOpenclassesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenOpenclassesTest.java index 8cb512b0a..189592f84 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenOpenclassesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenOpenclassesTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; @@ -41,8 +42,8 @@ void cleanup() { @Test void generate_MultipleInterfacesPerType() throws Exception { - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); + File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent( @@ -53,12 +54,18 @@ void generate_MultipleInterfacesPerType() throws Exception { @Test void generate_MultipleInterfacesPerTypeVarFields() throws Exception { mappingConfig.setGenerateImmutableModels(false); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); + File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); assertSameTrimmedContent( new File("src/test/resources/expected-classes/scala/Commit_normal_class_var_fields.scala.txt"), getFileByName(files, "Commit.scala")); } + + private void generate() throws IOException { + new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java index d2dd0c9aa..e5ef6e37b 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java @@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashSet; @@ -43,8 +44,7 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -62,8 +62,8 @@ void generateServerSideRelayClasses() throws Exception { void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Exception { mappingConfig.getRelayConfig() .setConnectionType("reactor.core.publisher.Mono[graphql.relay.Connection[%s]]"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -73,4 +73,9 @@ void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Except } + private void generate() throws IOException { + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRestrictedWordsAndToStringTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRestrictedWordsAndToStringTest.java index 8c2f04dc7..4d6a9b2e8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRestrictedWordsAndToStringTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRestrictedWordsAndToStringTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -26,27 +27,27 @@ class GraphQLCodegenRestrictedWordsAndToStringTest { private final File outputBuildDir = new File("build/generated"); private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/codegen/prot"); - @AfterEach - void cleanup() { - Utils.deleteDir(outputBuildDir); - } - @BeforeEach public void setup() { mappingConfig.setGeneratedLanguage(GeneratedLanguage.SCALA); + mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot"); + mappingConfig.setGenerateEqualsAndHashCode(true); + mappingConfig.setGenerateModelsForRootTypes(true); + mappingConfig.setApiNameSuffix("API"); + } + + @AfterEach + void cleanup() { + Utils.deleteDir(outputBuildDir); } @Test void generate_SetGenerateBuilder_False() throws Exception { - mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot"); // fix an issue when generateBuilder=false => can not use object.OPERATION_NAME mappingConfig.setGenerateBuilder(false); - mappingConfig.setGenerateEqualsAndHashCode(true); mappingConfig.setGenerateClient(true); - mappingConfig.setGenerateModelsForRootTypes(true); - mappingConfig.setApiNameSuffix("API"); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/scala/restricted-words.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName) @@ -64,22 +65,19 @@ void generate_SetGenerateBuilder_False() throws Exception { @Test void generate_SetGenerateClient_True() throws Exception { - mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot"); - mappingConfig.setGenerateEqualsAndHashCode(true); mappingConfig.setGenerateClient(true); mappingConfig.setGenerateBuilder(true); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("TestEnum")); mappingConfig.putCustomTypeMappingIfAbsent("DateTime", "java.time.ZonedDateTime"); mappingConfig.setGenerateApis(true); - mappingConfig.setGenerateModelsForRootTypes(true); - mappingConfig.setApiNameSuffix("API"); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("DateTime")); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/scala/restricted-words.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter( - f -> Arrays.asList("QueryPrivateParametrizedInput.scala", "Synchronized.scala").contains(f)).sorted() + List generatedFileNames = Arrays.stream(files).map(File::getName) + .filter(f -> Arrays.asList("QueryPrivateParametrizedInput.scala", "Synchronized.scala").contains(f)) + .sorted() .collect(toList()); assertEquals(Arrays.asList("QueryPrivateParametrizedInput.scala", "Synchronized.scala"), generatedFileNames); @@ -95,18 +93,13 @@ void generate_SetGenerateClient_True() throws Exception { @Test void generate_SetGenerateClient_False() throws Exception { - mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot"); - mappingConfig.setGenerateEqualsAndHashCode(true); mappingConfig.setGenerateClient(false); mappingConfig.setGenerateToString(true); mappingConfig.setUseObjectMapperForRequestSerialization(singleton("TestEnum")); mappingConfig.putCustomTypeMappingIfAbsent("DateTime", "java.time.ZonedDateTime"); mappingConfig.setGenerateApis(true); - mappingConfig.setGenerateModelsForRootTypes(true); - mappingConfig.setApiNameSuffix("API"); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/scala/restricted-words.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName) @@ -126,4 +119,9 @@ void generate_SetGenerateClient_False() throws Exception { } } + private void generate() throws IOException { + new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/scala/restricted-words.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenTypesAsInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenTypesAsInterfacesTest.java index 5461f6152..dd63b7749 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenTypesAsInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenTypesAsInterfacesTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import java.io.File; +import java.io.IOException; import java.util.Collections; import java.util.HashSet; import java.util.Objects; @@ -40,8 +41,7 @@ void cleanup() { void generate_typeAsInterface() throws Exception { mappingConfig.setTypesAsInterfaces(new HashSet<>(asList("@asInterface", "Order"))); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/types-as-interfaces.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/types-as-interfaces.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -61,25 +61,29 @@ void generate_typeAsInterface() throws Exception { void generate_typeAsInterfaceExtendsInterface() throws Exception { mappingConfig.setTypesAsInterfaces(new HashSet<>(asList("@asInterface"))); - new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/" + - "types-as-interfaces-extends-interface.graphqls"), - outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + generate("src/test/resources/schemas/types-as-interfaces-extends-interface.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/" + "types-as-interfaces-extends-interface/Node.scala.txt"), getFileByName(files, "Node.scala")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/" + - "types-as-interfaces-extends-interface/Profile.scala.txt"), + "types-as-interfaces-extends-interface/Profile.scala.txt"), getFileByName(files, "Profile.scala")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/" + - "types-as-interfaces-extends-interface/QueryResolver.scala.txt"), + "types-as-interfaces-extends-interface/QueryResolver.scala.txt"), getFileByName(files, "QueryResolver.scala")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/" + "types-as-interfaces-extends-interface/User.scala.txt"), getFileByName(files, "User.scala")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/" + - "types-as-interfaces-extends-interface/UserCurrentQueryResolver.scala.txt"), + "types-as-interfaces-extends-interface/UserCurrentQueryResolver.scala.txt"), getFileByName(files, "UserCurrentQueryResolver.scala")); } + private void generate(String path) throws IOException { + new ScalaGraphQLCodegen(singletonList(path), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java index 1efa8b065..83ba98e57 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java @@ -40,7 +40,8 @@ void cleanup() { @Test void generate_CheckFiles_with_model_package() throws Exception { mappingConfig.setPackageName("com.kobylynskyi.graphql.unionresolver"); - generate("src/test/resources/schemas/union-resolver.graphqls"); + + generate(); File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -62,7 +63,8 @@ void generate_CheckFiles_with_model_package() throws Exception { void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() throws Exception { mappingConfig.setModelNamePrefix("My"); mappingConfig.setModelNameSuffix("Suffix"); - generate("src/test/resources/schemas/union-resolver.graphqls"); + + generate(); File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -81,9 +83,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro } } - private void generate(String path) throws IOException { - new ScalaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); + private void generate() throws IOException { + new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/union-resolver.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); } } From 11c9d5bcd740022a66ff9066b78af88e625921e8 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sun, 26 Feb 2023 07:27:12 -0500 Subject: [PATCH 09/25] Bump version to 5.6.0-SNAPSHOT (#1038) --- build.gradle | 2 +- plugins/gradle/example-client-kotlin/build.gradle | 6 +++--- plugins/gradle/example-client/build.gradle | 4 ++-- plugins/gradle/example-server/build.gradle | 2 +- .../gradle/graphql-java-codegen-gradle-plugin/build.gradle | 2 +- plugins/maven/example-client/pom.xml | 2 +- plugins/maven/example-server/pom.xml | 2 +- plugins/maven/graphql-java-codegen-maven-plugin/pom.xml | 4 ++-- .../example-client-scala/project/plugins.sbt | 2 +- .../example-client-scala/version.sbt | 2 +- .../example-client/project/plugins.sbt | 2 +- .../graphql-codegen-sbt-plugin/example-client/version.sbt | 2 +- .../graphql-codegen-sbt-plugin/simple/project/plugins.sbt | 2 +- .../sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt | 2 +- plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt | 2 +- 15 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index 7b6595024..d539126db 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id "org.sonarqube" version "3.2.0" } -def graphqlCodegenVersion = '5.5.1-SNAPSHOT' // This variable used in the automatic release process +def graphqlCodegenVersion = '5.6.0-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenVersion diff --git a/plugins/gradle/example-client-kotlin/build.gradle b/plugins/gradle/example-client-kotlin/build.gradle index 12998fb7a..3d0a3f2b7 100644 --- a/plugins/gradle/example-client-kotlin/build.gradle +++ b/plugins/gradle/example-client-kotlin/build.gradle @@ -4,10 +4,10 @@ import io.github.kobylynskyi.graphql.codegen.gradle.GraphQLCodegenGradleTask plugins { id "java" id "org.jetbrains.kotlin.jvm" version "1.6.21" - id "io.github.kobylynskyi.graphql.codegen" version "5.5.1-SNAPSHOT" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.0-SNAPSHOT" } -def graphqlCodegenClientKotlinVersion = '5.5.1-SNAPSHOT' // Variable used in the automatic release process +def graphqlCodegenClientKotlinVersion = '5.6.0-SNAPSHOT' // Variable used in the automatic release process group = 'io.github.dreamylost' version = graphqlCodegenClientKotlinVersion @@ -29,7 +29,7 @@ repositories { dependencies { - implementation "io.github.kobylynskyi:graphql-java-codegen:5.5.1-SNAPSHOT" + implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.0-SNAPSHOT" implementation "javax.validation:validation-api:2.0.1.Final" implementation "com.squareup.okhttp3:okhttp:4.2.2" implementation "com.fasterxml.jackson.core:jackson-core:2.13.3" diff --git a/plugins/gradle/example-client/build.gradle b/plugins/gradle/example-client/build.gradle index f8943b336..24e448c08 100644 --- a/plugins/gradle/example-client/build.gradle +++ b/plugins/gradle/example-client/build.gradle @@ -7,7 +7,7 @@ plugins { // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "5.5.1-SNAPSHOT" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.0-SNAPSHOT" } mainClassName = "io.github.kobylynskyi.order.Application" @@ -22,7 +22,7 @@ dependencies { // use the latest available version: // https://search.maven.org/artifact/io.github.kobylynskyi/graphql-java-codegen - implementation "io.github.kobylynskyi:graphql-java-codegen:5.5.1-SNAPSHOT" + implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.0-SNAPSHOT" implementation "org.apache.httpcomponents:httpclient:4.5.13" implementation "javax.validation:validation-api:2.0.1.Final" diff --git a/plugins/gradle/example-server/build.gradle b/plugins/gradle/example-server/build.gradle index 6a3922f7a..2b0fed249 100644 --- a/plugins/gradle/example-server/build.gradle +++ b/plugins/gradle/example-server/build.gradle @@ -6,7 +6,7 @@ plugins { // // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "5.5.1-SNAPSHOT" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.0-SNAPSHOT" } mainClassName = "io.github.kobylynskyi.product.Application" diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle index 751f0f812..c16aae14a 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle @@ -16,7 +16,7 @@ apply plugin: "java" apply plugin: "idea" apply plugin: "maven-publish" -def graphqlCodegenGradlePluginVersion = '5.5.1-SNAPSHOT' // This variable used in the automatic release process +def graphqlCodegenGradlePluginVersion = '5.6.0-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenGradlePluginVersion diff --git a/plugins/maven/example-client/pom.xml b/plugins/maven/example-client/pom.xml index 418c422cb..5d9abe668 100644 --- a/plugins/maven/example-client/pom.xml +++ b/plugins/maven/example-client/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin-example-client - 5.5.1-SNAPSHOT + 5.6.0-SNAPSHOT graphql-codegen-maven-plugin-example-client diff --git a/plugins/maven/example-server/pom.xml b/plugins/maven/example-server/pom.xml index 5f5d85d11..fd5470505 100644 --- a/plugins/maven/example-server/pom.xml +++ b/plugins/maven/example-server/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin-example-server - 5.5.1-SNAPSHOT + 5.6.0-SNAPSHOT graphql-codegen-maven-plugin-example-server diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml index ba76048c6..645873e44 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -3,7 +3,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin - 5.5.1-SNAPSHOT + 5.6.0-SNAPSHOT maven-plugin graphql-codegen-maven-plugin @@ -72,7 +72,7 @@ 3.0.1 3.3.4 - 5.5.1-SNAPSHOT + 5.6.0-SNAPSHOT diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt index 8b61a3547..4608c8e00 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.5.1-SNAPSHOT") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.0-SNAPSHOT") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt index 4be577733..a761c0701 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.5.1-SNAPSHOT" +version in ThisBuild := "5.6.0-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt index 8b61a3547..4608c8e00 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.5.1-SNAPSHOT") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.0-SNAPSHOT") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt index 4be577733..a761c0701 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.5.1-SNAPSHOT" +version in ThisBuild := "5.6.0-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt index 7f80e8527..b967d6bee 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt @@ -1,4 +1,4 @@ -sys.props.get("plugin.version").orElse(Some("5.5.1-SNAPSHOT")) match { +sys.props.get("plugin.version").orElse(Some("5.6.0-SNAPSHOT")) match { case Some(x) => addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt index 4be577733..a761c0701 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.5.1-SNAPSHOT" +version in ThisBuild := "5.6.0-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt index 4be577733..a761c0701 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.5.1-SNAPSHOT" +version in ThisBuild := "5.6.0-SNAPSHOT" From 8f4dee2ff5bee9bb82d4240b3c24d05acc755d1c Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sun, 26 Feb 2023 12:52:36 -0500 Subject: [PATCH 10/25] Fix line separator tests (#1039) --- .../GraphQLCodegenAnnotationsTest.java | 96 +++++++++---------- .../graphql/codegen/GraphQLCodegenTest.java | 9 +- .../scala/GraphQLCodegenAnnotationsTest.java | 60 ++++++------ 3 files changed, 79 insertions(+), 86 deletions(-) diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java index 811224722..511da3584 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java @@ -53,9 +53,9 @@ void generate_CustomAnnotationMappings() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = com.example.json.DateTimeScalarDeserializer.class)" - + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = com.example.json.DateTimeScalarDeserializer.class)", + " private org.joda.time.DateTime createdDateTime;"); } @Test @@ -69,9 +69,9 @@ void generate_CustomAnnotationMappings_Type() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = com.example.json.DateTimeScalarDeserializer.class)" - + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = com.example.json.DateTimeScalarDeserializer.class)", + " private org.joda.time.DateTime createdDateTime;"); } @Test @@ -85,9 +85,9 @@ void generate_CustomAnnotationMappings_Regexp() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = com.example.json.DateTimeScalarDeserializer.class)" - + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = com.example.json.DateTimeScalarDeserializer.class)", + " private org.joda.time.DateTime createdDateTime;"); } @Test @@ -101,9 +101,9 @@ void generate_CustomAnnotationMappings_FieldType() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = com.example.json.DateTimeScalarDeserializer.class)" - + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = com.example.json.DateTimeScalarDeserializer.class)", + " private org.joda.time.DateTime createdDateTime;"); } @Test @@ -117,9 +117,9 @@ void generate_CustomAnnotationMappings_FieldType_Regexp() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = com.example.json.DateTimeScalarDeserializer.class)" - + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = com.example.json.DateTimeScalarDeserializer.class)", + " private org.joda.time.DateTime createdDateTime;"); } @Test @@ -151,25 +151,25 @@ void generate_CustomAnnotationMappings_Class() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionInput.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = AcceptTopicSuggestionInputDeserializer.class)" - + System.lineSeparator() + "public class AcceptTopicSuggestionInput "); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = AcceptTopicSuggestionInputDeserializer.class)", + "public class AcceptTopicSuggestionInput "); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = AcceptTopicSuggestionPayloadDeserializer.class)" - + System.lineSeparator() + "public class AcceptTopicSuggestionPayload "); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = AcceptTopicSuggestionPayloadDeserializer.class)", + "public class AcceptTopicSuggestionPayload "); assertFileContainsElements(files, "Actor.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = ActorDeserializer.class)" - + System.lineSeparator() + "public interface Actor "); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = ActorDeserializer.class)", + "public interface Actor "); assertFileContainsElements(files, "Assignee.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = AssigneeDeserializer.class)" - + System.lineSeparator() + "public interface Assignee "); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = AssigneeDeserializer.class)", + "public interface Assignee "); assertFileContainsElements(files, "DeploymentOrderField.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = DeploymentOrderFieldDeserializer.class)" - + System.lineSeparator() + "public enum DeploymentOrderField "); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = DeploymentOrderFieldDeserializer.class)", + "public enum DeploymentOrderField "); } @Test @@ -187,13 +187,11 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { generate("src/test/resources/schemas/github.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java", System.lineSeparator() + - "@com.fasterxml.jackson.annotation.JsonTypeInfo(" + - "use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")" - + System.lineSeparator() + - "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(" + - "io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver.class)" - + System.lineSeparator() + + assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java", + "@com.fasterxml.jackson.annotation.JsonTypeInfo(", + "use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")", + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(", + "io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver.class)", "public class AcceptTopicSuggestionPayload "); } @@ -247,15 +245,13 @@ void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "CodeOfConductQueryRequest.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = CodeOfConductQueryRequestDeserializer.class)" - + System.lineSeparator() + - "public class CodeOfConductQueryRequest implements GraphQLOperationRequest {"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = CodeOfConductQueryRequestDeserializer.class)", + "public class CodeOfConductQueryRequest implements GraphQLOperationRequest {"); assertFileContainsElements(files, "CodeOfConductQueryResponse.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + - "using = CodeOfConductQueryResponseDeserializer.class)" - + System.lineSeparator() + - "public class CodeOfConductQueryResponse extends GraphQLResult> {"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(", + "using = CodeOfConductQueryResponseDeserializer.class)", + "public class CodeOfConductQueryResponse extends GraphQLResult> {"); } @Test @@ -312,11 +308,11 @@ void generate_GeneratedAnnotation() throws Exception { generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertFileContainsElements(files, "Event.java", " */" + System.lineSeparator() + - "@jakarta.annotation.Generated(" + System.lineSeparator() + - " value = \"com.kobylynskyi.graphql.codegen.GraphQLCodegen\"," + System.lineSeparator() + - " date = \"2020-12-31T23:59:59-0500\"" + System.lineSeparator() + - ")" + System.lineSeparator() + + assertFileContainsElements(files, "Event.java", " */", + "@jakarta.annotation.Generated(", + " value = \"com.kobylynskyi.graphql.codegen.GraphQLCodegen\",", + " date = \"2020-12-31T23:59:59-0500\"", + ")", "public class Event implements java.io.Serializable {"); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java index 7b1b08b6a..e995cef0e 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java @@ -21,7 +21,6 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.assertFileContainsElements; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; -import static java.lang.System.lineSeparator; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; @@ -142,10 +141,10 @@ void generate_NoPackage() throws Exception { generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputBuildDir.listFiles()); - assertFileContainsElements(files, "Event.java", lineSeparator() + - "/**" + lineSeparator() + - " * An event that describes a thing that happens" + lineSeparator() + - " */" + lineSeparator()); + assertFileContainsElements(files, "Event.java", + "/**", + " * An event that describes a thing that happens", + " */"); } @Test diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java index 76e52ce55..e6a186f09 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java @@ -57,9 +57,9 @@ void generate_CustomAnnotationMappings() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.scala", - " @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[com.example.json.DateTimeScalarDeserializer])" + System.lineSeparator() + - " createdDateTime: org.joda.time.DateTime,"); + " @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ", + "classOf[com.example.json.DateTimeScalarDeserializer])", + " createdDateTime: org.joda.time.DateTime,"); } @Test @@ -89,25 +89,25 @@ void generate_CustomAnnotationMappings_Class() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionInput.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[AcceptTopicSuggestionInputDeserializer])" + System.lineSeparator() + - "case class AcceptTopicSuggestionInput"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ", + "classOf[AcceptTopicSuggestionInputDeserializer])", + "case class AcceptTopicSuggestionInput"); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[AcceptTopicSuggestionPayloadDeserializer])" + System.lineSeparator() + - "case class AcceptTopicSuggestionPayload"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ", + "classOf[AcceptTopicSuggestionPayloadDeserializer])", + "case class AcceptTopicSuggestionPayload"); assertFileContainsElements(files, "Actor.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[ActorDeserializer])" + System.lineSeparator() + - "trait Actor"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ", + "classOf[ActorDeserializer])", + "trait Actor"); assertFileContainsElements(files, "Assignee.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[AssigneeDeserializer])" + System.lineSeparator() + - "trait Assignee"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ", + "classOf[AssigneeDeserializer])", + "trait Assignee"); assertFileContainsElements(files, "DeploymentOrderField.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[DeploymentOrderFieldDeserializer])" + System.lineSeparator() + - "object DeploymentOrderField extends Enumeration"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ", + "classOf[DeploymentOrderFieldDeserializer])", + "object DeploymentOrderField extends Enumeration"); } @Test @@ -125,12 +125,11 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", - "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson" + - ".annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")" + System.lineSeparator() + - "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github" + - ".kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])" + - System.lineSeparator() + - "case class AcceptTopicSuggestionPayload"); + "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson", + ".annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")", + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github", + ".kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])", + "case class AcceptTopicSuggestionPayload"); } @Test @@ -151,14 +150,13 @@ void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "CodeOfConductQueryRequest.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[CodeOfConductQueryRequestDeserializer])" + System.lineSeparator() + - "class CodeOfConductQueryRequest"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ", + "classOf[CodeOfConductQueryRequestDeserializer])", + "class CodeOfConductQueryRequest"); assertFileContainsElements(files, "CodeOfConductQueryResponse.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + - "classOf[CodeOfConductQueryResponseDeserializer])" + System.lineSeparator() + - "class CodeOfConductQueryResponse extends GraphQLResult[JMap[String, " + - "CodeOfConduct]]"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ", + "classOf[CodeOfConductQueryResponseDeserializer])", + "class CodeOfConductQueryResponse extends GraphQLResult[JMap[String, CodeOfConduct]]"); } @Test From e6465c3e4ed59ba47e1d4b6517147afea84df920 Mon Sep 17 00:00:00 2001 From: Roman Dubinin Date: Mon, 27 Feb 2023 01:07:08 +0700 Subject: [PATCH 11/25] Save kotlin nullable sign for custom type mapping and apiReturnType #1019 (#1020) --------- Co-authored-by: romash1408 Co-authored-by: Bogdan Kobylynskyi <92bogdan@gmail.com> --- .../kotlin/KotlinGraphQLTypeMapper.java | 3 ++- .../kotlin/GraphQLCodegenNullableTest.java | 20 +++++++++++++++++++ ...NullableCustomTypeWithApiReturnType.kt.txt | 13 ++++++++++++ ...-custom-type-with-api-return-type.graphqls | 4 ++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/expected-classes/kt/nullable/NullableCustomTypeWithApiReturnType.kt.txt create mode 100644 src/test/resources/schemas/kt/nullable-custom-type-with-api-return-type.graphqls diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java index ee105ae81..f4dcce3e8 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java @@ -82,7 +82,8 @@ public String wrapSuperTypeIntoList(MappingContext mappingContext, String type, public String wrapApiReturnTypeIfRequired(MappingContext mappingContext, NamedDefinition namedDefinition, String parentTypeName) { - String computedTypeName = namedDefinition.getJavaName(); + String computedTypeName = getTypeConsideringPrimitive(mappingContext, namedDefinition, + namedDefinition.getJavaName()); if (parentTypeName.equalsIgnoreCase(GraphQLOperation.SUBSCRIPTION.name()) && Utils.isNotBlank(mappingContext.getSubscriptionReturnType())) { // in case it is subscription and subscriptionReturnType is set diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java index 60815e0a8..6b60f632b 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java @@ -12,10 +12,12 @@ import java.io.File; import java.io.IOException; import java.nio.file.Paths; +import java.util.HashMap; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; +import static java.util.Collections.singletonMap; class GraphQLCodegenNullableTest { @@ -111,6 +113,24 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { getFileByName(files, "TypeWithMandatoryField.kt")); } + @Test + void generate_NullableCustomTypeWithApiReturnType() throws Exception { + mappingConfig.setGenerateApis(true); + mappingConfig.setApiReturnType("reactor.core.publisher.Mono"); + mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("ZonedDateTime", "String"))); + + schemaFinder.setIncludePattern("nullable-custom-type-with-api-return-type.graphqls"); + + generate(); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/nullable/NullableCustomTypeWithApiReturnType.kt.txt"), + getFileByName(files, "QueryResolver.kt")); + + } + private void generate() throws IOException { new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) diff --git a/src/test/resources/expected-classes/kt/nullable/NullableCustomTypeWithApiReturnType.kt.txt b/src/test/resources/expected-classes/kt/nullable/NullableCustomTypeWithApiReturnType.kt.txt new file mode 100644 index 000000000..a4b58dcbe --- /dev/null +++ b/src/test/resources/expected-classes/kt/nullable/NullableCustomTypeWithApiReturnType.kt.txt @@ -0,0 +1,13 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface QueryResolver { + + @Throws(Exception::class) + fun nullable(): reactor.core.publisher.Mono + + @Throws(Exception::class) + fun mandatory(): reactor.core.publisher.Mono + +} diff --git a/src/test/resources/schemas/kt/nullable-custom-type-with-api-return-type.graphqls b/src/test/resources/schemas/kt/nullable-custom-type-with-api-return-type.graphqls new file mode 100644 index 000000000..2bc36f4d5 --- /dev/null +++ b/src/test/resources/schemas/kt/nullable-custom-type-with-api-return-type.graphqls @@ -0,0 +1,4 @@ +type Query { + nullable: ZonedDateTime + mandatory: ZonedDateTime! +} From 764925a6bca817059c7db0821c4c555d79882a28 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sun, 26 Feb 2023 13:10:07 -0500 Subject: [PATCH 12/25] New config to generate only no-args constructor #1017 (#1037) --- docs/codegen-options.md | 9 +- .../gradle/GraphQLCodegenGradleTask.java | 13 ++ .../graphql/codegen/GraphQLCodegenMojo.java | 29 ++-- .../graphql/codegen/GraphQLCodegenKeys.scala | 2 + .../codegen/GraphQLCodegenPlugin.scala | 2 + .../InputDefinitionToDataModelMapper.java | 2 + ...stResponseDefinitionToDataModelMapper.java | 2 + .../TypeDefinitionToDataModelMapper.java | 2 + .../codegen/model/DataModelFields.java | 1 + .../model/GraphQLCodegenConfiguration.java | 9 + .../graphql/codegen/model/MappingConfig.java | 24 ++- .../codegen/model/MappingConfigConstants.java | 8 +- ...MappingConfigDefaultValuesInitializer.java | 4 + .../graphql/codegen/model/MappingContext.java | 5 + .../java-lang/parametrized_input.ftl | 6 +- .../resources/templates/java-lang/type.ftl | 10 +- .../GraphQLCodegenFieldsResolversTest.java | 14 +- .../codegen/GraphQLCodegenGitHubTest.java | 6 +- .../graphql/codegen/GraphQLCodegenTest.java | 53 +++++- .../Commit_noValidationAnnotation.java.txt | 0 ...ertyTO_withoutGeneratedAnnotation.java.txt | 0 .../{ => builder}/Event_noBuilder.java.txt | 0 ...rametrizedInput_noargsconstructor.java.txt | 54 ++++++ .../Event_noargsconstr_builder.java.txt | 159 ++++++++++++++++++ ...Event_noargsconstr_withoutbuilder.java.txt | 86 ++++++++++ .../Commit_withoutPrimitives.java.txt | 0 ...eptTopicSuggestionPayloadResolver.java.txt | 0 .../CommentDeletedEvent.java.txt | 0 .../CommentDeletedEventResolver.java.txt | 0 .../{ => resolvers}/CommitResolver.java.txt | 0 .../Commit_noParametrizedFields.java.txt | 0 31 files changed, 459 insertions(+), 41 deletions(-) rename src/test/resources/expected-classes/{ => annotation}/Commit_noValidationAnnotation.java.txt (100%) rename src/test/resources/expected-classes/{ => annotation}/EventPropertyTO_withoutGeneratedAnnotation.java.txt (100%) rename src/test/resources/expected-classes/{ => builder}/Event_noBuilder.java.txt (100%) create mode 100644 src/test/resources/expected-classes/no-args-constructor/EventPropertyChildParametrizedInput_noargsconstructor.java.txt create mode 100644 src/test/resources/expected-classes/no-args-constructor/Event_noargsconstr_builder.java.txt create mode 100644 src/test/resources/expected-classes/no-args-constructor/Event_noargsconstr_withoutbuilder.java.txt rename src/test/resources/expected-classes/{ => primitives}/Commit_withoutPrimitives.java.txt (100%) rename src/test/resources/expected-classes/{ => resolvers}/AcceptTopicSuggestionPayloadResolver.java.txt (100%) rename src/test/resources/expected-classes/{ => resolvers}/CommentDeletedEvent.java.txt (100%) rename src/test/resources/expected-classes/{ => resolvers}/CommentDeletedEventResolver.java.txt (100%) rename src/test/resources/expected-classes/{ => resolvers}/CommitResolver.java.txt (100%) rename src/test/resources/expected-classes/{ => resolvers}/Commit_noParametrizedFields.java.txt (100%) diff --git a/docs/codegen-options.md b/docs/codegen-options.md index a863c69e7..c313930d5 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -37,11 +37,12 @@ | `fieldsWithoutResolvers` | Set(String) | Empty | Fields that DO NOT require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. Can be used in conjunction with `generateExtensionFieldsResolvers` option. E.g.: `Person`, `Person.friends`, `@noResolver`. | | `resolverArgumentAnnotations` | Set(String) | Empty | Annotations that will be added to all resolver arguments. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.Argument` | | `parametrizedResolverAnnotations` | Set(String) | Empty | Annotations that will be added to all parametrized resolver methods. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.SchemaMapping(typeName="{{TYPE_NAME}}")` | -| `generateParameterizedFieldsR`
`esolvers` | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. | -| `generateExtensionFieldsResol`
`vers` | Boolean | False | Specifies whether all fields in extensions (`extend type` and `extend interface`) should be present in Resolver interface instead of the type class itself. | +| `generateParameterizedFieldsResolvers` | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. | +| `generateExtensionFieldsResolvers` | Boolean | False | Specifies whether all fields in extensions (`extend type` and `extend interface`) should be present in Resolver interface instead of the type class itself. | | `generateModelsForRootTypes` | Boolean | False | Specifies whether model classes should be generated for `type Query`, `type Subscription`, `type Mutation`. | -| `useOptionalForNullableReturn`
`Types` | Boolean | False | Specifies whether nullable return types of api methods should be wrapped into [`java.util.Optional<>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Optional.html). Lists will not be wrapped. | -| `generateApisWithThrowsExcept`
`ion` | Boolean | True | Specifies whether api interface methods should have `throws Exception` in signature. | +| `useOptionalForNullableReturnTypes` | Boolean | False | Specifies whether nullable return types of api methods should be wrapped into [`java.util.Optional<>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Optional.html). Lists will not be wrapped. | +| `generateApisWithThrowsException` | Boolean | True | Specifies whether api interface methods should have `throws Exception` in signature. | +| `generateNoArgsConstructorOnly` | Boolean | False | Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is true | | `apiReturnType` | String | Empty | Return type for api methods (query/mutation). For example: `reactor.core.publisher.Mono`, etc. | | `apiReturnListType` | String | Empty | Return type for api methods (query/mutation) having list type. For example: `reactor.core.publisher.Flux`, etc. By default is empty, so `apiReturnType` will be used. | | `subscriptionReturnType` | String | Empty | Return type for subscription methods. For example: `org.reactivestreams.Publisher`, `io.reactivex.Observable`, etc. | diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java index e63d529c0..c122a3ac6 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java @@ -84,6 +84,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode private Boolean generateApisWithThrowsException = MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION; private Boolean generateJacksonTypeIdResolver = MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER; private Boolean addGeneratedAnnotation = MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION; + private Boolean generateNoArgsConstructorOnly = MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY; private String generatedAnnotation; private Set fieldsWithResolvers = new HashSet<>(); private Set fieldsWithoutResolvers = new HashSet<>(); @@ -155,6 +156,7 @@ public void generate() throws Exception { mappingConfig.setUseOptionalForNullableReturnTypes(useOptionalForNullableReturnTypes); mappingConfig.setGenerateApisWithThrowsException(generateApisWithThrowsException); mappingConfig.setGenerateJacksonTypeIdResolver(generateJacksonTypeIdResolver); + mappingConfig.setGenerateNoArgsConstructorOnly(generateNoArgsConstructorOnly); mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation); mappingConfig.setGeneratedAnnotation(generatedAnnotation); mappingConfig.setApiReturnType(apiReturnType); @@ -682,6 +684,17 @@ public void setGeneratedAnnotation(String generatedAnnotation) { this.generatedAnnotation = generatedAnnotation; } + @Input + @Optional + @Override + public Boolean isGenerateNoArgsConstructorOnly() { + return generateNoArgsConstructorOnly; + } + + public void setGenerateNoArgsConstructorOnly(Boolean generateNoArgsConstructorOnly) { + this.generateNoArgsConstructorOnly = generateNoArgsConstructorOnly; + } + @Input @Optional @Override diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java index 796f49099..9a2fd8655 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java @@ -155,6 +155,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo @Parameter(defaultValue = MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION_STRING) private boolean addGeneratedAnnotation; + @Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY_STRING) + private boolean generateNoArgsConstructorOnly; + @Parameter private String generatedAnnotation; @@ -271,6 +274,7 @@ public void execute() throws MojoExecutionException { mappingConfig.setGenerateJacksonTypeIdResolver(generateJacksonTypeIdResolver); mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation); mappingConfig.setGeneratedAnnotation(generatedAnnotation); + mappingConfig.setGenerateNoArgsConstructorOnly(generateNoArgsConstructorOnly); mappingConfig.setFieldsWithResolvers(mapToHashSet(fieldsWithResolvers)); mappingConfig.setFieldsWithoutResolvers(mapToHashSet(fieldsWithoutResolvers)); mappingConfig.setRelayConfig(relayConfig); @@ -665,30 +669,27 @@ public Boolean isGenerateSealedInterfaces() { return generateSealedInterfaces; } - public ParentInterfacesConfig getParentInterfaces() { - return parentInterfaces; - } - - public String[] getConfigurationFiles() { - return configurationFiles; - } - @Override public Boolean isSupportUnknownFields() { return supportUnknownFields; } - public void setSupportUnknownFields(boolean supportUnknownFields) { - this.supportUnknownFields = supportUnknownFields; - } - @Override public String getUnknownFieldsPropertyName() { return unknownFieldsPropertyName; } - public void setUnknownFieldsPropertyName(String unknownFieldsPropertyName) { - this.unknownFieldsPropertyName = unknownFieldsPropertyName; + @Override + public Boolean isGenerateNoArgsConstructorOnly() { + return generateNoArgsConstructorOnly; + } + + public ParentInterfacesConfig getParentInterfaces() { + return parentInterfaces; + } + + public String[] getConfigurationFiles() { + return configurationFiles; } private static Map> convertToListsMap(Map sourceMap) { diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala index c85eab40f..32fedc80d 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala @@ -129,6 +129,8 @@ trait GraphQLCodegenKeys { val generateJacksonTypeIdResolver = settingKey[Boolean]("Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package.") + val generateNoArgsConstructorOnly = settingKey[Boolean]("Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is .true.") + //for version val javaxValidationApiVersion = settingKey[Option[String]]("javax-validation-api version") val graphqlJavaCodegenVersion = settingKey[Option[String]]("graphql-java-codegen version") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index e6d597a46..fa14e07be 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -122,6 +122,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS, unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME, + generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY, skip := false ) @@ -179,6 +180,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co mappingConfig.setGeneratedLanguage((generatedLanguage in GraphQLCodegenConfig).value) mappingConfig.setGenerateModelOpenClasses((generateModelOpenClasses in GraphQLCodegenConfig).value) mappingConfig.setGenerateJacksonTypeIdResolver((generateJacksonTypeIdResolver in GraphQLCodegenConfig).value); + mappingConfig.setGenerateNoArgsConstructorOnly((generateNoArgsConstructorOnly in GraphQLCodegenConfig).value); mappingConfig.setSupportUnknownFields((supportUnknownFields in GraphQLCodegenConfig).value) mappingConfig.setUnknownFieldsPropertyName((unknownFieldsPropertyName in GraphQLCodegenConfig).value) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java index ffe6f5819..d567e8106 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java @@ -18,6 +18,7 @@ import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_ANNOTATION; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATE_MODEL_OPEN_CLASSES; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATE_NOARGS_CONSTRUCTOR_ONLY; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.IMMUTABLE_MODELS; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.INITIALIZE_NULLABLE_TYPES; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC; @@ -78,6 +79,7 @@ public Map map(MappingContext mappingContext, ExtendedInputObjec dataModel.put(INITIALIZE_NULLABLE_TYPES, mappingContext.isInitializeNullableTypes()); dataModel.put(SUPPORT_UNKNOWN_FIELDS, mappingContext.isSupportUnknownFields()); dataModel.put(UNKNOWN_FIELDS_PROPERTY_NAME, mappingContext.getUnknownFieldsPropertyName()); + dataModel.put(GENERATE_NOARGS_CONSTRUCTOR_ONLY, mappingContext.isGenerateNoArgsConstructorOnly()); return dataModel; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java index 39bf24ff7..d190013e8 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java @@ -29,6 +29,7 @@ import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_ANNOTATION; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATE_ALL_METHOD_IN_PROJECTION; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATE_NOARGS_CONSTRUCTOR_ONLY; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.METHOD_NAME; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.OPERATION_NAME; @@ -154,6 +155,7 @@ public Map mapParametrizedInput(MappingContext mappingContext, dataModel.put(GENERATED_ANNOTATION, mappingContext.getAddGeneratedAnnotation()); dataModel.put(GENERATED_INFO, mappingContext.getGeneratedInformation()); dataModel.put(ENUM_IMPORT_IT_SELF_IN_SCALA, mappingContext.getEnumImportItSelfInScala()); + dataModel.put(GENERATE_NOARGS_CONSTRUCTOR_ONLY, mappingContext.isGenerateNoArgsConstructorOnly()); // dataModel.put(TO_STRING, mappingConfig.getGenerateToString()); always generated for serialization purposes return dataModel; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java index 8936d5f30..5edef456d 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java @@ -26,6 +26,7 @@ import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_ANNOTATION; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATE_MODEL_OPEN_CLASSES; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATE_NOARGS_CONSTRUCTOR_ONLY; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATE_SEALED_INTERFACES; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.IMMUTABLE_MODELS; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.IMPLEMENTS; @@ -110,6 +111,7 @@ public Map map(MappingContext mappingContext, dataModel.put(GENERATE_SEALED_INTERFACES, mappingContext.isGenerateSealedInterfaces()); dataModel.put(SUPPORT_UNKNOWN_FIELDS, mappingContext.isSupportUnknownFields()); dataModel.put(UNKNOWN_FIELDS_PROPERTY_NAME, mappingContext.getUnknownFieldsPropertyName()); + dataModel.put(GENERATE_NOARGS_CONSTRUCTOR_ONLY, mappingContext.isGenerateNoArgsConstructorOnly()); return dataModel; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/DataModelFields.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/DataModelFields.java index bfe2f95f9..591080bf1 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/DataModelFields.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/DataModelFields.java @@ -40,6 +40,7 @@ public final class DataModelFields { public static final String GENERATE_SEALED_INTERFACES = "generateSealedInterfaces"; public static final String SUPPORT_UNKNOWN_FIELDS = "supportUnknownFields"; public static final String UNKNOWN_FIELDS_PROPERTY_NAME = "unknownFieldsPropertyName"; + public static final String GENERATE_NOARGS_CONSTRUCTOR_ONLY = "generateNoArgsConstructorOnly"; private DataModelFields() { } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java index e44ca1529..fd7d024c2 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java @@ -513,5 +513,14 @@ public interface GraphQLCodegenConfiguration { */ String getGeneratedAnnotation(); + /** + * Specifies whether model classes should only have a no-args constructor. + * All-args constructor will not be generated in case returned value is true + * + * @return true if only no-args constructor should be generated. + * false if both no-args and all-args constructors should be generated + */ + Boolean isGenerateNoArgsConstructorOnly(); + } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java index c5a503d8e..747254d65 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java @@ -55,6 +55,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable fieldsWithResolvers = new HashSet<>(); @@ -209,6 +210,8 @@ public void combine(MappingConfig source) { GraphQLCodegenConfiguration::getUnknownFieldsPropertyName); generatedAnnotation = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGeneratedAnnotation); + generateNoArgsConstructorOnly = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::isGenerateNoArgsConstructorOnly); } private T getValueOrDefaultToThis(MappingConfig source, Function getValueFunction) { @@ -680,11 +683,6 @@ public void setTypesAsInterfaces(Set typesAsInterfaces) { this.typesAsInterfaces = typesAsInterfaces; } - @Override - public GeneratedLanguage getGeneratedLanguage() { - return generatedLanguage; - } - @Override public String getUnknownFieldsPropertyName() { return unknownFieldsPropertyName; @@ -712,10 +710,16 @@ public void setSupportUnknownFields(Boolean supportUnknownFields) { this.supportUnknownFields = supportUnknownFields; } + @Override + public GeneratedLanguage getGeneratedLanguage() { + return generatedLanguage; + } + public void setGeneratedLanguage(GeneratedLanguage generatedLanguage) { this.generatedLanguage = generatedLanguage; } + @Override public Boolean isGenerateModelOpenClasses() { return generateModelOpenClasses; } @@ -724,6 +728,7 @@ public void setGenerateModelOpenClasses(boolean generateModelOpenClasses) { this.generateModelOpenClasses = generateModelOpenClasses; } + @Override public Boolean isInitializeNullableTypes() { return initializeNullableTypes; } @@ -732,6 +737,7 @@ public void setInitializeNullableTypes(boolean initializeNullableTypes) { this.initializeNullableTypes = initializeNullableTypes; } + @Override public Boolean isGenerateSealedInterfaces() { return generateSealedInterfaces; } @@ -740,4 +746,12 @@ public void setGenerateSealedInterfaces(boolean generateSealedInterfaces) { this.generateSealedInterfaces = generateSealedInterfaces; } + @Override + public Boolean isGenerateNoArgsConstructorOnly() { + return generateNoArgsConstructorOnly; + } + + public void setGenerateNoArgsConstructorOnly(Boolean generateNoArgsConstructorOnly) { + this.generateNoArgsConstructorOnly = generateNoArgsConstructorOnly; + } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java index 62bcfe1ca..4ff1d031e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java @@ -82,13 +82,14 @@ public class MappingConfigConstants { // There is no need to consider the possibility of switching. public static final String DEFAULT_SERIALIZATION_LIBRARY = "JACKSON"; - //It only support in kotlin and scala. + // Only supported in Kotlin and Scala public static final boolean DEFAULT_GENERATE_MODEL_OPEN_CLASSES = false; public static final String DEFAULT_GENERATE_MODEL_OPEN_CLASSES_STRING = "false"; - //Only supported in kotlin. + // Only supported in Kotlin public static final boolean DEFAULT_INITIALIZE_NULLABLE_TYPES = false; public static final String DEFAULT_INITIALIZE_NULLABLE_TYPES_STRING = "false"; + // Only supported in Kotlin public static final boolean DEFAULT_GENERATE_SEALED_INTERFACES = false; public static final String DEFAULT_GENERATE_SEALED_INTERFACES_STRING = "false"; @@ -97,6 +98,9 @@ public class MappingConfigConstants { public static final String DEFAULT_SUPPORT_UNKNOWN_FIELDS_STRING = "false"; public static final String DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME = "userDefinedFields"; + public static final boolean DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY = false; + public static final String DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY_STRING = "false"; + private MappingConfigConstants() { } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigDefaultValuesInitializer.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigDefaultValuesInitializer.java index 57f11b675..4ca94eae7 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigDefaultValuesInitializer.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigDefaultValuesInitializer.java @@ -114,6 +114,10 @@ public static void initDefaultValues(MappingConfig mappingConfig) { if (mappingConfig.getUnknownFieldsPropertyName() == null) { mappingConfig.setUnknownFieldsPropertyName(MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME); } + if (mappingConfig.isGenerateNoArgsConstructorOnly() == null) { + mappingConfig.setGenerateNoArgsConstructorOnly( + MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY); + } } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 479591039..899ddf5aa 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -341,6 +341,11 @@ public String getGeneratedAnnotation() { return config.getGeneratedAnnotation(); } + @Override + public Boolean isGenerateNoArgsConstructorOnly() { + return config.isGenerateNoArgsConstructorOnly(); + } + public ExtendedDocument getDocument() { return document; } diff --git a/src/main/resources/templates/java-lang/parametrized_input.ftl b/src/main/resources/templates/java-lang/parametrized_input.ftl index 97eb06fd2..e6fd88d02 100644 --- a/src/main/resources/templates/java-lang/parametrized_input.ftl +++ b/src/main/resources/templates/java-lang/parametrized_input.ftl @@ -43,11 +43,11 @@ public class ${className} implements GraphQLParametrizedInput { public ${className}() { } -<#if fields?has_content> +<#if fields?has_content && !generateNoArgsConstructorOnly> public ${className}(<#list fields as field>${field.type} ${field.name}<#if field_has_next>, ) { -<#list fields as field> + <#list fields as field> this.${field.name} = ${field.name}; - + } diff --git a/src/main/resources/templates/java-lang/type.ftl b/src/main/resources/templates/java-lang/type.ftl index 23a501e52..7ae44602f 100644 --- a/src/main/resources/templates/java-lang/type.ftl +++ b/src/main/resources/templates/java-lang/type.ftl @@ -53,7 +53,7 @@ public class ${className} implements java.io.Serializable<#if implements?has_con public ${className}() { } -<#if fields?has_content> +<#if fields?has_content && !generateNoArgsConstructorOnly> public ${className}(<#list fields as field>${field.type} ${field.name}<#if field_has_next>, ) { <#list fields as field> this.${field.name} = ${field.name}; @@ -194,7 +194,15 @@ public class ${className} implements java.io.Serializable<#if implements?has_con public ${className} build() { +<#if generateNoArgsConstructorOnly> + ${className} result = new ${className}; + <#list fields as field> + result.set${field.name?cap_first}(this.${field.name}); + + return result; +<#else> return new ${className}(<#list fields as field>${field.name}<#if field_has_next>, ); + } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java index 0c8dcecfb..ca8c3fd14 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java @@ -46,9 +46,11 @@ void generate_ParametrizedFields() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/Commit_noParametrizedFields.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/" + + "Commit_noParametrizedFields.java.txt"), getFileByName(files, "Commit.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/CommitResolver.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/" + + "CommitResolver.java.txt"), getFileByName(files, "CommitResolver.java")); } @@ -94,7 +96,7 @@ void generate_CustomFieldsResolvers() throws Exception { assertSameTrimmedContent(new File("src/test/resources/expected-classes/" + "GithubAcceptTopicSuggestionPayloadTO.java.txt"), getFileByName(files, "GithubAcceptTopicSuggestionPayloadTO.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/" + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/" + "AcceptTopicSuggestionPayloadResolver.java.txt"), getFileByName(files, "AcceptTopicSuggestionPayloadResolver.java")); } @@ -107,9 +109,11 @@ void generate_ResolverForWholeType() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/CommentDeletedEventResolver.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/" + + "CommentDeletedEventResolver.java.txt"), getFileByName(files, "CommentDeletedEventResolver.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/CommentDeletedEvent.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/" + + "CommentDeletedEvent.java.txt"), getFileByName(files, "CommentDeletedEvent.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java index 673f42d4d..13ee583e5 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java @@ -89,7 +89,8 @@ void generate_NoValidationAnnotation() throws Exception { generate(); File commitFile = getFileByName(Objects.requireNonNull(outputJavaClassesDir.listFiles()), "Commit.java"); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/Commit_noValidationAnnotation.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/annotation/" + + "Commit_noValidationAnnotation.java.txt"), commitFile); } @@ -120,7 +121,8 @@ void generate_NoPrimitives() throws Exception { generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/Commit_withoutPrimitives.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/primitives/" + + "Commit_withoutPrimitives.java.txt"), getFileByName(files, "Commit.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java index e995cef0e..4b06776c0 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java @@ -86,7 +86,8 @@ void generate_NoBuilder() throws Exception { generate("src/test/resources/schemas/test.graphqls"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/Event_noBuilder.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/builder/" + + "Event_noBuilder.java.txt"), getFileByName(files, "Event.java")); } @@ -242,8 +243,8 @@ void generate_GeneratedAnnotation() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertNotEquals(0, files.length); - assertSameTrimmedContent( - new File("src/test/resources/expected-classes/EventPropertyTO_withoutGeneratedAnnotation.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/annotation/" + + "EventPropertyTO_withoutGeneratedAnnotation.java.txt"), getFileByName(files, "EventPropertyTO.java")); } @@ -398,8 +399,50 @@ void generate_InterfaceAndTypeHavingDuplicateFields1() throws Exception { getFileByName(files, "Person.java")); } - private List generate(String s) throws IOException { - return new JavaGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig, + @Test + void generate_NoArgsConstructorOnlyWithBuilder() throws Exception { + mappingConfig.setGenerateNoArgsConstructorOnly(true); + mappingConfig.setGenerateBuilder(true); + + generate("src/test/resources/schemas/test.graphqls"); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/no-args-constructor/" + + "Event_noargsconstr_builder.java.txt"), + getFileByName(files, "Event.java")); + } + + @Test + void generate_NoArgsConstructorOnlyWithoutBuilder() throws Exception { + mappingConfig.setGenerateNoArgsConstructorOnly(true); + mappingConfig.setGenerateBuilder(false); + + generate("src/test/resources/schemas/test.graphqls"); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/no-args-constructor/" + + "Event_noargsconstr_withoutbuilder.java.txt"), + getFileByName(files, "Event.java")); + } + + @Test + void generate_NoArgsConstructor_ParametrizedInput() throws Exception { + mappingConfig.setGenerateNoArgsConstructorOnly(true); + mappingConfig.setGenerateClient(true); + + generate("src/test/resources/schemas/test.graphqls"); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/no-args-constructor/" + + "EventPropertyChildParametrizedInput_noargsconstructor.java.txt"), + getFileByName(files, "EventPropertyChildParametrizedInput.java")); + } + + private List generate(String path) throws IOException { + return new JavaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); } diff --git a/src/test/resources/expected-classes/Commit_noValidationAnnotation.java.txt b/src/test/resources/expected-classes/annotation/Commit_noValidationAnnotation.java.txt similarity index 100% rename from src/test/resources/expected-classes/Commit_noValidationAnnotation.java.txt rename to src/test/resources/expected-classes/annotation/Commit_noValidationAnnotation.java.txt diff --git a/src/test/resources/expected-classes/EventPropertyTO_withoutGeneratedAnnotation.java.txt b/src/test/resources/expected-classes/annotation/EventPropertyTO_withoutGeneratedAnnotation.java.txt similarity index 100% rename from src/test/resources/expected-classes/EventPropertyTO_withoutGeneratedAnnotation.java.txt rename to src/test/resources/expected-classes/annotation/EventPropertyTO_withoutGeneratedAnnotation.java.txt diff --git a/src/test/resources/expected-classes/Event_noBuilder.java.txt b/src/test/resources/expected-classes/builder/Event_noBuilder.java.txt similarity index 100% rename from src/test/resources/expected-classes/Event_noBuilder.java.txt rename to src/test/resources/expected-classes/builder/Event_noBuilder.java.txt diff --git a/src/test/resources/expected-classes/no-args-constructor/EventPropertyChildParametrizedInput_noargsconstructor.java.txt b/src/test/resources/expected-classes/no-args-constructor/EventPropertyChildParametrizedInput_noargsconstructor.java.txt new file mode 100644 index 000000000..ec275b0ef --- /dev/null +++ b/src/test/resources/expected-classes/no-args-constructor/EventPropertyChildParametrizedInput_noargsconstructor.java.txt @@ -0,0 +1,54 @@ +package com.kobylynskyi.graphql.test1; + +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput; +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer; +import java.util.StringJoiner; + +/** + * Parametrized input for field child in type EventProperty + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class EventPropertyChildParametrizedInput implements GraphQLParametrizedInput { + + private Integer first; + private Integer last; + + public EventPropertyChildParametrizedInput() { + } + + + public EventPropertyChildParametrizedInput first(Integer first) { + this.first = first; + return this; + } + + public EventPropertyChildParametrizedInput last(Integer last) { + this.last = last; + return this; + } + + @Override + public EventPropertyChildParametrizedInput deepCopy() { + EventPropertyChildParametrizedInput parametrizedInput = new EventPropertyChildParametrizedInput(); + parametrizedInput.first(this.first); + parametrizedInput.last(this.last); + return parametrizedInput; + } + + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(", ", "(", ")"); + if (first != null) { + joiner.add("first: " + GraphQLRequestSerializer.getEntry(first)); + } + if (last != null) { + joiner.add("last: " + GraphQLRequestSerializer.getEntry(last)); + } + return joiner.toString(); + } + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/no-args-constructor/Event_noargsconstr_builder.java.txt b/src/test/resources/expected-classes/no-args-constructor/Event_noargsconstr_builder.java.txt new file mode 100644 index 000000000..d319b09db --- /dev/null +++ b/src/test/resources/expected-classes/no-args-constructor/Event_noargsconstr_builder.java.txt @@ -0,0 +1,159 @@ +package com.kobylynskyi.graphql.test1; + + +/** + * An event that describes a thing that happens + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class Event implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + private String categoryId; + private java.util.List properties; + private EventStatus status; + private String createdBy; + private String createdDateTime; + private Boolean active; + private Integer rating; + + public Event() { + } + + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + + public String getCategoryId() { + return categoryId; + } + public void setCategoryId(String categoryId) { + this.categoryId = categoryId; + } + + public java.util.List getProperties() { + return properties; + } + public void setProperties(java.util.List properties) { + this.properties = properties; + } + + public EventStatus getStatus() { + return status; + } + public void setStatus(EventStatus status) { + this.status = status; + } + + public String getCreatedBy() { + return createdBy; + } + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getCreatedDateTime() { + return createdDateTime; + } + public void setCreatedDateTime(String createdDateTime) { + this.createdDateTime = createdDateTime; + } + + public Boolean getActive() { + return active; + } + public void setActive(Boolean active) { + this.active = active; + } + + public Integer getRating() { + return rating; + } + public void setRating(Integer rating) { + this.rating = rating; + } + + + + public static Event.Builder builder() { + return new Event.Builder(); + } + + public static class Builder { + + private String id; + private String categoryId; + private java.util.List properties; + private EventStatus status; + private String createdBy; + private String createdDateTime; + private Boolean active; + private Integer rating; + + public Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setCategoryId(String categoryId) { + this.categoryId = categoryId; + return this; + } + + public Builder setProperties(java.util.List properties) { + this.properties = properties; + return this; + } + + public Builder setStatus(EventStatus status) { + this.status = status; + return this; + } + + public Builder setCreatedBy(String createdBy) { + this.createdBy = createdBy; + return this; + } + + public Builder setCreatedDateTime(String createdDateTime) { + this.createdDateTime = createdDateTime; + return this; + } + + public Builder setActive(Boolean active) { + this.active = active; + return this; + } + + public Builder setRating(Integer rating) { + this.rating = rating; + return this; + } + + + public Event build() { + Event result = new Event; + result.setId(this.id); + result.setCategoryId(this.categoryId); + result.setProperties(this.properties); + result.setStatus(this.status); + result.setCreatedBy(this.createdBy); + result.setCreatedDateTime(this.createdDateTime); + result.setActive(this.active); + result.setRating(this.rating); + return result; + } + + } +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/no-args-constructor/Event_noargsconstr_withoutbuilder.java.txt b/src/test/resources/expected-classes/no-args-constructor/Event_noargsconstr_withoutbuilder.java.txt new file mode 100644 index 000000000..07746e3fd --- /dev/null +++ b/src/test/resources/expected-classes/no-args-constructor/Event_noargsconstr_withoutbuilder.java.txt @@ -0,0 +1,86 @@ +package com.kobylynskyi.graphql.test1; + + +/** + * An event that describes a thing that happens + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class Event implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + private String categoryId; + private java.util.List properties; + private EventStatus status; + private String createdBy; + private String createdDateTime; + private Boolean active; + private Integer rating; + + public Event() { + } + + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + + public String getCategoryId() { + return categoryId; + } + public void setCategoryId(String categoryId) { + this.categoryId = categoryId; + } + + public java.util.List getProperties() { + return properties; + } + public void setProperties(java.util.List properties) { + this.properties = properties; + } + + public EventStatus getStatus() { + return status; + } + public void setStatus(EventStatus status) { + this.status = status; + } + + public String getCreatedBy() { + return createdBy; + } + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getCreatedDateTime() { + return createdDateTime; + } + public void setCreatedDateTime(String createdDateTime) { + this.createdDateTime = createdDateTime; + } + + public Boolean getActive() { + return active; + } + public void setActive(Boolean active) { + this.active = active; + } + + public Integer getRating() { + return rating; + } + public void setRating(Integer rating) { + this.rating = rating; + } + + + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/Commit_withoutPrimitives.java.txt b/src/test/resources/expected-classes/primitives/Commit_withoutPrimitives.java.txt similarity index 100% rename from src/test/resources/expected-classes/Commit_withoutPrimitives.java.txt rename to src/test/resources/expected-classes/primitives/Commit_withoutPrimitives.java.txt diff --git a/src/test/resources/expected-classes/AcceptTopicSuggestionPayloadResolver.java.txt b/src/test/resources/expected-classes/resolvers/AcceptTopicSuggestionPayloadResolver.java.txt similarity index 100% rename from src/test/resources/expected-classes/AcceptTopicSuggestionPayloadResolver.java.txt rename to src/test/resources/expected-classes/resolvers/AcceptTopicSuggestionPayloadResolver.java.txt diff --git a/src/test/resources/expected-classes/CommentDeletedEvent.java.txt b/src/test/resources/expected-classes/resolvers/CommentDeletedEvent.java.txt similarity index 100% rename from src/test/resources/expected-classes/CommentDeletedEvent.java.txt rename to src/test/resources/expected-classes/resolvers/CommentDeletedEvent.java.txt diff --git a/src/test/resources/expected-classes/CommentDeletedEventResolver.java.txt b/src/test/resources/expected-classes/resolvers/CommentDeletedEventResolver.java.txt similarity index 100% rename from src/test/resources/expected-classes/CommentDeletedEventResolver.java.txt rename to src/test/resources/expected-classes/resolvers/CommentDeletedEventResolver.java.txt diff --git a/src/test/resources/expected-classes/CommitResolver.java.txt b/src/test/resources/expected-classes/resolvers/CommitResolver.java.txt similarity index 100% rename from src/test/resources/expected-classes/CommitResolver.java.txt rename to src/test/resources/expected-classes/resolvers/CommitResolver.java.txt diff --git a/src/test/resources/expected-classes/Commit_noParametrizedFields.java.txt b/src/test/resources/expected-classes/resolvers/Commit_noParametrizedFields.java.txt similarity index 100% rename from src/test/resources/expected-classes/Commit_noParametrizedFields.java.txt rename to src/test/resources/expected-classes/resolvers/Commit_noParametrizedFields.java.txt From 2af7f6896f03f75f9cd5e6415eac807dbb037c0f Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sun, 26 Feb 2023 13:27:58 -0500 Subject: [PATCH 13/25] Bump to release version 5.6.0 --- build.gradle | 2 +- plugins/gradle/example-client-kotlin/build.gradle | 6 +++--- plugins/gradle/example-client/build.gradle | 4 ++-- plugins/gradle/example-server/build.gradle | 2 +- .../gradle/graphql-java-codegen-gradle-plugin/build.gradle | 2 +- plugins/maven/example-client/pom.xml | 2 +- plugins/maven/example-server/pom.xml | 2 +- plugins/maven/graphql-java-codegen-maven-plugin/pom.xml | 4 ++-- .../example-client-scala/project/plugins.sbt | 2 +- .../example-client-scala/version.sbt | 2 +- .../example-client/project/plugins.sbt | 2 +- .../graphql-codegen-sbt-plugin/example-client/version.sbt | 2 +- .../graphql-codegen-sbt-plugin/simple/project/plugins.sbt | 2 +- .../sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt | 2 +- plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt | 2 +- 15 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index d539126db..4810bcf40 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id "org.sonarqube" version "3.2.0" } -def graphqlCodegenVersion = '5.6.0-SNAPSHOT' // This variable used in the automatic release process +def graphqlCodegenVersion = '5.6.0' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenVersion diff --git a/plugins/gradle/example-client-kotlin/build.gradle b/plugins/gradle/example-client-kotlin/build.gradle index 3d0a3f2b7..b154b1ff3 100644 --- a/plugins/gradle/example-client-kotlin/build.gradle +++ b/plugins/gradle/example-client-kotlin/build.gradle @@ -4,10 +4,10 @@ import io.github.kobylynskyi.graphql.codegen.gradle.GraphQLCodegenGradleTask plugins { id "java" id "org.jetbrains.kotlin.jvm" version "1.6.21" - id "io.github.kobylynskyi.graphql.codegen" version "5.6.0-SNAPSHOT" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.0" } -def graphqlCodegenClientKotlinVersion = '5.6.0-SNAPSHOT' // Variable used in the automatic release process +def graphqlCodegenClientKotlinVersion = '5.6.0' // Variable used in the automatic release process group = 'io.github.dreamylost' version = graphqlCodegenClientKotlinVersion @@ -29,7 +29,7 @@ repositories { dependencies { - implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.0-SNAPSHOT" + implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.0" implementation "javax.validation:validation-api:2.0.1.Final" implementation "com.squareup.okhttp3:okhttp:4.2.2" implementation "com.fasterxml.jackson.core:jackson-core:2.13.3" diff --git a/plugins/gradle/example-client/build.gradle b/plugins/gradle/example-client/build.gradle index 24e448c08..ef9d03b9a 100644 --- a/plugins/gradle/example-client/build.gradle +++ b/plugins/gradle/example-client/build.gradle @@ -7,7 +7,7 @@ plugins { // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "5.6.0-SNAPSHOT" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.0" } mainClassName = "io.github.kobylynskyi.order.Application" @@ -22,7 +22,7 @@ dependencies { // use the latest available version: // https://search.maven.org/artifact/io.github.kobylynskyi/graphql-java-codegen - implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.0-SNAPSHOT" + implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.0" implementation "org.apache.httpcomponents:httpclient:4.5.13" implementation "javax.validation:validation-api:2.0.1.Final" diff --git a/plugins/gradle/example-server/build.gradle b/plugins/gradle/example-server/build.gradle index 2b0fed249..f0527fc2e 100644 --- a/plugins/gradle/example-server/build.gradle +++ b/plugins/gradle/example-server/build.gradle @@ -6,7 +6,7 @@ plugins { // // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "5.6.0-SNAPSHOT" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.0" } mainClassName = "io.github.kobylynskyi.product.Application" diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle index c16aae14a..ff81067dd 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle @@ -16,7 +16,7 @@ apply plugin: "java" apply plugin: "idea" apply plugin: "maven-publish" -def graphqlCodegenGradlePluginVersion = '5.6.0-SNAPSHOT' // This variable used in the automatic release process +def graphqlCodegenGradlePluginVersion = '5.6.0' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenGradlePluginVersion diff --git a/plugins/maven/example-client/pom.xml b/plugins/maven/example-client/pom.xml index 5d9abe668..b9a29809d 100644 --- a/plugins/maven/example-client/pom.xml +++ b/plugins/maven/example-client/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin-example-client - 5.6.0-SNAPSHOT + 5.6.0 graphql-codegen-maven-plugin-example-client diff --git a/plugins/maven/example-server/pom.xml b/plugins/maven/example-server/pom.xml index fd5470505..dbdd8ed54 100644 --- a/plugins/maven/example-server/pom.xml +++ b/plugins/maven/example-server/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin-example-server - 5.6.0-SNAPSHOT + 5.6.0 graphql-codegen-maven-plugin-example-server diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml index 645873e44..ef16541c9 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -3,7 +3,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin - 5.6.0-SNAPSHOT + 5.6.0 maven-plugin graphql-codegen-maven-plugin @@ -72,7 +72,7 @@ 3.0.1 3.3.4 - 5.6.0-SNAPSHOT + 5.6.0 diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt index 4608c8e00..cea10894f 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.0-SNAPSHOT") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.0") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt index a761c0701..9a5ba26ad 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.0-SNAPSHOT" +version in ThisBuild := "5.6.0" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt index 4608c8e00..cea10894f 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.0-SNAPSHOT") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.0") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt index a761c0701..9a5ba26ad 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.0-SNAPSHOT" +version in ThisBuild := "5.6.0" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt index b967d6bee..3a5c3bdb4 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt @@ -1,4 +1,4 @@ -sys.props.get("plugin.version").orElse(Some("5.6.0-SNAPSHOT")) match { +sys.props.get("plugin.version").orElse(Some("5.6.0")) match { case Some(x) => addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt index a761c0701..9a5ba26ad 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.0-SNAPSHOT" +version in ThisBuild := "5.6.0" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt index a761c0701..9a5ba26ad 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.0-SNAPSHOT" +version in ThisBuild := "5.6.0" From dd0dbdc6f6c6d43420cc4c52bfef9c4d656c4d1e Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Mon, 27 Feb 2023 20:44:42 -0500 Subject: [PATCH 14/25] Update to next development version: 5.6.1-SNAPSHOT --- build.gradle | 2 +- plugins/gradle/example-client-kotlin/build.gradle | 6 +++--- plugins/gradle/example-client/build.gradle | 4 ++-- plugins/gradle/example-server/build.gradle | 2 +- .../gradle/graphql-java-codegen-gradle-plugin/build.gradle | 2 +- plugins/maven/example-client/pom.xml | 2 +- plugins/maven/example-server/pom.xml | 2 +- plugins/maven/graphql-java-codegen-maven-plugin/pom.xml | 4 ++-- .../example-client-scala/project/plugins.sbt | 2 +- .../example-client-scala/version.sbt | 2 +- .../example-client/project/plugins.sbt | 2 +- .../graphql-codegen-sbt-plugin/example-client/version.sbt | 2 +- .../graphql-codegen-sbt-plugin/simple/project/plugins.sbt | 2 +- .../sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt | 2 +- plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt | 2 +- 15 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index 4810bcf40..945cbda8e 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id "org.sonarqube" version "3.2.0" } -def graphqlCodegenVersion = '5.6.0' // This variable used in the automatic release process +def graphqlCodegenVersion = '5.6.1-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenVersion diff --git a/plugins/gradle/example-client-kotlin/build.gradle b/plugins/gradle/example-client-kotlin/build.gradle index b154b1ff3..16eefb72e 100644 --- a/plugins/gradle/example-client-kotlin/build.gradle +++ b/plugins/gradle/example-client-kotlin/build.gradle @@ -4,10 +4,10 @@ import io.github.kobylynskyi.graphql.codegen.gradle.GraphQLCodegenGradleTask plugins { id "java" id "org.jetbrains.kotlin.jvm" version "1.6.21" - id "io.github.kobylynskyi.graphql.codegen" version "5.6.0" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.1-SNAPSHOT" } -def graphqlCodegenClientKotlinVersion = '5.6.0' // Variable used in the automatic release process +def graphqlCodegenClientKotlinVersion = '5.6.1-SNAPSHOT' // Variable used in the automatic release process group = 'io.github.dreamylost' version = graphqlCodegenClientKotlinVersion @@ -29,7 +29,7 @@ repositories { dependencies { - implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.0" + implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.1-SNAPSHOT" implementation "javax.validation:validation-api:2.0.1.Final" implementation "com.squareup.okhttp3:okhttp:4.2.2" implementation "com.fasterxml.jackson.core:jackson-core:2.13.3" diff --git a/plugins/gradle/example-client/build.gradle b/plugins/gradle/example-client/build.gradle index ef9d03b9a..8a118a864 100644 --- a/plugins/gradle/example-client/build.gradle +++ b/plugins/gradle/example-client/build.gradle @@ -7,7 +7,7 @@ plugins { // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "5.6.0" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.1-SNAPSHOT" } mainClassName = "io.github.kobylynskyi.order.Application" @@ -22,7 +22,7 @@ dependencies { // use the latest available version: // https://search.maven.org/artifact/io.github.kobylynskyi/graphql-java-codegen - implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.0" + implementation "io.github.kobylynskyi:graphql-java-codegen:5.6.1-SNAPSHOT" implementation "org.apache.httpcomponents:httpclient:4.5.13" implementation "javax.validation:validation-api:2.0.1.Final" diff --git a/plugins/gradle/example-server/build.gradle b/plugins/gradle/example-server/build.gradle index f0527fc2e..4a9445cf0 100644 --- a/plugins/gradle/example-server/build.gradle +++ b/plugins/gradle/example-server/build.gradle @@ -6,7 +6,7 @@ plugins { // // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "5.6.0" + id "io.github.kobylynskyi.graphql.codegen" version "5.6.1-SNAPSHOT" } mainClassName = "io.github.kobylynskyi.product.Application" diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle index ff81067dd..925025d82 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle @@ -16,7 +16,7 @@ apply plugin: "java" apply plugin: "idea" apply plugin: "maven-publish" -def graphqlCodegenGradlePluginVersion = '5.6.0' // This variable used in the automatic release process +def graphqlCodegenGradlePluginVersion = '5.6.1-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenGradlePluginVersion diff --git a/plugins/maven/example-client/pom.xml b/plugins/maven/example-client/pom.xml index b9a29809d..a42593800 100644 --- a/plugins/maven/example-client/pom.xml +++ b/plugins/maven/example-client/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin-example-client - 5.6.0 + 5.6.1-SNAPSHOT graphql-codegen-maven-plugin-example-client diff --git a/plugins/maven/example-server/pom.xml b/plugins/maven/example-server/pom.xml index dbdd8ed54..42b2a9ca8 100644 --- a/plugins/maven/example-server/pom.xml +++ b/plugins/maven/example-server/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin-example-server - 5.6.0 + 5.6.1-SNAPSHOT graphql-codegen-maven-plugin-example-server diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml index ef16541c9..5de5dfb45 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -3,7 +3,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin - 5.6.0 + 5.6.1-SNAPSHOT maven-plugin graphql-codegen-maven-plugin @@ -72,7 +72,7 @@ 3.0.1 3.3.4 - 5.6.0 + 5.6.1-SNAPSHOT diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt index cea10894f..63f0f77b9 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.0") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.1-SNAPSHOT") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt index 9a5ba26ad..6e00a51aa 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.0" +version in ThisBuild := "5.6.1-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt index cea10894f..63f0f77b9 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.0") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "5.6.1-SNAPSHOT") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt index 9a5ba26ad..6e00a51aa 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.0" +version in ThisBuild := "5.6.1-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt index 3a5c3bdb4..88a5d6de0 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt @@ -1,4 +1,4 @@ -sys.props.get("plugin.version").orElse(Some("5.6.0")) match { +sys.props.get("plugin.version").orElse(Some("5.6.1-SNAPSHOT")) match { case Some(x) => addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt index 9a5ba26ad..6e00a51aa 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.0" +version in ThisBuild := "5.6.1-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt index 9a5ba26ad..6e00a51aa 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.0" +version in ThisBuild := "5.6.1-SNAPSHOT" From 571b22a89aabae4f07c427042959adee51f12b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= Date: Thu, 16 Mar 2023 19:50:15 +0800 Subject: [PATCH 15/25] Scala: fix deprecated APIs, support generateSealedInterfaces (#1042) --- .github/workflows/check-code-style.yml | 5 + docs/codegen-options.md | 2 +- .../.scalafmt.conf | 23 ++ .../.scalariform.conf | 11 - .../graphql-java-codegen-sbt-plugin/build.sbt | 25 +- .../project/Commands.scala | 20 + .../project/Publishing.scala | 32 +- .../project/plugins.sbt | 6 +- .../dreamylost/graphql/codegen/Compat.scala | 20 +- .../graphql/codegen/GraphQLCodegenKeys.scala | 77 ++-- .../codegen/GraphQLCodegenPlugin.scala | 343 ++++++++++-------- .../codegen/ParentInterfacesConfig.scala | 16 +- .../graphql/codegen/SchemaFinderConfig.scala | 16 +- .../example-client-scala/build.sbt | 3 +- .../src/main/resources/schema.graphqls | 2 + .../example-client/build.sbt | 2 + .../src/test/scala/test/Test.scala | 7 +- .../version.sbt | 2 +- .../templates/scala-lang/interface.ftl | 2 +- .../resources/templates/scala-lang/union.ftl | 2 +- .../GraphQLCodegenSealedInterfacesTest.java | 53 +++ .../scala/Comment_sealed_interfaces.scala.txt | 49 +++ 22 files changed, 464 insertions(+), 254 deletions(-) create mode 100644 plugins/sbt/graphql-java-codegen-sbt-plugin/.scalafmt.conf delete mode 100644 plugins/sbt/graphql-java-codegen-sbt-plugin/.scalariform.conf create mode 100644 plugins/sbt/graphql-java-codegen-sbt-plugin/project/Commands.scala create mode 100644 src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenSealedInterfacesTest.java create mode 100644 src/test/resources/expected-classes/scala/Comment_sealed_interfaces.scala.txt diff --git a/.github/workflows/check-code-style.yml b/.github/workflows/check-code-style.yml index 77c5ac8b6..62543b777 100644 --- a/.github/workflows/check-code-style.yml +++ b/.github/workflows/check-code-style.yml @@ -17,6 +17,11 @@ jobs: - name: Checkout uses: actions/checkout@v2 + # brew install sbt; cd graphql-java-codegen-sbt-plugin; sbt fmt or sbt check + - name: Check Scala Code Style + working-directory: plugins/sbt/graphql-java-codegen-sbt-plugin + run: sbt check + - name: Check Code Style env: WORKDIR: ./ diff --git a/docs/codegen-options.md b/docs/codegen-options.md index c313930d5..e3e0d289f 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -58,7 +58,7 @@ | `generatedLanguage` | Enum | GeneratedLanguage.JAVA | Choose which language you want to generate, Java,Scala,Kotlin were supported. Note that due to language features, there are slight differences in default values between languages. | | `generateModelOpenClasses` | Boolean | False | The class type of the generated model. If true, generate normal classes, else generate data classes. It only support in kotlin(```data class```) and scala(```case class```). Maybe we will consider to support Java ```record``` in the future. | | `initializeNullableTypes` | Boolean | False | Adds a default null value to nullable arguments. Only supported in Kotlin. | -| `generateSealedInterfaces` | Boolean | False | This applies to generated interfaces on unions and interfaces. If true, generate sealed interfaces, else generate normal ones. It is only supported in Kotlin. | +| `generateSealedInterfaces` | Boolean | False | This applies to generated interfaces on unions and interfaces. If true, generate sealed interfaces, else generate normal ones. It is only supported in Kotlin and Scala. | | `typesAsInterfaces` | Set(String) | Empty | Types that must generated as interfaces should be defined here in format: `TypeName` or `@directive`. E.g.: `User`, `@asInterface`. | | `useObjectMapperForRequestSerialization` | Set(String) | Empty | Fields that require serialization using `com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)`. Values should be defined here in the following format: `GraphqlObjectName.fieldName` or `GraphqlTypeName`. If just type is specified, then all fields of this type will be serialized using ObjectMapper. E.g.: `["Person.createdDateTime", ZonedDateTime"]` | | `supportUnknownFields` | Boolean | False | Specifies whether api classes should support unknown fields during serialization or deserialization. If `true`, classes will include a property of type [`java.util.Map`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html) that will store unknown fields. | diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/.scalafmt.conf b/plugins/sbt/graphql-java-codegen-sbt-plugin/.scalafmt.conf new file mode 100644 index 000000000..cfbfc7fa6 --- /dev/null +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/.scalafmt.conf @@ -0,0 +1,23 @@ +version = "3.6.1" +runner.dialect = scala213 +maxColumn = 120 +align.preset = more +lineEndings = preserve +align.stripMargin = false +docstrings.style = AsteriskSpace +docstrings.oneline = keep +continuationIndent.defnSite = 2 +danglingParentheses.preset = true +spaces { + inImportCurlyBraces = true +} +indentOperator.exemptScope = aloneArgOrBody +includeCurlyBraceInSelectChains = false +align.openParenDefnSite = false +optIn.annotationNewlines = true +rewrite.rules = [SortImports, RedundantBraces] +rewriteTokens = { + "⇒": "=>" + "→": "->" + "←": "<-" +} \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/.scalariform.conf b/plugins/sbt/graphql-java-codegen-sbt-plugin/.scalariform.conf deleted file mode 100644 index 517e1439e..000000000 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/.scalariform.conf +++ /dev/null @@ -1,11 +0,0 @@ -autoformat = true -withBaseDirectory = true - -// Preferences -alignParameters = true -newlineAtEndOfFile = true -rewriteArrowSymbols = false -allowParamGroupsOnNewlines = true -danglingCloseParenthesis = Preserve -alignSingleLineCaseStatements = true -doubleIndentConstructorArguments = true diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt index 7d62cfb62..57ed41d72 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt @@ -8,12 +8,13 @@ jValidationVersion := "2.0.1.Final" // keep version is equals with parent project `graphql-java-codegen`. // Plugin don't need to care about the scala version, just the SBT version. -lazy val `graphql-codegen-sbt-plugin` = Project(id = "graphql-codegen-sbt-plugin", base = file(".")). - enablePlugins(SbtPlugin, BuildInfoPlugin). - settings(Publishing.publishSettings). - settings( - sbtPlugin := true, +lazy val `graphql-codegen-sbt-plugin` = Project(id = "graphql-codegen-sbt-plugin", base = file(".")) + .enablePlugins(SbtPlugin, BuildInfoPlugin) + .settings(Publishing.publishSettings) + .settings( + sbtPlugin := true, scriptedBufferLog := false, + commands ++= Commands.value, scriptedLaunchOpts += s"-Dplugin.version=${version.value}", scalacOptions += "-target:jvm-1.8", releaseIgnoreUntrackedFiles := true, @@ -31,12 +32,12 @@ lazy val `graphql-codegen-sbt-plugin` = Project(id = "graphql-codegen-sbt-plugin pushChanges ), libraryDependencies ++= Seq( - "io.github.kobylynskyi" % "graphql-java-codegen" % (version in ThisBuild).value, - "org.freemarker" % "freemarker" % "2.3.31", - "com.graphql-java" % "graphql-java" % "16.2", - "com.fasterxml.jackson.core" % "jackson-databind" % "2.12.1", - "com.typesafe" % "config" % "1.4.2" + "io.github.kobylynskyi" % "graphql-java-codegen" % (ThisBuild / version).value, + "org.freemarker" % "freemarker" % "2.3.31", + "com.graphql-java" % "graphql-java" % "16.2", + "com.fasterxml.jackson.core" % "jackson-databind" % "2.12.1", + "com.typesafe" % "config" % "1.4.2" ), - buildInfoKeys := Seq[BuildInfoKey](name, version, sbtVersion, jValidationVersion), + buildInfoKeys := Seq[BuildInfoKey](name, version, sbtVersion, jValidationVersion), buildInfoPackage := "io.github.dreamylost.graphql.codegen" - ) \ No newline at end of file + ) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Commands.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Commands.scala new file mode 100644 index 000000000..cf483e938 --- /dev/null +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Commands.scala @@ -0,0 +1,20 @@ +import sbt.Command + +/** @author + * 梦境迷离 + * @since 2022/1/15 + * @version 1.0 + */ +object Commands { + + val FmtSbtCommand = Command.command("fmt")(state => "scalafmtSbt" :: "scalafmtAll" :: state) + + val FmtSbtCheckCommand = + Command.command("check")(state => "scalafmtSbtCheck" :: "scalafmtCheckAll" :: state) + + val value = Seq( + FmtSbtCommand, + FmtSbtCheckCommand + ) + +} diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Publishing.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Publishing.scala index a9829b54b..2e0749b58 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Publishing.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/Publishing.scala @@ -2,16 +2,16 @@ import sbt._ import sbt.Keys._ import xerial.sbt.Sonatype.autoImport.sonatypeProfileName -/** - * sbt publish setting +/** sbt publish setting * - * @author 梦境迷离 - * @since 2020-07-19 - * @version v1.0 + * @author + * 梦境迷离 + * @since 2020-07-19 + * @version v1.0 */ object Publishing { - //publish by sbt publishSigned + // publish by sbt publishSigned lazy val publishSettings = Seq( credentials += Credentials(Path.userHome / ".ivy2" / ".sonatype_credentials"), publishTo := { @@ -21,25 +21,27 @@ object Publishing { else Some("releases" at nexus + "service/local/staging/deploy/maven2") }, - licenses := Seq("MIT" -> url("https://opensource.org/licenses/MIT")), - publishMavenStyle := true, + licenses := Seq("MIT" -> url("https://opensource.org/licenses/MIT")), + publishMavenStyle := true, publishArtifact in Test := false, - pomIncludeRepository := { _ => false }, + pomIncludeRepository := { _ => false }, developers := List( Developer( id = "dreamylost", name = "梦境迷离", email = "dreamylost@outlook.com", - url = url("https://dreamylost.cn") - )), + url = url("https://blog.dreamylost.cn") + ) + ), sonatypeProfileName := organization.value, - isSnapshot := version.value endsWith "SNAPSHOT", - homepage := Some(url("https://github.com/jxnu-liguobin")), + isSnapshot := version.value endsWith "SNAPSHOT", + homepage := Some(url("https://github.com/jxnu-liguobin")), scmInfo := Some( ScmInfo( - //it is fork from https://github.com/kobylynskyi/graphql-java-codegen + // it is fork from https://github.com/kobylynskyi/graphql-java-codegen url("https://github.com/jxnu-liguobin/graphql-java-codegen"), "scm:git@github.com:jxnu-liguobin/graphql-java-codegen.git" - )) + ) + ) ) } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/plugins.sbt index 85b9d39d9..77f7a7be0 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/plugins.sbt @@ -1,5 +1,5 @@ -addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.8.3") -addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.0") +addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.13") addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2") -addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.13") \ No newline at end of file +addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.13") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/Compat.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/Compat.scala index fa589fcb5..91650d755 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/Compat.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/Compat.scala @@ -7,24 +7,24 @@ import sbt.io.{ AllPassFilter, SuffixFilter } import sbt.{ Def, Task } import sbt.Configuration -/** - * - * @author 梦境迷离 - * @since 2020-07-18 - * @version v1.0 +/** @author + * 梦境迷离 + * @since 2020-07-18 + * @version v1.0 */ trait Compat { self: GraphQLCodegenPlugin => import self.GlobalImport._ - val watchSourcesSetting: Def.Setting[Task[Seq[WatchSource]]] = { + val watchSourcesSetting: Def.Setting[Task[Seq[WatchSource]]] = watchSources += new Source( - (sourceDirectory in graphqlCodegen).value, + (graphqlCodegen / sourceDirectory).value, new SuffixFilter(".graphql") | new SuffixFilter(".graphqls"), - AllPassFilter) - } + AllPassFilter + ) - protected[this] lazy val GraphQLCodegenConfig = Configuration.of("GraphQLCodegen", "graphqlCodegen" + configurationPostfix) + protected[this] lazy val GraphQLCodegenConfig = + Configuration.of("GraphQLCodegen", "graphqlCodegen" + configurationPostfix) } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala index 32fedc80d..ca9090e03 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala @@ -5,17 +5,16 @@ import java.util import com.kobylynskyi.graphql.codegen.model._ import sbt._ -/** - * - * @author 梦境迷离 - * @version 1.0,2020/7/15 +/** @author + * 梦境迷离 + * @version 1.0,2020/7/15 */ trait GraphQLCodegenKeys { - //Conflict with SBT key + // Conflict with SBT key val generatePackageName = settingKey[Option[String]]("generatePackageName") - //Scala collection and asJava cannot be used. The latter one uses the put method, which is not supported by Scala collection + // Scala collection and asJava cannot be used. The latter one uses the put method, which is not supported by Scala collection val customTypesMapping = settingKey[util.Map[String, String]]("customTypesMapping") val apiNamePrefix = settingKey[Option[String]]("apiNamePrefix") @@ -44,25 +43,36 @@ trait GraphQLCodegenKeys { val customAnnotationsMapping = settingKey[util.Map[String, util.List[String]]]("customAnnotationsMapping") - val generateEqualsAndHashCode = settingKey[Boolean]("Specifies whether generated model classes should have equals and hashCode methods defined.") + val generateEqualsAndHashCode = + settingKey[Boolean]("Specifies whether generated model classes should have equals and hashCode methods defined.") val generateImmutableModels = settingKey[Boolean]("generateImmutableModels") - val generateToString = settingKey[Boolean]("Specifies whether generated model classes should have toString method defined.") + val generateToString = + settingKey[Boolean]("Specifies whether generated model classes should have toString method defined.") val subscriptionReturnType = settingKey[Option[String]]("subscriptionReturnType") val modelValidationAnnotation = settingKey[String]("Annotation for mandatory (NonNull) fields. Can be None/empty.") - val generateParameterizedFieldsResolvers = settingKey[Boolean]("If true, then generate separate Resolver interface for parametrized fields. If false, then add field to the type definition and ignore field parameters.") + val generateParameterizedFieldsResolvers = settingKey[Boolean]( + "If true, then generate separate Resolver interface for parametrized fields. If false, then add field to the type definition and ignore field parameters." + ) - val generateExtensionFieldsResolvers = settingKey[Boolean]("Specifies whether all fields in extensions (extend type and extend interface) should be present in Resolver interface instead of the type class itself.") + val generateExtensionFieldsResolvers = settingKey[Boolean]( + "Specifies whether all fields in extensions (extend type and extend interface) should be present in Resolver interface instead of the type class itself." + ) - val addGeneratedAnnotation = settingKey[Boolean]("Specifies whether generated classes should be annotated with @Generated") + val addGeneratedAnnotation = + settingKey[Boolean]("Specifies whether generated classes should be annotated with @Generated") - val generatedAnnotation = settingKey[Option[String]]("Qualified class name (with package) of the @Generated annotation that will be added on top of every generated class (if addGeneratedAnnotation is true)") + val generatedAnnotation = settingKey[Option[String]]( + "Qualified class name (with package) of the @Generated annotation that will be added on top of every generated class (if addGeneratedAnnotation is true)" + ) - val generateDataFetchingEnvironmentArgumentInApis = settingKey[Boolean]("If true, then graphql.schema.DataFetchingEnvironment env will be added as a last argument to all methods of root type resolvers and field resolvers.") + val generateDataFetchingEnvironmentArgumentInApis = settingKey[Boolean]( + "If true, then graphql.schema.DataFetchingEnvironment env will be added as a last argument to all methods of root type resolvers and field resolvers." + ) val generateModelsForRootTypes = settingKey[Boolean]("generateModelsForRootTypes") @@ -74,17 +84,23 @@ trait GraphQLCodegenKeys { val generateClient = settingKey[Boolean]("generateClient") - val requestSuffix = settingKey[String]("Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: Request class (contains input data) and ResponseProjection class (contains response fields).") + val requestSuffix = settingKey[String]( + "Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: Request class (contains input data) and ResponseProjection class (contains response fields)." + ) val responseSuffix = settingKey[String]("responseSuffix") - val responseProjectionSuffix = settingKey[String]("Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: Request class (contains input data) and ResponseProjection class (contains response fields).") + val responseProjectionSuffix = settingKey[String]( + "Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: Request class (contains input data) and ResponseProjection class (contains response fields)." + ) val parametrizedInputSuffix = settingKey[String]("parametrizedInputSuffix") val useObjectMapperForRequestSerialization = settingKey[util.Set[String]]("useObjectMapperForRequestSerialization") - val configurationFiles = settingKey[Seq[String]]("configurationFiles, either JSON or HOCON. The same key is used in order, so the default configuration should be placed at the end.") + val configurationFiles = settingKey[Seq[String]]( + "configurationFiles, either JSON or HOCON. The same key is used in order, so the default configuration should be placed at the end." + ) val parentInterfaces = settingKey[ParentInterfacesConfig]("parentInterfaces") @@ -94,7 +110,7 @@ trait GraphQLCodegenKeys { val graphqlSchemaPaths = settingKey[Seq[String]]("Locations of GraphQL schemas.") - //use different paths + // use different paths val graphqlSchemaValidate = inputKey[Seq[String]]("graphqlSchemaValidatePaths") val graphqlCodegen = taskKey[Seq[File]]("Generate code") @@ -123,22 +139,33 @@ trait GraphQLCodegenKeys { val generatedLanguage = settingKey[GeneratedLanguage]("Generate code with language, like java/scala.") - val generateModelOpenClasses = settingKey[Boolean]("The class type of the generated model. If true, generate normal classes, else generate case class.") + val generateModelOpenClasses = settingKey[Boolean]( + "The class type of the generated model. If true, generate normal classes, else generate case class." + ) - val generateSealedInterfaces = settingKey[Boolean]("If true, generate sealed interfaces for GraphQL unions and interfaces, else generate normal interfaces.") + val generateSealedInterfaces = settingKey[Boolean]( + "If true, generate sealed interfaces for GraphQL unions and interfaces, else generate normal interfaces." + ) - val generateJacksonTypeIdResolver = settingKey[Boolean]("Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package.") + val generateJacksonTypeIdResolver = settingKey[Boolean]( + "Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package." + ) - val generateNoArgsConstructorOnly = settingKey[Boolean]("Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is .true.") + // not support in scala + val generateNoArgsConstructorOnly = settingKey[Boolean]( + "Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is .true." + ) - //for version + // for version val javaxValidationApiVersion = settingKey[Option[String]]("javax-validation-api version") val graphqlJavaCodegenVersion = settingKey[Option[String]]("graphql-java-codegen version") - //some others for sbt - val generateCodegenTargetPath = settingKey[File]("Where to store generated files and add the generated code to the classpath, so that they can be referenced.") + // some others for sbt + val generateCodegenTargetPath = settingKey[File]( + "Where to store generated files and add the generated code to the classpath, so that they can be referenced." + ) - val supportUnknownFields = settingKey[Boolean]("supportUnknownFields") + val supportUnknownFields = settingKey[Boolean]("supportUnknownFields") val unknownFieldsPropertyName = settingKey[String]("unknownFieldsPropertyName") } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index fa14e07be..8f0a04d0e 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -17,32 +17,33 @@ import java.util.{ HashMap => JHashMap, HashSet => JHashSet, List => JList } import scala.collection.JavaConverters._ import sbt.Def -/** - * - * @author 梦境迷离 - * @version 1.0,2020/7/15 +/** @author + * 梦境迷离 + * @version 1.0,2020/7/15 */ object GraphQLCodegenPlugin extends GraphQLCodegenPlugin(Compile, configurationPostfix = "-main") { - //for auto import + // for auto import val autoImport = GlobalImport } -class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val configurationPostfix: String = "") extends AutoPlugin with Compat { +class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val configurationPostfix: String = "") + extends AutoPlugin + with Compat { self => private val jValidation = BuildInfo.jValidationVersion - private val codegen = BuildInfo.version + private val codegen = BuildInfo.version object GlobalImport extends GraphQLCodegenKeys { lazy val GraphQLCodegenPluginDependencies: Def.Setting[Seq[ModuleID]] = libraryDependencies ++= Seq( - "javax.validation" % "validation-api" % javaxValidationApiVersion.value.getOrElse(jValidation), + "javax.validation" % "validation-api" % javaxValidationApiVersion.value.getOrElse(jValidation), "io.github.kobylynskyi" % "graphql-java-codegen" % graphqlJavaCodegenVersion.value.getOrElse(codegen) ) - lazy val schemaFinderConfig: SchemaFinderConfig = SchemaFinderConfig(null) + lazy val schemaFinderConfig: SchemaFinderConfig = SchemaFinderConfig(null) lazy val parentInterfacesConfig: ParentInterfacesConfig = ParentInterfacesConfig() - lazy val defaultRelayConfig = new RelayConfig() //for auto import which can change it by `set` methods. + lazy val defaultRelayConfig = new RelayConfig() // for auto import which can change it by `set` methods. lazy val GraphQLCodegenConfig = self.GraphQLCodegenConfig } @@ -55,135 +56,145 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co import GlobalImport._ - //With the implementation of some other plugins, initialization is not necessary, - //but maybe should be related to the dependency of key. For convenience, this is a conservative operation. + // With the implementation of some other plugins, initialization is not necessary, + // but maybe should be related to the dependency of key. For convenience, this is a conservative operation. override lazy val globalSettings: Seq[Def.Setting[_]] = Seq( graphqlQueryIntrospectionResultPath := None, - graphqlSchemas := schemaFinderConfig, - configurationFiles := Seq.empty[String], - graphqlSchemaPaths := Seq.empty, - graphqlSchemaValidate := Seq.empty, - generateJacksonTypeIdResolver := MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER, - customTypesMapping := new JHashMap[String, String](), //TODO use scala Map, convert to java Map - customAnnotationsMapping := new JHashMap[String, JList[String]](), - directiveAnnotationsMapping := new JHashMap[String, JList[String]](), - javaxValidationApiVersion := None, - graphqlJavaCodegenVersion := None, + graphqlSchemas := schemaFinderConfig, + configurationFiles := Seq.empty[String], + graphqlSchemaPaths := Seq.empty, + graphqlSchemaValidate := Seq.empty, + generateJacksonTypeIdResolver := MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER, + customTypesMapping := new JHashMap[String, String](), // TODO use scala Map, convert to java Map + customAnnotationsMapping := new JHashMap[String, JList[String]](), + directiveAnnotationsMapping := new JHashMap[String, JList[String]](), + javaxValidationApiVersion := None, + graphqlJavaCodegenVersion := None, // suffix/prefix/strategies: generateModelOpenClasses := MappingConfigConstants.DEFAULT_GENERATE_MODEL_OPEN_CLASSES, generateSealedInterfaces := MappingConfigConstants.DEFAULT_GENERATE_SEALED_INTERFACES, - generatedLanguage := MappingConfigConstants.DEFAULT_GENERATED_LANGUAGE, - apiNamePrefix := None, - apiNameSuffix := MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX, - apiRootInterfaceStrategy := ApiRootInterfaceStrategy.valueOf(MappingConfigConstants.DEFAULT_API_ROOT_INTERFACE_STRATEGY_STRING), - apiNamePrefixStrategy := ApiNamePrefixStrategy.valueOf(MappingConfigConstants.DEFAULT_API_NAME_PREFIX_STRATEGY_STRING), - modelNamePrefix := None, - modelNameSuffix := None, - requestSuffix := MappingConfigConstants.DEFAULT_REQUEST_SUFFIX, - responseSuffix := MappingConfigConstants.DEFAULT_RESPONSE_SUFFIX, - responseProjectionSuffix := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_SUFFIX, - parametrizedInputSuffix := MappingConfigConstants.DEFAULT_PARAMETRIZED_INPUT_SUFFIX, + generatedLanguage := MappingConfigConstants.DEFAULT_GENERATED_LANGUAGE, + apiNamePrefix := None, + apiNameSuffix := MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX, + apiRootInterfaceStrategy := ApiRootInterfaceStrategy.valueOf( + MappingConfigConstants.DEFAULT_API_ROOT_INTERFACE_STRATEGY_STRING + ), + apiNamePrefixStrategy := ApiNamePrefixStrategy.valueOf( + MappingConfigConstants.DEFAULT_API_NAME_PREFIX_STRATEGY_STRING + ), + modelNamePrefix := None, + modelNameSuffix := None, + requestSuffix := MappingConfigConstants.DEFAULT_REQUEST_SUFFIX, + responseSuffix := MappingConfigConstants.DEFAULT_RESPONSE_SUFFIX, + responseProjectionSuffix := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_SUFFIX, + parametrizedInputSuffix := MappingConfigConstants.DEFAULT_PARAMETRIZED_INPUT_SUFFIX, useObjectMapperForRequestSerialization := new JHashSet[String](), - typeResolverPrefix := None, - typeResolverSuffix := MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX, - subscriptionReturnType := None, - modelValidationAnnotation := MappingConfigConstants.DEFAULT_VALIDATION_ANNOTATION, - apiReturnType := None, - apiReturnListType := None, - apiInterfaceStrategy := MappingConfigConstants.DEFAULT_API_INTERFACE_STRATEGY, - useOptionalForNullableReturnTypes := MappingConfigConstants.DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES, - generateApisWithThrowsException := MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION, - addGeneratedAnnotation := MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION, - generatedAnnotation := None, - typesAsInterfaces := new JHashSet[String](), - relayConfig := defaultRelayConfig, + typeResolverPrefix := None, + typeResolverSuffix := MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX, + subscriptionReturnType := None, + modelValidationAnnotation := MappingConfigConstants.DEFAULT_VALIDATION_ANNOTATION, + apiReturnType := None, + apiReturnListType := None, + apiInterfaceStrategy := MappingConfigConstants.DEFAULT_API_INTERFACE_STRATEGY, + useOptionalForNullableReturnTypes := MappingConfigConstants.DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES, + generateApisWithThrowsException := MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION, + addGeneratedAnnotation := MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION, + generatedAnnotation := None, + typesAsInterfaces := new JHashSet[String](), + relayConfig := defaultRelayConfig, // package name configs: - apiPackageName := None, + apiPackageName := None, modelPackageName := None, // field resolvers configs: - fieldsWithResolvers := new JHashSet[String](), + fieldsWithResolvers := new JHashSet[String](), fieldsWithoutResolvers := new JHashSet[String](), // various toggles: - generateClient := MappingConfigConstants.DEFAULT_GENERATE_CLIENT, + generateClient := MappingConfigConstants.DEFAULT_GENERATE_CLIENT, generateParameterizedFieldsResolvers := MappingConfigConstants.DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS, - generateExtensionFieldsResolvers := MappingConfigConstants.DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS, + generateExtensionFieldsResolvers := MappingConfigConstants.DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS, generateDataFetchingEnvironmentArgumentInApis := MappingConfigConstants.DEFAULT_GENERATE_DATA_FETCHING_ENV, - generateModelsForRootTypes := MappingConfigConstants.DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES, - generatePackageName := None, - generateBuilder := MappingConfigConstants.DEFAULT_BUILDER, - generateApis := MappingConfigConstants.DEFAULT_GENERATE_APIS, - generateEqualsAndHashCode := MappingConfigConstants.DEFAULT_EQUALS_AND_HASHCODE, + generateModelsForRootTypes := MappingConfigConstants.DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES, + generatePackageName := None, + generateBuilder := MappingConfigConstants.DEFAULT_BUILDER, + generateApis := MappingConfigConstants.DEFAULT_GENERATE_APIS, + generateEqualsAndHashCode := MappingConfigConstants.DEFAULT_EQUALS_AND_HASHCODE, generateImmutableModels := MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS, // TODO change default value - generateToString := MappingConfigConstants.DEFAULT_TO_STRING, + generateToString := MappingConfigConstants.DEFAULT_TO_STRING, // parent interfaces configs: - parentInterfaces := parentInterfacesConfig, + parentInterfaces := parentInterfacesConfig, generateAllMethodInProjection := MappingConfigConstants.DEFAULT_GENERATE_ALL_METHOD, - responseProjectionMaxDepth := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_MAX_DEPTH, - - supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS, - unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME, + responseProjectionMaxDepth := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_MAX_DEPTH, + supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS, + unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME, generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY, - - skip := false + skip := false ) private def getMappingConfig(): Def.Initialize[MappingConfig] = Def.setting { val mappingConfig = new MappingConfig - mappingConfig.setPackageName((generatePackageName in GraphQLCodegenConfig).value.orNull) - mappingConfig.setCustomTypesMapping((customTypesMapping in GraphQLCodegenConfig).value) - mappingConfig.setApiNameSuffix((apiNameSuffix in GraphQLCodegenConfig).value) - mappingConfig.setApiNamePrefix((apiNamePrefix in GraphQLCodegenConfig).value.orNull) - mappingConfig.setApiRootInterfaceStrategy((apiRootInterfaceStrategy in GraphQLCodegenConfig).value) - mappingConfig.setApiNamePrefixStrategy((apiNamePrefixStrategy in GraphQLCodegenConfig).value) - mappingConfig.setModelNamePrefix((modelNamePrefix in GraphQLCodegenConfig).value.orNull) - mappingConfig.setModelNameSuffix((modelNameSuffix in GraphQLCodegenConfig).value.orNull) - mappingConfig.setApiPackageName((apiPackageName in GraphQLCodegenConfig).value.orNull) - mappingConfig.setModelPackageName((modelPackageName in GraphQLCodegenConfig).value.orNull) - mappingConfig.setGenerateBuilder((generateBuilder in GraphQLCodegenConfig).value) - mappingConfig.setGenerateApis((generateApis in GraphQLCodegenConfig).value) - mappingConfig.setTypeResolverSuffix((typeResolverSuffix in GraphQLCodegenConfig).value) - mappingConfig.setTypeResolverPrefix((typeResolverPrefix in GraphQLCodegenConfig).value.orNull) - mappingConfig.setModelValidationAnnotation((modelValidationAnnotation in GraphQLCodegenConfig).value) - mappingConfig.setCustomAnnotationsMapping((customAnnotationsMapping in GraphQLCodegenConfig).value) - mappingConfig.setGenerateEqualsAndHashCode((generateEqualsAndHashCode in GraphQLCodegenConfig).value) - mappingConfig.setGenerateImmutableModels((generateImmutableModels in GraphQLCodegenConfig).value) - mappingConfig.setGenerateToString((generateToString in GraphQLCodegenConfig).value) - mappingConfig.setSubscriptionReturnType((subscriptionReturnType in GraphQLCodegenConfig).value.orNull) - mappingConfig.setGenerateParameterizedFieldsResolvers((generateParameterizedFieldsResolvers in GraphQLCodegenConfig).value) - mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis((generateDataFetchingEnvironmentArgumentInApis in GraphQLCodegenConfig).value) - mappingConfig.setGenerateExtensionFieldsResolvers((generateExtensionFieldsResolvers in GraphQLCodegenConfig).value) - mappingConfig.setGenerateModelsForRootTypes((generateModelsForRootTypes in GraphQLCodegenConfig).value) - mappingConfig.setFieldsWithResolvers((fieldsWithResolvers in GraphQLCodegenConfig).value) - mappingConfig.setFieldsWithoutResolvers((fieldsWithoutResolvers in GraphQLCodegenConfig).value) - mappingConfig.setTypesAsInterfaces((typesAsInterfaces in GraphQLCodegenConfig).value) - mappingConfig.setGenerateClient((generateClient in GraphQLCodegenConfig).value) - mappingConfig.setRequestSuffix((requestSuffix in GraphQLCodegenConfig).value) - mappingConfig.setResponseSuffix((responseSuffix in GraphQLCodegenConfig).value) - mappingConfig.setResponseProjectionSuffix((responseProjectionSuffix in GraphQLCodegenConfig).value) - mappingConfig.setParametrizedInputSuffix((parametrizedInputSuffix in GraphQLCodegenConfig).value) - mappingConfig.setUseObjectMapperForRequestSerialization((useObjectMapperForRequestSerialization in GraphQLCodegenConfig).value) - mappingConfig.setResolverParentInterface((parentInterfaces in GraphQLCodegenConfig).value.resolver) - mappingConfig.setQueryResolverParentInterface((parentInterfaces in GraphQLCodegenConfig).value.queryResolver) - mappingConfig.setMutationResolverParentInterface((parentInterfaces in GraphQLCodegenConfig).value.mutationResolver) - mappingConfig.setSubscriptionResolverParentInterface((parentInterfaces in GraphQLCodegenConfig).value.subscriptionResolver) - mappingConfig.setApiReturnType((apiReturnType in GraphQLCodegenConfig).value.orNull) - mappingConfig.setApiReturnListType((apiReturnListType in GraphQLCodegenConfig).value.orNull) - mappingConfig.setDirectiveAnnotationsMapping((directiveAnnotationsMapping in GraphQLCodegenConfig).value) - mappingConfig.setApiInterfaceStrategy((apiInterfaceStrategy in GraphQLCodegenConfig).value) - mappingConfig.setUseOptionalForNullableReturnTypes((useOptionalForNullableReturnTypes in GraphQLCodegenConfig).value) - mappingConfig.setGenerateApisWithThrowsException((generateApisWithThrowsException in GraphQLCodegenConfig).value) - mappingConfig.setAddGeneratedAnnotation((addGeneratedAnnotation in GraphQLCodegenConfig).value) - mappingConfig.setGeneratedAnnotation((generatedAnnotation in GraphQLCodegenConfig).value.orNull) - mappingConfig.setGenerateAllMethodInProjection((generateAllMethodInProjection in GraphQLCodegenConfig).value) - mappingConfig.setResponseProjectionMaxDepth((responseProjectionMaxDepth in GraphQLCodegenConfig).value) - mappingConfig.setRelayConfig((relayConfig in GraphQLCodegenConfig).value) - mappingConfig.setGeneratedLanguage((generatedLanguage in GraphQLCodegenConfig).value) - mappingConfig.setGenerateModelOpenClasses((generateModelOpenClasses in GraphQLCodegenConfig).value) - mappingConfig.setGenerateJacksonTypeIdResolver((generateJacksonTypeIdResolver in GraphQLCodegenConfig).value); - mappingConfig.setGenerateNoArgsConstructorOnly((generateNoArgsConstructorOnly in GraphQLCodegenConfig).value); + mappingConfig.setPackageName((GraphQLCodegenConfig / generatePackageName).value.orNull) + mappingConfig.setCustomTypesMapping((GraphQLCodegenConfig / customTypesMapping).value) + mappingConfig.setApiNameSuffix((GraphQLCodegenConfig / apiNameSuffix).value) + mappingConfig.setApiNamePrefix((GraphQLCodegenConfig / apiNamePrefix).value.orNull) + mappingConfig.setApiRootInterfaceStrategy((GraphQLCodegenConfig / apiRootInterfaceStrategy).value) + mappingConfig.setApiNamePrefixStrategy((GraphQLCodegenConfig / apiNamePrefixStrategy).value) + mappingConfig.setModelNamePrefix((GraphQLCodegenConfig / modelNamePrefix).value.orNull) + mappingConfig.setModelNameSuffix((GraphQLCodegenConfig / modelNameSuffix).value.orNull) + mappingConfig.setApiPackageName((GraphQLCodegenConfig / apiPackageName).value.orNull) + mappingConfig.setModelPackageName((GraphQLCodegenConfig / modelPackageName).value.orNull) + mappingConfig.setGenerateBuilder((GraphQLCodegenConfig / generateBuilder).value) + mappingConfig.setGenerateApis((GraphQLCodegenConfig / generateApis).value) + mappingConfig.setTypeResolverSuffix((GraphQLCodegenConfig / typeResolverSuffix).value) + mappingConfig.setTypeResolverPrefix((GraphQLCodegenConfig / typeResolverPrefix).value.orNull) + mappingConfig.setModelValidationAnnotation((GraphQLCodegenConfig / modelValidationAnnotation).value) + mappingConfig.setCustomAnnotationsMapping((GraphQLCodegenConfig / customAnnotationsMapping).value) + mappingConfig.setGenerateEqualsAndHashCode((GraphQLCodegenConfig / generateEqualsAndHashCode).value) + mappingConfig.setGenerateImmutableModels((GraphQLCodegenConfig / generateImmutableModels).value) + mappingConfig.setGenerateToString((GraphQLCodegenConfig / generateToString).value) + mappingConfig.setSubscriptionReturnType((GraphQLCodegenConfig / subscriptionReturnType).value.orNull) + mappingConfig.setGenerateParameterizedFieldsResolvers( + (GraphQLCodegenConfig / generateParameterizedFieldsResolvers).value + ) + mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis( + (GraphQLCodegenConfig / generateDataFetchingEnvironmentArgumentInApis).value + ) + mappingConfig.setGenerateExtensionFieldsResolvers((GraphQLCodegenConfig / generateExtensionFieldsResolvers).value) + mappingConfig.setGenerateModelsForRootTypes((GraphQLCodegenConfig / generateModelsForRootTypes).value) + mappingConfig.setFieldsWithResolvers((GraphQLCodegenConfig / fieldsWithResolvers).value) + mappingConfig.setFieldsWithoutResolvers((GraphQLCodegenConfig / fieldsWithoutResolvers).value) + mappingConfig.setTypesAsInterfaces((GraphQLCodegenConfig / typesAsInterfaces).value) + mappingConfig.setGenerateClient((GraphQLCodegenConfig / generateClient).value) + mappingConfig.setRequestSuffix((GraphQLCodegenConfig / requestSuffix).value) + mappingConfig.setResponseSuffix((GraphQLCodegenConfig / responseSuffix).value) + mappingConfig.setResponseProjectionSuffix((GraphQLCodegenConfig / responseProjectionSuffix).value) + mappingConfig.setParametrizedInputSuffix((GraphQLCodegenConfig / parametrizedInputSuffix).value) + mappingConfig.setUseObjectMapperForRequestSerialization( + (GraphQLCodegenConfig / useObjectMapperForRequestSerialization).value + ) + mappingConfig.setResolverParentInterface((GraphQLCodegenConfig / parentInterfaces).value.resolver) + mappingConfig.setQueryResolverParentInterface((GraphQLCodegenConfig / parentInterfaces).value.queryResolver) + mappingConfig.setMutationResolverParentInterface((GraphQLCodegenConfig / parentInterfaces).value.mutationResolver) + mappingConfig.setSubscriptionResolverParentInterface( + (GraphQLCodegenConfig / parentInterfaces).value.subscriptionResolver + ) + mappingConfig.setApiReturnType((GraphQLCodegenConfig / apiReturnType).value.orNull) + mappingConfig.setApiReturnListType((GraphQLCodegenConfig / apiReturnListType).value.orNull) + mappingConfig.setDirectiveAnnotationsMapping((GraphQLCodegenConfig / directiveAnnotationsMapping).value) + mappingConfig.setApiInterfaceStrategy((GraphQLCodegenConfig / apiInterfaceStrategy).value) + mappingConfig.setUseOptionalForNullableReturnTypes((GraphQLCodegenConfig / useOptionalForNullableReturnTypes).value) + mappingConfig.setGenerateApisWithThrowsException((GraphQLCodegenConfig / generateApisWithThrowsException).value) + mappingConfig.setAddGeneratedAnnotation((GraphQLCodegenConfig / addGeneratedAnnotation).value) + mappingConfig.setGeneratedAnnotation((GraphQLCodegenConfig / generatedAnnotation).value.orNull) + mappingConfig.setGenerateAllMethodInProjection((GraphQLCodegenConfig / generateAllMethodInProjection).value) + mappingConfig.setResponseProjectionMaxDepth((GraphQLCodegenConfig / responseProjectionMaxDepth).value) + mappingConfig.setRelayConfig((GraphQLCodegenConfig / relayConfig).value) + mappingConfig.setGeneratedLanguage((GraphQLCodegenConfig / generatedLanguage).value) + mappingConfig.setGenerateModelOpenClasses((GraphQLCodegenConfig / generateModelOpenClasses).value) + mappingConfig.setGenerateJacksonTypeIdResolver((GraphQLCodegenConfig / generateJacksonTypeIdResolver).value); + mappingConfig.setGenerateNoArgsConstructorOnly((GraphQLCodegenConfig / generateNoArgsConstructorOnly).value); - mappingConfig.setSupportUnknownFields((supportUnknownFields in GraphQLCodegenConfig).value) - mappingConfig.setUnknownFieldsPropertyName((unknownFieldsPropertyName in GraphQLCodegenConfig).value) + mappingConfig.setSupportUnknownFields((GraphQLCodegenConfig / supportUnknownFields).value) + mappingConfig.setUnknownFieldsPropertyName((GraphQLCodegenConfig / unknownFieldsPropertyName).value) mappingConfig } @@ -192,15 +203,19 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co Seq( // `generateCodegenTargetPath` not support playframework, https://github.com/kobylynskyi/graphql-java-codegen/issues/551 // There may be some problems that have not been found at present :) - generateCodegenTargetPath := crossTarget.value / "src_managed_graphql", - sourceManaged := generateCodegenTargetPath.value, - javaSource in configuration := (sourceManaged in GraphQLCodegenConfig).value, - managedSourceDirectories in configuration ++= Seq((sourceManaged in GraphQLCodegenConfig).value), + generateCodegenTargetPath := crossTarget.value / "src_managed_graphql", + sourceManaged := generateCodegenTargetPath.value, + configuration / javaSource := (GraphQLCodegenConfig / sourceManaged).value, + configuration / managedSourceDirectories ++= Seq((GraphQLCodegenConfig / sourceManaged).value), managedClasspath := { - Classpaths.managedJars(GraphQLCodegenConfig, (classpathTypes in GraphQLCodegenConfig).value, (update in GraphQLCodegenConfig).value) + Classpaths.managedJars( + GraphQLCodegenConfig, + (GraphQLCodegenConfig / classpathTypes).value, + (GraphQLCodegenConfig / update).value + ) }, outputDir := { - val file = (javaSource in configuration).value + val file = (configuration / javaSource).value if (!file.exists()) { file.mkdirs() } @@ -209,7 +224,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co }, graphqlCodegenValidate := { val schemas = if (graphqlSchemaPaths.value.isEmpty) { - Seq(((resourceDirectory in configuration).value / "schema.graphql").getCanonicalPath).asJava + Seq(((configuration / resourceDirectory).value / "schema.graphql").getCanonicalPath).asJava } else { graphqlSchemaPaths.value.asJava } @@ -218,68 +233,90 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co graphqlSchemaValidate := { val args: Seq[String] = spaceDelimited("").parsed new GraphQLCodegenValidate(args.asJava).validate() - args.foreach(a ⇒ sLog.value.info(s"obtain args: $a")) + args.foreach(a => sLog.value.info(s"obtain args: $a")) args - }, graphqlCodegen := { + }, + graphqlCodegen := { sLog.value.info(s"Generating files: ${BuildInfo.toString}") val mappingConfigSupplier = buildJsonSupplier(configurationFiles.value) val language = mappingConfigSupplier.map(_.get()).map(_.getGeneratedLanguage).getOrElse(generatedLanguage.value) - var result = Seq.empty[File] + var result = Seq.empty[File] try { - val _outputDir = outputDir.value + val _outputDir = outputDir.value val _introspectionResult = graphqlQueryIntrospectionResultPath.value.orNull - lazy val instantiateCodegen = (mappingConfig: MappingConfig) => { + lazy val instantiateCodegen = (mappingConfig: MappingConfig) => language match { case JAVA => - new JavaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier.orNull) + new JavaGraphQLCodegen( + getSchemas(), + _introspectionResult, + _outputDir, + mappingConfig, + mappingConfigSupplier.orNull + ) case SCALA => - new ScalaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier.orNull) + new ScalaGraphQLCodegen( + getSchemas(), + _introspectionResult, + _outputDir, + mappingConfig, + mappingConfigSupplier.orNull + ) case KOTLIN => - new KotlinGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier.orNull) + new KotlinGraphQLCodegen( + getSchemas(), + _introspectionResult, + _outputDir, + mappingConfig, + mappingConfigSupplier.orNull + ) case _ => throw new LanguageNotSupportedException(language) } - } if (skip.value) { sLog.value.info("Skipping code generation") } else { - result = instantiateCodegen(getMappingConfig().value).generate.asScala - for (file ← result) { - sLog.value.info(s"${file.getName}") - } - sLog.value.success(s"Total files: ${result.length}") + result = instantiateCodegen(getMappingConfig().value: @sbtUnchecked).generate.asScala + for (file <- result) + sLog.value.info(s"${file.getName}") + sLog.value.success(s"Total files: ${result.length}") } } catch { - case e: Exception ⇒ - (logLevel in configuration).?.value.orElse(state.value.get(logLevel.key)) match { + case e: Exception => + (configuration / logLevel).?.value.orElse(state.value.get(logLevel.key)) match { case Some(Level.Debug) => e.printStackTrace() case _ => throw new Exception(s"${e.getLocalizedMessage}") } } - def getSchemas(): JList[String] = { - if (graphqlSchemaPaths.value != null && - graphqlSchemaPaths.value.nonEmpty) { + def getSchemas(): JList[String] = + if ( + graphqlSchemaPaths.value != null && + graphqlSchemaPaths.value.nonEmpty + ) { graphqlSchemaPaths.value.asJava - } else if (graphqlQueryIntrospectionResultPath.value != null && - graphqlQueryIntrospectionResultPath.value.isDefined) { + } else if ( + graphqlQueryIntrospectionResultPath.value != null && + graphqlQueryIntrospectionResultPath.value.isDefined + ) { Seq.empty[String].asJava } else { val schemasRootDir = getSchemasRootDir - val finder = new SchemaFinder(schemasRootDir) + val finder = new SchemaFinder(schemasRootDir) finder.setRecursive(graphqlSchemas.value.recursive) finder.setIncludePattern(graphqlSchemas.value.includePattern) finder.setExcludedFiles(graphqlSchemas.value.excludedFiles.asJava) finder.findSchemas } - } def getSchemasRootDir: Path = { val rootDir = graphqlSchemas.value.rootDir if (rootDir == null) { val default = getDefaultResourcesDirectory() if (default == null) - throw new IllegalStateException("Default resource folder not found, please provide in ") + throw new IllegalStateException( + "Default resource folder not found, please provide in " + ) else default } else { Paths.get(rootDir) @@ -287,7 +324,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co } def getDefaultResourcesDirectory(): Path = { - val file = (resourceDirectory in configuration).value + val file = (configuration / resourceDirectory).value if (!file.exists()) { file.mkdirs() } @@ -298,13 +335,13 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co result } - //watch graphql schema source, I'm not sure if this will be mutually exclusive with the deletion of codegen. + // watch graphql schema source, I'm not sure if this will be mutually exclusive with the deletion of codegen. ) ++ watchSourcesSetting ++ Seq(cleanFiles += generateCodegenTargetPath.value) } - protected def buildJsonSupplier(configurationFiles: Seq[String]): Option[MergeableMappingConfigSupplier] = { + protected def buildJsonSupplier(configurationFiles: Seq[String]): Option[MergeableMappingConfigSupplier] = if (configurationFiles != null && configurationFiles.nonEmpty) - Some(new MergeableMappingConfigSupplier(configurationFiles.asJava)) else None - } + Some(new MergeableMappingConfigSupplier(configurationFiles.asJava)) + else None } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/ParentInterfacesConfig.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/ParentInterfacesConfig.scala index 1ac52001d..27b65f1dd 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/ParentInterfacesConfig.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/ParentInterfacesConfig.scala @@ -1,12 +1,12 @@ package io.github.dreamylost.graphql.codegen -/** - * - * @author 梦境迷离 - * @version 1.0,2020/7/15 +/** @author + * 梦境迷离 + * @version 1.0,2020/7/15 */ final case class ParentInterfacesConfig( - queryResolver: String = null, - mutationResolver: String = null, - subscriptionResolver: String = null, - resolver: String = null) + queryResolver: String = null, + mutationResolver: String = null, + subscriptionResolver: String = null, + resolver: String = null +) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/SchemaFinderConfig.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/SchemaFinderConfig.scala index 68ba1cbd6..06b90deea 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/SchemaFinderConfig.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/SchemaFinderConfig.scala @@ -2,13 +2,13 @@ package io.github.dreamylost.graphql.codegen import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder -/** - * - * @author 梦境迷离 - * @version 1.0,2020/7/15 +/** @author + * 梦境迷离 + * @version 1.0,2020/7/15 */ final case class SchemaFinderConfig( - rootDir: String, - recursive: Boolean = SchemaFinder.DEFAULT_RECURSIVE, - includePattern: String = SchemaFinder.DEFAULT_INCLUDE_PATTERN, - excludedFiles: Set[String] = Set.empty) + rootDir: String, + recursive: Boolean = SchemaFinder.DEFAULT_RECURSIVE, + includePattern: String = SchemaFinder.DEFAULT_INCLUDE_PATTERN, + excludedFiles: Set[String] = Set.empty +) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/build.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/build.sbt index 9c792bc15..adf7f2554 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/build.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/build.sbt @@ -38,4 +38,5 @@ customAnnotationsMapping := { } generateCodegenTargetPath in GraphQLCodegenConfig := crossTarget.value / "src_managed_graphql_scala" generateEqualsAndHashCode := true -generateToString := true \ No newline at end of file +generateToString := true +generateSealedInterfaces := true \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/src/main/resources/schema.graphqls b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/src/main/resources/schema.graphqls index cba4019cd..b028fcabf 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/src/main/resources/schema.graphqls +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/src/main/resources/schema.graphqls @@ -42,3 +42,5 @@ type Droid implements Character { } scalar Email + +union Role = Droid | Human diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/build.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/build.sbt index 4ed4c84b8..07f8abaac 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/build.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/build.sbt @@ -59,3 +59,5 @@ generateCodegenTargetPath in GraphQLCodegenConfig := crossTarget.value / "src_m generateEqualsAndHashCode := true generateToString := true + +generateSealedInterfaces := true \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/test/scala/test/Test.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/test/scala/test/Test.scala index e94859ede..4bfbb409a 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/test/scala/test/Test.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/test/scala/test/Test.scala @@ -1,9 +1,8 @@ package test -/** - * - * @author 梦境迷离 - * @version 1.0,2020/7/15 +/** @author + * 梦境迷离 + * @version 1.0,2020/7/15 */ object Test { diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt index 6e00a51aa..57fea3fd9 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt @@ -1 +1 @@ -version in ThisBuild := "5.6.1-SNAPSHOT" +ThisBuild / version := "5.6.1-SNAPSHOT" diff --git a/src/main/resources/templates/scala-lang/interface.ftl b/src/main/resources/templates/scala-lang/interface.ftl index c1b22b864..923a5e50c 100644 --- a/src/main/resources/templates/scala-lang/interface.ftl +++ b/src/main/resources/templates/scala-lang/interface.ftl @@ -42,7 +42,7 @@ import ${enum}._ <#list annotations as annotation> @${annotation} -trait ${className}<#if implements?has_content> extends<#list implements as interface> ${interface}<#if interface_has_next> with { +<#if generateSealedInterfaces>sealed trait ${className}<#if implements?has_content> extends<#list implements as interface> ${interface}<#if interface_has_next> with { <#if fields?has_content> <#list fields as field> diff --git a/src/main/resources/templates/scala-lang/union.ftl b/src/main/resources/templates/scala-lang/union.ftl index 79a26ca28..0dbd77087 100644 --- a/src/main/resources/templates/scala-lang/union.ftl +++ b/src/main/resources/templates/scala-lang/union.ftl @@ -19,6 +19,6 @@ package ${package} <#list annotations as annotation> @${annotation} -trait ${className} { +<#if generateSealedInterfaces>sealed trait ${className} { } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenSealedInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenSealedInterfacesTest.java new file mode 100644 index 000000000..07a775eae --- /dev/null +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenSealedInterfacesTest.java @@ -0,0 +1,53 @@ +package com.kobylynskyi.graphql.codegen.scala; + +import com.kobylynskyi.graphql.codegen.TestUtils; +import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; +import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; +import com.kobylynskyi.graphql.codegen.model.MappingConfig; +import com.kobylynskyi.graphql.codegen.utils.Utils; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.Objects; + +import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; +import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; +import static java.util.Collections.singletonList; + +class GraphQLCodegenSealedInterfacesTest { + private final File outputBuildDir = new File("build/generated"); + private final File outputScalaClassesDir = new File("build/generated/com/github/graphql"); + private final MappingConfig mappingConfig = new MappingConfig(); + + @BeforeEach + void init() { + mappingConfig.setGenerateParameterizedFieldsResolvers(false); + mappingConfig.setPackageName("com.github.graphql"); + mappingConfig.setGeneratedLanguage(GeneratedLanguage.SCALA); + mappingConfig.setGenerateToString(true); + mappingConfig.setGenerateApis(true); + mappingConfig.setGenerateClient(true); + mappingConfig.setGenerateEqualsAndHashCode(true); + mappingConfig.setGenerateBuilder(true); + mappingConfig.setGenerateSealedInterfaces(true); + } + + @AfterEach + void cleanup() { + Utils.deleteDir(outputBuildDir); + } + + @Test + void generate_MultipleInterfacesPerType() throws Exception { + new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); + File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); + + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/Comment_sealed_interfaces.scala.txt"), + getFileByName(files, "Comment.scala") + ); + } +} diff --git a/src/test/resources/expected-classes/scala/Comment_sealed_interfaces.scala.txt b/src/test/resources/expected-classes/scala/Comment_sealed_interfaces.scala.txt new file mode 100644 index 000000000..4e2d51a34 --- /dev/null +++ b/src/test/resources/expected-classes/scala/Comment_sealed_interfaces.scala.txt @@ -0,0 +1,49 @@ +package com.github.graphql + +import CommentAuthorAssociation._ + +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +sealed trait Comment { + + val author: Actor + + @javax.validation.constraints.NotNull + @com.fasterxml.jackson.module.scala.JsonScalaEnumeration(classOf[com.github.graphql.CommentAuthorAssociationTypeRefer]) + val authorAssociation: CommentAuthorAssociation + + @javax.validation.constraints.NotNull + val body: String + + @javax.validation.constraints.NotNull + val bodyHTML: String + + @javax.validation.constraints.NotNull + val bodyText: String + + @javax.validation.constraints.NotNull + val createdAt: String + + val createdViaEmail: Boolean + + val editor: Actor + + @javax.validation.constraints.NotNull + val id: String + + val includesCreatedEdit: Boolean + + val lastEditedAt: String + + val publishedAt: String + + @javax.validation.constraints.NotNull + val updatedAt: String + + val userContentEdits: UserContentEditConnection + + val viewerDidAuthor: Boolean + +} \ No newline at end of file From 3314b53351326af4fa3e70a6e330dfb38adc8a22 Mon Sep 17 00:00:00 2001 From: Upendra Rao Vedullapalli Date: Thu, 16 Mar 2023 12:52:13 +0100 Subject: [PATCH 16/25] Mitigate CVE-2022-37734 by updating graphql and jackson dependencies #1045 (#1046) Co-authored-by: Upendra Vedullapalli Co-authored-by: Bogdan Kobylynskyi <92bogdan@gmail.com> --- build.gradle | 4 +-- .../GraphQLCodegenAnnotationsTest.java | 2 ++ .../codegen/GraphQLCodegenApisTest.java | 2 ++ .../GraphQLCodegenFieldsResolversTest.java | 2 ++ .../codegen/GraphQLCodegenGitHubTest.java | 2 ++ .../codegen/GraphQLCodegenOptionalTest.java | 2 ++ .../codegen/GraphQLCodegenRequestTest.java | 2 ++ .../codegen/MaxQueryTokensExtension.java | 27 +++++++++++++++++++ .../kotlin/GraphQLCodegenGitHubTest.java | 3 +++ ...hQLCodegenInitializeNullableTypesTest.java | 3 +++ .../kotlin/GraphQLCodegenOpenclassesTest.java | 3 +++ .../GraphQLCodegenSealedInterfacesTest.java | 3 +++ .../scala/GraphQLCodegenAnnotationsTest.java | 3 +++ .../scala/GraphQLCodegenGitHubTest.java | 3 +++ .../scala/GraphQLCodegenOpenclassesTest.java | 3 +++ .../StockStatus.java.txt | 20 +++++++++++++- 16 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/kobylynskyi/graphql/codegen/MaxQueryTokensExtension.java diff --git a/build.gradle b/build.gradle index 945cbda8e..646f0e128 100644 --- a/build.gradle +++ b/build.gradle @@ -21,8 +21,8 @@ repositories { dependencies { compileOnly "org.freemarker:freemarker:2.3.31" - compileOnly "com.graphql-java:graphql-java:16.2" - compileOnly "com.fasterxml.jackson.core:jackson-databind:2.13.3" + compileOnly "com.graphql-java:graphql-java:20.0" + compileOnly "com.fasterxml.jackson.core:jackson-databind:2.14.2" compileOnly "com.typesafe:config:1.4.1" testImplementation "org.junit.jupiter:junit-jupiter-api:5.7.1" diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java index 511da3584..8b118eaa3 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -22,6 +23,7 @@ import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenAnnotationsTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java index c4c05a316..513e44fcc 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java @@ -10,6 +10,7 @@ import com.kobylynskyi.graphql.codegen.utils.Utils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -28,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenApisTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java index ca8c3fd14..2793dff5e 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -18,6 +19,7 @@ import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenFieldsResolversTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java index 13ee583e5..81f29ac18 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -17,6 +18,7 @@ import static java.util.Collections.singletonList; import static org.hamcrest.MatcherAssert.assertThat; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenGitHubTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java index b36831dca..ba64a99f1 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -16,6 +17,7 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenOptionalTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java index e2b790a2b..bcafe0337 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -17,6 +18,7 @@ import static java.util.Collections.singletonList; import static org.junit.jupiter.api.Assertions.assertNotNull; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenRequestTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/MaxQueryTokensExtension.java b/src/test/java/com/kobylynskyi/graphql/codegen/MaxQueryTokensExtension.java new file mode 100644 index 000000000..a71538ab5 --- /dev/null +++ b/src/test/java/com/kobylynskyi/graphql/codegen/MaxQueryTokensExtension.java @@ -0,0 +1,27 @@ +package com.kobylynskyi.graphql.codegen; + +import graphql.parser.ParserOptions; +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +/** + * This extension is to increase the {@link ParserOptions#MAX_QUERY_TOKENS}} to 20_000 JVM wide + * to allow successful test schema parsing + */ +public class MaxQueryTokensExtension implements BeforeAllCallback, AfterAllCallback { + + private static final ParserOptions defaultJvmParserOptions = ParserOptions.getDefaultParserOptions(); + + @Override + public void beforeAll(ExtensionContext context) { + ParserOptions.setDefaultParserOptions( + ParserOptions.getDefaultParserOptions().transform(o -> o.maxTokens(20_000)) + ); + } + + @Override + public void afterAll(ExtensionContext context) { + ParserOptions.setDefaultParserOptions(defaultJvmParserOptions); + } +} diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java index 1a7016415..c8d631799 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.kotlin; +import com.kobylynskyi.graphql.codegen.MaxQueryTokensExtension; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -7,6 +8,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -21,6 +23,7 @@ import static java.util.Collections.singleton; import static java.util.Collections.singletonList; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenGitHubTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInitializeNullableTypesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInitializeNullableTypesTest.java index 369554f46..665f8fc3d 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInitializeNullableTypesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInitializeNullableTypesTest.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.kotlin; +import com.kobylynskyi.graphql.codegen.MaxQueryTokensExtension; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -7,6 +8,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.util.Objects; @@ -15,6 +17,7 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; import static java.util.Collections.singletonList; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenInitializeNullableTypesTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenOpenclassesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenOpenclassesTest.java index c7d59a5ae..cdb64e6e5 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenOpenclassesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenOpenclassesTest.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.kotlin; +import com.kobylynskyi.graphql.codegen.MaxQueryTokensExtension; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -7,6 +8,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.util.Objects; @@ -15,6 +17,7 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; import static java.util.Collections.singletonList; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenOpenclassesTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenSealedInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenSealedInterfacesTest.java index 84ffce0c0..6769239b4 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenSealedInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenSealedInterfacesTest.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.kotlin; +import com.kobylynskyi.graphql.codegen.MaxQueryTokensExtension; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -7,6 +8,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.util.Objects; @@ -15,6 +17,7 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; import static java.util.Collections.singletonList; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenSealedInterfacesTest { private final File outputBuildDir = new File("build/generated"); private final File outputScalaClassesDir = new File("build/generated/com/github/graphql"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java index e6a186f09..1230f47e4 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.scala; +import com.kobylynskyi.graphql.codegen.MaxQueryTokensExtension; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -7,6 +8,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -22,6 +24,7 @@ import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenAnnotationsTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java index e5a9c91fa..db7b73e00 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.scala; +import com.kobylynskyi.graphql.codegen.MaxQueryTokensExtension; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -8,6 +9,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -18,6 +20,7 @@ import static java.util.Collections.singletonList; import static org.hamcrest.MatcherAssert.assertThat; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenGitHubTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenOpenclassesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenOpenclassesTest.java index 189592f84..05ce65d98 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenOpenclassesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenOpenclassesTest.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.scala; +import com.kobylynskyi.graphql.codegen.MaxQueryTokensExtension; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -7,6 +8,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.io.IOException; @@ -16,6 +18,7 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; import static java.util.Collections.singletonList; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenOpenclassesTest { private final File outputBuildDir = new File("build/generated"); diff --git a/src/test/resources/expected-classes/from-introspection-result/StockStatus.java.txt b/src/test/resources/expected-classes/from-introspection-result/StockStatus.java.txt index b38c08360..f8b5858ff 100644 --- a/src/test/resources/expected-classes/from-introspection-result/StockStatus.java.txt +++ b/src/test/resources/expected-classes/from-introspection-result/StockStatus.java.txt @@ -6,11 +6,29 @@ package com.kobylynskyi.graphql.test1; ) public enum StockStatus { + /** + * + */ IN_STOCK("IN_STOCK"), + /** + * + */ SPECIAL_ORDER("SPECIAL_ORDER"), + /** + * + */ BACK_ORDERED("BACK_ORDERED"), + /** + * + */ COMING_SOON("COMING_SOON"), + /** + * + */ SOLD_OUT("SOLD_OUT"), + /** + * + */ DISCONTINUED("DISCONTINUED"); private final String graphqlName; @@ -24,4 +42,4 @@ public enum StockStatus { return this.graphqlName; } -} \ No newline at end of file +} From 0c3674bb0baf949a950a079912ce63cf509cbe1e Mon Sep 17 00:00:00 2001 From: Upendra Rao Vedullapalli Date: Thu, 16 Mar 2023 14:49:32 +0100 Subject: [PATCH 17/25] fix: updated unit test with increased max query tokens (#1047) --- .../codegen/scala/GraphQLCodegenSealedInterfacesTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenSealedInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenSealedInterfacesTest.java index 07a775eae..9bb40de88 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenSealedInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenSealedInterfacesTest.java @@ -1,13 +1,14 @@ package com.kobylynskyi.graphql.codegen.scala; +import com.kobylynskyi.graphql.codegen.MaxQueryTokensExtension; import com.kobylynskyi.graphql.codegen.TestUtils; -import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; import com.kobylynskyi.graphql.codegen.utils.Utils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.io.File; import java.util.Objects; @@ -16,6 +17,7 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; import static java.util.Collections.singletonList; +@ExtendWith(MaxQueryTokensExtension.class) class GraphQLCodegenSealedInterfacesTest { private final File outputBuildDir = new File("build/generated"); private final File outputScalaClassesDir = new File("build/generated/com/github/graphql"); From 58f10612e9a1c2d0fa3cdf83060e44fa6d832532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Buchart?= Date: Sat, 18 Mar 2023 02:41:59 +0100 Subject: [PATCH 18/25] Add resolver argument annotation on parameterized field resolvers (#1044) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add resolver argument annotation test assertion Signed-off-by: Clément BUCHART --------- Signed-off-by: Clément BUCHART --- .../codegen/mapper/AnnotationsMapper.java | 10 +++++--- .../graphql/codegen/model/MappingContext.java | 7 ++++++ .../GraphQLCodegenAnnotationsTest.java | 4 ++++ ...pertyResolver_ArgumentAnnotations.java.txt | 23 +++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/expected-classes/annotation/EventPropertyResolver_ArgumentAnnotations.java.txt diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java index fbfb2453f..0ec2c7136 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/AnnotationsMapper.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static com.kobylynskyi.graphql.codegen.mapper.GraphQLTypeMapper.getDirectives; import static com.kobylynskyi.graphql.codegen.mapper.GraphQLTypeMapper.getMandatoryType; @@ -123,9 +124,12 @@ public List getAnnotations(MappingContext mappingContext, String graphQL } } // 6. Add annotations for resolver arguments - if (!Utils.isEmpty(mappingContext.getResolverArgumentAnnotations()) - && mappingContext.getOperationsName().contains(parentTypeName)) { - annotations.addAll(mappingContext.getResolverArgumentAnnotations()); + if (!Utils.isEmpty(mappingContext.getResolverArgumentAnnotations())) { + if (mappingContext.getOperationsName().contains(parentTypeName) + || (def instanceof InputValueDefinition + && !mappingContext.getInputsName().contains(parentTypeName))) { + annotations.addAll(mappingContext.getResolverArgumentAnnotations()); + } } // 7. Add annotations for parametrized resolvers if (!Utils.isEmpty(mappingContext.getParametrizedResolverAnnotations()) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 899ddf5aa..7768ab8f2 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -31,6 +31,7 @@ public class MappingContext implements GraphQLCodegenConfiguration { private final Set interfacesName; private final Set unionsName; private final Set operationsName; + private final Set inputsName; private final Map> interfaceChildren; private final GeneratedInformation generatedInformation; private final DataModelMapperFactory dataModelMapperFactory; @@ -49,6 +50,8 @@ private MappingContext(File outputDirectory, this.typesUnionsInterfacesNames = document.getTypesUnionsInterfacesNames(); this.interfacesName = document.getInterfacesNames(); this.unionsName = document.getUnionsNames(); + this.inputsName = document.getInputDefinitions().stream().map(ExtendedDefinition::getName) + .collect(Collectors.toSet()); this.interfaceChildren = document.getInterfaceChildren(); this.generatedInformation = generatedInformation; this.operationsName = document.getOperationsNames(); @@ -366,6 +369,10 @@ public Set getOperationsName() { return operationsName; } + public Set getInputsName() { + return inputsName; + } + public Map> getInterfaceChildren() { return interfaceChildren; } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java index 8b118eaa3..9c1e23ae7 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java @@ -200,6 +200,7 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { @Test void generate_ResolverArgumentAnnotations() throws Exception { mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); + mappingConfig.setGenerateParameterizedFieldsResolvers(true); mappingConfig.setResolverArgumentAnnotations(singleton( "@org.springframework.graphql.data.method.annotation.Argument")); @@ -212,6 +213,9 @@ void generate_ResolverArgumentAnnotations() throws Exception { assertSameTrimmedContent( new File("src/test/resources/expected-classes/annotation/QueryResolver_ArgumentAnnotations.java.txt"), getFileByName(files, "QueryResolver.java")); + assertSameTrimmedContent(new File("src/test/resources/expected-classes/annotation/" + + "EventPropertyResolver_ArgumentAnnotations.java.txt"), + getFileByName(files, "EventPropertyResolver.java")); } @Test diff --git a/src/test/resources/expected-classes/annotation/EventPropertyResolver_ArgumentAnnotations.java.txt b/src/test/resources/expected-classes/annotation/EventPropertyResolver_ArgumentAnnotations.java.txt new file mode 100644 index 000000000..0394437c1 --- /dev/null +++ b/src/test/resources/expected-classes/annotation/EventPropertyResolver_ArgumentAnnotations.java.txt @@ -0,0 +1,23 @@ +package com.kobylynskyi.graphql.test1; + + +/** + * Resolver for EventProperty + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public interface EventPropertyResolver { + + /** + * Properties + */ + java.util.List child(EventProperty eventProperty, @org.springframework.graphql.data.method.annotation.Argument Integer first, @org.springframework.graphql.data.method.annotation.Argument Integer last, graphql.schema.DataFetchingEnvironment env) throws Exception; + + /** + * Parent event of the property + */ + Event parent(EventProperty eventProperty, @org.springframework.graphql.data.method.annotation.Argument EventStatus withStatus, @org.springframework.graphql.data.method.annotation.Argument String createdAfter, graphql.schema.DataFetchingEnvironment env) throws Exception; + +} From 73a342e6a7b7673b191091f08d3cdcde5c10f31f Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Fri, 17 Mar 2023 22:50:20 -0400 Subject: [PATCH 19/25] Add test to show how to generate nullable types instead of primitives #1023 --- .../codegen/GraphQLCodegenOptionalTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java index ba64a99f1..80fcf1171 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java @@ -12,8 +12,10 @@ import java.io.File; import java.io.IOException; import java.nio.file.Paths; +import java.util.HashMap; import java.util.Objects; +import static com.kobylynskyi.graphql.codegen.TestUtils.assertFileContainsElements; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; @@ -98,6 +100,26 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { getFileByName(files, "TypeWithMandatoryField.java")); } + /** + * @see Related issue in GitHub + */ + @Test + void generate_ObjectsInsteadOfPrimitives() throws Exception { + mappingConfig.setCustomTypesMapping(new HashMap() {{ + put("Int!", "Integer"); + }}); + schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); + + generate(); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + // Integer is generated instead of int + assertFileContainsElements(files, "TypeWithMandatoryField.java", + " @javax.validation.constraints.NotNull", + " private Integer test;"); + } + private void generate() throws IOException { new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); From 134bc891198f967a7120319358f6cd1f3ec31a58 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sat, 18 Mar 2023 20:02:43 -0400 Subject: [PATCH 20/25] New config to generate models with public fields #864 (#1049) generateModelsWithPublicFields --- docs/codegen-options.md | 1 + .../gradle/GraphQLCodegenGradleTask.java | 13 ++ .../graphql/codegen/GraphQLCodegenMojo.java | 9 ++ .../graphql/codegen/GraphQLCodegenKeys.scala | 7 +- .../codegen/GraphQLCodegenPlugin.scala | 20 +-- .../FieldDefinitionToParameterMapper.java | 1 + ...InputValueDefinitionToParameterMapper.java | 1 + .../codegen/mapper/UnknownFieldsSupport.java | 1 + .../model/GraphQLCodegenConfiguration.java | 8 ++ .../graphql/codegen/model/MappingConfig.java | 12 ++ .../codegen/model/MappingConfigConstants.java | 3 + ...MappingConfigDefaultValuesInitializer.java | 4 + .../graphql/codegen/model/MappingContext.java | 5 + .../codegen/model/ParameterDefinition.java | 9 ++ .../graphql/codegen/utils/Utils.java | 5 + .../java-lang/parametrized_input.ftl | 50 +++---- .../resources/templates/java-lang/type.ftl | 42 +++--- .../codegen/GraphQLCodegenDefaultsTest.java | 2 +- .../graphql/codegen/GraphQLCodegenTest.java | 54 +++++++ ...ildParametrizedInput_publicfields.java.txt | 48 +++++++ ...edInput_publicfields_noargsconstr.java.txt | 44 ++++++ .../public-fields/Event_publicfields.java.txt | 135 ++++++++++++++++++ ...publicfields_builder_noargsconstr.java.txt | 134 +++++++++++++++++ ...blicfields_nobuilder_noargsconstr.java.txt | 30 ++++ 24 files changed, 585 insertions(+), 53 deletions(-) create mode 100644 src/test/resources/expected-classes/public-fields/EventPropertyChildParametrizedInput_publicfields.java.txt create mode 100644 src/test/resources/expected-classes/public-fields/EventPropertyChildParametrizedInput_publicfields_noargsconstr.java.txt create mode 100644 src/test/resources/expected-classes/public-fields/Event_publicfields.java.txt create mode 100644 src/test/resources/expected-classes/public-fields/Event_publicfields_builder_noargsconstr.java.txt create mode 100644 src/test/resources/expected-classes/public-fields/Event_publicfields_nobuilder_noargsconstr.java.txt diff --git a/docs/codegen-options.md b/docs/codegen-options.md index e3e0d289f..0ea1dbe10 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -43,6 +43,7 @@ | `useOptionalForNullableReturnTypes` | Boolean | False | Specifies whether nullable return types of api methods should be wrapped into [`java.util.Optional<>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Optional.html). Lists will not be wrapped. | | `generateApisWithThrowsException` | Boolean | True | Specifies whether api interface methods should have `throws Exception` in signature. | | `generateNoArgsConstructorOnly` | Boolean | False | Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is true | +| `generateModelsWithPublicFields` | Boolean | False | Specifies whether model classes should have public fields and NO getters/setters. By default, fields are private and there are getters/setters for each field. | | `apiReturnType` | String | Empty | Return type for api methods (query/mutation). For example: `reactor.core.publisher.Mono`, etc. | | `apiReturnListType` | String | Empty | Return type for api methods (query/mutation) having list type. For example: `reactor.core.publisher.Flux`, etc. By default is empty, so `apiReturnType` will be used. | | `subscriptionReturnType` | String | Empty | Return type for subscription methods. For example: `org.reactivestreams.Publisher`, `io.reactivex.Observable`, etc. | diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java index c122a3ac6..1dbff1ca6 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java @@ -85,6 +85,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode private Boolean generateJacksonTypeIdResolver = MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER; private Boolean addGeneratedAnnotation = MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION; private Boolean generateNoArgsConstructorOnly = MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY; + private Boolean generateModelsWithPublicFields = MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS; private String generatedAnnotation; private Set fieldsWithResolvers = new HashSet<>(); private Set fieldsWithoutResolvers = new HashSet<>(); @@ -157,6 +158,7 @@ public void generate() throws Exception { mappingConfig.setGenerateApisWithThrowsException(generateApisWithThrowsException); mappingConfig.setGenerateJacksonTypeIdResolver(generateJacksonTypeIdResolver); mappingConfig.setGenerateNoArgsConstructorOnly(generateNoArgsConstructorOnly); + mappingConfig.setGenerateModelsWithPublicFields(generateModelsWithPublicFields); mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation); mappingConfig.setGeneratedAnnotation(generatedAnnotation); mappingConfig.setApiReturnType(apiReturnType); @@ -695,6 +697,17 @@ public void setGenerateNoArgsConstructorOnly(Boolean generateNoArgsConstructorOn this.generateNoArgsConstructorOnly = generateNoArgsConstructorOnly; } + @Input + @Optional + @Override + public Boolean isGenerateModelsWithPublicFields() { + return generateModelsWithPublicFields; + } + + public void setGenerateModelsWithPublicFields(Boolean generateModelsWithPublicFields) { + this.generateModelsWithPublicFields = generateModelsWithPublicFields; + } + @Input @Optional @Override diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java index 9a2fd8655..18af6a2a1 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java @@ -158,6 +158,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo @Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY_STRING) private boolean generateNoArgsConstructorOnly; + @Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS_STRING) + private boolean generateModelsWithPublicFields; + @Parameter private String generatedAnnotation; @@ -275,6 +278,7 @@ public void execute() throws MojoExecutionException { mappingConfig.setAddGeneratedAnnotation(addGeneratedAnnotation); mappingConfig.setGeneratedAnnotation(generatedAnnotation); mappingConfig.setGenerateNoArgsConstructorOnly(generateNoArgsConstructorOnly); + mappingConfig.setGenerateModelsWithPublicFields(generateModelsWithPublicFields); mappingConfig.setFieldsWithResolvers(mapToHashSet(fieldsWithResolvers)); mappingConfig.setFieldsWithoutResolvers(mapToHashSet(fieldsWithoutResolvers)); mappingConfig.setRelayConfig(relayConfig); @@ -684,6 +688,11 @@ public Boolean isGenerateNoArgsConstructorOnly() { return generateNoArgsConstructorOnly; } + @Override + public Boolean isGenerateModelsWithPublicFields() { + return generateModelsWithPublicFields; + } + public ParentInterfacesConfig getParentInterfaces() { return parentInterfaces; } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala index ca9090e03..3c63e379c 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala @@ -151,11 +151,16 @@ trait GraphQLCodegenKeys { "Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package." ) - // not support in scala + // not supported in scala val generateNoArgsConstructorOnly = settingKey[Boolean]( "Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is .true." ) + // not supported in scala + val generateModelsWithPublicFields = settingKey[Boolean]( + "Specifies whether model classes should have public fields and NO getters/setters. By default, fields are private and there are getters/setters for each field." + ) + // for version val javaxValidationApiVersion = settingKey[Option[String]]("javax-validation-api version") val graphqlJavaCodegenVersion = settingKey[Option[String]]("graphql-java-codegen version") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index 8f0a04d0e..0fe649e68 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -118,16 +118,17 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co generateBuilder := MappingConfigConstants.DEFAULT_BUILDER, generateApis := MappingConfigConstants.DEFAULT_GENERATE_APIS, generateEqualsAndHashCode := MappingConfigConstants.DEFAULT_EQUALS_AND_HASHCODE, - generateImmutableModels := MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS, // TODO change default value - generateToString := MappingConfigConstants.DEFAULT_TO_STRING, + generateImmutableModels := MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS, // TODO change default value + generateToString := MappingConfigConstants.DEFAULT_TO_STRING, // parent interfaces configs: - parentInterfaces := parentInterfacesConfig, - generateAllMethodInProjection := MappingConfigConstants.DEFAULT_GENERATE_ALL_METHOD, - responseProjectionMaxDepth := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_MAX_DEPTH, - supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS, - unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME, - generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY, - skip := false + parentInterfaces := parentInterfacesConfig, + generateAllMethodInProjection := MappingConfigConstants.DEFAULT_GENERATE_ALL_METHOD, + responseProjectionMaxDepth := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_MAX_DEPTH, + supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS, + unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME, + generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY, + generateModelsWithPublicFields := MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS, + skip := false ) private def getMappingConfig(): Def.Initialize[MappingConfig] = Def.setting { @@ -192,6 +193,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co mappingConfig.setGenerateModelOpenClasses((GraphQLCodegenConfig / generateModelOpenClasses).value) mappingConfig.setGenerateJacksonTypeIdResolver((GraphQLCodegenConfig / generateJacksonTypeIdResolver).value); mappingConfig.setGenerateNoArgsConstructorOnly((GraphQLCodegenConfig / generateNoArgsConstructorOnly).value); + mappingConfig.setGenerateModelsWithPublicFields((GraphQLCodegenConfig / generateModelsWithPublicFields).value); mappingConfig.setSupportUnknownFields((GraphQLCodegenConfig / supportUnknownFields).value) mappingConfig.setUnknownFieldsPropertyName((GraphQLCodegenConfig / unknownFieldsPropertyName).value) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java index 3ec8fe5ea..fb4bd5e1a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java @@ -139,6 +139,7 @@ private ParameterDefinition mapField(MappingContext mappingContext, mappingContext, fieldDef.getType(), fieldDef, parentDefinition.getName(), false)); parameter.setJavaDoc(fieldDef.getJavaDoc()); parameter.setDeprecated(DeprecatedDefinitionBuilder.build(mappingContext, fieldDef)); + parameter.setVisibility(Utils.getFieldVisibility(mappingContext)); parameter.setMandatory(namedDefinition.isMandatory()); parameter.setSerializeUsingObjectMapper(namedDefinition.isSerializeUsingObjectMapper()); parameter.setGetterMethodName(dataModelMapper.capitalizeMethodNameIfRestricted(mappingContext, diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java index 32734491c..61c14b686 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java @@ -66,6 +66,7 @@ private ParameterDefinition map(MappingContext mappingContext, InputValueDefinit namedDefinition.getJavaName())); parameter.setDefaultValue(valueMapper.map( mappingContext, inputValueDefinition.getDefaultValue(), inputValueDefinition.getType())); + parameter.setVisibility(Utils.getFieldVisibility(mappingContext)); parameter.setAnnotations(annotationsMapper.getAnnotations(mappingContext, inputValueDefinition.getType(), inputValueDefinition, parentTypeName, false)); parameter.setDeprecated(DeprecatedDefinitionBuilder.build(mappingContext, inputValueDefinition)); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnknownFieldsSupport.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnknownFieldsSupport.java index 1b70b5739..3930f1d34 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnknownFieldsSupport.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnknownFieldsSupport.java @@ -30,6 +30,7 @@ default Optional createUnknownFields(MappingContext mapping unknownFields.setName(mappingContext.getUnknownFieldsPropertyName()); unknownFields.setGetterMethodName("get" + Utils.capitalize(mappingContext.getUnknownFieldsPropertyName())); unknownFields.setOriginalName(mappingContext.getUnknownFieldsPropertyName()); + unknownFields.setVisibility(Utils.getFieldVisibility(mappingContext)); unknownFields.setType("java.util.Map"); unknownFields.setAnnotations(Arrays.asList( "com.fasterxml.jackson.annotation.JsonAnyGetter", diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java index fd7d024c2..7972ca044 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java @@ -522,5 +522,13 @@ public interface GraphQLCodegenConfiguration { */ Boolean isGenerateNoArgsConstructorOnly(); + /** + * Specifies whether model classes should have public or private fields. + * + * @return true if model classes should have public fields and no getters/setters. + * false if model classes should have private fields and getters/setters. + */ + Boolean isGenerateModelsWithPublicFields(); + } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java index 747254d65..72de287c0 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java @@ -56,6 +56,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable fieldsWithResolvers = new HashSet<>(); @@ -212,6 +213,8 @@ public void combine(MappingConfig source) { GraphQLCodegenConfiguration::getGeneratedAnnotation); generateNoArgsConstructorOnly = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::isGenerateNoArgsConstructorOnly); + generateModelsWithPublicFields = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::isGenerateNoArgsConstructorOnly); } private T getValueOrDefaultToThis(MappingConfig source, Function getValueFunction) { @@ -754,4 +757,13 @@ public Boolean isGenerateNoArgsConstructorOnly() { public void setGenerateNoArgsConstructorOnly(Boolean generateNoArgsConstructorOnly) { this.generateNoArgsConstructorOnly = generateNoArgsConstructorOnly; } + + @Override + public Boolean isGenerateModelsWithPublicFields() { + return generateModelsWithPublicFields; + } + + public void setGenerateModelsWithPublicFields(Boolean generateModelsWithPublicFields) { + this.generateModelsWithPublicFields = generateModelsWithPublicFields; + } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java index 4ff1d031e..d940f0fab 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java @@ -101,6 +101,9 @@ public class MappingConfigConstants { public static final boolean DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY = false; public static final String DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY_STRING = "false"; + public static final boolean DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS = false; + public static final String DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS_STRING = "false"; + private MappingConfigConstants() { } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigDefaultValuesInitializer.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigDefaultValuesInitializer.java index 4ca94eae7..b838b1b72 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigDefaultValuesInitializer.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigDefaultValuesInitializer.java @@ -118,6 +118,10 @@ public static void initDefaultValues(MappingConfig mappingConfig) { mappingConfig.setGenerateNoArgsConstructorOnly( MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY); } + if (mappingConfig.isGenerateModelsWithPublicFields() == null) { + mappingConfig.setGenerateModelsWithPublicFields( + MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS); + } } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 7768ab8f2..6420a8158 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -349,6 +349,11 @@ public Boolean isGenerateNoArgsConstructorOnly() { return config.isGenerateNoArgsConstructorOnly(); } + @Override + public Boolean isGenerateModelsWithPublicFields() { + return config.isGenerateModelsWithPublicFields(); + } + public ExtendedDocument getDocument() { return document; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java index b2c571bce..9c1b8884a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java @@ -26,6 +26,7 @@ public class ParameterDefinition { */ private String originalName; private String defaultValue; + private String visibility; private boolean isMandatory; private List annotations = new ArrayList<>(); private List javaDoc = new ArrayList<>(); @@ -82,6 +83,14 @@ public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } + public String getVisibility() { + return visibility; + } + + public void setVisibility(String visibility) { + this.visibility = visibility; + } + public boolean isMandatory() { return isMandatory; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java b/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java index f369876ea..8315f9686 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java @@ -1,6 +1,7 @@ package com.kobylynskyi.graphql.codegen.utils; import com.fasterxml.jackson.databind.ObjectMapper; +import com.kobylynskyi.graphql.codegen.model.MappingContext; import com.kobylynskyi.graphql.codegen.model.exception.UnableToCreateDirectoryException; import com.kobylynskyi.graphql.codegen.model.exception.UnableToDeleteDirectoryException; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation; @@ -263,4 +264,8 @@ public static String wrapString(String str, String wrapStart, String wrapEnd) { return wrapStart + str + wrapEnd; } + public static String getFieldVisibility(MappingContext mappingContext) { + return Boolean.TRUE.equals(mappingContext.isGenerateModelsWithPublicFields()) ? "public" : "private"; + } + } diff --git a/src/main/resources/templates/java-lang/parametrized_input.ftl b/src/main/resources/templates/java-lang/parametrized_input.ftl index e6fd88d02..1aaa8ff4a 100644 --- a/src/main/resources/templates/java-lang/parametrized_input.ftl +++ b/src/main/resources/templates/java-lang/parametrized_input.ftl @@ -36,7 +36,7 @@ public class ${className} implements GraphQLParametrizedInput { <#list field.annotations as annotation> @${annotation} - private ${field.type} ${field.name}<#if field.defaultValue?has_content> = ${field.defaultValue}; + ${field.visibility} ${field.type} ${field.name}<#if field.defaultValue?has_content> = ${field.defaultValue}; @@ -52,32 +52,34 @@ public class ${className} implements GraphQLParametrizedInput { <#if fields?has_content> -<#list fields as field> -<#if field.javaDoc?has_content> + <#list fields as field> + <#if field.visibility != 'public'> + <#if field.javaDoc?has_content> /** -<#list field.javaDoc as javaDocLine> + <#list field.javaDoc as javaDocLine> * ${javaDocLine} - + */ - -<#if field.deprecated?has_content> + + <#if field.deprecated?has_content> @${field.deprecated.annotation} - + public ${className} ${field.name}(${field.type} ${field.name}) { this.${field.name} = ${field.name}; return this; } - + + @Override public ${className} deepCopy() { ${className} parametrizedInput = new ${className}(); - <#if fields?has_content> - <#list fields as field> +<#if fields?has_content> + <#list fields as field> parametrizedInput.${field.name}(this.${field.name}); - - + + return parametrizedInput; } @@ -91,21 +93,21 @@ public class ${className} implements GraphQLParametrizedInput { return false; } final ${className} that = (${className}) obj; -<#if fields?has_content> + <#if fields?has_content> return <#list fields as field>Objects.equals(${field.name}, that.${field.name})<#if field_has_next> && ; -<#else> + <#else> return true; - + } @Override public int hashCode() { -<#if fields?has_content> + <#if fields?has_content> return Objects.hash(<#list fields as field>${field.name}<#if field_has_next>, ); -<#else> + <#else> return 0; - + } @@ -113,15 +115,15 @@ public class ${className} implements GraphQLParametrizedInput { public String toString() { StringJoiner joiner = new StringJoiner(", ", "(", ")"); <#if fields?has_content> -<#list fields as field> -<#if MapperUtil.isJavaPrimitive(field.type)> + <#list fields as field> + <#if MapperUtil.isJavaPrimitive(field.type)> joiner.add("${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}<#if field.serializeUsingObjectMapper>, true)); -<#else> + <#else> if (${field.name} != null) { joiner.add("${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}<#if field.serializeUsingObjectMapper>, true)); } - - + + return joiner.toString(); } diff --git a/src/main/resources/templates/java-lang/type.ftl b/src/main/resources/templates/java-lang/type.ftl index 7ae44602f..72f3698d4 100644 --- a/src/main/resources/templates/java-lang/type.ftl +++ b/src/main/resources/templates/java-lang/type.ftl @@ -46,7 +46,7 @@ public class ${className} implements java.io.Serializable<#if implements?has_con <#list field.annotations as annotation> @${annotation} - private ${field.type} ${field.name}<#if field.defaultValue?has_content> = ${field.defaultValue}; + ${field.visibility} ${field.type} ${field.name}<#if field.defaultValue?has_content> = ${field.defaultValue}; @@ -63,39 +63,41 @@ public class ${className} implements java.io.Serializable<#if implements?has_con <#if fields?has_content> <#list fields as field> - <#if field.javaDoc?has_content> + <#if field.visibility != 'public'> + <#if field.javaDoc?has_content> /** - <#list field.javaDoc as javaDocLine> + <#list field.javaDoc as javaDocLine> * ${javaDocLine} - + */ - - <#if field.deprecated?has_content> + + <#if field.deprecated?has_content> @${field.deprecated.annotation} - - <#if field.mandatory && field.definitionInParentType?has_content && !field.definitionInParentType.mandatory> + + <#if field.mandatory && field.definitionInParentType?has_content && !field.definitionInParentType.mandatory> public ${field.definitionInParentType.type} ${field.getterMethodName}() { - <#else> + <#else> public ${field.type} ${field.getterMethodName}() { - + return ${field.name}; } - <#if !immutableModels> - <#if field.javaDoc?has_content> + <#if !immutableModels> + <#if field.javaDoc?has_content> /** - <#list field.javaDoc as javaDocLine> + <#list field.javaDoc as javaDocLine> * ${javaDocLine} - + */ - - <#if field.deprecated?has_content> + + <#if field.deprecated?has_content> @${field.deprecated.annotation} - + public void set${field.name?cap_first}(${field.type} ${field.name}) { this.${field.name} = ${field.name}; } - + + <#if equalsAndHashCode> @@ -197,7 +199,11 @@ public class ${className} implements java.io.Serializable<#if implements?has_con <#if generateNoArgsConstructorOnly> ${className} result = new ${className}; <#list fields as field> + <#if field.visibility == 'public'> + result.${field.name}(this.${field.name}); + <#else> result.set${field.name?cap_first}(this.${field.name}); + return result; <#else> diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java index fac00d6c8..f8df4d969 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java @@ -53,7 +53,7 @@ void generate_CheckFiles() throws Exception { } @Test - void generate_UnkonwnFields() throws Exception { + void generate_UnknownFields() throws Exception { mappingConfig.setSupportUnknownFields(true); mappingConfig.setUnknownFieldsPropertyName("userDefinedFields"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java index 4b06776c0..29d02cd1a 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java @@ -441,6 +441,60 @@ void generate_NoArgsConstructor_ParametrizedInput() throws Exception { getFileByName(files, "EventPropertyChildParametrizedInput.java")); } + @Test + void generate_PublicFields() throws Exception { + mappingConfig.setGenerateModelsWithPublicFields(true); + mappingConfig.setGenerateClient(true); + + generate("src/test/resources/schemas/test.graphqls"); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/public-fields/" + + "Event_publicfields.java.txt"), + getFileByName(files, "Event.java")); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/public-fields/" + + "EventPropertyChildParametrizedInput_publicfields.java.txt"), + getFileByName(files, "EventPropertyChildParametrizedInput.java")); + } + + @Test + void generate_PublicFields_NoArgsConstructor_immutableModels() throws Exception { + mappingConfig.setGenerateModelsWithPublicFields(true); + mappingConfig.setGenerateNoArgsConstructorOnly(true); + mappingConfig.setGenerateImmutableModels(true); + mappingConfig.setGenerateClient(true); + + generate("src/test/resources/schemas/test.graphqls"); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/public-fields/" + + "Event_publicfields_builder_noargsconstr.java.txt"), + getFileByName(files, "Event.java")); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/public-fields/" + + "EventPropertyChildParametrizedInput_publicfields_noargsconstr.java.txt"), + getFileByName(files, "EventPropertyChildParametrizedInput.java")); + } + + @Test + void generate_PublicFields_NoBuilder_NoArgsConstructor() throws Exception { + mappingConfig.setGenerateModelsWithPublicFields(true); + mappingConfig.setGenerateNoArgsConstructorOnly(true); + mappingConfig.setGenerateImmutableModels(true); + mappingConfig.setGenerateBuilder(false); + + generate("src/test/resources/schemas/test.graphqls"); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + + assertSameTrimmedContent(new File("src/test/resources/expected-classes/public-fields/" + + "Event_publicfields_nobuilder_noargsconstr.java.txt"), + getFileByName(files, "Event.java")); + } + private List generate(String path) throws IOException { return new JavaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)).generate(); diff --git a/src/test/resources/expected-classes/public-fields/EventPropertyChildParametrizedInput_publicfields.java.txt b/src/test/resources/expected-classes/public-fields/EventPropertyChildParametrizedInput_publicfields.java.txt new file mode 100644 index 000000000..cf669650c --- /dev/null +++ b/src/test/resources/expected-classes/public-fields/EventPropertyChildParametrizedInput_publicfields.java.txt @@ -0,0 +1,48 @@ +package com.kobylynskyi.graphql.test1; + +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput; +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer; +import java.util.StringJoiner; + +/** + * Parametrized input for field child in type EventProperty + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class EventPropertyChildParametrizedInput implements GraphQLParametrizedInput { + + public Integer first; + public Integer last; + + public EventPropertyChildParametrizedInput() { + } + + public EventPropertyChildParametrizedInput(Integer first, Integer last) { + this.first = first; + this.last = last; + } + + @Override + public EventPropertyChildParametrizedInput deepCopy() { + EventPropertyChildParametrizedInput parametrizedInput = new EventPropertyChildParametrizedInput(); + parametrizedInput.first(this.first); + parametrizedInput.last(this.last); + return parametrizedInput; + } + + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(", ", "(", ")"); + if (first != null) { + joiner.add("first: " + GraphQLRequestSerializer.getEntry(first)); + } + if (last != null) { + joiner.add("last: " + GraphQLRequestSerializer.getEntry(last)); + } + return joiner.toString(); + } + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/public-fields/EventPropertyChildParametrizedInput_publicfields_noargsconstr.java.txt b/src/test/resources/expected-classes/public-fields/EventPropertyChildParametrizedInput_publicfields_noargsconstr.java.txt new file mode 100644 index 000000000..d408db806 --- /dev/null +++ b/src/test/resources/expected-classes/public-fields/EventPropertyChildParametrizedInput_publicfields_noargsconstr.java.txt @@ -0,0 +1,44 @@ +package com.kobylynskyi.graphql.test1; + +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput; +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer; +import java.util.StringJoiner; + +/** + * Parametrized input for field child in type EventProperty + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class EventPropertyChildParametrizedInput implements GraphQLParametrizedInput { + + public Integer first; + public Integer last; + + public EventPropertyChildParametrizedInput() { + } + + + @Override + public EventPropertyChildParametrizedInput deepCopy() { + EventPropertyChildParametrizedInput parametrizedInput = new EventPropertyChildParametrizedInput(); + parametrizedInput.first(this.first); + parametrizedInput.last(this.last); + return parametrizedInput; + } + + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(", ", "(", ")"); + if (first != null) { + joiner.add("first: " + GraphQLRequestSerializer.getEntry(first)); + } + if (last != null) { + joiner.add("last: " + GraphQLRequestSerializer.getEntry(last)); + } + return joiner.toString(); + } + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/public-fields/Event_publicfields.java.txt b/src/test/resources/expected-classes/public-fields/Event_publicfields.java.txt new file mode 100644 index 000000000..9abd08d32 --- /dev/null +++ b/src/test/resources/expected-classes/public-fields/Event_publicfields.java.txt @@ -0,0 +1,135 @@ +package com.kobylynskyi.graphql.test1; + +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer; +import java.util.StringJoiner; + +/** + * An event that describes a thing that happens + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class Event implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + public String id; + public String categoryId; + public java.util.List properties; + public EventStatus status; + public String createdBy; + public String createdDateTime; + public Boolean active; + public Integer rating; + + public Event() { + } + + public Event(String id, String categoryId, java.util.List properties, EventStatus status, String createdBy, String createdDateTime, Boolean active, Integer rating) { + this.id = id; + this.categoryId = categoryId; + this.properties = properties; + this.status = status; + this.createdBy = createdBy; + this.createdDateTime = createdDateTime; + this.active = active; + this.rating = rating; + } + + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(", ", "{ ", " }"); + if (id != null) { + joiner.add("id: " + GraphQLRequestSerializer.getEntry(id)); + } + if (categoryId != null) { + joiner.add("categoryId: " + GraphQLRequestSerializer.getEntry(categoryId)); + } + if (properties != null) { + joiner.add("properties: " + GraphQLRequestSerializer.getEntry(properties)); + } + if (status != null) { + joiner.add("status: " + GraphQLRequestSerializer.getEntry(status)); + } + if (createdBy != null) { + joiner.add("createdBy: " + GraphQLRequestSerializer.getEntry(createdBy)); + } + if (createdDateTime != null) { + joiner.add("createdDateTime: " + GraphQLRequestSerializer.getEntry(createdDateTime)); + } + if (active != null) { + joiner.add("active: " + GraphQLRequestSerializer.getEntry(active)); + } + if (rating != null) { + joiner.add("rating: " + GraphQLRequestSerializer.getEntry(rating)); + } + return joiner.toString(); + } + + public static Event.Builder builder() { + return new Event.Builder(); + } + + public static class Builder { + + private String id; + private String categoryId; + private java.util.List properties; + private EventStatus status; + private String createdBy; + private String createdDateTime; + private Boolean active; + private Integer rating; + + public Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setCategoryId(String categoryId) { + this.categoryId = categoryId; + return this; + } + + public Builder setProperties(java.util.List properties) { + this.properties = properties; + return this; + } + + public Builder setStatus(EventStatus status) { + this.status = status; + return this; + } + + public Builder setCreatedBy(String createdBy) { + this.createdBy = createdBy; + return this; + } + + public Builder setCreatedDateTime(String createdDateTime) { + this.createdDateTime = createdDateTime; + return this; + } + + public Builder setActive(Boolean active) { + this.active = active; + return this; + } + + public Builder setRating(Integer rating) { + this.rating = rating; + return this; + } + + + public Event build() { + return new Event(id, categoryId, properties, status, createdBy, createdDateTime, active, rating); + } + + } +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/public-fields/Event_publicfields_builder_noargsconstr.java.txt b/src/test/resources/expected-classes/public-fields/Event_publicfields_builder_noargsconstr.java.txt new file mode 100644 index 000000000..b786f0799 --- /dev/null +++ b/src/test/resources/expected-classes/public-fields/Event_publicfields_builder_noargsconstr.java.txt @@ -0,0 +1,134 @@ +package com.kobylynskyi.graphql.test1; + +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer; +import java.util.StringJoiner; + +/** + * An event that describes a thing that happens + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class Event implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + public String id; + public String categoryId; + public java.util.List properties; + public EventStatus status; + public String createdBy; + public String createdDateTime; + public Boolean active; + public Integer rating; + + public Event() { + } + + + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(", ", "{ ", " }"); + if (id != null) { + joiner.add("id: " + GraphQLRequestSerializer.getEntry(id)); + } + if (categoryId != null) { + joiner.add("categoryId: " + GraphQLRequestSerializer.getEntry(categoryId)); + } + if (properties != null) { + joiner.add("properties: " + GraphQLRequestSerializer.getEntry(properties)); + } + if (status != null) { + joiner.add("status: " + GraphQLRequestSerializer.getEntry(status)); + } + if (createdBy != null) { + joiner.add("createdBy: " + GraphQLRequestSerializer.getEntry(createdBy)); + } + if (createdDateTime != null) { + joiner.add("createdDateTime: " + GraphQLRequestSerializer.getEntry(createdDateTime)); + } + if (active != null) { + joiner.add("active: " + GraphQLRequestSerializer.getEntry(active)); + } + if (rating != null) { + joiner.add("rating: " + GraphQLRequestSerializer.getEntry(rating)); + } + return joiner.toString(); + } + + public static Event.Builder builder() { + return new Event.Builder(); + } + + public static class Builder { + + private String id; + private String categoryId; + private java.util.List properties; + private EventStatus status; + private String createdBy; + private String createdDateTime; + private Boolean active; + private Integer rating; + + public Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setCategoryId(String categoryId) { + this.categoryId = categoryId; + return this; + } + + public Builder setProperties(java.util.List properties) { + this.properties = properties; + return this; + } + + public Builder setStatus(EventStatus status) { + this.status = status; + return this; + } + + public Builder setCreatedBy(String createdBy) { + this.createdBy = createdBy; + return this; + } + + public Builder setCreatedDateTime(String createdDateTime) { + this.createdDateTime = createdDateTime; + return this; + } + + public Builder setActive(Boolean active) { + this.active = active; + return this; + } + + public Builder setRating(Integer rating) { + this.rating = rating; + return this; + } + + + public Event build() { + Event result = new Event; + result.id(this.id); + result.categoryId(this.categoryId); + result.properties(this.properties); + result.status(this.status); + result.createdBy(this.createdBy); + result.createdDateTime(this.createdDateTime); + result.active(this.active); + result.rating(this.rating); + return result; + } + + } +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/public-fields/Event_publicfields_nobuilder_noargsconstr.java.txt b/src/test/resources/expected-classes/public-fields/Event_publicfields_nobuilder_noargsconstr.java.txt new file mode 100644 index 000000000..8f70e8fc0 --- /dev/null +++ b/src/test/resources/expected-classes/public-fields/Event_publicfields_nobuilder_noargsconstr.java.txt @@ -0,0 +1,30 @@ +package com.kobylynskyi.graphql.test1; + + +/** + * An event that describes a thing that happens + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class Event implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + public String id; + public String categoryId; + public java.util.List properties; + public EventStatus status; + public String createdBy; + public String createdDateTime; + public Boolean active; + public Integer rating; + + public Event() { + } + + + + +} \ No newline at end of file From 0b212e6d33eb07d047f5b15d4bd43fe65d53d82c Mon Sep 17 00:00:00 2001 From: Marvin Froeder Date: Sun, 19 Mar 2023 21:48:54 +0000 Subject: [PATCH 21/25] Support overriding FreeMarker templates #860 (#1048) --------- Co-authored-by: Marvin Froeder Co-authored-by: Bogdan Kobylynskyi <92bogdan@gmail.com> Co-authored-by: Marvin Froeder --- .gitignore | 5 +- CONTRIBUTING.md | 6 +- docs/codegen-options.md | 131 +++++++++--------- .../gradle/GraphQLCodegenGradleTask.java | 17 ++- .../graphql/codegen/GraphQLCodegenMojo.java | 13 ++ .../graphql/codegen/GraphQLCodegenKeys.scala | 3 + .../codegen/GraphQLCodegenPlugin.scala | 23 +-- .../FreeMarkerTemplateFilesCreator.java | 16 ++- .../FreeMarkerTemplatesRegistry.java | 12 +- .../model/GraphQLCodegenConfiguration.java | 8 ++ .../graphql/codegen/model/MappingConfig.java | 29 +++- .../graphql/codegen/model/MappingContext.java | 6 + .../GraphQLCodegenCustomTemplatesTest.java | 54 ++++++++ src/test/resources/template/record_type.ftl | 19 +++ 14 files changed, 255 insertions(+), 87 deletions(-) create mode 100644 src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomTemplatesTest.java create mode 100644 src/test/resources/template/record_type.ftl diff --git a/.gitignore b/.gitignore index 377246b2f..963d0847c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,10 @@ build modules.xml .idea/misc.xml *.ipr - +bin/ +.classpath +.project +.settings/ ### Maven ### target/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 57e627d2a..929f2c3e8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,8 +36,7 @@ Please follow the steps below in order to make the changes: ./gradlew -p plugins/gradle/graphql-java-codegen-gradle-plugin clean build # Build Maven plugin - cd plugins/maven/graphql-java-codegen-maven-plugin - mvn clean verify + mvn clean verify -f plugins/maven/graphql-java-codegen-maven-plugin/pom.xml ``` 9. Make changes to the plugin code @@ -48,8 +47,7 @@ Please follow the steps below in order to make the changes: ./gradlew -p plugins/gradle/graphql-java-codegen-gradle-plugin clean build publishToMavenLocal # Install Maven plugin - cd plugins/maven/graphql-java-codegen-maven-plugin - mvn clean install + mvn clean install -f plugins/maven/graphql-java-codegen-maven-plugin/pom.xml ``` 11. Make sure that `example` projects are compiling and running. diff --git a/docs/codegen-options.md b/docs/codegen-options.md index 0ea1dbe10..6801803a8 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -1,70 +1,71 @@ # Codegen Options -| Option | Data Type | Default value | Description | -|:-----------------------------------------------------:|:---------------------------------------------------------------------:|:--------------------------------------------------------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `graphqlSchemaPaths` | List(String) | (falls back to `graphqlSchemas`) | GraphQL schema locations. You can supply multiple paths to GraphQL schemas. To include many schemas from a folder hierarchy, use the `graphqlSchemas` block instead. | -| `graphqlSchemas` | *See
[graphqlSchemas](#option-graphqlschemas)* | All
`.graphqls`/`.graphql`
files in
resources | Block to define the input GraphQL schemas, when exact paths are too cumbersome. See table below for a list of options. *See [graphqlSchemas](#option-graphqlschemas)* | -| `graphqlQueryIntrospectionResu`
`ltPath` | String | None | Path to GraphQL Introspection Query result in json format (with root object `__schema` or `data.__schema`). Sample: [sample-introspection-query-result.json](../src/test/resources/introspection-result/sample-introspection-query-result.json) | -| `outputDir` | String | None | The output target directory into which code will be generated. | -| `configurationFiles` | List(String) | Empty | Paths to the files with mapping configurations. Supported formats. JSON, HOCON. Order of specified configuration files matters, so the default configuration should be placed at the end. | -| `packageName` | String | Empty | Java package for generated classes. | -| `apiPackageName` | String | Empty | Java package for generated api classes (Query, Mutation, Subscription). | -| `modelPackageName` | String | Empty | Java package for generated model classes (type, input, interface, enum, union). | -| `generateBuilder` | Boolean | True | Specifies whether generated model classes should have builder. | -| `generateApis` | Boolean | True | Specifies whether api classes should be generated as well as model classes. | -| `generateDataFetchingEnvironme`
`ntArgumentInApis` | Boolean | False | If true, then `graphql.schema.DataFetchingEnvironment env` will be added as a last argument to all methods of root type resolvers and field resolvers. | -| `generateEqualsAndHashCode` | Boolean | False | Specifies whether generated model classes should have equals and hashCode methods defined. | -| `generateParameterizedFieldsResolvers` | Boolean | True | Specifies whether separate `Resolver` interface for parametrized fields should be generated. If `false`, then add parametrized field to the type definition and ignore field parameters. If `true` then separate `Resolver` interface for parametrized fields will be generated. | -| `generateImmutableModels` | Boolean | False | Specifies whether generated model classes should be immutable. | -| `generateToString` | Boolean | False | Specifies whether generated model classes should have toString method defined. | -| `generateJacksonTypeIdResolver` | Boolean | False | Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package. | -| `addGeneratedAnnotation` | Boolean | True | Specifies whether generated classes should have `@Generated` annotation. | -| `generatedAnnotation` | String | `jakarta.annotation.Generated`
`javax.annotation.Generated` | Qualified class name (with package) of the `@Generated` annotation that will be added on top of every generated class (if `addGeneratedAnnotation` is **true**) | -| `apiNamePrefix` | String | Empty | Sets the prefix for GraphQL api classes (query, mutation, subscription). | -| `apiNameSuffix` | String | `Resolver` | Sets the suffix for GraphQL api classes (query, mutation, subscription). | -| `apiInterfaceStrategy` | *See
[ApiInterfaceStrategy](#option-apiinterfacestrategy)* | `INTERFACE_PER_OPERATION` | *See [ApiInterfaceStrategy](#option-apiinterfacestrategy)* | -| `apiRootInterfaceStrategy` | *See
[ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | `SINGLE_INTERFACE` | *See [ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | -| `apiNamePrefixStrategy` | *See
[ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | `CONSTANT` | *See [ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | -| `modelNamePrefix` | String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). | -| `modelNameSuffix` | String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). | -| `modelValidationAnnotation` | String | `@javax.validation.`
`constraints.NotNull` | Annotation for mandatory (NonNull) fields. Can be null/empty. | -| `typeResolverPrefix` | String | Empty | Sets the prefix for GraphQL type resolver classes. | -| `typeResolverSuffix` | String | `Resolver` | Sets the suffix for GraphQL type resolver classes. | -| `customTypesMapping` | Map(String,String) | Empty | *See [CustomTypesMapping](#option-customtypesmapping)* | -| `customAnnotationsMapping` | Map(String,String[]) | Empty | *See [CustomAnnotationsMapping](#option-customannotationsmapping)* | -| `directiveAnnotationsMapping` | Map(String,String[]) | Empty | *See [DirectiveAnnotationsMapping](#option-directiveannotationsmapping)* | -| `fieldsWithResolvers` | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. E.g.: `Person`, `Person.friends`, `@customResolver`. | -| `fieldsWithoutResolvers` | Set(String) | Empty | Fields that DO NOT require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. Can be used in conjunction with `generateExtensionFieldsResolvers` option. E.g.: `Person`, `Person.friends`, `@noResolver`. | -| `resolverArgumentAnnotations` | Set(String) | Empty | Annotations that will be added to all resolver arguments. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.Argument` | -| `parametrizedResolverAnnotations` | Set(String) | Empty | Annotations that will be added to all parametrized resolver methods. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.SchemaMapping(typeName="{{TYPE_NAME}}")` | -| `generateParameterizedFieldsResolvers` | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. | -| `generateExtensionFieldsResolvers` | Boolean | False | Specifies whether all fields in extensions (`extend type` and `extend interface`) should be present in Resolver interface instead of the type class itself. | -| `generateModelsForRootTypes` | Boolean | False | Specifies whether model classes should be generated for `type Query`, `type Subscription`, `type Mutation`. | -| `useOptionalForNullableReturnTypes` | Boolean | False | Specifies whether nullable return types of api methods should be wrapped into [`java.util.Optional<>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Optional.html). Lists will not be wrapped. | -| `generateApisWithThrowsException` | Boolean | True | Specifies whether api interface methods should have `throws Exception` in signature. | -| `generateNoArgsConstructorOnly` | Boolean | False | Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is true | -| `generateModelsWithPublicFields` | Boolean | False | Specifies whether model classes should have public fields and NO getters/setters. By default, fields are private and there are getters/setters for each field. | -| `apiReturnType` | String | Empty | Return type for api methods (query/mutation). For example: `reactor.core.publisher.Mono`, etc. | -| `apiReturnListType` | String | Empty | Return type for api methods (query/mutation) having list type. For example: `reactor.core.publisher.Flux`, etc. By default is empty, so `apiReturnType` will be used. | -| `subscriptionReturnType` | String | Empty | Return type for subscription methods. For example: `org.reactivestreams.Publisher`, `io.reactivex.Observable`, etc. | -| `relayConfig` | *See
[RelayConfig](#option-relayconfig)* | `@connection(for: ...)` | *See [RelayConfig](#option-relayconfig)* | -| `generateClient` | Boolean | False | Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: `Request` classes (contain input data), `ResponseProjection` classes for each type (contain response fields) and `Response` classes (contain response data). | -| `requestSuffix` | String | Request | Sets the suffix for `Request` classes. | -| `responseSuffix` | String | Response | Sets the suffix for `Response` classes. | -| `responseProjectionSuffix` | String | ResponseProjection | Sets the suffix for `ResponseProjection` classes. | -| `parametrizedInputSuffix` | String | ParametrizedInput | Sets the suffix for `ParametrizedInput` classes. | -| `parentInterfaces` | *See
[parentInterfaces](#option-parentinterfaces)* | Empty | Block to define parent interfaces for generated interfaces (query / mutation / subscription / type resolver). *See [parentInterfaces](#option-parentinterfaces)* | -| `generateAllMethodInProjection` | Boolean | True | Enables whether the `all$()` method should be generated in the projection classes. Disabling enforces the client to select the fields manually. | -| `responseProjectionMaxDepth` | Integer | 3 | Sets max depth when use `all$()` which for facilitating the construction of projection automatically, the fields on all projections are provided when it be invoked. This is a global configuration, of course, you can use `all$(max)` to set for each method. For self recursive types, too big depth may result in a large number of returned data! | -| `generatedLanguage` | Enum | GeneratedLanguage.JAVA | Choose which language you want to generate, Java,Scala,Kotlin were supported. Note that due to language features, there are slight differences in default values between languages. | -| `generateModelOpenClasses` | Boolean | False | The class type of the generated model. If true, generate normal classes, else generate data classes. It only support in kotlin(```data class```) and scala(```case class```). Maybe we will consider to support Java ```record``` in the future. | -| `initializeNullableTypes` | Boolean | False | Adds a default null value to nullable arguments. Only supported in Kotlin. | -| `generateSealedInterfaces` | Boolean | False | This applies to generated interfaces on unions and interfaces. If true, generate sealed interfaces, else generate normal ones. It is only supported in Kotlin and Scala. | -| `typesAsInterfaces` | Set(String) | Empty | Types that must generated as interfaces should be defined here in format: `TypeName` or `@directive`. E.g.: `User`, `@asInterface`. | -| `useObjectMapperForRequestSerialization` | Set(String) | Empty | Fields that require serialization using `com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)`. Values should be defined here in the following format: `GraphqlObjectName.fieldName` or `GraphqlTypeName`. If just type is specified, then all fields of this type will be serialized using ObjectMapper. E.g.: `["Person.createdDateTime", ZonedDateTime"]` | -| `supportUnknownFields` | Boolean | False | Specifies whether api classes should support unknown fields during serialization or deserialization. If `true`, classes will include a property of type [`java.util.Map`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html) that will store unknown fields. | -| `unknownFieldsPropertyName` | String | userDefinedFields | Specifies the name of the property to be included in api classes to support unknown fields during serialization or deserialization | -| `skip` | Boolean | False | If true, then code generation will not happen | +| Option | Data Type | Default value | Description | +|:-----------------------------------------------------:|:----------------------------------------------------------------------:|:--------------------------------------------------------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `graphqlSchemaPaths` | List(String) | (falls back to `graphqlSchemas`) | GraphQL schema locations. You can supply multiple paths to GraphQL schemas. To include many schemas from a folder hierarchy, use the `graphqlSchemas` block instead. | +| `graphqlSchemas` | *See
[graphqlSchemas](#option-graphqlschemas)* | All
`.graphqls`/`.graphql`
files in
resources | Block to define the input GraphQL schemas, when exact paths are too cumbersome. See table below for a list of options. *See [graphqlSchemas](#option-graphqlschemas)* | +| `graphqlQueryIntrospectionResu`
`ltPath` | String | None | Path to GraphQL Introspection Query result in json format (with root object `__schema` or `data.__schema`). Sample: [sample-introspection-query-result.json](../src/test/resources/introspection-result/sample-introspection-query-result.json) | +| `outputDir` | String | None | The output target directory into which code will be generated. | +| `configurationFiles` | List(String) | Empty | Paths to the files with mapping configurations. Supported formats. JSON, HOCON. Order of specified configuration files matters, so the default configuration should be placed at the end. | +| `packageName` | String | Empty | Java package for generated classes. | +| `apiPackageName` | String | Empty | Java package for generated api classes (Query, Mutation, Subscription). | +| `modelPackageName` | String | Empty | Java package for generated model classes (type, input, interface, enum, union). | +| `generateBuilder` | Boolean | True | Specifies whether generated model classes should have builder. | +| `generateApis` | Boolean | True | Specifies whether api classes should be generated as well as model classes. | +| `generateDataFetchingEnvironme`
`ntArgumentInApis` | Boolean | False | If true, then `graphql.schema.DataFetchingEnvironment env` will be added as a last argument to all methods of root type resolvers and field resolvers. | +| `generateEqualsAndHashCode` | Boolean | False | Specifies whether generated model classes should have equals and hashCode methods defined. | +| `generateParameterizedFieldsResolvers` | Boolean | True | Specifies whether separate `Resolver` interface for parametrized fields should be generated. If `false`, then add parametrized field to the type definition and ignore field parameters. If `true` then separate `Resolver` interface for parametrized fields will be generated. | +| `generateImmutableModels` | Boolean | False | Specifies whether generated model classes should be immutable. | +| `generateToString` | Boolean | False | Specifies whether generated model classes should have toString method defined. | +| `generateJacksonTypeIdResolver` | Boolean | False | Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package. | +| `addGeneratedAnnotation` | Boolean | True | Specifies whether generated classes should have `@Generated` annotation. | +| `generatedAnnotation` | String | `jakarta.annotation.Generated`
`javax.annotation.Generated` | Qualified class name (with package) of the `@Generated` annotation that will be added on top of every generated class (if `addGeneratedAnnotation` is **true**) | +| `apiNamePrefix` | String | Empty | Sets the prefix for GraphQL api classes (query, mutation, subscription). | +| `apiNameSuffix` | String | `Resolver` | Sets the suffix for GraphQL api classes (query, mutation, subscription). | +| `apiInterfaceStrategy` | *See
[ApiInterfaceStrategy](#option-apiinterfacestrategy)* | `INTERFACE_PER_OPERATION` | *See [ApiInterfaceStrategy](#option-apiinterfacestrategy)* | +| `apiRootInterfaceStrategy` | *See
[ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | `SINGLE_INTERFACE` | *See [ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | +| `apiNamePrefixStrategy` | *See
[ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | `CONSTANT` | *See [ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | +| `modelNamePrefix` | String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). | +| `modelNameSuffix` | String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). | +| `modelValidationAnnotation` | String | `@javax.validation.`
`constraints.NotNull` | Annotation for mandatory (NonNull) fields. Can be null/empty. | +| `typeResolverPrefix` | String | Empty | Sets the prefix for GraphQL type resolver classes. | +| `typeResolverSuffix` | String | `Resolver` | Sets the suffix for GraphQL type resolver classes. | +| `customTypesMapping` | Map(String,String) | Empty | *See [CustomTypesMapping](#option-customtypesmapping)* | +| `customTemplates` | Map(FreeMarkerTemplateType,String) | Empty | Use to supply paths to custom FreeMarker templates for code generation. | +| `customAnnotationsMapping` | Map(String,String[]) | Empty | *See [CustomAnnotationsMapping](#option-customannotationsmapping)* | +| `directiveAnnotationsMapping` | Map(String,String[]) | Empty | *See [DirectiveAnnotationsMapping](#option-directiveannotationsmapping)* | +| `fieldsWithResolvers` | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. E.g.: `Person`, `Person.friends`, `@customResolver`. | +| `fieldsWithoutResolvers` | Set(String) | Empty | Fields that DO NOT require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. Can be used in conjunction with `generateExtensionFieldsResolvers` option. E.g.: `Person`, `Person.friends`, `@noResolver`. | +| `resolverArgumentAnnotations` | Set(String) | Empty | Annotations that will be added to all resolver arguments. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.Argument` | +| `parametrizedResolverAnnotations` | Set(String) | Empty | Annotations that will be added to all parametrized resolver methods. Can be used for [spring-graphql](https://github.com/spring-projects/spring-graphql) inegration by supplying: `org.springframework.graphql.data.method.annotation.SchemaMapping(typeName="{{TYPE_NAME}}")` | +| `generateParameterizedFieldsResolvers` | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. | +| `generateExtensionFieldsResolvers` | Boolean | False | Specifies whether all fields in extensions (`extend type` and `extend interface`) should be present in Resolver interface instead of the type class itself. | +| `generateModelsForRootTypes` | Boolean | False | Specifies whether model classes should be generated for `type Query`, `type Subscription`, `type Mutation`. | +| `useOptionalForNullableReturnTypes` | Boolean | False | Specifies whether nullable return types of api methods should be wrapped into [`java.util.Optional<>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Optional.html). Lists will not be wrapped. | +| `generateApisWithThrowsException` | Boolean | True | Specifies whether api interface methods should have `throws Exception` in signature. | +| `generateNoArgsConstructorOnly` | Boolean | False | Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is true | +| `generateModelsWithPublicFields` | Boolean | False | Specifies whether model classes should have public fields and NO getters/setters. By default, fields are private and there are getters/setters for each field. | +| `apiReturnType` | String | Empty | Return type for api methods (query/mutation). For example: `reactor.core.publisher.Mono`, etc. | +| `apiReturnListType` | String | Empty | Return type for api methods (query/mutation) having list type. For example: `reactor.core.publisher.Flux`, etc. By default is empty, so `apiReturnType` will be used. | +| `subscriptionReturnType` | String | Empty | Return type for subscription methods. For example: `org.reactivestreams.Publisher`, `io.reactivex.Observable`, etc. | +| `relayConfig` | *See
[RelayConfig](#option-relayconfig)* | `@connection(for: ...)` | *See [RelayConfig](#option-relayconfig)* | +| `generateClient` | Boolean | False | Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: `Request` classes (contain input data), `ResponseProjection` classes for each type (contain response fields) and `Response` classes (contain response data). | +| `requestSuffix` | String | Request | Sets the suffix for `Request` classes. | +| `responseSuffix` | String | Response | Sets the suffix for `Response` classes. | +| `responseProjectionSuffix` | String | ResponseProjection | Sets the suffix for `ResponseProjection` classes. | +| `parametrizedInputSuffix` | String | ParametrizedInput | Sets the suffix for `ParametrizedInput` classes. | +| `parentInterfaces` | *See
[parentInterfaces](#option-parentinterfaces)* | Empty | Block to define parent interfaces for generated interfaces (query / mutation / subscription / type resolver). *See [parentInterfaces](#option-parentinterfaces)* | +| `generateAllMethodInProjection` | Boolean | True | Enables whether the `all$()` method should be generated in the projection classes. Disabling enforces the client to select the fields manually. | +| `responseProjectionMaxDepth` | Integer | 3 | Sets max depth when use `all$()` which for facilitating the construction of projection automatically, the fields on all projections are provided when it be invoked. This is a global configuration, of course, you can use `all$(max)` to set for each method. For self recursive types, too big depth may result in a large number of returned data! | +| `generatedLanguage` | Enum | GeneratedLanguage.JAVA | Choose which language you want to generate, Java,Scala,Kotlin were supported. Note that due to language features, there are slight differences in default values between languages. | +| `generateModelOpenClasses` | Boolean | False | The class type of the generated model. If true, generate normal classes, else generate data classes. It only support in kotlin(```data class```) and scala(```case class```). Maybe we will consider to support Java ```record``` in the future. | +| `initializeNullableTypes` | Boolean | False | Adds a default null value to nullable arguments. Only supported in Kotlin. | +| `generateSealedInterfaces` | Boolean | False | This applies to generated interfaces on unions and interfaces. If true, generate sealed interfaces, else generate normal ones. It is only supported in Kotlin and Scala. | +| `typesAsInterfaces` | Set(String) | Empty | Types that must generated as interfaces should be defined here in format: `TypeName` or `@directive`. E.g.: `User`, `@asInterface`. | +| `useObjectMapperForRequestSerialization` | Set(String) | Empty | Fields that require serialization using `com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)`. Values should be defined here in the following format: `GraphqlObjectName.fieldName` or `GraphqlTypeName`. If just type is specified, then all fields of this type will be serialized using ObjectMapper. E.g.: `["Person.createdDateTime", ZonedDateTime"]` | +| `supportUnknownFields` | Boolean | False | Specifies whether api classes should support unknown fields during serialization or deserialization. If `true`, classes will include a property of type [`java.util.Map`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html) that will store unknown fields. | +| `unknownFieldsPropertyName` | String | userDefinedFields | Specifies the name of the property to be included in api classes to support unknown fields during serialization or deserialization | +| `skip` | Boolean | False | If true, then code generation will not happen | ### Option `graphqlSchemas` diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java index 1dbff1ca6..244454bfc 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java @@ -1,6 +1,7 @@ package io.github.kobylynskyi.graphql.codegen.gradle; import com.kobylynskyi.graphql.codegen.GraphQLCodegen; +import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType; import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy; @@ -54,6 +55,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode private Map customTypesMapping = new HashMap<>(); private Map> customAnnotationsMapping = new HashMap<>(); + private Map customTemplates = new HashMap<>(); private Map> directiveAnnotationsMapping = new HashMap<>(); private String packageName; private String apiPackageName; @@ -133,8 +135,8 @@ public void generate() throws Exception { mappingConfig.setPackageName(packageName); mappingConfig.setCustomTypesMapping( customTypesMapping != null ? customTypesMapping : new HashMap<>()); - mappingConfig.setCustomAnnotationsMapping( - customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>()); + mappingConfig.setCustomTemplates( + customTemplates != null ? customTemplates : new HashMap<>()); mappingConfig.setDirectiveAnnotationsMapping( directiveAnnotationsMapping != null ? directiveAnnotationsMapping : new HashMap<>()); mappingConfig.setApiNameSuffix(apiNameSuffix); @@ -333,6 +335,17 @@ public void setCustomTypesMapping(Map customTypesMapping) { this.customTypesMapping = customTypesMapping; } + @Input + @Optional + @Override + public Map getCustomTemplates() { + return customTemplates; + } + + public void setCustomTemplates(Map customTemplates) { + this.customTemplates = customTemplates; + } + @Input @Optional @Override diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java index 18af6a2a1..d47f9dc9b 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java @@ -1,6 +1,7 @@ package io.github.kobylynskyi.graphql.codegen; import com.kobylynskyi.graphql.codegen.GraphQLCodegen; +import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType; import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy; @@ -65,6 +66,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo @Parameter private Map customAnnotationsMapping; + @Parameter + private Map customTemplates; + @Parameter private Map directiveAnnotationsMapping; @@ -246,6 +250,7 @@ public void execute() throws MojoExecutionException { MappingConfig mappingConfig = new MappingConfig(); mappingConfig.setPackageName(packageName); mappingConfig.setCustomTypesMapping(convertToMap(customTypesMapping)); + mappingConfig.setCustomTemplates(customTemplates); mappingConfig.setCustomAnnotationsMapping(convertToListsMap(customAnnotationsMapping)); mappingConfig.setDirectiveAnnotationsMapping(convertToListsMap(directiveAnnotationsMapping)); mappingConfig.setApiNameSuffix(apiNameSuffix); @@ -737,4 +742,12 @@ private static Map convertToMap(Properties properties) { return result; } + @Override + public Map getCustomTemplates() { + if (customTemplates == null) { + return new HashMap<>(); + } + return customTemplates; + } + } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala index 3c63e379c..acc45095b 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala @@ -3,6 +3,7 @@ package io.github.dreamylost.graphql.codegen import java.util import com.kobylynskyi.graphql.codegen.model._ +import com.kobylynskyi.graphql.codegen.generators._ import sbt._ /** @author @@ -43,6 +44,8 @@ trait GraphQLCodegenKeys { val customAnnotationsMapping = settingKey[util.Map[String, util.List[String]]]("customAnnotationsMapping") + val customTemplates = settingKey[util.Map[FreeMarkerTemplateType, String]]("customTemplates") + val generateEqualsAndHashCode = settingKey[Boolean]("Specifies whether generated model classes should have equals and hashCode methods defined.") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index 0fe649e68..72a0c0474 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -7,6 +7,7 @@ import com.kobylynskyi.graphql.codegen.model.exception.LanguageNotSupportedExcep import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage._ import com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLCodegen import com.kobylynskyi.graphql.codegen.supplier._ +import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType import sbt.{ AutoPlugin, PluginTrigger, _ } import sbt.Keys.{ sLog, sourceManaged, _ } import sbt.internal.util.complete.DefaultParsers.spaceDelimited @@ -67,6 +68,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co generateJacksonTypeIdResolver := MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER, customTypesMapping := new JHashMap[String, String](), // TODO use scala Map, convert to java Map customAnnotationsMapping := new JHashMap[String, JList[String]](), + customTemplates := new JHashMap[FreeMarkerTemplateType, String](), directiveAnnotationsMapping := new JHashMap[String, JList[String]](), javaxValidationApiVersion := None, graphqlJavaCodegenVersion := None, @@ -118,17 +120,17 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co generateBuilder := MappingConfigConstants.DEFAULT_BUILDER, generateApis := MappingConfigConstants.DEFAULT_GENERATE_APIS, generateEqualsAndHashCode := MappingConfigConstants.DEFAULT_EQUALS_AND_HASHCODE, - generateImmutableModels := MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS, // TODO change default value - generateToString := MappingConfigConstants.DEFAULT_TO_STRING, + generateImmutableModels := MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS, // TODO change default value + generateToString := MappingConfigConstants.DEFAULT_TO_STRING, // parent interfaces configs: - parentInterfaces := parentInterfacesConfig, - generateAllMethodInProjection := MappingConfigConstants.DEFAULT_GENERATE_ALL_METHOD, - responseProjectionMaxDepth := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_MAX_DEPTH, - supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS, - unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME, - generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY, - generateModelsWithPublicFields := MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS, - skip := false + parentInterfaces := parentInterfacesConfig, + generateAllMethodInProjection := MappingConfigConstants.DEFAULT_GENERATE_ALL_METHOD, + responseProjectionMaxDepth := MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_MAX_DEPTH, + supportUnknownFields := MappingConfigConstants.DEFAULT_SUPPORT_UNKNOWN_FIELDS, + unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME, + generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY, + generateModelsWithPublicFields := MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS, + skip := false ) private def getMappingConfig(): Def.Initialize[MappingConfig] = Def.setting { @@ -149,6 +151,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co mappingConfig.setTypeResolverPrefix((GraphQLCodegenConfig / typeResolverPrefix).value.orNull) mappingConfig.setModelValidationAnnotation((GraphQLCodegenConfig / modelValidationAnnotation).value) mappingConfig.setCustomAnnotationsMapping((GraphQLCodegenConfig / customAnnotationsMapping).value) + mappingConfig.setCustomTemplates((GraphQLCodegenConfig / customTemplates).value) mappingConfig.setGenerateEqualsAndHashCode((GraphQLCodegenConfig / generateEqualsAndHashCode).value) mappingConfig.setGenerateImmutableModels((GraphQLCodegenConfig / generateImmutableModels).value) mappingConfig.setGenerateToString((GraphQLCodegenConfig / generateToString).value) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplateFilesCreator.java b/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplateFilesCreator.java index 96049c639..837295e0a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplateFilesCreator.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplateFilesCreator.java @@ -48,7 +48,7 @@ public static File create(MappingContext mappingContext, } try (FileWriter fileWriter = new FileWriter(javaSourceFile)) { - Template template = FreeMarkerTemplatesRegistry.getTemplateWithLang(language, templateType); + Template template = getTemplateForTypeAndLanguage(mappingContext, templateType, language); template.process(dataModel, fileWriter); } catch (Exception e) { throw new UnableToCreateFileException(e); @@ -56,6 +56,20 @@ public static File create(MappingContext mappingContext, return javaSourceFile; } + private static Template getTemplateForTypeAndLanguage(MappingContext mappingContext, + FreeMarkerTemplateType templateType, + GeneratedLanguage language) { + String templatePath = null; + if (mappingContext.getCustomTemplates() != null) { + templatePath = mappingContext.getCustomTemplates().get(templateType); + } + if (templatePath != null) { + return FreeMarkerTemplatesRegistry.getCustomTemplates(templatePath); + } else { + return FreeMarkerTemplatesRegistry.getTemplateWithLang(language, templateType); + } + } + private static File getFileTargetDirectory(Map dataModel, File outputDir) { File targetDir; Object packageName = dataModel.get(DataModelFields.PACKAGE); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplatesRegistry.java b/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplatesRegistry.java index 9d467641e..3c3da45d7 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplatesRegistry.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplatesRegistry.java @@ -22,9 +22,9 @@ class FreeMarkerTemplatesRegistry { private static final EnumMap> templateMap = new EnumMap<>(GeneratedLanguage.class); + private static final Configuration configuration = buildFreeMarkerTemplateConfiguration(); + static { - Configuration configuration = buildFreeMarkerTemplateConfiguration(); - try { templateMap.put(GeneratedLanguage.JAVA, getTemplates(configuration, GeneratedLanguage.JAVA)); templateMap.put(GeneratedLanguage.SCALA, getTemplates(configuration, GeneratedLanguage.SCALA)); @@ -70,4 +70,12 @@ private static Configuration buildFreeMarkerTemplateConfiguration() { return configuration; } + public static Template getCustomTemplates(String templatePath) { + try { + return configuration.getTemplate(templatePath); + } catch (IOException e) { + throw new UnableToLoadFreeMarkerTemplateException(e); + } + } + } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java index 7972ca044..c6755b953 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.model; +import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType; import java.util.List; import java.util.Map; import java.util.Set; @@ -27,6 +28,13 @@ public interface GraphQLCodegenConfiguration { * @return mappings from GraphqlType to JavaType */ Map getCustomTypesMapping(); + + /** + * Can be used to supply paths to custom FreeMarker templates for code generation. + * + * @return a map, where key is a tempalte type and a value is path to a FreeMarker template + */ + Map getCustomTemplates(); /** * Can be used to supply custom annotations (serializers) for scalars. diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java index 72de287c0..46cc31f85 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.model; +import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -85,6 +86,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable parametrizedResolverAnnotations = new HashSet<>(); private Map customTypesMapping = new HashMap<>(); + private Map customTemplates = new HashMap<>(); private Set typesAsInterfaces = new HashSet<>(); @@ -94,9 +96,9 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable Map combineMap(Map thisMap, Map otherMap) { + private static Map combineMap(Map thisMap, Map otherMap) { if (thisMap != null && otherMap != null) { - Map resultMap = new HashMap<>(); + Map resultMap = new HashMap<>(); resultMap.putAll(thisMap); resultMap.putAll(otherMap); return resultMap; @@ -186,6 +188,7 @@ public void combine(MappingConfig source) { fieldsWithResolvers = combineSet(fieldsWithResolvers, source.fieldsWithResolvers); fieldsWithoutResolvers = combineSet(fieldsWithoutResolvers, source.fieldsWithoutResolvers); customTypesMapping = combineMap(customTypesMapping, source.customTypesMapping); + customTemplates = combineMap(customTemplates, source.customTemplates); customAnnotationsMapping = combineMap(customAnnotationsMapping, source.customAnnotationsMapping); directiveAnnotationsMapping = combineMap(directiveAnnotationsMapping, source.directiveAnnotationsMapping); resolverArgumentAnnotations = combineSet(resolverArgumentAnnotations, source.resolverArgumentAnnotations); @@ -244,6 +247,28 @@ public void setCustomTypesMapping(Map customTypesMapping) { this.customTypesMapping = customTypesMapping; } + /** + * Provide a path to a custom template for the specific FreeMarker template type (if absent). + * + * @param from the from + * @param to the to + */ + public void putCustomTemplatesIfAbsent(FreeMarkerTemplateType from, String to) { + if (customTemplates == null) { + customTemplates = new HashMap<>(); + } + customTemplates.computeIfAbsent(from, k -> to); + } + + @Override + public Map getCustomTemplates() { + return customTemplates; + } + + public void setCustomTemplates(Map customTemplates) { + this.customTemplates = customTemplates; + } + @Override public Map> getCustomAnnotationsMapping() { return customAnnotationsMapping; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 6420a8158..503f7d961 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -1,5 +1,6 @@ package com.kobylynskyi.graphql.codegen.model; +import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType; import com.kobylynskyi.graphql.codegen.mapper.DataModelMapper; import com.kobylynskyi.graphql.codegen.mapper.DataModelMapperFactory; import com.kobylynskyi.graphql.codegen.mapper.FieldDefinitionToParameterMapper; @@ -83,6 +84,11 @@ public Boolean isGenerateSealedInterfaces() { public Map getCustomTypesMapping() { return config.getCustomTypesMapping(); } + + @Override + public Map getCustomTemplates() { + return config.getCustomTemplates(); + } @Override public Map> getCustomAnnotationsMapping() { diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomTemplatesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomTemplatesTest.java new file mode 100644 index 000000000..e965414fd --- /dev/null +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomTemplatesTest.java @@ -0,0 +1,54 @@ +package com.kobylynskyi.graphql.codegen; + +import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType; +import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; +import com.kobylynskyi.graphql.codegen.model.MappingConfig; +import com.kobylynskyi.graphql.codegen.utils.Utils; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Objects; + +import static com.kobylynskyi.graphql.codegen.TestUtils.assertFileContainsElements; +import static java.util.Collections.singletonList; + +class GraphQLCodegenCustomTemplatesTest { + + private final File outputBuildDir = new File("build/generated"); + private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/test1"); + + private MappingConfig mappingConfig; + + @BeforeEach + void init() { + mappingConfig = new MappingConfig(); + mappingConfig.setPackageName("com.kobylynskyi.graphql.test1"); + mappingConfig.setGenerateClient(true); + } + + @AfterEach + void cleanup() { + Utils.deleteDir(outputBuildDir); + } + + @Test + void generate_CustomTemplates_Type() throws Exception { + mappingConfig.putCustomTemplatesIfAbsent(FreeMarkerTemplateType.TYPE, "/template/record_type.ftl"); + + generate("src/test/resources/schemas/test.graphqls"); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + assertFileContainsElements(files, "Event.java", + "public record Event ("); + } + + private void generate(String path) throws IOException { + new JavaGraphQLCodegen(singletonList(path), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig)) + .generate(); + } + +} diff --git a/src/test/resources/template/record_type.ftl b/src/test/resources/template/record_type.ftl new file mode 100644 index 000000000..3ed480643 --- /dev/null +++ b/src/test/resources/template/record_type.ftl @@ -0,0 +1,19 @@ +<#assign MapperUtil=statics["com.kobylynskyi.graphql.codegen.java.JavaGraphQLTypeMapper"]> +<#if package?has_content> +package ${package}; + + +public record ${className} ( +<#if fields?has_content> + <#list fields as field> + ${field.type} ${field.name}<#if field.defaultValue?has_content> = ${field.defaultValue}<#if field?has_next>, + + +) +{ + + public ${className}() { + <#list fields as field><#if field.defaultValue?has_content> ${field.name} = ${field.defaultValue}; + } + +} From 52eb425baa36208ff63cc7a4bfc856e255b35377 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sun, 19 Mar 2023 19:06:38 -0400 Subject: [PATCH 22/25] Fix reviewdog styling issues --- .../graphql/codegen/GraphQLCodegenOptionalTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java index 80fcf1171..da31a5d93 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java @@ -12,6 +12,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Paths; +import java.util.Collections; import java.util.HashMap; import java.util.Objects; @@ -105,9 +106,7 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { */ @Test void generate_ObjectsInsteadOfPrimitives() throws Exception { - mappingConfig.setCustomTypesMapping(new HashMap() {{ - put("Int!", "Integer"); - }}); + mappingConfig.setCustomTypesMapping(new HashMap<>(Collections.singletonMap("Int!", "Integer"))); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); generate(); From 569fba3055ceea855c149a61830cfdcc191f5930 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Tue, 21 Mar 2023 22:22:17 -0400 Subject: [PATCH 23/25] Change output message --- .../graphql/codegen/GraphQLCodegen.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java index dcdd43606..fe7b61628 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java @@ -148,17 +148,11 @@ public List generate() throws IOException { if (!Utils.isEmpty(schemas)) { ExtendedDocument document = GraphQLDocumentParser.getDocumentFromSchemas(mappingConfig, schemas); - List generatedFiles = processDefinitions(document); - System.out.printf("Finished processing %d schema(s) in %d ms%n", schemas.size(), - System.currentTimeMillis() - startTime); - return generatedFiles; + return processDefinitions(document, schemas.size() + " schema(s)", startTime); } else if (introspectionResult != null) { ExtendedDocument document = GraphQLDocumentParser .getDocumentFromIntrospectionResult(mappingConfig, introspectionResult); - List generatedFiles = processDefinitions(document); - System.out.printf("Finished processing introspection result in %d ms%n", - System.currentTimeMillis() - startTime); - return generatedFiles; + return processDefinitions(document, "introspection result", startTime); } else { // either schemas or introspection result should be provided throw new IllegalArgumentException( @@ -166,7 +160,7 @@ public List generate() throws IOException { } } - private List processDefinitions(ExtendedDocument document) { + private List processDefinitions(ExtendedDocument document, String source, long startTime) { initCustomTypeMappings(document.getScalarDefinitions()); MappingContext context = MappingContext.builder() .setMappingConfig(mappingConfig) @@ -180,11 +174,15 @@ private List processDefinitions(ExtendedDocument document) { for (FilesGenerator generator : FilesGeneratorsFactory.getAll(context, dataModelMapperFactory)) { generatedFiles.addAll(generator.generate()); } - System.out.printf("Generated %d definition classes in folder %s%n", generatedFiles.size(), - outputDir.getAbsolutePath()); + printOutputResult(source, generatedFiles.size(), System.currentTimeMillis() - startTime); return generatedFiles; } + private void printOutputResult(String source, int classesGenerated, long duration) { + System.out.printf("Generated %d classes from %s in folder %s, took %d ms%n", + classesGenerated, source, outputDir.getAbsolutePath(), duration); + } + protected void initCustomTypeMappings(Collection scalarTypeDefinitions) { for (ExtendedScalarTypeDefinition definition : scalarTypeDefinitions) { if (definition.getDefinition() != null) { From e8f7cd6632b95ff248dcf56ccd5fd30001157f0a Mon Sep 17 00:00:00 2001 From: Marvin Froeder Date: Wed, 22 Mar 2023 02:23:43 +0000 Subject: [PATCH 24/25] Change customTemplates Map key to be type String (#1052) --------- Co-authored-by: Marvin Froeder Co-authored-by: Marvin Froeder --- docs/codegen-options.md | 2 +- .../codegen/gradle/GraphQLCodegenGradleTask.java | 7 +++---- .../graphql/codegen/GraphQLCodegenMojo.java | 5 ++--- .../graphql/codegen/GraphQLCodegenKeys.scala | 3 +-- .../graphql/codegen/GraphQLCodegenPlugin.scala | 3 +-- .../FreeMarkerTemplateFilesCreator.java | 2 +- .../generators/FreeMarkerTemplatesRegistry.java | 15 ++++++++++++--- .../model/GraphQLCodegenConfiguration.java | 2 +- .../graphql/codegen/model/MappingConfig.java | 8 ++++---- .../graphql/codegen/model/MappingContext.java | 2 +- .../GraphQLCodegenCustomTemplatesTest.java | 2 +- 11 files changed, 28 insertions(+), 23 deletions(-) diff --git a/docs/codegen-options.md b/docs/codegen-options.md index 6801803a8..0580d1faa 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -31,7 +31,7 @@ | `typeResolverPrefix` | String | Empty | Sets the prefix for GraphQL type resolver classes. | | `typeResolverSuffix` | String | `Resolver` | Sets the suffix for GraphQL type resolver classes. | | `customTypesMapping` | Map(String,String) | Empty | *See [CustomTypesMapping](#option-customtypesmapping)* | -| `customTemplates` | Map(FreeMarkerTemplateType,String) | Empty | Use to supply paths to custom FreeMarker templates for code generation. | +| `customTemplates` | Map(String,String) | Empty | Use to supply paths to custom FreeMarker templates for code generation. | | `customAnnotationsMapping` | Map(String,String[]) | Empty | *See [CustomAnnotationsMapping](#option-customannotationsmapping)* | | `directiveAnnotationsMapping` | Map(String,String[]) | Empty | *See [DirectiveAnnotationsMapping](#option-directiveannotationsmapping)* | | `fieldsWithResolvers` | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. E.g.: `Person`, `Person.friends`, `@customResolver`. | diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java index 244454bfc..8a5977995 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java @@ -1,7 +1,6 @@ package io.github.kobylynskyi.graphql.codegen.gradle; import com.kobylynskyi.graphql.codegen.GraphQLCodegen; -import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType; import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy; @@ -55,7 +54,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode private Map customTypesMapping = new HashMap<>(); private Map> customAnnotationsMapping = new HashMap<>(); - private Map customTemplates = new HashMap<>(); + private Map customTemplates = new HashMap<>(); private Map> directiveAnnotationsMapping = new HashMap<>(); private String packageName; private String apiPackageName; @@ -338,11 +337,11 @@ public void setCustomTypesMapping(Map customTypesMapping) { @Input @Optional @Override - public Map getCustomTemplates() { + public Map getCustomTemplates() { return customTemplates; } - public void setCustomTemplates(Map customTemplates) { + public void setCustomTemplates(Map customTemplates) { this.customTemplates = customTemplates; } diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java index d47f9dc9b..8cc9ec448 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java @@ -1,7 +1,6 @@ package io.github.kobylynskyi.graphql.codegen; import com.kobylynskyi.graphql.codegen.GraphQLCodegen; -import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType; import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy; @@ -67,7 +66,7 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo private Map customAnnotationsMapping; @Parameter - private Map customTemplates; + private Map customTemplates; @Parameter private Map directiveAnnotationsMapping; @@ -743,7 +742,7 @@ private static Map convertToMap(Properties properties) { } @Override - public Map getCustomTemplates() { + public Map getCustomTemplates() { if (customTemplates == null) { return new HashMap<>(); } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala index acc45095b..f31cf8a50 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala @@ -3,7 +3,6 @@ package io.github.dreamylost.graphql.codegen import java.util import com.kobylynskyi.graphql.codegen.model._ -import com.kobylynskyi.graphql.codegen.generators._ import sbt._ /** @author @@ -44,7 +43,7 @@ trait GraphQLCodegenKeys { val customAnnotationsMapping = settingKey[util.Map[String, util.List[String]]]("customAnnotationsMapping") - val customTemplates = settingKey[util.Map[FreeMarkerTemplateType, String]]("customTemplates") + val customTemplates = settingKey[util.Map[String, String]]("customTemplates") val generateEqualsAndHashCode = settingKey[Boolean]("Specifies whether generated model classes should have equals and hashCode methods defined.") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index 72a0c0474..dfa99b933 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -7,7 +7,6 @@ import com.kobylynskyi.graphql.codegen.model.exception.LanguageNotSupportedExcep import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage._ import com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLCodegen import com.kobylynskyi.graphql.codegen.supplier._ -import com.kobylynskyi.graphql.codegen.generators.FreeMarkerTemplateType import sbt.{ AutoPlugin, PluginTrigger, _ } import sbt.Keys.{ sLog, sourceManaged, _ } import sbt.internal.util.complete.DefaultParsers.spaceDelimited @@ -68,7 +67,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co generateJacksonTypeIdResolver := MappingConfigConstants.DEFAULT_GENERATE_JACKSON_TYPE_ID_RESOLVER, customTypesMapping := new JHashMap[String, String](), // TODO use scala Map, convert to java Map customAnnotationsMapping := new JHashMap[String, JList[String]](), - customTemplates := new JHashMap[FreeMarkerTemplateType, String](), + customTemplates := new JHashMap[String, String](), directiveAnnotationsMapping := new JHashMap[String, JList[String]](), javaxValidationApiVersion := None, graphqlJavaCodegenVersion := None, diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplateFilesCreator.java b/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplateFilesCreator.java index 837295e0a..c15f763c7 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplateFilesCreator.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplateFilesCreator.java @@ -61,7 +61,7 @@ private static Template getTemplateForTypeAndLanguage(MappingContext mappingCont GeneratedLanguage language) { String templatePath = null; if (mappingContext.getCustomTemplates() != null) { - templatePath = mappingContext.getCustomTemplates().get(templateType); + templatePath = mappingContext.getCustomTemplates().get(templateType.name()); } if (templatePath != null) { return FreeMarkerTemplatesRegistry.getCustomTemplates(templatePath); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplatesRegistry.java b/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplatesRegistry.java index 3c3da45d7..f1558d33a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplatesRegistry.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/generators/FreeMarkerTemplatesRegistry.java @@ -3,6 +3,10 @@ import com.kobylynskyi.graphql.codegen.GraphQLCodegen; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.exception.UnableToLoadFreeMarkerTemplateException; +import freemarker.cache.ClassTemplateLoader; +import freemarker.cache.FileTemplateLoader; +import freemarker.cache.MultiTemplateLoader; +import freemarker.cache.TemplateLoader; import freemarker.core.PlainTextOutputFormat; import freemarker.ext.beans.BeansWrapper; import freemarker.template.Configuration; @@ -10,6 +14,7 @@ import freemarker.template.TemplateExceptionHandler; import freemarker.template.Version; +import java.io.File; import java.io.IOException; import java.util.EnumMap; @@ -22,10 +27,11 @@ class FreeMarkerTemplatesRegistry { private static final EnumMap> templateMap = new EnumMap<>(GeneratedLanguage.class); - private static final Configuration configuration = buildFreeMarkerTemplateConfiguration(); + private static final Configuration configuration; static { try { + configuration = buildFreeMarkerTemplateConfiguration(); templateMap.put(GeneratedLanguage.JAVA, getTemplates(configuration, GeneratedLanguage.JAVA)); templateMap.put(GeneratedLanguage.SCALA, getTemplates(configuration, GeneratedLanguage.SCALA)); templateMap.put(GeneratedLanguage.KOTLIN, getTemplates(configuration, GeneratedLanguage.KOTLIN)); @@ -58,9 +64,12 @@ private static String buildTemplatePath(FreeMarkerTemplateType templateType, Gen templateType.name().toLowerCase()); } - private static Configuration buildFreeMarkerTemplateConfiguration() { + private static Configuration buildFreeMarkerTemplateConfiguration() throws IOException { Configuration configuration = new Configuration(FREEMARKER_TEMPLATE_VERSION); - configuration.setClassLoaderForTemplateLoading(GraphQLCodegen.class.getClassLoader(), ""); + ClassTemplateLoader classTemplateLoader = new ClassTemplateLoader(GraphQLCodegen.class.getClassLoader(), ""); + FileTemplateLoader fileTemplateLoader = new FileTemplateLoader(new File(".")); + configuration.setTemplateLoader( + new MultiTemplateLoader(new TemplateLoader[] {classTemplateLoader, fileTemplateLoader})); configuration.setDefaultEncoding(DEFAULT_ENCODING); configuration.setOutputFormat(PlainTextOutputFormat.INSTANCE); configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java index c6755b953..6b37b4fd6 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java @@ -34,7 +34,7 @@ public interface GraphQLCodegenConfiguration { * * @return a map, where key is a tempalte type and a value is path to a FreeMarker template */ - Map getCustomTemplates(); + Map getCustomTemplates(); /** * Can be used to supply custom annotations (serializers) for scalars. diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java index 46cc31f85..7faa1dda9 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java @@ -86,7 +86,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable parametrizedResolverAnnotations = new HashSet<>(); private Map customTypesMapping = new HashMap<>(); - private Map customTemplates = new HashMap<>(); + private Map customTemplates = new HashMap<>(); private Set typesAsInterfaces = new HashSet<>(); @@ -253,7 +253,7 @@ public void setCustomTypesMapping(Map customTypesMapping) { * @param from the from * @param to the to */ - public void putCustomTemplatesIfAbsent(FreeMarkerTemplateType from, String to) { + public void putCustomTemplatesIfAbsent(String from, String to) { if (customTemplates == null) { customTemplates = new HashMap<>(); } @@ -261,11 +261,11 @@ public void putCustomTemplatesIfAbsent(FreeMarkerTemplateType from, String to) { } @Override - public Map getCustomTemplates() { + public Map getCustomTemplates() { return customTemplates; } - public void setCustomTemplates(Map customTemplates) { + public void setCustomTemplates(Map customTemplates) { this.customTemplates = customTemplates; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 503f7d961..9d80bc411 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -86,7 +86,7 @@ public Map getCustomTypesMapping() { } @Override - public Map getCustomTemplates() { + public Map getCustomTemplates() { return config.getCustomTemplates(); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomTemplatesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomTemplatesTest.java index e965414fd..0dcf9c3de 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomTemplatesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenCustomTemplatesTest.java @@ -36,7 +36,7 @@ void cleanup() { @Test void generate_CustomTemplates_Type() throws Exception { - mappingConfig.putCustomTemplatesIfAbsent(FreeMarkerTemplateType.TYPE, "/template/record_type.ftl"); + mappingConfig.putCustomTemplatesIfAbsent(FreeMarkerTemplateType.TYPE.name(), "/template/record_type.ftl"); generate("src/test/resources/schemas/test.graphqls"); From d2b2f08585031b49d5e17f6401c0be46ee29d2a3 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Tue, 21 Mar 2023 22:31:02 -0400 Subject: [PATCH 25/25] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7b76a6f0b..f4b34b73a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # GraphQL Codegen # +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/donate/?business=V5VX4NAQT7TW8&no_recurring=0&item_name=to+help+maintaining+GraphQL+Java+Codegen+project+🙏¤cy_code=USD) + ![Build](https://github.com/kobylynskyi/graphql-java-codegen/workflows/Build/badge.svg) [![Discussions](https://img.shields.io/badge/github-discussions-green)](https://github.com/kobylynskyi/graphql-java-codegen/discussions) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)