From 25edcc13891e4df168f6a5a383c7b8655f1ea5c3 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Fri, 5 Mar 2021 00:40:39 -0500 Subject: [PATCH 01/12] Prepare for next dev iteration - 4.1.5-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/graphql-java-codegen-maven-plugin/pom.xml | 2 +- .../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 +- 13 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index 8089b121e..2fa59594f 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id "org.sonarqube" version "3.1.1" } -def graphqlCodegenVersion = '4.1.4' // This variable used in the automatic release process +def graphqlCodegenVersion = '4.1.5-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 8d00aecd0..7b85dde81 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.3.71" - id "io.github.kobylynskyi.graphql.codegen" version "4.1.4" + id "io.github.kobylynskyi.graphql.codegen" version "4.1.5-SNAPSHOT" } -def graphqlCodegenClientKotlinVersion = '4.1.4' // Variable used in the automatic release process +def graphqlCodegenClientKotlinVersion = '4.1.5-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:4.1.4" + implementation "io.github.kobylynskyi:graphql-java-codegen:4.1.5-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.12.0" diff --git a/plugins/gradle/example-client/build.gradle b/plugins/gradle/example-client/build.gradle index 6a992a944..fbdaabcdd 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 "4.1.4" + id "io.github.kobylynskyi.graphql.codegen" version "4.1.5-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:4.1.4" + implementation "io.github.kobylynskyi:graphql-java-codegen:4.1.5-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 5ba8ec60a..9b952d59e 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 "4.1.4" + id "io.github.kobylynskyi.graphql.codegen" version "4.1.5-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 d78239713..c09ed4cd0 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 = '4.1.4' // This variable used in the automatic release process +def graphqlCodegenGradlePluginVersion = '4.1.5-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenGradlePluginVersion diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml index 6ec6c4267..adbdd4bea 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -72,7 +72,7 @@ 1.6 3.3.3 - 4.1.4 + 4.1.5-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 6da4acca6..66de85c82 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" % "4.1.4") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "4.1.5-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 ab24ad788..a28cbe1b3 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 := "4.1.4" +version in ThisBuild := "4.1.5-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 6da4acca6..66de85c82 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" % "4.1.4") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "4.1.5-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 ab24ad788..a28cbe1b3 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 := "4.1.4" +version in ThisBuild := "4.1.5-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 599ca21bd..2b2ac967e 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("4.1.4")) match { +sys.props.get("plugin.version").orElse(Some("4.1.5-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 ab24ad788..a28cbe1b3 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 := "4.1.4" +version in ThisBuild := "4.1.5-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt index ab24ad788..a28cbe1b3 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 := "4.1.4" +version in ThisBuild := "4.1.5-SNAPSHOT" From ea0191a601881e710edced441a196f8ae1d55625 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Fri, 5 Mar 2021 00:41:41 -0500 Subject: [PATCH 02/12] Fix CONTRIBUTING.md --- CONTRIBUTING.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7d0bbfe2c..9ba085291 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,15 +17,16 @@ Before sending your pull requests, make sure you followed this list: Please follow the steps below in order to make the changes: 1. Clone the repository and open it in your favourite IDE. -2. Make code changes to the core library of `graphql-java-codegen`. -3. If changes are required in the plugin code, then **build** and **install** `graphql-java-codegen` first. +2. Checkout **develop** branch. +3. Make code changes to the core library of `graphql-java-codegen`. +4. If changes are required in the plugin code, then **build** and **install** `graphql-java-codegen` first. ```shell script # This will install the library (including your recent changes) in your local maven repository. ./gradlew clean build publishToMavenLocal ``` -4. Build the plugin project with updated `graphql-java-codegen` library. +5. Build the plugin project with updated `graphql-java-codegen` library. ```shell script # Build Gradle plugin @@ -36,8 +37,8 @@ Please follow the steps below in order to make the changes: mvn clean verify ``` -5. Make changes to the plugin code -6. Install the plugin (copy to your local maven repository). +6. Make changes to the plugin code +7. Install the plugin (copy to your local maven repository). ```shell script # Install Gradle plugin @@ -48,4 +49,4 @@ Please follow the steps below in order to make the changes: mvn clean install ``` -7. Make sure that `example` projects are compiling and running. +8. Make sure that `example` projects are compiling and running. From 4c6b412b553d83ef0d21bf1f5bd02af411d3925e Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Fri, 5 Mar 2021 00:52:07 -0500 Subject: [PATCH 03/12] Prepare for next dev iteration - 4.1.5-SNAPSHOT --- plugins/maven/example-client/pom.xml | 2 +- plugins/maven/example-server/pom.xml | 2 +- plugins/maven/graphql-java-codegen-maven-plugin/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/maven/example-client/pom.xml b/plugins/maven/example-client/pom.xml index 1dc78efc2..94c2c19cb 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 - 4.1.4-SNAPSHOT + 4.1.5-SNAPSHOT graphql-codegen-maven-plugin-example-client diff --git a/plugins/maven/example-server/pom.xml b/plugins/maven/example-server/pom.xml index 8f17e5197..ae8460658 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 - 4.1.4-SNAPSHOT + 4.1.5-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 adbdd4bea..d369d881e 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -4,7 +4,7 @@ io.github.kobylynskyi graphql-codegen-maven-plugin - 4.1.4-SNAPSHOT + 4.1.5-SNAPSHOT maven-plugin graphql-codegen-maven-plugin From 9c2435a327ccf67a1d9a84228a2c67686234f4b5 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Fri, 5 Mar 2021 00:57:09 -0500 Subject: [PATCH 04/12] Update workflows --- .github/workflows/release.yml | 6 ++++-- .github/workflows/update-version.yml | 1 + .../{ => graphql-java-codegen-maven-plugin}/.maven.xml | 5 ++--- 3 files changed, 7 insertions(+), 5 deletions(-) rename plugins/maven/{ => graphql-java-codegen-maven-plugin}/.maven.xml (80%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 110bb0a9e..25e20f300 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -189,7 +189,7 @@ jobs: working-directory: plugins/maven/graphql-java-codegen-maven-plugin run: | mvn \ - --settings .maven.xml + --settings .maven.xml \ --no-transfer-progress \ --batch-mode \ -Dgpg.passphrase=${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} \ @@ -212,4 +212,6 @@ jobs: # - name: Push release version - run: git push --tags \ No newline at end of file + run: | + git push + git push --tags \ No newline at end of file diff --git a/.github/workflows/update-version.yml b/.github/workflows/update-version.yml index de601ae98..4b8a8fecc 100644 --- a/.github/workflows/update-version.yml +++ b/.github/workflows/update-version.yml @@ -33,4 +33,5 @@ jobs: git config --global user.name 'Bogdan Kobylynskyi' git config --global user.email 'kobylynskyi@users.noreply.github.com' git commit -am "Bump version to ${{ github.event.inputs.new_version }}" + git push git push --tags diff --git a/plugins/maven/.maven.xml b/plugins/maven/graphql-java-codegen-maven-plugin/.maven.xml similarity index 80% rename from plugins/maven/.maven.xml rename to plugins/maven/graphql-java-codegen-maven-plugin/.maven.xml index 60dda0a53..e1b46b95f 100644 --- a/plugins/maven/.maven.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/.maven.xml @@ -1,6 +1,5 @@ - From c3fdf6ccff9b698075cdf59f196d92009f377a87 Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Fri, 5 Mar 2021 01:16:57 -0500 Subject: [PATCH 05/12] Fix maven-release-plugin configuration --- plugins/maven/graphql-java-codegen-maven-plugin/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml index d369d881e..528db0b24 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -249,7 +249,6 @@ ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.patchVersion} - true From 708e6072d928fd25b9ffc31c4d2e53ff2f83be9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= Date: Sat, 6 Mar 2021 08:10:35 +0800 Subject: [PATCH 06/12] Kotlin: Fix ParameterizedInput and toString() issue (#573) * fxi ParameterizedInput bug * fix tostring (cherry picked from commit f3fe479f51f46b6a29172348860fea026e59eadd) --- .../kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl | 1 + .../templates/kotlin-lang/kotlinClassGraphqlType.ftl | 2 +- .../scala-lang/scalaClassGraphqlParametrizedInput.ftl | 1 + .../codegen/scala/GraphQLCodegenReactorToStringTest.java | 8 +++++--- .../expected-classes/kt/Commit_no_final_class.kt.txt | 2 +- .../kt/restricted-words/QueryFunParametrizedInput.kt.txt | 1 + .../tostring/QueryPrivateParametrizedInput.scala.txt | 1 + 7 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/resources/templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl b/src/main/resources/templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl index 18b9b6841..942519dd0 100755 --- a/src/main/resources/templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl +++ b/src/main/resources/templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl @@ -3,6 +3,7 @@ package ${package} import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer import java.util.StringJoiner <#if javaDoc?has_content> /** diff --git a/src/main/resources/templates/kotlin-lang/kotlinClassGraphqlType.ftl b/src/main/resources/templates/kotlin-lang/kotlinClassGraphqlType.ftl index cfb3a54ec..02177fad8 100755 --- a/src/main/resources/templates/kotlin-lang/kotlinClassGraphqlType.ftl +++ b/src/main/resources/templates/kotlin-lang/kotlinClassGraphqlType.ftl @@ -130,7 +130,7 @@ open class ${className}()<#if implements?has_content> : <#list implements as int return true } - override fun hashCode(): Int = { + override fun hashCode(): Int { <#if fields?has_content> return Objects.hash(<#list fields as field>${field.name}<#if field_has_next>, ) <#else> diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl index 50ede6d61..4b1106cb4 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl @@ -4,6 +4,7 @@ package ${package} import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer import scala.collection.JavaConverters._ <#if fields?has_content> <#if enumImportItSelfInScala?has_content> diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java index f68bbd4d4..c7fef53b3 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java @@ -103,13 +103,15 @@ void generate_SetGenerateClient_False() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> Objects.equals("Synchronized.scala", f)).sorted().collect(toList()); + List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> Objects.equals("Synchronized.scala", f) + || Objects.equals("QueryCaseParametrizedInput.scala", f)).sorted().collect(toList()); assertEquals(singletonList("Synchronized.scala"), generatedFileNames); for (File file : files) { - if (Objects.equals("Synchronized.scala", file.getName())) { + if (Arrays.asList("QueryCaseParametrizedInput.scala", "Synchronized.scala").contains(file.getName())) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", "TOSTRING_Synchronized.scala")), + new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", "TOSTRING_Synchronized.scala", + "QueryCaseParametrizedInput")), file); } } diff --git a/src/test/resources/expected-classes/kt/Commit_no_final_class.kt.txt b/src/test/resources/expected-classes/kt/Commit_no_final_class.kt.txt index 6168af65e..dc4cf3834 100644 --- a/src/test/resources/expected-classes/kt/Commit_no_final_class.kt.txt +++ b/src/test/resources/expected-classes/kt/Commit_no_final_class.kt.txt @@ -172,7 +172,7 @@ open class Commit( } - override fun hashCode(): Int = { + override fun hashCode(): Int { return Objects.hash(abbreviatedOid, additions, associatedPullRequests, author, authoredByCommitter, authoredDate, blame, changedFiles, comments, commitResourcePath, commitUrl, committedDate, committedViaWeb, committer, deletions, deployments, history, id, message, messageBody, messageBodyHTML, messageHeadline, messageHeadlineHTML, oid, parents, pushedDate, repository, resourcePath, signature, status, tarballUrl, tree, treeResourcePath, treeUrl, url, viewerCanSubscribe, viewerSubscription, zipballUrl) } 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 8aaa94d25..1ff7dae2f 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 @@ -1,6 +1,7 @@ package com.kobylynskyi.graphql.codegen.prot import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer import java.util.StringJoiner /** * Parametrized input for field fun in type Query 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 14a302579..a3dd8cb68 100644 --- a/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt +++ b/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt @@ -1,6 +1,7 @@ package com.kobylynskyi.graphql.codegen.prot import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer import scala.collection.JavaConverters._ import TestEnum._ From 4fee0a7c893c1cb7fc873ff2edcccae6b4978c67 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, 7 Mar 2021 19:11:03 +0800 Subject: [PATCH 07/12] Scala: fix enum import (#576) (cherry picked from commit 8db4c7c149068e539dee85c49263f67e08ca0ae5) --- .../scala-lang/scalaClassGraphqlOperations.ftl | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl index 444c8dea3..882ec46fe 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl @@ -14,16 +14,14 @@ import ${import}._ <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(param.type)> <#if enum == param.type?replace("Seq[", "")?replace("]", "")> - <#if waitImports?seq_contains(enum)> - <#else > - <#assign waitImports = waitImports + [param.type] /> + <#if !waitImports?seq_contains(enum)> + <#assign waitImports = waitImports + [enum] /> <#else > <#if enum == param.type> - <#if waitImports?seq_contains(enum)> - <#else > - <#assign waitImports = waitImports + [param.type] /> + <#if !waitImports?seq_contains(enum)> + <#assign waitImports = waitImports + [enum] /> From de7335adc28529055cadacdc38af99c19f3e4c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= Date: Mon, 8 Mar 2021 05:03:07 +0800 Subject: [PATCH 08/12] Fix generatedLanguage switch in all plugins #572 (#577) * https://github.com/kobylynskyi/graphql-java-codegen/issues/572 * add default * optimize code --- .../gradle/GraphQLCodegenGradleTask.java | 43 ++++++------------- .../graphql/codegen/GraphQLCodegenMojo.java | 40 ++++++----------- .../codegen/GraphQLCodegenPlugin.scala | 13 +++--- 3 files changed, 34 insertions(+), 62 deletions(-) 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 a70708c52..6eecde4d5 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 @@ -3,13 +3,7 @@ import com.kobylynskyi.graphql.codegen.GraphQLCodegen; import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; -import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy; -import com.kobylynskyi.graphql.codegen.model.ApiNamePrefixStrategy; -import com.kobylynskyi.graphql.codegen.model.ApiRootInterfaceStrategy; -import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; -import com.kobylynskyi.graphql.codegen.model.GraphQLCodegenConfiguration; -import com.kobylynskyi.graphql.codegen.model.MappingConfig; -import com.kobylynskyi.graphql.codegen.model.MappingConfigConstants; +import com.kobylynskyi.graphql.codegen.model.*; import com.kobylynskyi.graphql.codegen.model.exception.LanguageNotSupportedException; import com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.supplier.JsonMappingConfigSupplier; @@ -18,26 +12,15 @@ import org.gradle.api.Action; import org.gradle.api.DefaultTask; import org.gradle.api.plugins.JavaPluginConvention; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.InputFiles; -import org.gradle.api.tasks.Internal; -import org.gradle.api.tasks.Nested; import org.gradle.api.tasks.Optional; -import org.gradle.api.tasks.OutputDirectory; -import org.gradle.api.tasks.SourceSet; -import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.*; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.function.Supplier; /** * Gradle task for GraphQL code generation @@ -163,15 +146,17 @@ public void generate() throws Exception { } private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IOException { - switch (generatedLanguage) { + java.util.Optional mappingConfigSupplier = buildJsonSupplier(); + GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get).map(MappingConfig::getGeneratedLanguage).orElse(generatedLanguage); + switch (language) { case JAVA: - return new JavaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier()); + return new JavaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case SCALA: - return new ScalaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier()); + return new ScalaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case KOTLIN: - return new KotlinGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier()); + return new KotlinGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); default: - throw new LanguageNotSupportedException(generatedLanguage); + throw new LanguageNotSupportedException(language); } } @@ -216,11 +201,11 @@ private java.util.Optional findDefaultResourcesDir() { .map(File::toPath); } - private MappingConfigSupplier buildJsonSupplier() { + private java.util.Optional buildJsonSupplier() { if (jsonConfigurationFile != null && !jsonConfigurationFile.isEmpty()) { - return new JsonMappingConfigSupplier(jsonConfigurationFile); + return java.util.Optional.of(new JsonMappingConfigSupplier(jsonConfigurationFile)); } - return null; + return java.util.Optional.empty(); } @InputFiles 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 e201de058..04e83f18c 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 @@ -3,14 +3,7 @@ import com.kobylynskyi.graphql.codegen.GraphQLCodegen; import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; -import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy; -import com.kobylynskyi.graphql.codegen.model.ApiNamePrefixStrategy; -import com.kobylynskyi.graphql.codegen.model.ApiRootInterfaceStrategy; -import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; -import com.kobylynskyi.graphql.codegen.model.GraphQLCodegenConfiguration; -import com.kobylynskyi.graphql.codegen.model.MappingConfig; -import com.kobylynskyi.graphql.codegen.model.MappingConfigConstants; -import com.kobylynskyi.graphql.codegen.model.RelayConfig; +import com.kobylynskyi.graphql.codegen.model.*; import com.kobylynskyi.graphql.codegen.model.exception.LanguageNotSupportedException; import com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.supplier.JsonMappingConfigSupplier; @@ -28,17 +21,8 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Properties; -import java.util.Set; +import java.util.*; +import java.util.function.Supplier; @Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES, threadSafe = true) public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenConfiguration { @@ -261,15 +245,17 @@ public void execute() throws MojoExecutionException { } private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IOException { - switch (generatedLanguage) { + java.util.Optional mappingConfigSupplier = buildJsonSupplier(jsonConfigurationFile); + GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get).map(MappingConfig::getGeneratedLanguage).orElse(generatedLanguage); + switch (language) { case JAVA: - return new JavaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier(jsonConfigurationFile)); + return new JavaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case SCALA: - return new ScalaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier(jsonConfigurationFile)); + return new ScalaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case KOTLIN: - return new KotlinGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier(jsonConfigurationFile)); + return new KotlinGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); default: - throw new LanguageNotSupportedException(generatedLanguage); + throw new LanguageNotSupportedException(language); } } @@ -301,11 +287,11 @@ private Optional getDefaultResourcesDirectory() { return project.getResources().stream().findFirst().map(Resource::getDirectory).map(Paths::get); } - private MappingConfigSupplier buildJsonSupplier(String jsonConfigurationFile) { + private java.util.Optional buildJsonSupplier(String jsonConfigurationFile) { if (jsonConfigurationFile != null && !jsonConfigurationFile.isEmpty()) { - return new JsonMappingConfigSupplier(jsonConfigurationFile); + return java.util.Optional.of(new JsonMappingConfigSupplier(jsonConfigurationFile)); } - return null; + return java.util.Optional.empty(); } private void addCompileSourceRootIfConfigured() { 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 610ed71cc..50841acfa 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 @@ -202,18 +202,19 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co }, graphqlCodegen := { sLog.value.info(s"Generating files: ${BuildInfo.toString}") val mappingConfigSupplier = buildJsonSupplier(jsonConfigurationFile.value.orNull) + val language = mappingConfigSupplier.map(_.get()).map(_.getGeneratedLanguage).getOrElse(generatedLanguage.value) var result = Seq.empty[File] try { val _outputDir = outputDir.value val _introspectionResult = graphqlQueryIntrospectionResultPath.value.orNull lazy val instantiateCodegen = (mappingConfig: MappingConfig) => { - generatedLanguage.value match { + language match { case JAVA => - new JavaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier) + new JavaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier.orNull) case SCALA => - new ScalaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier) + new ScalaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier.orNull) case _ => - throw new LanguageNotSupportedException(generatedLanguage.value) + throw new LanguageNotSupportedException(language) } } result = instantiateCodegen(getMappingConfig().value).generate.asScala @@ -274,9 +275,9 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co ) ++ watchSourcesSetting ++ Seq(cleanFiles += generateCodegenTargetPath.value) } - protected def buildJsonSupplier(jsonConfigurationFile: String): JsonMappingConfigSupplier = { + protected def buildJsonSupplier(jsonConfigurationFile: String): Option[JsonMappingConfigSupplier] = { if (jsonConfigurationFile != null && jsonConfigurationFile.nonEmpty) - new JsonMappingConfigSupplier(jsonConfigurationFile) else null + Some(new JsonMappingConfigSupplier(jsonConfigurationFile)) else None } } From 5b65522202139e673a2f6028c163a383b0f414ff Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Wed, 10 Mar 2021 19:55:43 -0600 Subject: [PATCH 09/12] Introduce code style and reformat existing code #403 (#579) * Introduce code style and reformat existing code #403 * Add check-code-style.yml workflow #403 * Add graphql-codegen-check-style.xml and enable it in the workflow #403 * Fix check-code-style.yml workflow * Fix build issues * Revert back changes in gradlew script --- .github/ISSUE_TEMPLATE/bug_report.md | 6 +- .github/workflows/check-code-style.yml | 33 + .github/workflows/github.yml | 2 +- CONTRIBUTING.md | 20 +- config/checkstyle/checkstyle-suppressions.xml | 43 + .../graphql-codegen-check-style.xml | 363 + docs/client-side-cases-by-proxy.md | 31 +- docs/codegen-options.md | 80 +- docs/migration-to-2.0.0.md | 25 +- docs/migration-to-3.0.0.md | 31 +- docs/migration-to-4.0.0.md | 38 +- plugins/gradle/README.md | 27 +- .../graphql/resolvers/MutationsResolver.java | 3 +- .../order/service/OrderService.java | 27 +- .../service/CreateProductIntegrationTest.java | 13 +- .../graphql/mappers/ProductMapper.java | 3 +- .../graphql/resolvers/MutationsResolver.java | 4 +- .../gradle/GraphQLCodegenGradleTask.java | 75 +- .../gradle/ParentInterfacesConfig.java | 3 + .../graphql/codegen/gradle/RelayConfig.java | 3 + .../codegen/gradle/SchemaFinderConfig.java | 13 +- plugins/maven/README.md | 25 +- plugins/maven/example-client/pom.xml | 10 +- .../starwars/CharacterTypeResolver.java | 3 + .../graphql/resolvers/MutationsResolver.java | 3 +- .../order/service/OrderService.java | 27 +- .../service/CreateProductIntegrationTest.java | 13 +- plugins/maven/example-server/pom.xml | 8 +- .../graphql/mappers/ProductMapper.java | 3 +- .../graphql/resolvers/MutationsResolver.java | 4 +- .../graphql-java-codegen-maven-plugin/pom.xml | 7 +- .../graphql/codegen/GraphQLCodegenMojo.java | 37 +- .../codegen/ParentInterfacesConfig.java | 27 +- .../graphql/codegen/SchemaFinderConfig.java | 3 + plugins/sbt/README.md | 28 +- .../project/build.properties | 2 +- .../project/build.properties | 2 +- .../example-client/project/build.properties | 2 +- .../simple/project/build.properties | 2 +- .../codegen/FreeMarkerTemplatesRegistry.java | 88 +- .../graphql/codegen/GraphQLCodegen.java | 191 +- .../codegen/GraphQLCodegenFileCreator.java | 3 +- .../codegen/GraphQLDocumentParser.java | 12 +- .../codegen/java/JavaDataModelMapper.java | 3 + .../codegen/java/JavaGraphQLCodegen.java | 20 +- .../codegen/java/JavaGraphQLTypeMapper.java | 13 + .../codegen/java/JavaMapperFactoryImpl.java | 3 + .../codegen/java/JavaValueFormatter.java | 3 + .../codegen/kotlin/KotlinDataModelMapper.java | 13 +- .../codegen/kotlin/KotlinGraphQLCodegen.java | 19 +- .../kotlin/KotlinGraphQLTypeMapper.java | 83 +- .../kotlin/KotlinMapperFactoryImpl.java | 2 + .../codegen/kotlin/KotlinValueFormatter.java | 2 + .../codegen/mapper/DataModelMapper.java | 43 +- .../mapper/DataModelMapperFactory.java | 68 +- .../EnumDefinitionToDataModelMapper.java | 36 +- .../FieldDefinitionToParameterMapper.java | 36 +- ...dDefinitionsToResolverDataModelMapper.java | 42 +- .../codegen/mapper/GraphQLTypeMapper.java | 117 +- .../InputDefinitionToDataModelMapper.java | 23 +- ...InputValueDefinitionToParameterMapper.java | 19 +- .../InterfaceDefinitionToDataModelMapper.java | 15 +- ...stResponseDefinitionToDataModelMapper.java | 79 +- .../TypeDefinitionToDataModelMapper.java | 9 +- .../UnionDefinitionToDataModelMapper.java | 2 +- .../codegen/mapper/ValueFormatter.java | 7 + .../graphql/codegen/mapper/ValueMapper.java | 21 +- .../codegen/model/ApiInterfaceStrategy.java | 3 + .../codegen/model/ApiNamePrefixStrategy.java | 3 + .../model/ApiRootInterfaceStrategy.java | 3 + .../codegen/model/EnumValueDefinition.java | 3 +- .../codegen/model/GeneratedInformation.java | 3 + .../codegen/model/GeneratedLanguage.java | 3 + .../model/GraphQLCodegenConfiguration.java | 76 +- .../graphql/codegen/model/MappingConfig.java | 66 +- .../codegen/model/MappingConfigConstants.java | 9 +- .../graphql/codegen/model/MappingContext.java | 44 +- .../model/MultiLanguageDeprecated.java | 7 + .../codegen/model/NamedDefinition.java | 3 + .../codegen/model/ParameterDefinition.java | 8 +- .../graphql/codegen/model/RelayConfig.java | 3 + .../model/definitions/ExtendedDefinition.java | 15 + .../model/definitions/ExtendedDocument.java | 10 + .../ExtendedEnumTypeDefinition.java | 3 + .../definitions/ExtendedFieldDefinition.java | 8 +- .../ExtendedImplementingTypeDefinition.java | 3 +- .../ExtendedInputObjectTypeDefinition.java | 6 +- .../ExtendedInterfaceTypeDefinition.java | 11 +- .../ExtendedObjectTypeDefinition.java | 11 +- .../ExtendedScalarTypeDefinition.java | 6 +- .../ExtendedUnionTypeDefinition.java | 6 +- .../LanguageNotSupportedException.java | 3 + .../codegen/model/graphql/GraphQLError.java | 11 +- .../graphql/GraphQLErrorSourceLocation.java | 11 +- .../model/graphql/GraphQLErrorType.java | 6 +- .../model/graphql/GraphQLOperation.java | 7 +- .../graphql/GraphQLOperationRequest.java | 12 +- .../graphql/GraphQLRequestSerializer.java | 15 +- .../model/graphql/GraphQLResponse.java | 3 + .../graphql/GraphQLResponseProjection.java | 13 +- .../UnableToBuildJsonQueryException.java | 3 + .../codegen/scala/ScalaDataModelMapper.java | 3 + .../codegen/scala/ScalaGraphQLCodegen.java | 26 +- .../codegen/scala/ScalaGraphQLTypeMapper.java | 6 +- .../codegen/scala/ScalaMapperFactoryImpl.java | 3 + .../codegen/scala/ScalaValueFormatter.java | 3 + .../graphql/codegen/utils/Utils.java | 28 +- .../GraphQLCodegenAnnotationsTest.java | 96 +- .../codegen/GraphQLCodegenApisTest.java | 41 +- .../codegen/GraphQLCodegenDefaultsTest.java | 7 +- .../codegen/GraphQLCodegenEmptyTest.java | 6 +- .../codegen/GraphQLCodegenExtendTest.java | 29 +- .../GraphQLCodegenExternalConfigTest.java | 3 +- .../GraphQLCodegenFieldsResolversTest.java | 15 +- .../GraphQLCodegenFileCreatorTest.java | 10 +- .../codegen/GraphQLCodegenGitHubTest.java | 15 +- .../codegen/GraphQLCodegenInterfacesTest.java | 6 +- ...GraphQLCodegenIntrospectionResultTest.java | 3 +- .../GraphQLCodegenModelsForRootTypesTest.java | 6 +- .../codegen/GraphQLCodegenOptionalTest.java | 21 +- .../GraphQLCodegenParentInterfacesTest.java | 21 +- .../codegen/GraphQLCodegenRelayTest.java | 9 +- .../codegen/GraphQLCodegenRequestTest.java | 67 +- .../codegen/GraphQLCodegenResponseTest.java | 24 +- .../GraphQLCodegenRestrictedWordsTest.java | 4 +- .../graphql/codegen/GraphQLCodegenTest.java | 34 +- .../codegen/GraphQLCodegenValidateTest.java | 3 +- ...GraphQLCodegenCustomScalarMappingTest.java | 10 +- .../kotlin/GraphQLCodegenDeprecatedTest.java | 9 +- .../kotlin/GraphQLCodegenEmptyTest.java | 6 +- .../kotlin/GraphQLCodegenGitHubTest.java | 35 +- .../kotlin/GraphQLCodegenInterfacesTest.java | 6 +- .../kotlin/GraphQLCodegenNullableTest.java | 17 +- .../kotlin/GraphQLCodegenRelayTest.java | 9 +- ...nRestrictedWordsAndParameterInputTest.java | 15 +- .../codegen/model/MappingConfigTest.java | 286 +- .../GraphQLRequestSerializerScalaTest.java | 12 +- .../graphql/GraphQLRequestSerializerTest.java | 157 +- .../model/graphql/GraphQLResultTest.java | 44 +- .../EventPropertyParentParametrizedInput.java | 3 +- .../data/EventPropertyResponseProjection.java | 12 +- ...EventsByCategoryAndStatusQueryRequest.java | 13 +- .../graphql/data/EventsByIdsQueryRequest.java | 3 +- .../data/UpdateDate2MutationRequest.java | 13 +- .../data/UpdateDateMutationRequest.java | 11 +- .../model/graphql/data/UpdateIssueInput.java | 6 +- .../data/UpdateIssueMutationRequest.java | 11 +- .../UpdateNodeUnionResponseProjection.java | 3 +- .../graphql/data/VersionQueryRequest.java | 11 +- .../scala/GraphQLCodegenAnnotationsTest.java | 82 +- ...GraphQLCodegenCustomScalarMappingTest.java | 12 +- .../scala/GraphQLCodegenDeprecatedTest.java | 12 +- .../scala/GraphQLCodegenEmptyTest.java | 9 +- .../scala/GraphQLCodegenExtendTest.java | 70 +- .../scala/GraphQLCodegenGitHubTest.java | 43 +- .../GraphQLCodegenReactorToStringTest.java | 27 +- .../scala/GraphQLCodegenRelayTest.java | 9 +- .../JsonMappingConfigSupplierTest.java | 3 +- .../schemas/defaults-with-Long.graphqls | 1 - src/test/resources/schemas/defaults.graphqls | 1 - src/test/resources/schemas/github.graphqls | 8375 ++++++++--------- .../type-interface-duplicate-fields.graphqls | 10 +- .../type-interface-duplicate-fields1.graphqls | 10 +- 163 files changed, 6889 insertions(+), 5374 deletions(-) create mode 100644 .github/workflows/check-code-style.yml create mode 100644 config/checkstyle/checkstyle-suppressions.xml create mode 100644 config/checkstyle/graphql-codegen-check-style.xml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 31c9685ba..35ec20ccb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,21 +12,25 @@ assignees: '' *Describe your bug in detail.* ## Steps to Reproduce + *List in detail the exact steps to reproduce the unexpected behavior.* ## Expected Result + *Explain in detail what behavior you expected to happen.* ## Actual Result + *Explain in detail what behavior actually happened.* ## Your Environment and Setup * **graphql-java-codegen version**: *X.X.X* * **Build tool**: *E.g.: Maven/Gradle/SBT* -* **Mapping Config**: *E.g.:* +* **Mapping Config**: *E.g.:* ```xml + ${project.build.directory}/generated-sources/graphql io.github.kobylynskyi.graphql.model diff --git a/.github/workflows/check-code-style.yml b/.github/workflows/check-code-style.yml new file mode 100644 index 000000000..77c5ac8b6 --- /dev/null +++ b/.github/workflows/check-code-style.yml @@ -0,0 +1,33 @@ +name: Check Code Style + +on: + push: + branches: + - master + - develop + pull_request: + branches: + - master + - develop + +jobs: + check-code-style: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Check Code Style + env: + WORKDIR: ./ + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CHECKSTYLE_CONFIG: config/checkstyle/graphql-codegen-check-style.xml + REVIEWDOG_VERSION: v0.11.0 + run: | + wget -O - -q https://github.com/checkstyle/checkstyle/releases/download/checkstyle-8.41/checkstyle-8.41-all.jar > /opt/checkstyle.jar + wget -O - -q https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b /opt ${REVIEWDOG_VERSION} + java -jar /opt/checkstyle.jar "${WORKDIR}" -c "${CHECKSTYLE_CONFIG}" -f xml \ + | /opt/reviewdog -f=checkstyle \ + -reporter="${INPUT_REPORTER:-github-pr-check}" \ + -filter-mode="${INPUT_FILTER_MODE:-added}" \ + -fail-on-error="${INPUT_FAIL_ON_ERROR:-false}" diff --git a/.github/workflows/github.yml b/.github/workflows/github.yml index 8e27f8deb..4f6bc39fc 100644 --- a/.github/workflows/github.yml +++ b/.github/workflows/github.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - jdk-version: [1.8] + jdk-version: [ 1.8 ] steps: - uses: actions/checkout@v2 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9ba085291..f89eb5fa5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,22 +11,24 @@ Before sending your pull requests, make sure you followed this list: - Build the project locally. - Run Unit Tests and ensure that you have the test coverage for your code. - ## Development process Please follow the steps below in order to make the changes: -1. Clone the repository and open it in your favourite IDE. +1. Clone the repository 2. Checkout **develop** branch. -3. Make code changes to the core library of `graphql-java-codegen`. -4. If changes are required in the plugin code, then **build** and **install** `graphql-java-codegen` first. +3. Open repository in your favourite IDE. +4. Enable and configure CheckStyle plugin in your IDE (for IntelliJ it is CheckStyle-IDEA). + Import [graphql-codegen-check-style.xml](config/checkstyle/graphql-codegen-check-style.xml) as a . +5. Make code changes to the core library of `graphql-java-codegen`. +6. If changes are required in the plugin code, then **build** and **install** `graphql-java-codegen` first. ```shell script # This will install the library (including your recent changes) in your local maven repository. ./gradlew clean build publishToMavenLocal ``` - -5. Build the plugin project with updated `graphql-java-codegen` library. + +7. Build the plugin project with updated `graphql-java-codegen` library. ```shell script # Build Gradle plugin @@ -37,8 +39,8 @@ Please follow the steps below in order to make the changes: mvn clean verify ``` -6. Make changes to the plugin code -7. Install the plugin (copy to your local maven repository). +8. Make changes to the plugin code +9. Install the plugin (copy to your local maven repository). ```shell script # Install Gradle plugin @@ -49,4 +51,4 @@ Please follow the steps below in order to make the changes: mvn clean install ``` -8. Make sure that `example` projects are compiling and running. +10. Make sure that `example` projects are compiling and running. diff --git a/config/checkstyle/checkstyle-suppressions.xml b/config/checkstyle/checkstyle-suppressions.xml new file mode 100644 index 000000000..309e98d63 --- /dev/null +++ b/config/checkstyle/checkstyle-suppressions.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/checkstyle/graphql-codegen-check-style.xml b/config/checkstyle/graphql-codegen-check-style.xml new file mode 100644 index 000000000..251683368 --- /dev/null +++ b/config/checkstyle/graphql-codegen-check-style.xml @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/client-side-cases-by-proxy.md b/docs/client-side-cases-by-proxy.md index ea6849341..c264d2694 100644 --- a/docs/client-side-cases-by-proxy.md +++ b/docs/client-side-cases-by-proxy.md @@ -1,20 +1,22 @@ ## Using dynamic proxy to implement client-side calls to GraphQL server -This is an example of using dynamic proxy to implement client-side call server, so in addition to generating code, -you almost do not need to write any code, only need to write a little code to call the server directly (This is a very small part of the method call code). +This is an example of using dynamic proxy to implement client-side call server, so in addition to generating code, you +almost do not need to write any code, only need to write a little code to call the server directly (This is a very small +part of the method call code). -However, since we have simplified the client-side logic as much as possible, this method is more used when exposed as an SDK, -so that the users do not need to choose the fields on projection. -This will also have a bad effect, we can only use all fields of the projection on the returned structure by default. -Moreover, we also need set to default the depth of nested queries so that the proxy can end smoothly. -All in all, the scenarios used are limited. Currently, `.. on` and `alias` are not supported. +However, since we have simplified the client-side logic as much as possible, this method is more used when exposed as an +SDK, so that the users do not need to choose the fields on projection. This will also have a bad effect, we can only use +all fields of the projection on the returned structure by default. Moreover, we also need set to default the depth of +nested queries so that the proxy can end smoothly. All in all, the scenarios used are limited. Currently, `.. on` +and `alias` are not supported. Here is only to provide a way, the specific implementation for reference only, not verified by production environment! > Because reflection is heavily used, don't consider this approach if you need high performance. - -1. First of all, we need to implement dynamic proxy, and be able to automatically add parameters to request and select return fields on projection. - + +1. First of all, we need to implement dynamic proxy, and be able to automatically add parameters to request and select + return fields on projection. + ```java import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest; @@ -77,8 +79,8 @@ final public class DynamicProxy implements InvocationHandler, ExecutionGraphql { /** * proxy invoke - *

- * when handle projection, we use reflect to invoke method directly + * + *

when handle projection, we use reflect to invoke method directly * but when handle request(need set parameters), we use reflect to get field which is a internal implementation of set method * * @param parentProjection @@ -193,7 +195,8 @@ final public class DynamicProxy implements InvocationHandler, ExecutionGraphql { } ``` -2. Then we need to be able to proxy any resolver implementation and enable users to call resolver methods through proxy objects. +2. Then we need to be able to proxy any resolver implementation and enable users to call resolver methods through proxy + objects. ```java @@ -430,7 +433,7 @@ object HumanResolverScalaApp extends App { ``` Here are some auxiliary codes, It depends on the different users. - + ```java public interface ExecutionGraphql { diff --git a/docs/codegen-options.md b/docs/codegen-options.md index 0396f8a65..d678b3ad4 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -28,9 +28,12 @@ | `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)* | +| `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`. | | `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. | @@ -54,8 +57,8 @@ ### Option `graphqlSchemas` -When exact paths to GraphQL schemas are too cumbersome to provide in the `graphqlSchemaPaths`, use the `graphqlSchemas` block. -The parameters inside that block are the following: +When exact paths to GraphQL schemas are too cumbersome to provide in the `graphqlSchemaPaths`, use the `graphqlSchemas` +block. The parameters inside that block are the following: | Key inside `graphqlSchemas` | Data Type | Default value | Description | | --------------------------- | ------------ | ------------------ | ----------- | @@ -64,29 +67,30 @@ The parameters inside that block are the following: | `includePattern` | String | `.*\.graphqls?` | A Java regex that file names must match to be included. It should be a regex as defined by the [Pattern](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html) JDK class. It will be used to match only the file name without path. | | `excludedFiles` | Set | (empty set) | A set of files to exclude, even if they match the include pattern. These paths should be either absolute or relative to the provided `rootDir`. | - ### Option `ApiInterfaceStrategy` -Defines how to generate interfaces (resolvers) for each operation: `Query`/`Mutation`/`Subscription`. -Provides ability to skip generation of separate interface class for each operation in favor of having a single "root" interface (see *[ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* and *[ApiNamePrefixStrategy](#option-apinameprefixstrategy)*) +Defines how to generate interfaces (resolvers) for each operation: `Query`/`Mutation`/`Subscription`. Provides ability +to skip generation of separate interface class for each operation in favor of having a single "root" interface ( +see *[ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* +and *[ApiNamePrefixStrategy](#option-apinameprefixstrategy)*) | Value | Description | | --------------------------------------- | ----------- | | `INTERFACE_PER_OPERATION` **(default)** | Generate separate interface classes for each GraphQL operation. | | `DO_NOT_GENERATE` | Do not generate separate interfaces classes for GraphQL operation. | - ### Option `ApiRootInterfaceStrategy` -Defines how root interface (`QueryResolver` / `MutationResolver` / `SubscriptionResolver` will be generated (in addition to separate interfaces for each query/mutation/subscription) +Defines how root interface (`QueryResolver` / `MutationResolver` / `SubscriptionResolver` will be generated (in addition +to separate interfaces for each query/mutation/subscription) | Value | Description | | -------------------------------- | ----------- | | `INTERFACE_PER_SCHEMA` | Generate multiple super-interfaces for each graphql file.
Takes into account `apiNamePrefixStrategy`.
E.g.: `OrderServiceQueryResolver.java`, `ProductServiceQueryResolver.java`, etc. | -| `SINGLE_INTERFACE` **(default)** | Generate a single `QueryResolver.java`, `MutationResolver.java`, `SubscriptionResolver.java` for all graphql schema files. | +| `SINGLE_INTERFACE` **( +default)** | Generate a single `QueryResolver.java`, `MutationResolver.java`, `SubscriptionResolver.java` for all graphql schema files. | | `DO_NOT_GENERATE` | Do not generate super interface for GraphQL operations. | - ### Option `ApiNamePrefixStrategy` Defines which prefix to use for API interfaces. @@ -97,13 +101,23 @@ Defines which prefix to use for API interfaces. | `FOLDER_NAME_AS_PREFIX` | Will take parent folder name as a prefix for all generated API interfaces + value of `apiNamePrefix` config option. E.g.:
* following schemas: *resources/order-service/schema1.graphql*, *resources/order-service/schema2.graphql*
* will result in: `OrderServiceQueryResolver.java`, `OrderServiceGetOrderByIdQueryResolver.java`, etc | | `CONSTANT` **(default)** | Will take only the value of `apiNamePrefix` config option. | +resources/schemas/order-service.graphql*, * +resources/schemas/product-service.graphql*
* will result in: `OrderServiceQueryResolver.java` +, `ProductServiceQueryResolver.java`, etc | | `FOLDER_NAME_AS_PREFIX` | Will take parent folder name as a prefix for +all generated API interfaces + value of `apiNamePrefix` config option. E.g.:
* following schemas: * +resources/order-service/schema1.graphql*, * +resources/order-service/schema2.graphql*
* will result in: `OrderServiceQueryResolver.java` +, `OrderServiceGetOrderByIdQueryResolver.java`, etc | | `CONSTANT` **(default)** | Will take only the value +of `apiNamePrefix` config option. | ### Option `parentInterfaces` -Following options can be defined if you want generated resolvers to extend certain interfaces. -Can be handy if you are using [graphql-java-tools](https://github.com/graphql-java-kickstart/graphql-java-tools) and want your resolver classes to extend only interfaces generated by this plugin. +Following options can be defined if you want generated resolvers to extend certain interfaces. Can be handy if you are +using [graphql-java-tools](https://github.com/graphql-java-kickstart/graphql-java-tools) and want your resolver classes +to extend only interfaces generated by this plugin. -**Note:** if you want to include a GraphQL type name into the interface name, then use `{{TYPE}}` placeholder. E.g.: `graphql.kickstart.tools.GraphQLResolver<{{TYPE}}>` +**Note:** if you want to include a GraphQL type name into the interface name, then use `{{TYPE}}` placeholder. +E.g.: `graphql.kickstart.tools.GraphQLResolver<{{TYPE}}>` | Key inside `parentInterfaces` | Data Type | Default value | Description | | ----------------------------- | --------- | ------------- | ----------- | @@ -112,41 +126,42 @@ Can be handy if you are using [graphql-java-tools](https://github.com/graphql-ja | `subscriptionResolver` | String | Empty | Interface that will be added as "extend" to all generated api Subscription interfaces. | | `resolver` | String | Empty | Interface that will be added as "extend" to all generated TypeResolver interfaces. | - ### Option `customTypesMapping` -Can be used to supply custom mappings for scalars. +Can be used to supply custom mappings for scalars. Supports following formats: -* Map of (GraphQLObjectName.fieldName) to (JavaType). E.g.: `Event.dateTime = java.util.Date` -* Map of (GraphQLType) to (JavaType). E.g.: `EpochMillis = java.time.LocalDateTime` +* Map of (GraphQLObjectName.fieldName) to (JavaType). E.g.: `Event.dateTime = java.util.Date` +* Map of (GraphQLType) to (JavaType). E.g.: `EpochMillis = java.time.LocalDateTime` ### Option `customAnnotationsMapping` Can be used to supply custom annotations (serializers) for scalars. -`@` in front of the annotation class is optional. +`@` in front of the annotation class is optional. Supports following formats: -* Map of (GraphQLObjectName.fieldName) to (JavaAnnotation). E.g.: `Event.dateTime = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.DateDeserializer.class)` -* Map of (GraphQLType) to (JavaAnnotation). E.g.: `EpochMillis = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.EpochMillisDeserializer.class)` +* Map of (GraphQLObjectName.fieldName) to (JavaAnnotation). + E.g.: `Event.dateTime = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.DateDeserializer.class)` +* Map of (GraphQLType) to (JavaAnnotation). + E.g.: `EpochMillis = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.EpochMillisDeserializer.class)` ### Option `directiveAnnotationsMapping` -Can be used to supply custom annotations for directives in a following format: -Map of (GraphQL.directiveName) to (JavaAnnotation). E.g.: `auth = @org.springframework.security.access.annotation.Secured({{roles}})`. +Can be used to supply custom annotations for directives in a following format: +Map of (GraphQL.directiveName) to (JavaAnnotation). +E.g.: `auth = @org.springframework.security.access.annotation.Secured({{roles}})`. `@` in front of the annotation class is optional. -**Note:** In order to supply the value of directive argument to annotation, use placeholder `{{directiveArgument}}`. -You can also use one of the formatters for directive argument value: `{{val?toString}}`, `{{val?toArray}}`, `{{val?toArrayOfStrings}}`. - - +**Note:** In order to supply the value of directive argument to annotation, use placeholder `{{directiveArgument}}`. You +can also use one of the formatters for directive argument value: `{{val?toString}}`, `{{val?toArray}}` +, `{{val?toArrayOfStrings}}`. ### Option `relayConfig` -Can be used to supply a custom configuration for Relay support. -For reference see: https://www.graphql-java-kickstart.com/tools/relay/ +Can be used to supply a custom configuration for Relay support. For reference +see: https://www.graphql-java-kickstart.com/tools/relay/ | Key inside `relayConfig` | Data Type | Default value | Description | | ------------------------ | --------- | -------------------------- | ----------- | @@ -155,16 +170,17 @@ For reference see: https://www.graphql-java-kickstart.com/tools/relay/ | `connectionType` | String | `graphql.relay.Connection` | Generic Connection type. | For example, the following schema: + ``` type Query { users(first: Int, after: String): UserConnection @connection(for: "User") } ``` + will result in generating the interface with the following method: + ``` graphql.relay.Connection users(Integer first, String after) throws Exception; ``` - - ### External mapping configuration Provide a path to external file via property `jsonConfigurationFile` diff --git a/docs/migration-to-2.0.0.md b/docs/migration-to-2.0.0.md index 5d8031f68..88a15ed37 100644 --- a/docs/migration-to-2.0.0.md +++ b/docs/migration-to-2.0.0.md @@ -1,12 +1,16 @@ -Some breaking changes were introduced in [Release 2.0.0](https://github.com/kobylynskyi/graphql-java-codegen/releases/tag/v2.0.0). -So if you were using version 1.x.x then please follow steps below. +Some breaking changes were introduced +in [Release 2.0.0](https://github.com/kobylynskyi/graphql-java-codegen/releases/tag/v2.0.0). So if you were using +version 1.x.x then please follow steps below. ## Migration steps ### 1. Update plugin and library versions -As per plugin description: [Gradle](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/gradle), [Maven](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven) + +As per plugin description: [Gradle](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/gradle) +, [Maven](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven) ### 2. Update plugin configuration (only for client-side codegen) + If you have used `generateRequests` config option, please replace it with `generateClient`: Plugin | Old config | Replaced by ------ | ---------- | ----------- @@ -14,13 +18,15 @@ Maven | `true` | `true @@ -29,6 +33,7 @@ So now if you want to use async return type in your APIs, simply follow the new ``` #### Gradle + ```groovy // OLD APPROACH generateAsyncApis=true @@ -43,6 +48,7 @@ apiReturnListType=reactor.core.publisher.Flux ``` #### SBT + ```sbt // OLD APPROACH generateAsyncApis := true @@ -55,9 +61,12 @@ apiReturnType := Some("scala.concurrent.Future") ``` ### 3. Update plugin configuration for `customAnnotationsMapping` and `directiveAnnotationsMapping` -If you have used `customAnnotationsMapping` or `directiveAnnotationsMapping` config options, then it should be updated by providing an array of annotations in the following format: + +If you have used `customAnnotationsMapping` or `directiveAnnotationsMapping` config options, then it should be updated +by providing an array of annotations in the following format: #### Maven + ```xml @@ -89,6 +98,7 @@ If you have used `customAnnotationsMapping` or `directiveAnnotationsMapping` con ``` #### Gradle + ```groovy // OLD APPROACH customAnnotationsMapping = [ @@ -115,6 +125,7 @@ directiveAnnotationsMapping = [ ``` #### SBT + ```sbt // OLD APPROACH customAnnotationsMapping := { @@ -147,13 +158,15 @@ customAnnotationsMapping := { } // NEW APPROACH ``` -`directiveAnnotationsMapping`, In the same way. +`directiveAnnotationsMapping`, In the same way. ### 4. Regenerate the code + Run project build so that GraphQL classes are regenerated. --- -Feel free to ask any questions in [GitHub Discussions](https://github.com/kobylynskyi/graphql-java-codegen/discussions) or [create an issue](https://github.com/kobylynskyi/graphql-java-codegen/issues) if you discover some problems. +Feel free to ask any questions in [GitHub Discussions](https://github.com/kobylynskyi/graphql-java-codegen/discussions) +or [create an issue](https://github.com/kobylynskyi/graphql-java-codegen/issues) if you discover some problems. diff --git a/docs/migration-to-4.0.0.md b/docs/migration-to-4.0.0.md index fe2f3a422..5b392c5c2 100644 --- a/docs/migration-to-4.0.0.md +++ b/docs/migration-to-4.0.0.md @@ -1,28 +1,33 @@ -Some breaking changes were introduced in [Release 4.0.0](https://github.com/kobylynskyi/graphql-java-codegen/releases/tag/v4.0.0). -So if you were using version 3.x.x then please follow steps below. -Note: if you are migrating from version 2.x.x, then please also follow [3.0.0 migration guide](migration-to-3.0.0.md) first. +Some breaking changes were introduced +in [Release 4.0.0](https://github.com/kobylynskyi/graphql-java-codegen/releases/tag/v4.0.0). So if you were using +version 3.x.x then please follow steps below. Note: if you are migrating from version 2.x.x, then please also +follow [3.0.0 migration guide](migration-to-3.0.0.md) first. ## Migration steps ### 1. Update plugin and library versions -As per plugin description: [Gradle](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/gradle), [Maven](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven) +As per plugin description: [Gradle](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/gradle) +, [Maven](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven) ### 2. Change GraphQL Resolvers containing non-null GraphQL types to primitive Java types This effects the following types: + * GraphQL `Int` - * Non-null -> Java `int` - * Nullable -> Java `Integer` + * Non-null -> Java `int` + * Nullable -> Java `Integer` * GraphQL `Float` - * Non-null -> Java `double` - * Nullable -> Java `Double` + * Non-null -> Java `double` + * Nullable -> Java `Double` * GraphQL `Boolean` - * Non-null -> Java `boolean` - * Nullable -> Java `Boolean` + * Non-null -> Java `boolean` + * Nullable -> Java `Boolean` #### Example + Let's suppose there is a graphql schema: + ```graphql type Query { diffTypes(intNonNull: Int!, @@ -33,7 +38,9 @@ type Query { floatNullable: Float): Int! } ``` + And your GraphQL resolver (in version 3.x.x and below) looks like the following: + ```java public class DiffTypesQueryResolverImpl implements DiffTypesQueryResolver { @Override @@ -45,7 +52,10 @@ public class DiffTypesQueryResolverImpl implements DiffTypesQueryResolver { Double floatNullable) { return null; } } ``` -Now in version 4.0.0 the FeedsQueryResolver interface will be generated **with primitive types** for non-null GraphQL types: + +Now in version 4.0.0 the FeedsQueryResolver interface will be generated **with primitive types** for non-null GraphQL +types: + ```java public interface DiffTypesQueryResolver { int diffTypes(int intNonNull, @@ -56,7 +66,9 @@ public interface DiffTypesQueryResolver { Double floatNullable); } ``` + So you should change your resolver implementation to: + ```java public class DiffTypesQueryResolverImpl implements DiffTypesQueryResolver { @Override @@ -72,9 +84,11 @@ public class DiffTypesQueryResolverImpl implements DiffTypesQueryResolver { ``` ### 3. Regenerate the code + Run project build so that GraphQL classes are regenerated and your code compiles. --- -Feel free to ask any questions in [GitHub Discussions](https://github.com/kobylynskyi/graphql-java-codegen/discussions) or [create an issue](https://github.com/kobylynskyi/graphql-java-codegen/issues) if you discover some problems. +Feel free to ask any questions in [GitHub Discussions](https://github.com/kobylynskyi/graphql-java-codegen/discussions) +or [create an issue](https://github.com/kobylynskyi/graphql-java-codegen/issues) if you discover some problems. diff --git a/plugins/gradle/README.md b/plugins/gradle/README.md index 64271711e..cf95bfef7 100644 --- a/plugins/gradle/README.md +++ b/plugins/gradle/README.md @@ -8,12 +8,11 @@ * [Plugin Options](#plugin-options) * [Sample Plugin Configuration](#sample-plugin-configuration) * [Examples](#examples) - * [GraphQL **server** code generation](#graphql-server-code-generation) - * [GraphQL **client** code generation](#graphql-client-code-generation) + * [GraphQL **server** code generation](#graphql-server-code-generation) + * [GraphQL **client** code generation](#graphql-client-code-generation) * [Different configurations for graphql schemas](#different-configurations-for-graphql-schemas) * [Convert generated Java classes to Kotlin classes](#convert-generated-java-classes-to-kotlin-classes) - ### Plugin Setup ```groovy @@ -71,7 +70,8 @@ compileJava.dependsOn 'graphqlCodegen' sourceSets.main.java.srcDir "$buildDir/generated" ``` -You can also refer to build.gradle files in example projects: [example-client/build.gradle](example-client/build.gradle), [example-server/build.gradle](example-server/build.gradle) +You can also refer to build.gradle files in example projects: [example-client/build.gradle](example-client/build.gradle) +, [example-server/build.gradle](example-server/build.gradle) #### build.gradle.kts: @@ -97,26 +97,27 @@ tasks.named("compileJava") { } ``` - ### Examples #### GraphQL **server** code generation [example-server](example-server): - * [Plugin configuration in build.gradle](example-server/build.gradle) - * [GraphQL Resolver classes that implement generated interfaces](example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers) -#### GraphQL **client** code generation +* [Plugin configuration in build.gradle](example-server/build.gradle) +* [GraphQL Resolver classes that implement generated interfaces](example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers) + +#### GraphQL **client** code generation [example-client](example-client): - * [Plugin configuration in build.gradle](example-client/build.gradle) - * [Building GraphQL request and parsing response using Spring RestTemplate](example-client/src/main/java/io/github/kobylynskyi/order/external/product/ProductServiceGraphQLClient.java) - * [Building GraphQL request and parsing response using RestAssured](example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java) +* [Plugin configuration in build.gradle](example-client/build.gradle) +* [Building GraphQL request and parsing response using Spring RestTemplate](example-client/src/main/java/io/github/kobylynskyi/order/external/product/ProductServiceGraphQLClient.java) +* [Building GraphQL request and parsing response using RestAssured](example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java) ### Different configurations for graphql schemas -If you want to have different configuration for different `.graphqls` files (e.g.: different javaPackage, outputDir, etc.), then you will need to create separate gradle tasks for each set of schemas. E.g.: +If you want to have different configuration for different `.graphqls` files (e.g.: different javaPackage, outputDir, +etc.), then you will need to create separate gradle tasks for each set of schemas. E.g.: ```groovy task graphqlCodegenService1(type: GraphqlCodegenGradleTask) { @@ -136,13 +137,11 @@ Later on you can call each task separately or together: * `gradle clean graphqlCodegenService2 build` * `gradle clean graphqlCodegenService1 graphqlCodegenService2 build` - ### Convert generated Java classes to Kotlin classes 1. Navigate in IntelliJ IDEA to the `./build/generated/graphql/` folder and press `Cmd+Alt+Shift+K` 2. Access generated classes as normal Kotlin classes. - ### Inspired by [swagger-codegen](https://github.com/swagger-api/swagger-codegen) diff --git a/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java b/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java index 821fa4dba..2e0e9e568 100644 --- a/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java +++ b/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java @@ -10,7 +10,8 @@ import org.springframework.stereotype.Component; @Component -public class MutationsResolver implements CreateMutationResolver, AddProductToOrderMutationResolver, GraphQLMutationResolver { +public class MutationsResolver implements + CreateMutationResolver, AddProductToOrderMutationResolver, GraphQLMutationResolver { @Autowired private OrderService service; diff --git a/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java b/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java index b549bb660..ca89864ad 100644 --- a/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java +++ b/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java @@ -6,7 +6,6 @@ import io.github.kobylynskyi.order.model.OrderNotFoundException; import io.github.kobylynskyi.order.model.Product; import io.github.kobylynskyi.order.model.UnableToRetrieveProductException; -import io.github.kobylynskyi.order.model.UnableToRetrieveProductsException; import io.github.kobylynskyi.order.repository.OrderRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -39,13 +38,26 @@ public Order create() { return saved; } - public Order addProduct(String orderId, String productId, int quantity) throws OrderNotFoundException, UnableToRetrieveProductException, UnableToRetrieveProductsException { + public Order addProduct(String orderId, String productId, int quantity) + throws OrderNotFoundException, UnableToRetrieveProductException { Order order = getOrderById(orderId); - - Product product = productService.getProduct(productId); // for bulk use: // Product product = productService.getProducts(Collections.singletonList(productId)).get(0); - Item item = order.getItems().stream() + Product product = productService.getProduct(productId); + Item item = getItem(productId, order); + updateOrderItem(item, product, quantity); + repository.save(order); + log.info("Added product [id: {}] to the order [id: {}]", product.getId(), order.getId()); + return order; + } + + private void updateOrderItem(Item item, Product product, int quantity) { + item.setQuantity(item.getQuantity() + quantity); + item.setTotal(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); + } + + private Item getItem(String productId, Order order) { + return order.getItems().stream() .filter(p -> p.getProductId().equals(productId)) .findFirst() .orElseGet(() -> { @@ -53,11 +65,6 @@ public Order addProduct(String orderId, String productId, int quantity) throws O order.getItems().add(newItem); return newItem; }); - item.setQuantity(item.getQuantity() + quantity); - item.setTotal(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); - repository.save(order); - log.info("Added product [id: {}] to the order [id: {}]", product.getId(), order.getId()); - return order; } } diff --git a/plugins/gradle/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java b/plugins/gradle/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java index dfb49843d..f07e3cd56 100644 --- a/plugins/gradle/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java +++ b/plugins/gradle/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java @@ -2,7 +2,11 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequest; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResult; -import io.github.kobylynskyi.product.graphql.model.*; +import io.github.kobylynskyi.product.graphql.model.CreateMutationRequest; +import io.github.kobylynskyi.product.graphql.model.ProductInputTO; +import io.github.kobylynskyi.product.graphql.model.ProductResponseProjection; +import io.github.kobylynskyi.product.graphql.model.ProductTO; +import io.github.kobylynskyi.product.graphql.model.StockStatusTO; import io.restassured.common.mapper.TypeRef; import io.restassured.http.ContentType; import org.junit.jupiter.api.Disabled; @@ -12,7 +16,9 @@ import java.util.Map; import static io.restassured.RestAssured.given; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; class CreateProductIntegrationTest { @@ -33,7 +39,8 @@ void createProductUsingRestAssured() { .post("/graphql") .then() .statusCode(200) - .extract().response().as(new TypeRef>>() {}); + .extract().response().as(new TypeRef>>() { + }); assertFalse(result.hasErrors()); ProductTO createdProduct = result.getData().get(createProductMutation.getOperationName()); diff --git a/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java b/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java index d958f3598..7458dba0b 100644 --- a/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java +++ b/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java @@ -12,8 +12,7 @@ public interface ProductMapper { ProductTO map(Product from); @Mapping(target = "id", ignore = true) // auto-generated - @Mapping(target = "addedDateTime", ignore = true) - // set in the service + @Mapping(target = "addedDateTime", ignore = true) // this property is set in the service Product mapInput(ProductInputTO from); } diff --git a/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java b/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java index d79f091c6..58f368f46 100644 --- a/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java +++ b/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java @@ -18,8 +18,8 @@ public class MutationsResolver implements CreateMutationResolver { private ProductMapper mapper; @Override - public ProductTO create(ProductInputTO ProductInputTO) { - Product savedProduct = service.create(mapper.mapInput(ProductInputTO)); + public ProductTO create(ProductInputTO productInput) { + Product savedProduct = service.create(mapper.mapInput(productInput)); return mapper.map(savedProduct); } } 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 6eecde4d5..c3c63154b 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 @@ -3,7 +3,13 @@ import com.kobylynskyi.graphql.codegen.GraphQLCodegen; import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; -import com.kobylynskyi.graphql.codegen.model.*; +import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy; +import com.kobylynskyi.graphql.codegen.model.ApiNamePrefixStrategy; +import com.kobylynskyi.graphql.codegen.model.ApiRootInterfaceStrategy; +import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; +import com.kobylynskyi.graphql.codegen.model.GraphQLCodegenConfiguration; +import com.kobylynskyi.graphql.codegen.model.MappingConfig; +import com.kobylynskyi.graphql.codegen.model.MappingConfigConstants; import com.kobylynskyi.graphql.codegen.model.exception.LanguageNotSupportedException; import com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.supplier.JsonMappingConfigSupplier; @@ -12,14 +18,26 @@ import org.gradle.api.Action; import org.gradle.api.DefaultTask; import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.Nested; import org.gradle.api.tasks.Optional; -import org.gradle.api.tasks.*; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.TaskAction; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Supplier; /** @@ -88,13 +106,22 @@ public GraphQLCodegenGradleTask() { setDescription("Generates Java POJOs and interfaces based on GraphQL schemas"); } + /** + * Perform code generation + * + * @throws Exception in case source file is not found, there is an invalid schema or there are any problems + * with a configuration + */ @TaskAction public void generate() throws Exception { MappingConfig mappingConfig = new MappingConfig(); mappingConfig.setPackageName(packageName); - mappingConfig.setCustomTypesMapping(customTypesMapping != null ? customTypesMapping : new HashMap<>()); - mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>()); - mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping != null ? directiveAnnotationsMapping : new HashMap<>()); + mappingConfig.setCustomTypesMapping( + customTypesMapping != null ? customTypesMapping : new HashMap<>()); + mappingConfig.setCustomAnnotationsMapping( + customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>()); + mappingConfig.setDirectiveAnnotationsMapping( + directiveAnnotationsMapping != null ? directiveAnnotationsMapping : new HashMap<>()); mappingConfig.setApiNameSuffix(apiNameSuffix); mappingConfig.setApiNamePrefix(apiNamePrefix); mappingConfig.setApiRootInterfaceStrategy(apiRootInterfaceStrategy); @@ -122,8 +149,10 @@ public void generate() throws Exception { mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(generateDataFetchingEnvironmentArgumentInApis); mappingConfig.setGenerateExtensionFieldsResolvers(generateExtensionFieldsResolvers); mappingConfig.setGenerateModelsForRootTypes(generateModelsForRootTypes); - mappingConfig.setFieldsWithResolvers(fieldsWithResolvers != null ? fieldsWithResolvers : new HashSet<>()); - mappingConfig.setFieldsWithoutResolvers(fieldsWithoutResolvers != null ? fieldsWithoutResolvers : new HashSet<>()); + mappingConfig.setFieldsWithResolvers( + fieldsWithResolvers != null ? fieldsWithResolvers : new HashSet<>()); + mappingConfig.setFieldsWithoutResolvers( + fieldsWithoutResolvers != null ? fieldsWithoutResolvers : new HashSet<>()); mappingConfig.setRelayConfig(relayConfig); mappingConfig.setGenerateClient(generateClient); @@ -131,7 +160,8 @@ public void generate() throws Exception { mappingConfig.setResponseSuffix(responseSuffix); mappingConfig.setResponseProjectionSuffix(responseProjectionSuffix); mappingConfig.setParametrizedInputSuffix(parametrizedInputSuffix); - mappingConfig.setUseObjectMapperForRequestSerialization(useObjectMapperForRequestSerialization != null ? useObjectMapperForRequestSerialization : new HashSet<>()); + mappingConfig.setUseObjectMapperForRequestSerialization(useObjectMapperForRequestSerialization != null ? + useObjectMapperForRequestSerialization : new HashSet<>()); mappingConfig.setResponseProjectionMaxDepth(responseProjectionMaxDepth); mappingConfig.setResolverParentInterface(getResolverParentInterface()); @@ -147,22 +177,32 @@ public void generate() throws Exception { private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IOException { java.util.Optional mappingConfigSupplier = buildJsonSupplier(); - GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get).map(MappingConfig::getGeneratedLanguage).orElse(generatedLanguage); + GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get) + .map(MappingConfig::getGeneratedLanguage) + .orElse(generatedLanguage); switch (language) { case JAVA: - return new JavaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); + return new JavaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case SCALA: - return new ScalaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); + return new ScalaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case KOTLIN: - return new KotlinGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); + return new KotlinGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); default: throw new LanguageNotSupportedException(language); } } - // This is only public so that it can be part of the inputs. - // Changes to schema contents need to invalidate this task, and require re-run. - // Using the SchemaFinder, we need to calculate the resulting list of paths as @InputFiles for it to work. + /** + * This is only public so that it can be part of the inputs. + * Changes to schema contents need to invalidate this task, and require re-run. + * Using the SchemaFinder, we need to calculate the resulting list of paths as @InputFiles for it to work. + * + * @return a list of schema files that will be processed. + * @throws IOException in case some I/O error occurred + */ @InputFiles public List getActualSchemaPaths() throws IOException { if (graphqlSchemaPaths != null) { @@ -551,7 +591,8 @@ public Boolean getGenerateDataFetchingEnvironmentArgumentInApis() { return generateDataFetchingEnvironmentArgumentInApis; } - public void setGenerateDataFetchingEnvironmentArgumentInApis(Boolean generateDataFetchingEnvironmentArgumentInApis) { + public void setGenerateDataFetchingEnvironmentArgumentInApis( + Boolean generateDataFetchingEnvironmentArgumentInApis) { this.generateDataFetchingEnvironmentArgumentInApis = generateDataFetchingEnvironmentArgumentInApis; } diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/ParentInterfacesConfig.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/ParentInterfacesConfig.java index aaf6d05c2..f67ac2ca6 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/ParentInterfacesConfig.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/ParentInterfacesConfig.java @@ -3,6 +3,9 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Optional; +/** + * Configuration of parent interfaces to be used during code generation + */ public class ParentInterfacesConfig { private String queryResolver; diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/RelayConfig.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/RelayConfig.java index 524969076..95a9974a8 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/RelayConfig.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/RelayConfig.java @@ -3,6 +3,9 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Optional; +/** + * Relay-relatedconfigurations + */ public class RelayConfig extends com.kobylynskyi.graphql.codegen.model.RelayConfig { @Input diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/SchemaFinderConfig.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/SchemaFinderConfig.java index 06fc78446..10c688a4b 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/SchemaFinderConfig.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/SchemaFinderConfig.java @@ -1,14 +1,16 @@ package io.github.kobylynskyi.graphql.codegen.gradle; import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder; - -import java.util.Collections; -import java.util.Set; - import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.Optional; +import java.util.Collections; +import java.util.Set; + +/** + * Configuration of dynamic GraphQL schema finder + */ public class SchemaFinderConfig { private String rootDir; @@ -20,7 +22,8 @@ public class SchemaFinderConfig { private Set excludedFiles = Collections.emptySet(); // This should not be replaced by @InputDirectory, because some files in this directory may not be schemas. - // We only know the actual list of schema files to check after running the SchemaFinder, so @InputFiles is over there. + // We only know the actual list of schema files to check after running the SchemaFinder, + // so @InputFiles is over there. @Input @Optional public String getRootDir() { diff --git a/plugins/maven/README.md b/plugins/maven/README.md index 59e2ce201..fa9869a65 100644 --- a/plugins/maven/README.md +++ b/plugins/maven/README.md @@ -7,11 +7,10 @@ * [Plugin Setup and Configuration](#plugin-setup-and-configuration) * [Plugin Options](#plugin-options) * [Examples](#examples) - * [GraphQL **server** code generation](#graphql-server-code-generation) - * [GraphQL **client** code generation](#graphql-client-code-generation) + * [GraphQL **server** code generation](#graphql-server-code-generation) + * [GraphQL **client** code generation](#graphql-client-code-generation) * [Different configurations for graphql schemas](#different-configurations-for-graphql-schemas) - ### Plugin Setup and Configuration ```xml @@ -55,8 +54,8 @@ ``` -You can run the plugin manually with `mvn generate-sources`. It will be run automatically as part of the Maven lifecycle when compiling your code - +You can run the plugin manually with `mvn generate-sources`. It will be run automatically as part of the Maven lifecycle +when compiling your code ### Plugin Options @@ -67,20 +66,22 @@ Please refer to [Codegen Options](../../docs/codegen-options.md) #### GraphQL **server** code generation [example-server](example-server): - * [Plugin configuration in pom.xml](example-server/pom.xml) - * [GraphQL Resolver classes that implement generated interfaces](example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers) + +* [Plugin configuration in pom.xml](example-server/pom.xml) +* [GraphQL Resolver classes that implement generated interfaces](example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers) #### GraphQL **client** code generation [example-client](example-client): - * [Plugin configuration in pom.xml](example-client/pom.xml) - * [Building GraphQL request and parsing response using Spring RestTemplate](example-client/src/main/java/io/github/kobylynskyi/order/external/product/ProductServiceGraphQLClient.java) - * [Building GraphQL request and parsing response using RestAssured](example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java) +* [Plugin configuration in pom.xml](example-client/pom.xml) +* [Building GraphQL request and parsing response using Spring RestTemplate](example-client/src/main/java/io/github/kobylynskyi/order/external/product/ProductServiceGraphQLClient.java) +* [Building GraphQL request and parsing response using RestAssured](example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java) ### Different configurations for graphql schemas -If you want to have different configuration for different `.graphqls` files (e.g.: different javaPackage, outputDir, etc.), then you will need to define separate executions for each set of schemas. E.g.: +If you want to have different configuration for different `.graphqls` files (e.g.: different javaPackage, outputDir, +etc.), then you will need to define separate executions for each set of schemas. E.g.: ```xml @@ -107,7 +108,7 @@ If you want to have different configuration for different `.graphqls` files (e.g ``` - ### Inspired by + [swagger-codegen](https://github.com/swagger-api/swagger-codegen) diff --git a/plugins/maven/example-client/pom.xml b/plugins/maven/example-client/pom.xml index 94c2c19cb..1d59f6784 100644 --- a/plugins/maven/example-client/pom.xml +++ b/plugins/maven/example-client/pom.xml @@ -1,4 +1,4 @@ - 4.0.0 @@ -74,8 +74,12 @@ io.github.kobylynskyi.starwars.graphql - @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.CharacterTypeResolver.class) + @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.CharacterTypeResolver.class) + true diff --git a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/external/starwars/CharacterTypeResolver.java b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/external/starwars/CharacterTypeResolver.java index 4b2a7b5f7..38ac4cc59 100644 --- a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/external/starwars/CharacterTypeResolver.java +++ b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/external/starwars/CharacterTypeResolver.java @@ -7,6 +7,9 @@ import io.github.kobylynskyi.starwars.graphql.Droid; import io.github.kobylynskyi.starwars.graphql.Human; +/** + * Resolver of Character type + */ public class CharacterTypeResolver extends TypeIdResolverBase { private JavaType superType; diff --git a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java index 821fa4dba..2e0e9e568 100644 --- a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java +++ b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java @@ -10,7 +10,8 @@ import org.springframework.stereotype.Component; @Component -public class MutationsResolver implements CreateMutationResolver, AddProductToOrderMutationResolver, GraphQLMutationResolver { +public class MutationsResolver implements + CreateMutationResolver, AddProductToOrderMutationResolver, GraphQLMutationResolver { @Autowired private OrderService service; diff --git a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java index b549bb660..ca89864ad 100644 --- a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java +++ b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java @@ -6,7 +6,6 @@ import io.github.kobylynskyi.order.model.OrderNotFoundException; import io.github.kobylynskyi.order.model.Product; import io.github.kobylynskyi.order.model.UnableToRetrieveProductException; -import io.github.kobylynskyi.order.model.UnableToRetrieveProductsException; import io.github.kobylynskyi.order.repository.OrderRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -39,13 +38,26 @@ public Order create() { return saved; } - public Order addProduct(String orderId, String productId, int quantity) throws OrderNotFoundException, UnableToRetrieveProductException, UnableToRetrieveProductsException { + public Order addProduct(String orderId, String productId, int quantity) + throws OrderNotFoundException, UnableToRetrieveProductException { Order order = getOrderById(orderId); - - Product product = productService.getProduct(productId); // for bulk use: // Product product = productService.getProducts(Collections.singletonList(productId)).get(0); - Item item = order.getItems().stream() + Product product = productService.getProduct(productId); + Item item = getItem(productId, order); + updateOrderItem(item, product, quantity); + repository.save(order); + log.info("Added product [id: {}] to the order [id: {}]", product.getId(), order.getId()); + return order; + } + + private void updateOrderItem(Item item, Product product, int quantity) { + item.setQuantity(item.getQuantity() + quantity); + item.setTotal(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); + } + + private Item getItem(String productId, Order order) { + return order.getItems().stream() .filter(p -> p.getProductId().equals(productId)) .findFirst() .orElseGet(() -> { @@ -53,11 +65,6 @@ public Order addProduct(String orderId, String productId, int quantity) throws O order.getItems().add(newItem); return newItem; }); - item.setQuantity(item.getQuantity() + quantity); - item.setTotal(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); - repository.save(order); - log.info("Added product [id: {}] to the order [id: {}]", product.getId(), order.getId()); - return order; } } diff --git a/plugins/maven/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java b/plugins/maven/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java index dfb49843d..f07e3cd56 100644 --- a/plugins/maven/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java +++ b/plugins/maven/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java @@ -2,7 +2,11 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequest; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResult; -import io.github.kobylynskyi.product.graphql.model.*; +import io.github.kobylynskyi.product.graphql.model.CreateMutationRequest; +import io.github.kobylynskyi.product.graphql.model.ProductInputTO; +import io.github.kobylynskyi.product.graphql.model.ProductResponseProjection; +import io.github.kobylynskyi.product.graphql.model.ProductTO; +import io.github.kobylynskyi.product.graphql.model.StockStatusTO; import io.restassured.common.mapper.TypeRef; import io.restassured.http.ContentType; import org.junit.jupiter.api.Disabled; @@ -12,7 +16,9 @@ import java.util.Map; import static io.restassured.RestAssured.given; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; class CreateProductIntegrationTest { @@ -33,7 +39,8 @@ void createProductUsingRestAssured() { .post("/graphql") .then() .statusCode(200) - .extract().response().as(new TypeRef>>() {}); + .extract().response().as(new TypeRef>>() { + }); assertFalse(result.hasErrors()); ProductTO createdProduct = result.getData().get(createProductMutation.getOperationName()); diff --git a/plugins/maven/example-server/pom.xml b/plugins/maven/example-server/pom.xml index ae8460658..85e59f38f 100644 --- a/plugins/maven/example-server/pom.xml +++ b/plugins/maven/example-server/pom.xml @@ -1,4 +1,4 @@ - 4.0.0 @@ -23,7 +23,8 @@ - ${project.basedir}/src/main/resources/schema.graphqls + ${project.basedir}/src/main/resources/schema.graphqls + ${project.build.directory}/generated-sources/graphql io.github.kobylynskyi.product.graphql.api @@ -35,7 +36,8 @@ graphql.kickstart.tools.GraphQLQueryResolver graphql.kickstart.tools.GraphQLMutationResolver - graphql.kickstart.tools.GraphQLSubscriptionResolver + graphql.kickstart.tools.GraphQLSubscriptionResolver + ]]> diff --git a/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java b/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java index d958f3598..7458dba0b 100644 --- a/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java +++ b/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java @@ -12,8 +12,7 @@ public interface ProductMapper { ProductTO map(Product from); @Mapping(target = "id", ignore = true) // auto-generated - @Mapping(target = "addedDateTime", ignore = true) - // set in the service + @Mapping(target = "addedDateTime", ignore = true) // this property is set in the service Product mapInput(ProductInputTO from); } diff --git a/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java b/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java index d79f091c6..58f368f46 100644 --- a/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java +++ b/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java @@ -18,8 +18,8 @@ public class MutationsResolver implements CreateMutationResolver { private ProductMapper mapper; @Override - public ProductTO create(ProductInputTO ProductInputTO) { - Product savedProduct = service.create(mapper.mapInput(ProductInputTO)); + public ProductTO create(ProductInputTO productInput) { + Product savedProduct = service.create(mapper.mapInput(productInput)); return mapper.map(savedProduct); } } diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml index 6fb84b20f..2a987240d 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 io.github.kobylynskyi @@ -36,8 +37,8 @@ scm:git:git@github.com:kobylynskyi/graphql-java-codegen.git https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven - HEAD - + HEAD + 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 04e83f18c..b77bb9db0 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 @@ -3,7 +3,14 @@ import com.kobylynskyi.graphql.codegen.GraphQLCodegen; import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.kotlin.KotlinGraphQLCodegen; -import com.kobylynskyi.graphql.codegen.model.*; +import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy; +import com.kobylynskyi.graphql.codegen.model.ApiNamePrefixStrategy; +import com.kobylynskyi.graphql.codegen.model.ApiRootInterfaceStrategy; +import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; +import com.kobylynskyi.graphql.codegen.model.GraphQLCodegenConfiguration; +import com.kobylynskyi.graphql.codegen.model.MappingConfig; +import com.kobylynskyi.graphql.codegen.model.MappingConfigConstants; +import com.kobylynskyi.graphql.codegen.model.RelayConfig; import com.kobylynskyi.graphql.codegen.model.exception.LanguageNotSupportedException; import com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.supplier.JsonMappingConfigSupplier; @@ -21,9 +28,22 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; +import java.util.Set; import java.util.function.Supplier; +/** + * GraphQL Codegen MOJO implementation + */ @Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES, threadSafe = true) public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenConfiguration { @@ -246,14 +266,19 @@ public void execute() throws MojoExecutionException { private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IOException { java.util.Optional mappingConfigSupplier = buildJsonSupplier(jsonConfigurationFile); - GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get).map(MappingConfig::getGeneratedLanguage).orElse(generatedLanguage); + GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get) + .map(MappingConfig::getGeneratedLanguage) + .orElse(generatedLanguage); switch (language) { case JAVA: - return new JavaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); + return new JavaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case SCALA: - return new ScalaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); + return new ScalaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case KOTLIN: - return new KotlinGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); + return new KotlinGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); default: throw new LanguageNotSupportedException(language); } diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/ParentInterfacesConfig.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/ParentInterfacesConfig.java index 0dee2a69e..5ce3b96ef 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/ParentInterfacesConfig.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/ParentInterfacesConfig.java @@ -1,5 +1,8 @@ package io.github.kobylynskyi.graphql.codegen; +/** + * Configuration of parent interfaces to be used during code generation + */ public class ParentInterfacesConfig { private String queryResolver; @@ -11,30 +14,30 @@ public String getQueryResolver() { return queryResolver; } - public String getMutationResolver() { - return mutationResolver; - } - - public String getSubscriptionResolver() { - return subscriptionResolver; - } - - public String getResolver() { - return resolver; - } - public void setQueryResolver(String queryResolver) { this.queryResolver = queryResolver; } + public String getMutationResolver() { + return mutationResolver; + } + public void setMutationResolver(String mutationResolver) { this.mutationResolver = mutationResolver; } + public String getSubscriptionResolver() { + return subscriptionResolver; + } + public void setSubscriptionResolver(String subscriptionResolver) { this.subscriptionResolver = subscriptionResolver; } + public String getResolver() { + return resolver; + } + public void setResolver(String resolver) { this.resolver = resolver; } diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/SchemaFinderConfig.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/SchemaFinderConfig.java index ed9446afb..993dba7ca 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/SchemaFinderConfig.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/SchemaFinderConfig.java @@ -5,6 +5,9 @@ import java.util.Collections; import java.util.Set; +/** + * Configuration of dynamic GraphQL schema finder + */ public class SchemaFinderConfig { private String rootDir; diff --git a/plugins/sbt/README.md b/plugins/sbt/README.md index 03ede453e..3138d86c8 100644 --- a/plugins/sbt/README.md +++ b/plugins/sbt/README.md @@ -2,24 +2,22 @@ This is a sbt plugin for https://github.com/kobylynskyi/graphql-java-codegen -Server example at https://github.com/jxnu-liguobin/springboot-examples/tree/master/graphql-complete (do not use plugin, only a normal graphql server ) - +Server example at https://github.com/jxnu-liguobin/springboot-examples/tree/master/graphql-complete (do not use plugin, +only a normal graphql server ) ![Build](https://github.com/kobylynskyi/graphql-java-codegen/workflows/Build/badge.svg) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.jxnu-liguobin/graphql-codegen-sbt-plugin/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.github.jxnu-liguobin/graphql-codegen-sbt-plugin) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) - ### Plugin Setup - ```scala // plugins.sbt addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "") // since graphql-java-codegen V2.2.1 ``` > Java code will be generated by default, via set `generatedLanguage =: GeneratedLanguage.SCALA` to generate Scala code (since 4.0.0). By the way, Scala code is currently ugly. - + ### Config for generating scala code Options example in ```build.sbt``` @@ -60,22 +58,22 @@ generateToString := true ### Codegen Options +SBT task -SBT task - -1. graphqlSchemaValidate - - use validate at terminal by user, can get args from terminal, such as `graphqlSchemaValidate src/main/resources/schema.graphqls`, args split with space -2. graphqlCodegen +1. graphqlSchemaValidate + - use validate at terminal by user, can get args from terminal, such + as `graphqlSchemaValidate src/main/resources/schema.graphqls`, args split with space +2. graphqlCodegen - generate java code from graphql schema -3. graphqlCodegenValidate +3. graphqlCodegenValidate - use validate schemas that config in build.sbt key: `graphqlSchemaPaths` - ### Plugin Options - Please refer to [Codegen Options](../../docs/codegen-options.md) -> in sbt plugin option +> in sbt plugin option + - `packageName` was rename to `generatePackageName` -- `generateCodegenTargetPath` Where to store generated files and add the generated code to the classpath, so that they can be referenced. since 3.0.0 . \ No newline at end of file +- `generateCodegenTargetPath` Where to store generated files and add the generated code to the classpath, so that they + can be referenced. since 3.0.0 . \ No newline at end of file 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 97a7ea7b3..862afa5f2 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.4.7 \ 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/project/build.properties b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/build.properties index 97a7ea7b3..862afa5f2 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/build.properties +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/build.properties @@ -1 +1 @@ -sbt.version = 1.4.7 \ No newline at end of file +sbt.version=1.4.7 \ 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/project/build.properties b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/build.properties index 97a7ea7b3..862afa5f2 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/build.properties +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/build.properties @@ -1 +1 @@ -sbt.version = 1.4.7 \ No newline at end of file +sbt.version=1.4.7 \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/build.properties b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/build.properties index 97a7ea7b3..862afa5f2 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/build.properties +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/build.properties @@ -1 +1 @@ -sbt.version = 1.4.7 \ No newline at end of file +sbt.version=1.4.7 \ No newline at end of file diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java b/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java index d9abd0b7d..3bf1cebe1 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java @@ -24,7 +24,9 @@ class FreeMarkerTemplatesRegistry { private static final Version FREEMARKER_TEMPLATE_VERSION = Configuration.VERSION_2_3_30; - private static final EnumMap> templateMap = new EnumMap<>(GeneratedLanguage.class); + private static final EnumMap> templateMap = + new EnumMap<>( + GeneratedLanguage.class); static { BeansWrapper beansWrapper = new BeansWrapper(FREEMARKER_TEMPLATE_VERSION); @@ -38,39 +40,66 @@ class FreeMarkerTemplatesRegistry { try { EnumMap javaTemplates = new EnumMap<>(FreeMarkerTemplateType.class); - javaTemplates.put(TYPE, configuration.getTemplate("templates/java-lang/javaClassGraphqlType.ftl")); - javaTemplates.put(ENUM, configuration.getTemplate("templates/java-lang/javaClassGraphqlEnum.ftl")); - javaTemplates.put(UNION, configuration.getTemplate("templates/java-lang/javaClassGraphqlUnion.ftl")); - javaTemplates.put(REQUEST, configuration.getTemplate("templates/java-lang/javaClassGraphqlRequest.ftl")); - javaTemplates.put(RESPONSE, configuration.getTemplate("templates/java-lang/javaClassGraphqlResponse.ftl")); - javaTemplates.put(INTERFACE, configuration.getTemplate("templates/java-lang/javaClassGraphqlInterface.ftl")); - javaTemplates.put(OPERATIONS, configuration.getTemplate("templates/java-lang/javaClassGraphqlOperations.ftl")); - javaTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/java-lang/javaClassGraphqlParametrizedInput.ftl")); - javaTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/java-lang/javaClassGraphqlResponseProjection.ftl")); + javaTemplates.put(TYPE, + configuration.getTemplate("templates/java-lang/javaClassGraphqlType.ftl")); + javaTemplates.put(ENUM, + configuration.getTemplate("templates/java-lang/javaClassGraphqlEnum.ftl")); + javaTemplates.put(UNION, + configuration.getTemplate("templates/java-lang/javaClassGraphqlUnion.ftl")); + javaTemplates.put(REQUEST, + configuration.getTemplate("templates/java-lang/javaClassGraphqlRequest.ftl")); + javaTemplates.put(RESPONSE, + configuration.getTemplate("templates/java-lang/javaClassGraphqlResponse.ftl")); + javaTemplates.put(INTERFACE, + configuration.getTemplate("templates/java-lang/javaClassGraphqlInterface.ftl")); + javaTemplates.put(OPERATIONS, + configuration.getTemplate("templates/java-lang/javaClassGraphqlOperations.ftl")); + javaTemplates.put(PARAMETRIZED_INPUT, + configuration.getTemplate("templates/java-lang/javaClassGraphqlParametrizedInput.ftl")); + javaTemplates.put(RESPONSE_PROJECTION, + configuration.getTemplate("templates/java-lang/javaClassGraphqlResponseProjection.ftl")); templateMap.put(GeneratedLanguage.JAVA, javaTemplates); EnumMap scalaTemplates = new EnumMap<>(FreeMarkerTemplateType.class); - scalaTemplates.put(TYPE, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlType.ftl")); - scalaTemplates.put(ENUM, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlEnum.ftl")); - scalaTemplates.put(UNION, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlUnion.ftl")); - scalaTemplates.put(REQUEST, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlRequest.ftl")); - scalaTemplates.put(RESPONSE, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponse.ftl")); - scalaTemplates.put(INTERFACE, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlInterface.ftl")); - scalaTemplates.put(OPERATIONS, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlOperations.ftl")); - scalaTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl")); - scalaTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponseProjection.ftl")); + scalaTemplates.put(TYPE, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlType.ftl")); + scalaTemplates.put(ENUM, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlEnum.ftl")); + scalaTemplates.put(UNION, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlUnion.ftl")); + scalaTemplates.put(REQUEST, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlRequest.ftl")); + scalaTemplates.put(RESPONSE, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponse.ftl")); + scalaTemplates.put(INTERFACE, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlInterface.ftl")); + scalaTemplates.put(OPERATIONS, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlOperations.ftl")); + scalaTemplates.put(PARAMETRIZED_INPUT, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl")); + scalaTemplates.put(RESPONSE_PROJECTION, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponseProjection.ftl")); templateMap.put(GeneratedLanguage.SCALA, scalaTemplates); EnumMap kotlinTemplates = new EnumMap<>(FreeMarkerTemplateType.class); - kotlinTemplates.put(TYPE, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlType.ftl")); - kotlinTemplates.put(ENUM, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlEnum.ftl")); - kotlinTemplates.put(UNION, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlUnion.ftl")); - kotlinTemplates.put(REQUEST, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlRequest.ftl")); - kotlinTemplates.put(RESPONSE, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponse.ftl")); - kotlinTemplates.put(INTERFACE, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlInterface.ftl")); - kotlinTemplates.put(OPERATIONS, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlOperations.ftl")); - kotlinTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl")); - kotlinTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponseProjection.ftl")); + kotlinTemplates.put(TYPE, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlType.ftl")); + kotlinTemplates.put(ENUM, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlEnum.ftl")); + kotlinTemplates.put(UNION, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlUnion.ftl")); + kotlinTemplates.put(REQUEST, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlRequest.ftl")); + kotlinTemplates.put(RESPONSE, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponse.ftl")); + kotlinTemplates.put(INTERFACE, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlInterface.ftl")); + kotlinTemplates.put(OPERATIONS, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlOperations.ftl")); + kotlinTemplates.put(PARAMETRIZED_INPUT, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl")); + kotlinTemplates.put(RESPONSE_PROJECTION, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponseProjection.ftl")); templateMap.put(GeneratedLanguage.KOTLIN, kotlinTemplates); } catch (IOException e) { throw new UnableToLoadFreeMarkerTemplateException(e); @@ -80,7 +109,8 @@ class FreeMarkerTemplatesRegistry { private FreeMarkerTemplatesRegistry() { } - public static Template getTemplateWithLang(GeneratedLanguage generatedLanguage, FreeMarkerTemplateType templateType) { + public static Template getTemplateWithLang(GeneratedLanguage generatedLanguage, + FreeMarkerTemplateType templateType) { return templateMap.get(generatedLanguage).get(templateType); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java index 4ed199b16..06ed30da1 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java @@ -76,7 +76,8 @@ protected GraphQLCodegen(List schemas, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, MapperFactory mapperFactory) { - this(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, new GeneratedInformation(), mapperFactory); + this(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, + new GeneratedInformation(), mapperFactory); } // used by other constructors @@ -163,25 +164,30 @@ protected void initDefaultValues(MappingConfig mappingConfig) { mappingConfig.setTypeResolverSuffix(MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX); } if (mappingConfig.getGenerateParameterizedFieldsResolvers() == null) { - mappingConfig.setGenerateParameterizedFieldsResolvers(MappingConfigConstants.DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS); + mappingConfig.setGenerateParameterizedFieldsResolvers( + MappingConfigConstants.DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS); } if (mappingConfig.getGenerateExtensionFieldsResolvers() == null) { - mappingConfig.setGenerateExtensionFieldsResolvers(MappingConfigConstants.DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS); + mappingConfig.setGenerateExtensionFieldsResolvers( + MappingConfigConstants.DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS); } if (mappingConfig.getGenerateDataFetchingEnvironmentArgumentInApis() == null) { - mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(MappingConfigConstants.DEFAULT_GENERATE_DATA_FETCHING_ENV); + mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis( + MappingConfigConstants.DEFAULT_GENERATE_DATA_FETCHING_ENV); } if (mappingConfig.getGenerateModelsForRootTypes() == null) { mappingConfig.setGenerateModelsForRootTypes(MappingConfigConstants.DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES); } if (mappingConfig.getGenerateApisWithThrowsException() == null) { - mappingConfig.setGenerateApisWithThrowsException(MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION); + mappingConfig.setGenerateApisWithThrowsException( + MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION); } if (mappingConfig.getAddGeneratedAnnotation() == null) { mappingConfig.setAddGeneratedAnnotation(MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION); } if (mappingConfig.getUseOptionalForNullableReturnTypes() == null) { - mappingConfig.setUseOptionalForNullableReturnTypes(MappingConfigConstants.DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES); + mappingConfig.setUseOptionalForNullableReturnTypes( + MappingConfigConstants.DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES); } if (mappingConfig.getApiNamePrefixStrategy() == null) { mappingConfig.setApiNamePrefixStrategy(MappingConfigConstants.DEFAULT_API_NAME_PREFIX_STRATEGY); @@ -208,7 +214,8 @@ private void validateConfigs(MappingConfig mappingConfig) { if (!Utils.isEmpty(schemas) && introspectionResult != null || (Utils.isEmpty(schemas) && introspectionResult == null)) { // either schemas or introspection result should be provided - throw new IllegalArgumentException("Either graphql schema path or introspection result path should be supplied"); + throw new IllegalArgumentException( + "Either graphql schema path or introspection result path should be supplied"); } if (mappingConfig.getApiRootInterfaceStrategy() == ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA && mappingConfig.getApiNamePrefixStrategy() == ApiNamePrefixStrategy.CONSTANT) { @@ -219,20 +226,33 @@ private void validateConfigs(MappingConfig mappingConfig) { && Boolean.TRUE.equals(mappingConfig.getGenerateModelsForRootTypes()) && mappingConfig.getApiNamePrefixStrategy() == ApiNamePrefixStrategy.CONSTANT) { // checking for conflict between root type model classes and api interfaces - if (Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNamePrefix(), mappingConfig.getModelNamePrefix()) && - Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNameSuffix(), mappingConfig.getModelNameSuffix())) { + if (Utils.stringsEqualIgnoreSpaces( + mappingConfig.getApiNamePrefix(), mappingConfig.getModelNamePrefix()) && + Utils.stringsEqualIgnoreSpaces( + mappingConfig.getApiNameSuffix(), mappingConfig.getModelNameSuffix())) { // we will have a conflict between model pojo (Query.java) and api interface (Query.java) - throw new IllegalArgumentException("Either disable APIs generation or set different Prefix/Suffix for API classes and model classes"); + throw new IllegalArgumentException("Either disable APIs generation or " + + "set different Prefix/Suffix for API classes and model classes"); } // checking for conflict between root type model resolver classes and api interfaces - if (Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNamePrefix(), mappingConfig.getTypeResolverPrefix()) && - Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNameSuffix(), mappingConfig.getTypeResolverSuffix())) { - // we will have a conflict between model resolver interface (QueryResolver.java) and api interface resolver (QueryResolver.java) - throw new IllegalArgumentException("Either disable APIs generation or set different Prefix/Suffix for API classes and type resolver classes"); + if (Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNamePrefix(), + mappingConfig.getTypeResolverPrefix()) && + Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNameSuffix(), + mappingConfig.getTypeResolverSuffix())) { + // we will have a conflict between model resolver interface (QueryResolver.java) and api interface + // resolver (QueryResolver.java) + throw new IllegalArgumentException("Either disable APIs generation or " + + "set different Prefix/Suffix for API classes and type resolver classes"); } } } + /** + * Generate class files based on GraphQL schema + * + * @return a list of generated classes + * @throws IOException in case some I/O error occurred, e.g.: file can't be created, directory access issues, etc. + */ public List generate() throws IOException { GraphQLCodegenFileCreator.prepareOutputDir(outputDir); long startTime = System.currentTimeMillis(); @@ -244,7 +264,8 @@ public List generate() throws IOException { System.out.printf("Finished processing %d schema(s) in %d ms%n", schemas.size(), System.currentTimeMillis() - startTime); } else if (introspectionResult != null) { - ExtendedDocument document = GraphQLDocumentParser.getDocumentFromIntrospectionResult(mappingConfig, introspectionResult); + ExtendedDocument document = GraphQLDocumentParser + .getDocumentFromIntrospectionResult(mappingConfig, introspectionResult); initCustomTypeMappings(document.getScalarDefinitions()); generatedFiles = processDefinitions(document); System.out.printf("Finished processing introspection result in %d ms%n", @@ -255,7 +276,8 @@ public List generate() throws IOException { } private List processDefinitions(ExtendedDocument document) { - MappingContext context = new MappingContext(mappingConfig, document, generatedInformation, dataModelMapperFactory); + MappingContext context = new MappingContext(mappingConfig, document, generatedInformation, + dataModelMapperFactory); List generatedFiles = new ArrayList<>(); for (ExtendedEnumTypeDefinition extendedEnumTypeDefinition : document.getEnumDefinitions()) { generatedFiles.add(generateEnum(context, extendedEnumTypeDefinition)); @@ -267,7 +289,8 @@ private List processDefinitions(ExtendedDocument document) { generatedFiles.addAll(generateType(context, extendedObjectTypeDefinition)); } for (ExtendedObjectTypeDefinition extendedObjectTypeDefinition : document.getTypeDefinitions()) { - generateFieldResolver(context, extendedObjectTypeDefinition.getFieldDefinitions(), extendedObjectTypeDefinition) + generateFieldResolver(context, extendedObjectTypeDefinition.getFieldDefinitions(), + extendedObjectTypeDefinition) .ifPresent(generatedFiles::add); } for (ExtendedObjectTypeDefinition extendedObjectTypeDefinition : document.getOperationDefinitions()) { @@ -287,42 +310,61 @@ private List processDefinitions(ExtendedDocument document) { for (ExtendedInterfaceTypeDefinition definition : document.getInterfaceDefinitions()) { generateFieldResolver(context, definition.getFieldDefinitions(), definition).ifPresent(generatedFiles::add); } - System.out.printf("Generated %d definition classes in folder %s%n", generatedFiles.size(), outputDir.getAbsolutePath()); + System.out.printf("Generated %d definition classes in folder %s%n", generatedFiles.size(), + outputDir.getAbsolutePath()); return generatedFiles; } private List generateUnion(MappingContext mappingContext, ExtendedUnionTypeDefinition definition) { List generatedFiles = new ArrayList<>(); - Map dataModel = dataModelMapperFactory.getUnionDefinitionMapper().map(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.UNION, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getUnionDefinitionMapper() + .map(mappingContext, definition); + generatedFiles.add(GraphQLCodegenFileCreator.generateFile( + mappingContext, FreeMarkerTemplateType.UNION, dataModel, outputDir)); if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) { - Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapResponseProjection(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, responseProjDataModel, outputDir)); + Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapResponseProjection(mappingContext, + definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, + responseProjDataModel, outputDir)); } return generatedFiles; } private List generateInterface(MappingContext mappingContext, ExtendedInterfaceTypeDefinition definition) { List generatedFiles = new ArrayList<>(); - Map dataModel = dataModelMapperFactory.getInterfaceDefinitionMapper().map(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.INTERFACE, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getInterfaceDefinitionMapper() + .map(mappingContext, definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.INTERFACE, dataModel, outputDir)); if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) { - Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapResponseProjection(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, responseProjDataModel, outputDir)); + Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapResponseProjection(mappingContext, + definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, + responseProjDataModel, outputDir)); for (ExtendedFieldDefinition fieldDefinition : definition.getFieldDefinitions()) { if (!Utils.isEmpty(fieldDefinition.getInputValueDefinitions())) { - Map fieldProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapParametrizedInput(mappingContext, fieldDefinition, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.PARAMETRIZED_INPUT, fieldProjDataModel, outputDir)); + Map fieldProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapParametrizedInput(mappingContext, + fieldDefinition, + definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.PARAMETRIZED_INPUT, + fieldProjDataModel, outputDir)); } } } return generatedFiles; } - private List generateServerOperations(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { + private List generateServerOperations(MappingContext mappingContext, + ExtendedObjectTypeDefinition definition) { List generatedFiles = new ArrayList<>(); // Generate a root interface with all operations inside // Relates to https://github.com/facebook/relay/issues/112 @@ -342,7 +384,8 @@ private List generateServerOperations(MappingContext mappingContext, Exten if (mappingContext.getApiInterfaceStrategy() == ApiInterfaceStrategy.INTERFACE_PER_OPERATION) { // Generate separate interfaces for all queries, mutations and subscriptions - List fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName).collect(toList()); + List fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName) + .collect(toList()); switch (mappingContext.getApiNamePrefixStrategy()) { case FOLDER_NAME_AS_PREFIX: for (ExtendedObjectTypeDefinition fileDef : definition.groupBySourceLocationFolder().values()) { @@ -365,44 +408,71 @@ private List generateServerOperations(MappingContext mappingContext, Exten private List generateClient(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { List generatedFiles = new ArrayList<>(); - List fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName).collect(toList()); + List fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName) + .collect(toList()); for (ExtendedFieldDefinition operationDef : definition.getFieldDefinitions()) { - Map requestDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapRequest(mappingContext, operationDef, definition.getName(), fieldNames); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.REQUEST, requestDataModel, outputDir)); - - Map responseDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapResponse(mappingContext, operationDef, definition.getName(), fieldNames); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE, responseDataModel, outputDir)); + Map requestDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapRequest(mappingContext, operationDef, + definition.getName(), fieldNames); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.REQUEST, requestDataModel, + outputDir)); + + Map responseDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapResponse(mappingContext, operationDef, + definition.getName(), + fieldNames); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE, responseDataModel, + outputDir)); } return generatedFiles; } - private List generateApis(MappingContext mappingContext, ExtendedObjectTypeDefinition definition, List fieldNames) { + private List generateApis(MappingContext mappingContext, ExtendedObjectTypeDefinition definition, + List fieldNames) { List generatedFiles = new ArrayList<>(); for (ExtendedFieldDefinition operationDef : definition.getFieldDefinitions()) { - Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper().mapRootTypeField(mappingContext, operationDef, definition.getName(), fieldNames); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper() + .mapRootTypeField(mappingContext, operationDef, + definition.getName(), fieldNames); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, + outputDir)); } return generatedFiles; } private File generateRootApi(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { - Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper().mapRootTypeFields(mappingContext, definition); - return GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, outputDir); + Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper() + .mapRootTypeFields(mappingContext, definition); + return GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, outputDir); } private List generateType(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { List generatedFiles = new ArrayList<>(); - Map dataModel = dataModelMapperFactory.getTypeDefinitionMapper().map(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.TYPE, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getTypeDefinitionMapper() + .map(mappingContext, definition); + generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, + FreeMarkerTemplateType.TYPE, dataModel, outputDir)); if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) { - Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapResponseProjection(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, responseProjDataModel, outputDir)); + Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapResponseProjection(mappingContext, + definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, + responseProjDataModel, outputDir)); for (ExtendedFieldDefinition fieldDefinition : definition.getFieldDefinitions()) { if (!Utils.isEmpty(fieldDefinition.getInputValueDefinitions())) { - Map fieldProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapParametrizedInput(mappingContext, fieldDefinition, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.PARAMETRIZED_INPUT, fieldProjDataModel, outputDir)); + Map fieldProjDataModel = + dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapParametrizedInput(mappingContext, fieldDefinition, definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.PARAMETRIZED_INPUT, + fieldProjDataModel, outputDir)); } } } @@ -414,24 +484,37 @@ private Optional generateFieldResolver(MappingContext mappingContext, ExtendedDefinition parentDefinition) { if (Boolean.TRUE.equals(mappingConfig.getGenerateApis())) { List fieldDefsWithResolvers = fieldDefinitions.stream() - .filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, parentDefinition)) + .filter( + fieldDef -> FieldDefinitionToParameterMapper + .generateResolversForField( + mappingContext, fieldDef, + parentDefinition)) .collect(toList()); if (!fieldDefsWithResolvers.isEmpty()) { - Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper().mapToTypeResolver(mappingContext, fieldDefsWithResolvers, parentDefinition.getName()); - return Optional.of(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper() + .mapToTypeResolver(mappingContext, + fieldDefsWithResolvers, + parentDefinition.getName()); + return Optional.of(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, + outputDir)); } } return Optional.empty(); } private File generateInput(MappingContext mappingContext, ExtendedInputObjectTypeDefinition definition) { - Map dataModel = dataModelMapperFactory.getInputDefinitionMapper().map(mappingContext, definition); - return GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.TYPE, dataModel, outputDir); + Map dataModel = dataModelMapperFactory.getInputDefinitionMapper() + .map(mappingContext, definition); + return GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.TYPE, dataModel, outputDir); } private File generateEnum(MappingContext mappingContext, ExtendedEnumTypeDefinition definition) { - Map dataModel = dataModelMapperFactory.getEnumDefinitionMapper().map(mappingContext, definition); - return GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.ENUM, dataModel, outputDir); + Map dataModel = dataModelMapperFactory.getEnumDefinitionMapper() + .map(mappingContext, definition); + return GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.ENUM, dataModel, outputDir); } protected void initCustomTypeMappings(Collection scalarTypeDefinitions) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreator.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreator.java index 2c2489a97..21428b230 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreator.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreator.java @@ -22,7 +22,8 @@ class GraphQLCodegenFileCreator { private GraphQLCodegenFileCreator() { } - static File generateFile(MappingContext mappingContext, FreeMarkerTemplateType templateType, Map dataModel, File outputDir) { + static File generateFile(MappingContext mappingContext, FreeMarkerTemplateType templateType, + Map dataModel, File outputDir) { GeneratedLanguage language = mappingContext.getGeneratedLanguage(); String fileName = dataModel.get(DataModelFields.CLASS_NAME) + language.getFileExtension(); File fileOutputDir = getFileTargetDirectory(dataModel, outputDir); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLDocumentParser.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLDocumentParser.java index 6abb79299..6f2bd2109 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLDocumentParser.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLDocumentParser.java @@ -41,7 +41,8 @@ class GraphQLDocumentParser { private GraphQLDocumentParser() { } - static ExtendedDocument getDocumentFromSchemas(MappingConfig mappingConfig, List schemaPaths) throws IOException { + static ExtendedDocument getDocumentFromSchemas(MappingConfig mappingConfig, List schemaPaths) + throws IOException { Document document = readDocument(schemaPaths); ExtendedDocumentBuilder extendedDocumentBuilder = new ExtendedDocumentBuilder(); @@ -52,10 +53,12 @@ static ExtendedDocument getDocumentFromSchemas(MappingConfig mappingConfig, List return extendedDocumentBuilder.build(); } - static ExtendedDocument getDocumentFromIntrospectionResult(MappingConfig mappingConfig, String introspectionResult) throws IOException { + static ExtendedDocument getDocumentFromIntrospectionResult(MappingConfig mappingConfig, String introspectionResult) + throws IOException { String introspectionResultContent = Utils.getFileContent(introspectionResult); Map introspectionResultMap = Utils.OBJECT_MAPPER.readValue(introspectionResultContent, - new TypeReference>() { + new TypeReference>() { }); // unwrapping "data" (in case such GraphQL response supplied) if (introspectionResultMap.containsKey("data")) { @@ -71,7 +74,8 @@ static ExtendedDocument getDocumentFromIntrospectionResult(MappingConfig mapping return extendedDocumentBuilder.build(); } - private static void processDefinition(MappingConfig mappingConfig, ExtendedDocumentBuilder extendedDocumentBuilder, Definition definition) { + private static void processDefinition(MappingConfig mappingConfig, ExtendedDocumentBuilder extendedDocumentBuilder, + Definition definition) { if (!(definition instanceof NamedNode)) { // the only definition that does not have a name is SchemaDefinition, so skipping it return; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaDataModelMapper.java index 9b8d82b89..68e707601 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaDataModelMapper.java @@ -8,6 +8,9 @@ import java.util.HashSet; import java.util.Set; +/** + * Data model mapper for JAVA generated classes + */ public class JavaDataModelMapper implements DataModelMapper { private static final Set JAVA_RESTRICTED_KEYWORDS = new HashSet<>(Arrays.asList( diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLCodegen.java index 938e4e1cf..aee3dcb8b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLCodegen.java @@ -11,24 +11,34 @@ import java.util.Collection; import java.util.List; +/** + * Class having only Java-specific methods for code-generation + * Most of the logic is still residing in the parent class + */ public class JavaGraphQLCodegen extends GraphQLCodegen { private static final MapperFactory MAPPER_FACTORY = new JavaMapperFactoryImpl(); - public JavaGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public JavaGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(schemas, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public JavaGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public JavaGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(introspectionResult, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public JavaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { + public JavaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, MAPPER_FACTORY); } - public JavaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, GeneratedInformation generatedInformation) { - super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, generatedInformation, MAPPER_FACTORY); + public JavaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, + GeneratedInformation generatedInformation) { + super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, + generatedInformation, MAPPER_FACTORY); } @Override 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 6ed0a247e..d543aaa23 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java @@ -14,6 +14,9 @@ import static java.util.Arrays.asList; +/** + * Mapper class for converting GraphQL types to Java types + */ public class JavaGraphQLTypeMapper implements GraphQLTypeMapper { public static final String JAVA_UTIL_LIST = "java.util.List"; @@ -41,6 +44,16 @@ public String wrapSuperTypeIntoList(MappingContext mappingContext, String type, return getGenericsString(mappingContext, JAVA_UTIL_LIST, "? extends " + type); } + /** + * Wrap return type of the API interface with generics and/or Optional and/or apiReturnType + * (as specified in the mapping configuration) + * + * @param mappingContext Global mapping context + * @param namedDefinition Named definition + * @param parentTypeName Name of the parent type + * @return API interface name + */ + @Override public String wrapApiReturnTypeIfRequired(MappingContext mappingContext, NamedDefinition namedDefinition, String parentTypeName) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaMapperFactoryImpl.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaMapperFactoryImpl.java index bb4896211..41e8d3bee 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaMapperFactoryImpl.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaMapperFactoryImpl.java @@ -6,6 +6,9 @@ import com.kobylynskyi.graphql.codegen.mapper.ValueFormatter; import com.kobylynskyi.graphql.codegen.mapper.ValueMapper; +/** + * A factory of various mappers for Java language + */ public class JavaMapperFactoryImpl implements MapperFactory { @Override diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaValueFormatter.java index 86e7297ad..3ad18bbd0 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaValueFormatter.java @@ -4,6 +4,9 @@ import java.util.StringJoiner; +/** + * Class contains various formatting logic that is specific only for Java language + */ public class JavaValueFormatter implements ValueFormatter { @Override diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinDataModelMapper.java index 595c9838d..40c9076ba 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinDataModelMapper.java @@ -12,19 +12,22 @@ import static com.kobylynskyi.graphql.codegen.utils.Utils.wrapString; /** + * Data model mapper for KOTLIN generated classes + * * @author 梦境迷离 * @since 2020/12/09 */ public class KotlinDataModelMapper implements DataModelMapper { private static final String RESTRICTED_KEYWORDS_WRAP_WITH = "`"; - private static final Set KOTLIN_RESTRICTED_KEYWORDS = new HashSet<>(Arrays.asList("package", "interface", "class", - "object", "super", "null", "this", "typealias", "as", "as?", "if", "else", "true", "false", "while", "do", - "for", "when", "break", "continue", "return", "fun", "in", "!in", "is", "!is", "throw", "try", "val", "var", - "typeof")); + private static final Set KOTLIN_RESTRICTED_KEYWORDS = new HashSet<>( + Arrays.asList("package", "interface", "class", "object", "super", "null", "this", "typealias", "as", "as?", + "if", "else", "true", "false", "while", "do", "for", "when", "break", "continue", "return", + "fun", "in", "!in", "is", "!is", "throw", "try", "val", "var", "typeof")); //TODO maybe have others - private static final Set KOTLIN_RESTRICTED_METHOD_NAMES = new HashSet<>(Arrays.asList("notify", "notifyAll", "wait")); + private static final Set KOTLIN_RESTRICTED_METHOD_NAMES = new HashSet<>( + Arrays.asList("notify", "notifyAll", "wait")); @Override public String capitalizeIfRestricted(MappingContext mappingContext, String fieldName) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java index a8c8feea0..9934f7de8 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java @@ -12,6 +12,9 @@ import java.util.List; /** + * Class having only Kotlin-specific methods for code-generation + * Most of the logic is still residing in the parent class + * * @author 梦境迷离 * @since 2020/12/09 */ @@ -19,20 +22,26 @@ public class KotlinGraphQLCodegen extends GraphQLCodegen { private static final MapperFactory MAPPER_FACTORY = new KotlinMapperFactoryImpl(); - public KotlinGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public KotlinGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(schemas, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public KotlinGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public KotlinGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(introspectionResult, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public KotlinGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { + public KotlinGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, MAPPER_FACTORY); } - public KotlinGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, GeneratedInformation generatedInformation) { - super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, generatedInformation, MAPPER_FACTORY); + public KotlinGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, + GeneratedInformation generatedInformation) { + super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, + generatedInformation, MAPPER_FACTORY); } @Override 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 fb06ced09..524c1694a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java @@ -14,6 +14,8 @@ import static java.util.Arrays.asList; /** + * Mapper class for converting GraphQL types to Kotlin types + * * @author 梦境迷离 * @since 2020/12/09 */ @@ -22,7 +24,8 @@ public class KotlinGraphQLTypeMapper implements GraphQLTypeMapper { private static final String KOTLIN_UTIL_LIST = "List"; private static final String KOTLIN_UTIL_NULLABLE = "?"; // Char Boolean are not primitive type, but non null equivalent jvm primitive types. - private static final Set KOTLIN_PRIMITIVE_TYPES = new HashSet<>(asList("Byte", "Short", "Int", "Long", "Float", "Double", "Char", "Boolean")); + private static final Set KOTLIN_PRIMITIVE_TYPES = new HashSet<>( + asList("Byte", "Short", "Int", "Long", "Float", "Double", "Char", "Boolean")); private final ValueMapper valueMapper; @@ -34,6 +37,32 @@ public static boolean isKotlinPrimitive(String scalaType) { return KOTLIN_PRIMITIVE_TYPES.contains(scalaType); } + /** + * This method is used in kotlin template, do not remove it. + * + * @param kotlinType type get from Type template + * @return default value + */ + public static String defaultValueKotlinPrimitive(String kotlinType) { + switch (kotlinType) { + case "Long": + return "0L"; + case "Float": + return "0F"; + case "Double": + return "0D"; + case "Char": + return "0.toChar()"; + case "Boolean": + return "false"; + case "Int": + case "Byte": + case "Short": + default: + return "0"; + } + } + @Override public String wrapIntoList(MappingContext mappingContext, String type, boolean mandatory) { //null2Query: [Int], mandatory=false @@ -93,7 +122,8 @@ public String getTypeConsideringPrimitive(MappingContext mappingContext, String computedTypeName) { String graphqlTypeName = namedDefinition.getGraphqlTypeName(); if (namedDefinition.isMandatory() && namedDefinition.isPrimitiveCanBeUsed()) { - String possiblyPrimitiveType = mappingContext.getCustomTypesMapping().get(GraphQLTypeMapper.getMandatoryType(graphqlTypeName)); + String possiblyPrimitiveType = mappingContext.getCustomTypesMapping() + .get(GraphQLTypeMapper.getMandatoryType(graphqlTypeName)); if (isPrimitive(possiblyPrimitiveType)) { return possiblyPrimitiveType; } @@ -103,18 +133,24 @@ public String getTypeConsideringPrimitive(MappingContext mappingContext, if (!computedTypeName.endsWith(KOTLIN_UTIL_NULLABLE) && !computedTypeName.startsWith(KOTLIN_UTIL_LIST)) { return computedTypeName + KOTLIN_UTIL_NULLABLE; } - // If it is not processed by 'wrapSuperTypeIntoList' and 'wrapIntoList', the nullable type may be missing here + // If it is not processed by 'wrapSuperTypeIntoList' and 'wrapIntoList', the nullable type may be missing + // here // Such as return a query type: ```codesOfConduct: [CodeOfConduct]``` if (computedTypeName.startsWith(KOTLIN_UTIL_LIST) && !graphqlTypeName.endsWith(KOTLIN_UTIL_NULLABLE)) { - String modelClassNameWithPrefixAndSuffix = DataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, graphqlTypeName); + String modelClassNameWithPrefixAndSuffix = DataModelMapper + .getModelClassNameWithPrefixAndSuffix(mappingContext, graphqlTypeName); if (computedTypeName.contains(modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE) || computedTypeName.contains(graphqlTypeName + KOTLIN_UTIL_NULLABLE)) { return computedTypeName; } - if (!computedTypeName.contains(modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE) && computedTypeName.contains(modelClassNameWithPrefixAndSuffix)) { - return computedTypeName.replace(modelClassNameWithPrefixAndSuffix, modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE); + if (!computedTypeName + .contains(modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE) && computedTypeName + .contains(modelClassNameWithPrefixAndSuffix)) { + return computedTypeName.replace(modelClassNameWithPrefixAndSuffix, + modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE); } - if (!computedTypeName.contains(graphqlTypeName + KOTLIN_UTIL_NULLABLE) && computedTypeName.contains(graphqlTypeName)) { + if (!computedTypeName.contains(graphqlTypeName + KOTLIN_UTIL_NULLABLE) && computedTypeName + .contains(graphqlTypeName)) { return computedTypeName.replace(graphqlTypeName, graphqlTypeName + KOTLIN_UTIL_NULLABLE); } } @@ -128,36 +164,13 @@ public ValueMapper getValueMapper() { return valueMapper; } - /** - * Thi method was used in kotlin template, do not remove it. - * - * @param kotlinType type get from Type template - * @return default value - */ - public static String defaultValueKotlinPrimitive(String kotlinType) { - switch (kotlinType) { - case "Long": - return "0L"; - case "Float": - return "0F"; - case "Double": - return "0D"; - case "Char": - return "0.toChar()"; - case "Boolean": - return "false"; - case "Int": - case "Byte": - case "Short": - default: - return "0"; - } - } - @Override - public String getResponseReturnType(MappingContext mappingContext, NamedDefinition namedDefinition, String computedTypeName) { + public String getResponseReturnType(MappingContext mappingContext, NamedDefinition namedDefinition, + String computedTypeName) { // Delegate to getTypeConsideringPrimitive. - // For kotlin such as XXXXXXResponse do not implement the mandatory function of graphql correctly when returnType is not List. Should fix it when generate response class. + // For kotlin such as XXXXXXResponse do not implement the mandatory function of graphql + // correctly when returnType is not List. + // Should fix it when generate response class. return getTypeConsideringPrimitive(mappingContext, namedDefinition, computedTypeName); } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinMapperFactoryImpl.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinMapperFactoryImpl.java index dbef47e23..040e7ae22 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinMapperFactoryImpl.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinMapperFactoryImpl.java @@ -7,6 +7,8 @@ import com.kobylynskyi.graphql.codegen.mapper.ValueMapper; /** + * A factory of various mappers for Kotlin language + * * @author 梦境迷离 * @since 2020/12/09 */ diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinValueFormatter.java index d3156b5d8..41a80d011 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinValueFormatter.java @@ -5,6 +5,8 @@ import java.util.StringJoiner; /** + * Class contains various formatting logic that is specific only for Kotlin language + * * @author 梦境迷离 * @since 2020/12/09 */ diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapper.java index a4d83f2cf..a75cf30ba 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapper.java @@ -22,8 +22,23 @@ import java.util.function.Function; import java.util.stream.Collectors; +/** + * Generic mapper for all languages + */ public interface DataModelMapper { + /** + * Generates a model class name including prefix and suffix (if any) + * + * @param mappingContext Global mapping context, record enum type + * @param extendedDefinition GraphQL extended definition + * @return Class name of GraphQL model node + */ + default String getModelClassNameWithPrefixAndSuffix(MappingContext mappingContext, + ExtendedDefinition extendedDefinition) { + return getModelClassNameWithPrefixAndSuffix(mappingContext, extendedDefinition.getName()); + } + /** * Generates a model class name including prefix and suffix (if any) * @@ -64,7 +79,8 @@ static String getTypeResolverClassNameWithPrefixAndSuffix(MappingContext mapping /** * Generates an api class name including prefix and suffix (if any) - * Examples: CreateEventMutationResolver, EventsQueryResolver, EventsByIdsQueryResolver (rootTypeName is "Query" or the likes) + * Examples: CreateEventMutationResolver, EventsQueryResolver, EventsByIdsQueryResolver (rootTypeName is "Query" + * or the likes) * * @param mappingContext Global mapping context * @param fieldDefinition GraphQL field definition @@ -161,7 +177,7 @@ static String getPrefixFromSourceLocation(SourceLocation sourceLocation, // remove prefix fileName = fileName.replaceFirst("[.][^.]+$", ""); // capitalize - fileName = Utils.capitalizeString(fileName); + fileName = Utils.camelCaseString(fileName); // leave only alphanumeric fileName = fileName.replaceAll("[^A-Za-z0-9]", ""); return fileName; @@ -263,19 +279,18 @@ static String getClassNameSuffixWithInputValues(ExtendedFieldDefinition fieldDef * @param document GraphQL document * @return all interfaces that given type implements. */ - static List getInterfacesOfType(ExtendedImplementingTypeDefinition definition, - ExtendedDocument document) { + static List getInterfacesOfType( + ExtendedImplementingTypeDefinition definition, + ExtendedDocument document) { if (definition.getImplements().isEmpty()) { return Collections.emptyList(); } - Set typeImplements = definition.getImplements() - .stream() + Set typeImplements = definition.getImplements().stream() .filter(type -> TypeName.class.isAssignableFrom(type.getClass())) .map(TypeName.class::cast) .map(TypeName::getName) .collect(Collectors.toSet()); - return document.getInterfaceDefinitions() - .stream() + return document.getInterfaceDefinitions().stream() .filter(def -> typeImplements.contains(def.getName())) .collect(Collectors.toList()); } @@ -309,16 +324,4 @@ static Function getParentFileNameFunction() { */ String capitalizeMethodNameIfRestricted(MappingContext mappingContext, String methodName); - /** - * Generates a model class name including prefix and suffix (if any) - * - * @param mappingContext Global mapping context, record enum type - * @param extendedDefinition GraphQL extended definition - * @return Class name of GraphQL model node - */ - default String getModelClassNameWithPrefixAndSuffix(MappingContext mappingContext, - ExtendedDefinition extendedDefinition) { - return getModelClassNameWithPrefixAndSuffix(mappingContext, extendedDefinition.getName()); - } - } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java index d8284d4a8..52da8119e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java @@ -2,68 +2,82 @@ import com.kobylynskyi.graphql.codegen.MapperFactory; +/** + * Factory of data model mappers + */ public class DataModelMapperFactory { - private final EnumDefinitionToDataModelMapper enumDefinitionToDataModelMapper; - private final FieldDefinitionsToResolverDataModelMapper fieldDefinitionsToResolverDataModelMapper; - private final InputDefinitionToDataModelMapper inputDefinitionToDataModelMapper; - private final InterfaceDefinitionToDataModelMapper interfaceDefinitionToDataModelMapper; - private final RequestResponseDefinitionToDataModelMapper requestResponseDefinitionToDataModelMapper; - private final TypeDefinitionToDataModelMapper typeDefinitionToDataModelMapper; - private final UnionDefinitionToDataModelMapper unionDefinitionToDataModelMapper; + private final EnumDefinitionToDataModelMapper enumDefToDataModelMapper; + private final FieldDefinitionsToResolverDataModelMapper fieldDefsToResolverDataModelMapper; + private final InputDefinitionToDataModelMapper inputDefToDataModelMapper; + private final InterfaceDefinitionToDataModelMapper interfaceDefToDataModelMapper; + private final RequestResponseDefinitionToDataModelMapper requestResponseDefToDataModelMapper; + private final TypeDefinitionToDataModelMapper typeDefToDataModelMapper; + private final UnionDefinitionToDataModelMapper unionDefToDataModelMapper; private final DataModelMapper dataModelMapper; - private final FieldDefinitionToParameterMapper fieldDefinitionToParameterMapper; + private final FieldDefinitionToParameterMapper fieldDefToParamMapper; + /** + * Constructor for creating a new DataModelMapperFactory based on a MapperFactory + * + * @param generatedLanguageMapperFactory Mapper factory of a generated language + */ public DataModelMapperFactory(MapperFactory generatedLanguageMapperFactory) { ValueFormatter valueFormatter = generatedLanguageMapperFactory.createValueFormatter(); dataModelMapper = generatedLanguageMapperFactory.createDataModelMapper(); ValueMapper valueMapper = new ValueMapper(valueFormatter, dataModelMapper); - GraphQLTypeMapper graphQLTypeMapper = generatedLanguageMapperFactory.createGraphQLTypeMapper(valueMapper); - fieldDefinitionToParameterMapper = new FieldDefinitionToParameterMapper(graphQLTypeMapper, dataModelMapper); - InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper = new InputValueDefinitionToParameterMapper(valueMapper, graphQLTypeMapper, dataModelMapper); - enumDefinitionToDataModelMapper = new EnumDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper); - unionDefinitionToDataModelMapper = new UnionDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper); - typeDefinitionToDataModelMapper = new TypeDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper, fieldDefinitionToParameterMapper); - interfaceDefinitionToDataModelMapper = new InterfaceDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper, fieldDefinitionToParameterMapper); - inputDefinitionToDataModelMapper = new InputDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper, inputValueDefinitionToParameterMapper); - fieldDefinitionsToResolverDataModelMapper = new FieldDefinitionsToResolverDataModelMapper(graphQLTypeMapper, dataModelMapper, inputValueDefinitionToParameterMapper); - requestResponseDefinitionToDataModelMapper = new RequestResponseDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper, fieldDefinitionToParameterMapper, inputValueDefinitionToParameterMapper); + GraphQLTypeMapper graphQlTypeMapper = generatedLanguageMapperFactory.createGraphQLTypeMapper(valueMapper); + fieldDefToParamMapper = new FieldDefinitionToParameterMapper(graphQlTypeMapper, dataModelMapper); + enumDefToDataModelMapper = new EnumDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper); + unionDefToDataModelMapper = new UnionDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper); + typeDefToDataModelMapper = new TypeDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper, + fieldDefToParamMapper); + interfaceDefToDataModelMapper = new InterfaceDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper, + fieldDefToParamMapper); + InputValueDefinitionToParameterMapper inputValueDefToParamMapper = new InputValueDefinitionToParameterMapper( + valueMapper, graphQlTypeMapper, dataModelMapper); + inputDefToDataModelMapper = new InputDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper, + inputValueDefToParamMapper); + fieldDefsToResolverDataModelMapper = new FieldDefinitionsToResolverDataModelMapper( + graphQlTypeMapper, dataModelMapper, inputValueDefToParamMapper); + requestResponseDefToDataModelMapper = new RequestResponseDefinitionToDataModelMapper( + graphQlTypeMapper, dataModelMapper, fieldDefToParamMapper, inputValueDefToParamMapper); } public EnumDefinitionToDataModelMapper getEnumDefinitionMapper() { - return enumDefinitionToDataModelMapper; + return enumDefToDataModelMapper; } public FieldDefinitionsToResolverDataModelMapper getFieldDefinitionsToResolverMapper() { - return fieldDefinitionsToResolverDataModelMapper; + return fieldDefsToResolverDataModelMapper; } public InputDefinitionToDataModelMapper getInputDefinitionMapper() { - return inputDefinitionToDataModelMapper; + return inputDefToDataModelMapper; } public InterfaceDefinitionToDataModelMapper getInterfaceDefinitionMapper() { - return interfaceDefinitionToDataModelMapper; + return interfaceDefToDataModelMapper; } public UnionDefinitionToDataModelMapper getUnionDefinitionMapper() { - return unionDefinitionToDataModelMapper; + return unionDefToDataModelMapper; } public RequestResponseDefinitionToDataModelMapper getRequestResponseDefinitionMapper() { - return requestResponseDefinitionToDataModelMapper; + return requestResponseDefToDataModelMapper; } public TypeDefinitionToDataModelMapper getTypeDefinitionMapper() { - return typeDefinitionToDataModelMapper; + return typeDefToDataModelMapper; } public DataModelMapper getDataModelMapper() { return dataModelMapper; } - public FieldDefinitionToParameterMapper getFieldDefinitionToParameterMapper() { - return fieldDefinitionToParameterMapper; + public FieldDefinitionToParameterMapper getFieldDefToParamMapper() { + return fieldDefToParamMapper; } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java index 300fa5356..1d841ebea 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java @@ -17,7 +17,15 @@ import java.util.Set; import java.util.stream.Collectors; -import static com.kobylynskyi.graphql.codegen.model.DataModelFields.*; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ANNOTATIONS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.FIELDS; +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.IMPLEMENTS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.PACKAGE; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.SERIALIZATION_LIBRARY; /** * Map enum definition to a Freemarker data model @@ -26,29 +34,25 @@ */ public class EnumDefinitionToDataModelMapper { - private final GraphQLTypeMapper graphQLTypeMapper; + private final GraphQLTypeMapper graphQlTypeMapper; private final DataModelMapper dataModelMapper; - public EnumDefinitionToDataModelMapper(GraphQLTypeMapper graphQLTypeMapper, + public EnumDefinitionToDataModelMapper(GraphQLTypeMapper graphQlTypeMapper, DataModelMapper dataModelMapper) { - this.graphQLTypeMapper = graphQLTypeMapper; + this.graphQlTypeMapper = graphQlTypeMapper; this.dataModelMapper = dataModelMapper; } private static Set getUnionInterfaces(MappingContext mappingContext, ExtendedEnumTypeDefinition definition) { - return mappingContext.getDocument().getUnionDefinitions() - .stream() + return mappingContext.getDocument().getUnionDefinitions().stream() .filter(union -> union.isDefinitionPartOfUnion(definition)) .map(ExtendedUnionTypeDefinition::getName) - .map(unionName -> DataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, unionName)) + .map(unionName -> DataModelMapper + .getModelClassNameWithPrefixAndSuffix(mappingContext, unionName)) .collect(Collectors.toSet()); } - public DeprecatedDefinition getDeprecated(MappingContext mappingContext, DirectivesContainer directivesContainer) { - return graphQLTypeMapper.getDeprecated(mappingContext, directivesContainer); - } - private static List getJavaDoc(graphql.language.EnumValueDefinition def) { if (def.getDescription() != null) { return Collections.singletonList(def.getDescription().getContent()); @@ -61,6 +65,11 @@ private static List getJavaDoc(graphql.language.EnumValueDefinition def) .map(String::trim).collect(Collectors.toList()); } + public DeprecatedDefinition getDeprecated(MappingContext mappingContext, + DirectivesContainer directivesContainer) { + return graphQlTypeMapper.getDeprecated(mappingContext, directivesContainer); + } + /** * Map field definition to a Freemarker data model * @@ -74,7 +83,7 @@ public Map map(MappingContext mappingContext, ExtendedEnumTypeDe dataModel.put(PACKAGE, DataModelMapper.getModelPackageName(mappingContext)); dataModel.put(CLASS_NAME, dataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, definition)); dataModel.put(IMPLEMENTS, getUnionInterfaces(mappingContext, definition)); - dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, definition)); + dataModel.put(ANNOTATIONS, graphQlTypeMapper.getAnnotations(mappingContext, definition)); dataModel.put(JAVA_DOC, definition.getJavaDoc()); dataModel.put(FIELDS, map(mappingContext, definition.getValueDefinitions())); dataModel.put(GENERATED_ANNOTATION, mappingContext.getAddGeneratedAnnotation()); @@ -90,7 +99,8 @@ public Map map(MappingContext mappingContext, ExtendedEnumTypeDe * @param enumValueDefinitions list of GraphQL EnumValueDefinition types * @return list of strings */ - private List map(MappingContext mappingContext, List enumValueDefinitions) { + private List map(MappingContext mappingContext, + List enumValueDefinitions) { return enumValueDefinitions.stream() .map(f -> new EnumValueDefinition( dataModelMapper.capitalizeIfRestricted(mappingContext, f.getName()), 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 d1503f07d..7f3cfd1d9 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java @@ -41,27 +41,35 @@ public static boolean generateResolversForField(MappingContext mappingContext, ExtendedDefinition parentDefinition) { String parentTypeName = parentDefinition.getName(); boolean noResolverForWholeType = mappingContext.getFieldsWithoutResolvers().contains(parentTypeName); - boolean noResolverForSpecificField = mappingContext.getFieldsWithoutResolvers().contains(parentTypeName + "." + fieldDef.getName()); + boolean noResolverForSpecificField = mappingContext.getFieldsWithoutResolvers() + .contains(parentTypeName + "." + fieldDef.getName()); if (noResolverForWholeType || noResolverForSpecificField) { return false; } for (String fieldWithoutResolver : mappingContext.getFieldsWithoutResolvers()) { - boolean noResolverForWholeTypeViaDirective = parentDefinition.getDirectiveNames().stream().anyMatch(fd -> fieldWithoutResolver.equals("@" + fd)); - boolean noResolverForSpecificFieldViaDirective = fieldDef.getDirectives().stream().anyMatch(fd -> fieldWithoutResolver.equals("@" + fd.getName())); + boolean noResolverForWholeTypeViaDirective = parentDefinition.getDirectiveNames().stream().anyMatch( + fd -> fieldWithoutResolver.equals("@" + fd)); + boolean noResolverForSpecificFieldViaDirective = fieldDef.getDirectives().stream().anyMatch( + fd -> fieldWithoutResolver.equals("@" + fd.getName())); if (noResolverForWholeTypeViaDirective || noResolverForSpecificFieldViaDirective) { return false; } } - boolean resolverForParamField = mappingContext.getGenerateParameterizedFieldsResolvers() && !Utils.isEmpty(fieldDef.getInputValueDefinitions()); - boolean resolverForExtendedType = mappingContext.getGenerateExtensionFieldsResolvers() && fieldDef.isFromExtension(); + boolean resolverForParamField = mappingContext.getGenerateParameterizedFieldsResolvers() && !Utils + .isEmpty(fieldDef.getInputValueDefinitions()); + boolean resolverForExtendedType = mappingContext.getGenerateExtensionFieldsResolvers() && fieldDef + .isFromExtension(); boolean resolverForWholeType = mappingContext.getFieldsWithResolvers().contains(parentTypeName); - boolean resolverForTypeField = mappingContext.getFieldsWithResolvers().contains(parentTypeName + "." + fieldDef.getName()); + boolean resolverForTypeField = mappingContext.getFieldsWithResolvers() + .contains(parentTypeName + "." + fieldDef.getName()); if (resolverForParamField || resolverForExtendedType || resolverForWholeType || resolverForTypeField) { return true; } for (String fieldWithResolver : mappingContext.getFieldsWithResolvers()) { - boolean resolverForWholeTypeViaDirective = parentDefinition.getDirectiveNames().stream().anyMatch(fd -> fieldWithResolver.equals("@" + fd)); - boolean resolverForSpecificFieldViaDirective = fieldDef.getDirectives().stream().anyMatch(fd -> fieldWithResolver.equals("@" + fd.getName())); + boolean resolverForWholeTypeViaDirective = parentDefinition.getDirectiveNames().stream().anyMatch( + fd -> fieldWithResolver.equals("@" + fd)); + boolean resolverForSpecificFieldViaDirective = fieldDef.getDirectives().stream().anyMatch( + fd -> fieldWithResolver.equals("@" + fd.getName())); if (resolverForWholeTypeViaDirective || resolverForSpecificFieldViaDirective) { return true; } @@ -81,7 +89,8 @@ public List mapFields(MappingContext mappingContext, List fieldDefinitions, ExtendedDefinition parentDefinition) { return fieldDefinitions.stream() - .filter(fieldDef -> !generateResolversForField(mappingContext, fieldDef, parentDefinition)) + .filter( + fieldDef -> !generateResolversForField(mappingContext, fieldDef, parentDefinition)) .map(fieldDef -> mapField(mappingContext, fieldDef, parentDefinition.getName())) .collect(toList()); } @@ -112,13 +121,16 @@ public List mapProjectionFields(MappingContext ma */ private ParameterDefinition mapField(MappingContext mappingContext, ExtendedFieldDefinition fieldDef, String parentTypeName) { - NamedDefinition namedDefinition = graphQLTypeMapper.getLanguageType(mappingContext, fieldDef.getType(), fieldDef.getName(), parentTypeName); + NamedDefinition namedDefinition = graphQLTypeMapper + .getLanguageType(mappingContext, fieldDef.getType(), fieldDef.getName(), parentTypeName); ParameterDefinition parameter = new ParameterDefinition(); parameter.setName(dataModelMapper.capitalizeIfRestricted(mappingContext, fieldDef.getName())); parameter.setOriginalName(fieldDef.getName()); - parameter.setType(graphQLTypeMapper.getTypeConsideringPrimitive(mappingContext, namedDefinition, namedDefinition.getJavaName())); - parameter.setAnnotations(graphQLTypeMapper.getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false)); + parameter.setType(graphQLTypeMapper.getTypeConsideringPrimitive(mappingContext, namedDefinition, + namedDefinition.getJavaName())); + parameter.setAnnotations( + graphQLTypeMapper.getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false)); parameter.setJavaDoc(fieldDef.getJavaDoc()); parameter.setDeprecated(fieldDef.getDeprecated(mappingContext)); parameter.setMandatory(namedDefinition.isMandatory()); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java index e41ad462c..3f928e787 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java @@ -46,12 +46,19 @@ public class FieldDefinitionsToResolverDataModelMapper { public FieldDefinitionsToResolverDataModelMapper(GraphQLTypeMapper graphQLTypeMapper, DataModelMapper dataModelMapper, - InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper) { + InputValueDefinitionToParameterMapper inputValueDefToParamMapper) { this.graphQLTypeMapper = graphQLTypeMapper; this.dataModelMapper = dataModelMapper; - this.inputValueDefinitionToParameterMapper = inputValueDefinitionToParameterMapper; + this.inputValueDefinitionToParameterMapper = inputValueDefToParamMapper; } + /** + * Get parent Interface name + * + * @param mappingContext Global mapping context + * @param typeName GraphQL node name + * @return name of the parent interface + */ public static String getParentInterface(MappingContext mappingContext, String typeName) { // 1. check if provided type name is GraphQL root type try { @@ -62,8 +69,11 @@ public static String getParentInterface(MappingContext mappingContext, String ty return mappingContext.getMutationResolverParentInterface(); case SUBSCRIPTION: return mappingContext.getSubscriptionResolverParentInterface(); + default: + // continue } } catch (Exception ignored) { + // meaning the type is not one of the GraphQL root operations } // 2. if provided type name is GraphQL root type then assume that it is GraphQL type @@ -106,7 +116,8 @@ public Map mapRootTypeField(MappingContext mappingContext, ExtendedFieldDefinition fieldDefinition, String rootTypeName, List fieldNames) { - String className = DataModelMapper.getApiClassNameWithPrefixAndSuffix(mappingContext, fieldDefinition, rootTypeName, fieldNames); + String className = DataModelMapper + .getApiClassNameWithPrefixAndSuffix(mappingContext, fieldDefinition, rootTypeName, fieldNames); List fieldDefs = Collections.singletonList(fieldDefinition); return mapToResolverModel(mappingContext, rootTypeName, className, fieldDefs, fieldDefinition.getJavaDoc(), getParentInterface(mappingContext, rootTypeName)); @@ -169,7 +180,8 @@ private List mapToOperations(MappingContext mappingContext, } /** - * Builds a Freemarker-understandable structure representing an operation to resolve a field for a given parent type. + * Builds a Freemarker-understandable structure representing an operation to resolve a field for a given parent + * type. * * @param mappingContext Global mapping context * @param fieldDef The GraphQL definition of the field that the method should resolve @@ -179,9 +191,11 @@ private List mapToOperations(MappingContext mappingContext, private OperationDefinition map(MappingContext mappingContext, ExtendedFieldDefinition fieldDef, String parentTypeName) { String name = dataModelMapper.capitalizeIfRestricted(mappingContext, fieldDef.getName()); - NamedDefinition javaType = graphQLTypeMapper.getLanguageType(mappingContext, fieldDef.getType(), fieldDef.getName(), parentTypeName); + NamedDefinition javaType = graphQLTypeMapper + .getLanguageType(mappingContext, fieldDef.getType(), fieldDef.getName(), parentTypeName); String returnType = getReturnType(mappingContext, fieldDef, javaType, parentTypeName); - List annotations = graphQLTypeMapper.getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false); + List annotations = graphQLTypeMapper + .getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false); List parameters = getOperationParameters(mappingContext, fieldDef, parentTypeName); OperationDefinition operation = new OperationDefinition(); @@ -203,8 +217,10 @@ private List getOperationParameters(MappingContext mappingC // 1. First parameter is the parent object for which we are resolving fields (unless it's the root Query) if (!Utils.isGraphqlOperation(parentTypeName)) { - String parentObjectParamType = graphQLTypeMapper.getLanguageType(mappingContext, new TypeName(parentTypeName)); - String parentObjectParamName = dataModelMapper.capitalizeIfRestricted(mappingContext, Utils.uncapitalize(parentObjectParamType)); + String parentObjectParamType = graphQLTypeMapper + .getLanguageType(mappingContext, new TypeName(parentTypeName)); + String parentObjectParamName = dataModelMapper + .capitalizeIfRestricted(mappingContext, Utils.unCapitalize(parentObjectParamType)); ParameterDefinition parameterDefinition = new ParameterDefinition(); parameterDefinition.setType(parentObjectParamType); parameterDefinition.setName(parentObjectParamName); @@ -214,7 +230,8 @@ private List getOperationParameters(MappingContext mappingC } // 2. Next parameters are input values - parameters.addAll(inputValueDefinitionToParameterMapper.map(mappingContext, resolvedField.getInputValueDefinitions(), resolvedField.getName())); + parameters.addAll(inputValueDefinitionToParameterMapper + .map(mappingContext, resolvedField.getInputValueDefinitions(), resolvedField.getName())); // 3. Last parameter (optional) is the DataFetchingEnvironment if (Boolean.TRUE.equals(mappingContext.getGenerateDataFetchingEnvironmentArgumentInApis())) { @@ -234,8 +251,11 @@ private String getReturnType(MappingContext mappingContext, ExtendedFieldDefinit if (argument != null && argument.getValue() instanceof StringValue) { String graphqlTypeName = ((StringValue) argument.getValue()).getValue(); String javaTypeName = graphQLTypeMapper.getLanguageType(mappingContext, - new TypeName(graphqlTypeName), graphqlTypeName, parentTypeName, false, false).getJavaName(); - return graphQLTypeMapper.getGenericsString(mappingContext, relayConfig.getConnectionType(), javaTypeName); + new TypeName(graphqlTypeName), + graphqlTypeName, parentTypeName, false, + false).getJavaName(); + return graphQLTypeMapper + .getGenericsString(mappingContext, relayConfig.getConnectionType(), javaTypeName); } } } 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 e7a1f8fd1..c172efe60 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java @@ -84,23 +84,26 @@ static List getDirectives(NamedNode def) { /** * Wraps type into apiReturnType or subscriptionReturnType (defined in the mapping configuration). - * Examples: - *

- * - Given GraphQL schema: {@code type Query { events: [Event!]! }} - * - Given config: {@code useOptionalForNullableReturnTypes = true} - * - Return: {@code java.util.Optional} - *

- * - Given GraphQL schema: {@code type Subscription { eventsCreated: [Event!]! }} - * - Given subscriptionReturnType in config: {@code org.reactivestreams.Publisher} - * - Return: {@code org.reactivestreams.Publisher} - *

- * - Given GraphQL schema: {@code type Mutation { createEvent(inp: Inp): Event }} - * - Given apiReturnType in config: {@code reactor.core.publisher.Mono} - * - Return: {@code reactor.core.publisher.Mono} - *

- * - Given GraphQL schema: {@code type Query { events: [Event!]! }} - * - Given apiReturnListType in config: {@code reactor.core.publisher.Flux} - * - Return: {@code reactor.core.publisher.Flux} + * + *

Example 1: + * * Given GraphQL schema: {@code type Query { events: [Event!]! }} + * * Given config: {@code useOptionalForNullableReturnTypes = true} + * * Return: {@code java.util.Optional} + * + *

Example 2: + * * Given GraphQL schema: {@code type Subscription { eventsCreated: [Event!]! }} + * * Given subscriptionReturnType in config: {@code org.reactivestreams.Publisher} + * * Return: {@code org.reactivestreams.Publisher} + * + *

Example 3: + * * Given GraphQL schema: {@code type Mutation { createEvent(inp: Inp): Event }} + * * Given apiReturnType in config: {@code reactor.core.publisher.Mono} + * * Return: {@code reactor.core.publisher.Mono} + * + *

Example 4: + * * Given GraphQL schema: {@code type Query { events: [Event!]! }} + * * Given apiReturnListType in config: {@code reactor.core.publisher.Flux} + * * Return: {@code reactor.core.publisher.Flux} * * @param mappingContext Global mapping context * @param namedDefinition Named definition @@ -119,6 +122,14 @@ String wrapApiReturnTypeIfRequired(MappingContext mappingContext, */ boolean isPrimitive(String possiblyPrimitiveType); + /** + * Whether to add model validation annotation to a type + * + * @param type GraphQL type name + * @return true if model validation annotation should be added to a type + */ + boolean addModelValidationAnnotationForType(String type); + /** * Wrap string into generics type * @@ -155,7 +166,8 @@ default String getLanguageType(MappingContext mappingContext, Type type) { * @param parentTypeName Name of the parent type * @return Corresponding language-specific type (java/scala/kotlin/etc) */ - default NamedDefinition getLanguageType(MappingContext mappingContext, Type graphqlType, String name, String parentTypeName) { + default NamedDefinition getLanguageType(MappingContext mappingContext, Type graphqlType, String name, + String parentTypeName) { return getLanguageType(mappingContext, graphqlType, name, parentTypeName, false, false); } @@ -174,17 +186,22 @@ default NamedDefinition getLanguageType(MappingContext mappingContext, Type g String name, String parentTypeName, boolean mandatory, boolean collection) { if (graphqlType instanceof TypeName) { - return getLanguageType(mappingContext, ((TypeName) graphqlType).getName(), name, parentTypeName, mandatory, collection); + return getLanguageType(mappingContext, ((TypeName) graphqlType).getName(), name, parentTypeName, mandatory, + collection); } else if (graphqlType instanceof ListType) { - NamedDefinition mappedCollectionType = getLanguageType(mappingContext, ((ListType) graphqlType).getType(), name, parentTypeName, false, true); + NamedDefinition mappedCollectionType = getLanguageType(mappingContext, ((ListType) graphqlType).getType(), + name, parentTypeName, false, true); if (mappedCollectionType.isInterface() && mappingContext.getInterfacesName().contains(parentTypeName)) { - mappedCollectionType.setJavaName(wrapSuperTypeIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); + mappedCollectionType.setJavaName( + wrapSuperTypeIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); } else { - mappedCollectionType.setJavaName(wrapIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); + mappedCollectionType.setJavaName( + wrapIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); } return mappedCollectionType; } else if (graphqlType instanceof NonNullType) { - return getLanguageType(mappingContext, ((NonNullType) graphqlType).getType(), name, parentTypeName, true, collection); + return getLanguageType(mappingContext, ((NonNullType) graphqlType).getType(), name, parentTypeName, true, + collection); } throw new IllegalArgumentException("Unknown type: " + graphqlType); } @@ -244,32 +261,48 @@ default List getAnnotations(MappingContext mappingContext, Type type, } else if (type instanceof NonNullType) { return getAnnotations(mappingContext, ((NonNullType) type).getType(), def, parentTypeName, true); } else if (type instanceof TypeName) { - return getAnnotations(mappingContext, ((TypeName) type).getName(), def.getName(), parentTypeName, getDirectives(def), mandatory); + return getAnnotations(mappingContext, ((TypeName) type).getName(), def.getName(), parentTypeName, + getDirectives(def), mandatory); } return Collections.emptyList(); } default List getAnnotations(MappingContext mappingContext, ExtendedDefinition extendedDefinition) { - return getAnnotations(mappingContext, extendedDefinition.getName(), extendedDefinition.getName(), null, Collections.emptyList(), false); + return getAnnotations(mappingContext, extendedDefinition.getName(), extendedDefinition.getName(), null, + Collections.emptyList(), false); } default List getAnnotations(MappingContext mappingContext, String name) { return getAnnotations(mappingContext, name, name, null, Collections.emptyList(), false); } + /** + * Get annotations for a given GraphQL type + * + * @param mappingContext Global mapping context + * @param graphQLTypeName GraphQL type + * @param name Name of the GraphQL type + * @param parentTypeName Name of the parent type + * @param directives List of GraphQL directive + * @param mandatory Type is mandatory + * @return list of Java annotations for a given GraphQL type + */ default List getAnnotations(MappingContext mappingContext, String graphQLTypeName, String name, String parentTypeName, List directives, boolean mandatory) { List annotations = new ArrayList<>(); if (mandatory) { - String possiblyPrimitiveType = mappingContext.getCustomTypesMapping().get(getMandatoryType(graphQLTypeName)); + String possiblyPrimitiveType = mappingContext.getCustomTypesMapping() + .get(getMandatoryType(graphQLTypeName)); String modelValidationAnnotation = mappingContext.getModelValidationAnnotation(); - if (Utils.isNotBlank(modelValidationAnnotation) && addModelValidationAnnotationForType(possiblyPrimitiveType)) { + if (Utils.isNotBlank(modelValidationAnnotation) && addModelValidationAnnotationForType( + possiblyPrimitiveType)) { annotations.add(modelValidationAnnotation); } } Map> customAnnotationsMapping = mappingContext.getCustomAnnotationsMapping(); - if (name != null && parentTypeName != null && customAnnotationsMapping.containsKey(parentTypeName + "." + name)) { + if (name != null && parentTypeName != null && customAnnotationsMapping + .containsKey(parentTypeName + "." + name)) { List annotationsToAdd = customAnnotationsMapping.get(parentTypeName + "." + name); if (!Utils.isEmpty(annotationsToAdd)) { annotations.addAll(annotationsToAdd); @@ -284,17 +317,24 @@ default List getAnnotations(MappingContext mappingContext, String graphQ Map> directiveAnnotationsMapping = mappingContext.getDirectiveAnnotationsMapping(); for (Directive directive : directives) { if (directiveAnnotationsMapping.containsKey(directive.getName())) { - annotations.addAll(getAnnotationForDirective(mappingContext, directiveAnnotationsMapping.get(directive.getName()), directive)); + annotations.addAll(getAnnotationsForDirective( + mappingContext, directiveAnnotationsMapping.get(directive.getName()), directive)); } } return annotations; } - boolean addModelValidationAnnotationForType(String possiblyPrimitiveType); - - default List getAnnotationForDirective(MappingContext mappingContext, - List directiveAnnotations, - Directive directive) { + /** + * Get a list of annotations for a given directive based on mapping config + * + * @param mappingContext Global mapping context + * @param directiveAnnotations List of directive annotations + * @param directive GraphQL Directive + * @return a list of annotations to be added for all types that have given directive + */ + default List getAnnotationsForDirective(MappingContext mappingContext, + List directiveAnnotations, + Directive directive) { List directiveAnnotationsMapped = new ArrayList<>(); for (String annotation : directiveAnnotations) { String directiveAnnotationMapped = annotation; @@ -317,7 +357,8 @@ default String getTypeConsideringPrimitive(MappingContext mappingContext, String computedTypeName) { String graphqlTypeName = namedDefinition.getGraphqlTypeName(); if (namedDefinition.isMandatory() && namedDefinition.isPrimitiveCanBeUsed()) { - String possiblyPrimitiveType = mappingContext.getCustomTypesMapping().get(getMandatoryType(graphqlTypeName)); + String possiblyPrimitiveType = mappingContext.getCustomTypesMapping() + .get(getMandatoryType(graphqlTypeName)); if (isPrimitive(possiblyPrimitiveType)) { return possiblyPrimitiveType; } @@ -331,12 +372,14 @@ default String getResponseReturnType(MappingContext mappingContext, return computedTypeName; } - default DeprecatedDefinition getDeprecated(MappingContext mappingContext, DirectivesContainer directivesContainer) { + default DeprecatedDefinition getDeprecated(MappingContext mappingContext, + DirectivesContainer directivesContainer) { return directivesContainer.getDirectives() .stream() .filter(d -> d.getName().equalsIgnoreCase(Deprecated.class.getSimpleName())) .findFirst() - .map(directive -> MultiLanguageDeprecated.getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive)) + .map(directive -> MultiLanguageDeprecated + .getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive)) .orElse(null); } 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 c7ad68671..ae11edaac 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java @@ -6,7 +6,21 @@ import java.util.HashMap; import java.util.Map; -import static com.kobylynskyi.graphql.codegen.model.DataModelFields.*; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ANNOTATIONS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.BUILDER; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.EQUALS_AND_HASH_CODE; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.FIELDS; +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.IMMUTABLE_MODELS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.NAME; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.PACKAGE; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.TO_STRING; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.TO_STRING_FOR_REQUEST; /** * Map input type definition to a Freemarker data model @@ -21,10 +35,10 @@ public class InputDefinitionToDataModelMapper { public InputDefinitionToDataModelMapper(GraphQLTypeMapper graphQLTypeMapper, DataModelMapper dataModelMapper, - InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper) { + InputValueDefinitionToParameterMapper inputValueDefToParamMapper) { this.graphQLTypeMapper = graphQLTypeMapper; this.dataModelMapper = dataModelMapper; - this.inputValueDefinitionToParameterMapper = inputValueDefinitionToParameterMapper; + this.inputValueDefinitionToParameterMapper = inputValueDefToParamMapper; } /** @@ -41,7 +55,8 @@ public Map map(MappingContext mappingContext, ExtendedInputObjec dataModel.put(CLASS_NAME, dataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, definition)); dataModel.put(JAVA_DOC, definition.getJavaDoc()); dataModel.put(NAME, definition.getName()); - dataModel.put(FIELDS, inputValueDefinitionToParameterMapper.map(mappingContext, definition.getValueDefinitions(), definition.getName())); + dataModel.put(FIELDS, inputValueDefinitionToParameterMapper + .map(mappingContext, definition.getValueDefinitions(), definition.getName())); dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, definition)); dataModel.put(BUILDER, mappingContext.getGenerateBuilder()); dataModel.put(EQUALS_AND_HASH_CODE, mappingContext.getGenerateEqualsAndHashCode()); 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 62450e14d..83ed0faa4 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java @@ -36,7 +36,8 @@ public InputValueDefinitionToParameterMapper(ValueMapper valueMapper, * @param parentTypeName Name of the parent GraphQL type * @return Freemarker data model of the GraphQL input value definition */ - public List map(MappingContext mappingContext, List valueDefinitions, String parentTypeName) { + public List map(MappingContext mappingContext, List valueDefinitions, + String parentTypeName) { return valueDefinitions.stream() .map(inputValueDef -> map(mappingContext, inputValueDef, parentTypeName)) .collect(toList()); @@ -50,15 +51,21 @@ public List map(MappingContext mappingContext, List map(MappingContext mappingContext, ExtendedInterfaceT dataModel.put(JAVA_DOC, definition.getJavaDoc()); dataModel.put(IMPLEMENTS, getInterfaces(mappingContext, definition)); dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, definition)); - dataModel.put(FIELDS, fieldDefinitionToParameterMapper.mapFields(mappingContext, definition.getFieldDefinitions(), definition)); + dataModel.put(FIELDS, fieldDefinitionToParameterMapper + .mapFields(mappingContext, definition.getFieldDefinitions(), definition)); dataModel.put(GENERATED_ANNOTATION, mappingContext.getAddGeneratedAnnotation()); dataModel.put(GENERATED_INFO, mappingContext.getGeneratedInformation()); dataModel.put(ENUM_IMPORT_IT_SELF_IN_SCALA, mappingContext.getEnumImportItSelfInScala()); 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 d601d35c3..5e07babab 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java @@ -25,8 +25,8 @@ import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.EQUALS_AND_HASH_CODE; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.FIELDS; -import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; 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.JAVA_DOC; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.METHOD_NAME; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.OPERATION_NAME; @@ -52,11 +52,11 @@ public class RequestResponseDefinitionToDataModelMapper { public RequestResponseDefinitionToDataModelMapper(GraphQLTypeMapper graphQLTypeMapper, DataModelMapper dataModelMapper, FieldDefinitionToParameterMapper fieldDefinitionToParameterMapper, - InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper) { + InputValueDefinitionToParameterMapper inputValDefToParamMapper) { this.graphQLTypeMapper = graphQLTypeMapper; this.dataModelMapper = dataModelMapper; this.fieldDefinitionToParameterMapper = fieldDefinitionToParameterMapper; - this.inputValueDefinitionToParameterMapper = inputValueDefinitionToParameterMapper; + this.inputValueDefinitionToParameterMapper = inputValDefToParamMapper; } /** @@ -81,26 +81,6 @@ private static String getClassName(ExtendedFieldDefinition operationDef, return classNameBuilder.toString(); } - /** - * Get merged attributes from the type and attributes from the interface. - * - * @param mappingContext Global mapping context - * @param unionDefinition GraphQL union definition - * @return Freemarker data model for response projection of the GraphQL union - */ - private static Collection getProjectionFields( - MappingContext mappingContext, ExtendedUnionTypeDefinition unionDefinition) { - // using the map to exclude duplicate fields from the type and interfaces - Map allParameters = new LinkedHashMap<>(); - for (String memberTypeName : unionDefinition.getMemberTypeNames()) { - ProjectionParameterDefinition memberDef = getChildDefinition(mappingContext, memberTypeName); - allParameters.put(memberDef.getMethodName(), memberDef); - } - ProjectionParameterDefinition typeNameProjParamDef = getTypeNameProjectionParameterDefinition(); - allParameters.put(typeNameProjParamDef.getMethodName(), typeNameProjParamDef); - return allParameters.values(); - } - private static ProjectionParameterDefinition getChildDefinition(MappingContext mappingContext, String childName) { ProjectionParameterDefinition parameter = new ProjectionParameterDefinition(); @@ -154,14 +134,16 @@ public Map mapResponseProjection(MappingContext mappingContext, public Map mapParametrizedInput(MappingContext mappingContext, ExtendedFieldDefinition fieldDefinition, ExtendedDefinition parentTypeDefinition) { - String className = DataModelMapper.getParametrizedInputClassName(mappingContext, fieldDefinition, parentTypeDefinition); + String className = DataModelMapper + .getParametrizedInputClassName(mappingContext, fieldDefinition, parentTypeDefinition); Map dataModel = new HashMap<>(); // ParametrizedInput classes are sharing the package with the model classes, so no imports are needed dataModel.put(PACKAGE, DataModelMapper.getModelPackageName(mappingContext)); dataModel.put(CLASS_NAME, className); dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, className)); dataModel.put(JAVA_DOC, Collections.singletonList(String.format("Parametrized input for field %s in type %s", - fieldDefinition.getName(), parentTypeDefinition.getName()))); + fieldDefinition.getName(), + parentTypeDefinition.getName()))); dataModel.put(FIELDS, inputValueDefinitionToParameterMapper.map( mappingContext, fieldDefinition.getInputValueDefinitions(), parentTypeDefinition.getName())); dataModel.put(BUILDER, mappingContext.getGenerateBuilder()); @@ -189,7 +171,8 @@ public Map mapResponse(MappingContext mappingContext, String className = getClassName(operationDef, fieldNames, objectTypeName, mappingContext.getResponseSuffix()); NamedDefinition namedDefinition = graphQLTypeMapper.getLanguageType( mappingContext, operationDef.getType(), operationDef.getName(), objectTypeName); - String returnType = graphQLTypeMapper.getResponseReturnType(mappingContext, namedDefinition, namedDefinition.getJavaName()); + String returnType = graphQLTypeMapper + .getResponseReturnType(mappingContext, namedDefinition, namedDefinition.getJavaName()); Map dataModel = new HashMap<>(); // Response classes are sharing the package with the model classes, so no imports are needed dataModel.put(PACKAGE, DataModelMapper.getModelPackageName(mappingContext)); @@ -198,7 +181,8 @@ public Map mapResponse(MappingContext mappingContext, dataModel.put(JAVA_DOC, operationDef.getJavaDoc()); dataModel.put(DEPRECATED, operationDef.getDeprecated(mappingContext)); dataModel.put(OPERATION_NAME, operationDef.getName()); - dataModel.put(METHOD_NAME, dataModelMapper.capitalizeMethodNameIfRestricted(mappingContext, operationDef.getName())); + dataModel.put(METHOD_NAME, dataModelMapper.capitalizeMethodNameIfRestricted( + mappingContext, operationDef.getName())); dataModel.put(RETURN_TYPE_NAME, returnType); dataModel.put(GENERATED_ANNOTATION, mappingContext.getAddGeneratedAnnotation()); dataModel.put(GENERATED_INFO, mappingContext.getGeneratedInformation()); @@ -228,7 +212,8 @@ public Map mapRequest(MappingContext mappingContext, dataModel.put(JAVA_DOC, operationDef.getJavaDoc()); dataModel.put(OPERATION_NAME, operationDef.getName()); dataModel.put(OPERATION_TYPE, objectTypeName.toUpperCase()); - dataModel.put(FIELDS, inputValueDefinitionToParameterMapper.map(mappingContext, operationDef.getInputValueDefinitions(), operationDef.getName())); + dataModel.put(FIELDS, inputValueDefinitionToParameterMapper + .map(mappingContext, operationDef.getInputValueDefinitions(), operationDef.getName())); dataModel.put(BUILDER, mappingContext.getGenerateBuilder()); dataModel.put(EQUALS_AND_HASH_CODE, mappingContext.getGenerateEqualsAndHashCode()); dataModel.put(TO_STRING, mappingContext.getGenerateToString()); @@ -239,6 +224,26 @@ public Map mapRequest(MappingContext mappingContext, return dataModel; } + /** + * Get merged attributes from the type and attributes from the interface. + * + * @param mappingContext Global mapping context + * @param unionDefinition GraphQL union definition + * @return Freemarker data model for response projection of the GraphQL union + */ + private static Collection getProjectionFields( + MappingContext mappingContext, ExtendedUnionTypeDefinition unionDefinition) { + // using the map to exclude duplicate fields from the type and interfaces + Map allParameters = new LinkedHashMap<>(); + for (String memberTypeName : unionDefinition.getMemberTypeNames()) { + ProjectionParameterDefinition memberDef = getChildDefinition(mappingContext, memberTypeName); + allParameters.put(memberDef.getMethodName(), memberDef); + } + ProjectionParameterDefinition typeNameProjParamDef = getTypeNameProjectionParameterDefinition(); + allParameters.put(typeNameProjParamDef.getMethodName(), typeNameProjParamDef); + return allParameters.values(); + } + /** * Get merged attributes from the type and attributes from the interface. * @@ -271,12 +276,15 @@ private Collection getProjectionFields( // using the map to exclude duplicate fields from the type and interfaces Map allParameters = new LinkedHashMap<>(); // includes parameters from the base definition and extensions - fieldDefinitionToParameterMapper.mapProjectionFields(mappingContext, typeDefinition.getFieldDefinitions(), typeDefinition) + fieldDefinitionToParameterMapper + .mapProjectionFields(mappingContext, typeDefinition.getFieldDefinitions(), typeDefinition) .forEach(p -> allParameters.put(p.getMethodName(), p)); // includes parameters from the interface - List interfacesOfType = DataModelMapper.getInterfacesOfType(typeDefinition, mappingContext.getDocument()); + List interfacesOfType = DataModelMapper + .getInterfacesOfType(typeDefinition, mappingContext.getDocument()); interfacesOfType.stream() - .map(i -> fieldDefinitionToParameterMapper.mapProjectionFields(mappingContext, i.getFieldDefinitions(), i)) + .map(i -> fieldDefinitionToParameterMapper + .mapProjectionFields(mappingContext, i.getFieldDefinitions(), i)) .flatMap(Collection::stream) .filter(paramDef -> !allParameters.containsKey(paramDef.getMethodName())) .forEach(paramDef -> allParameters.put(paramDef.getMethodName(), paramDef)); @@ -297,17 +305,20 @@ private Collection getProjectionFields( // using the map to exclude duplicate fields from the type and interfaces Map allParameters = new LinkedHashMap<>(); // includes parameters from the base definition and extensions - fieldDefinitionToParameterMapper.mapProjectionFields(mappingContext, interfaceDefinition.getFieldDefinitions(), interfaceDefinition) + fieldDefinitionToParameterMapper + .mapProjectionFields(mappingContext, interfaceDefinition.getFieldDefinitions(), interfaceDefinition) .forEach(p -> allParameters.put(p.getMethodName(), p)); // includes parameters from the interface DataModelMapper.getInterfacesOfType(interfaceDefinition, mappingContext.getDocument()).stream() - .map(i -> fieldDefinitionToParameterMapper.mapProjectionFields(mappingContext, i.getFieldDefinitions(), i)) + .map(i -> fieldDefinitionToParameterMapper + .mapProjectionFields(mappingContext, i.getFieldDefinitions(), i)) .flatMap(Collection::stream) .filter(paramDef -> !allParameters.containsKey(paramDef.getMethodName())) .forEach(paramDef -> allParameters.put(paramDef.getMethodName(), paramDef)); Set interfaceChildren = mappingContext.getInterfaceChildren() - .getOrDefault(interfaceDefinition.getName(), Collections.emptySet()); + .getOrDefault(interfaceDefinition.getName(), + Collections.emptySet()); for (String childName : interfaceChildren) { ProjectionParameterDefinition childDef = getChildDefinition(mappingContext, childName); allParameters.put(childDef.getMethodName(), childDef); 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 7299386ad..e6f72cb6e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java @@ -124,7 +124,8 @@ private Collection getFields(MappingContext mappingContext, DataModelMapper.getInterfacesOfType(typeDefinition, document).stream() .map(i -> fieldDefinitionToParameterMapper.mapFields(mappingContext, i.getFieldDefinitions(), i)) .flatMap(Collection::stream) - .forEach(paramDef -> allParameters.merge(paramDef.getName(), paramDef, TypeDefinitionToDataModelMapper::merge)); + .forEach(paramDef -> allParameters + .merge(paramDef.getName(), paramDef, TypeDefinitionToDataModelMapper::merge)); return allParameters.values(); } @@ -134,11 +135,13 @@ private Set getInterfaces(MappingContext mappingContext, .stream() .filter(union -> union.isDefinitionPartOfUnion(definition)) .map(ExtendedUnionTypeDefinition::getName) - .map(unionName -> DataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, unionName)) + .map(unionName -> DataModelMapper + .getModelClassNameWithPrefixAndSuffix(mappingContext, unionName)) .collect(Collectors.toList()); Set interfaceNames = definition.getImplements() .stream() - .map(anImplement -> graphQLTypeMapper.getLanguageType(mappingContext, anImplement)) + .map(anImplement -> graphQLTypeMapper + .getLanguageType(mappingContext, anImplement)) .collect(Collectors.toSet()); Set allInterfaces = new LinkedHashSet<>(); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnionDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnionDefinitionToDataModelMapper.java index 52fe0f061..eead1353f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnionDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnionDefinitionToDataModelMapper.java @@ -9,8 +9,8 @@ import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ANNOTATIONS; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA; -import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; 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.JAVA_DOC; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.PACKAGE; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueFormatter.java index 801e1e382..d887a9757 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueFormatter.java @@ -16,6 +16,13 @@ static String format(String value, String formatter) { return FORMATTER_TO_STRING.equals(formatter) ? "\"" + value + "\"" : value; } + /** + * Format a list of values to a single string according to a formatter + * + * @param values values to be formatted + * @param formatter value formatter + * @return formatted string + */ default String formatList(List values, String formatter) { if (values == null) { return format(getNullValue(), formatter); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java index 23bd819aa..8c8739e5a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java @@ -19,6 +19,9 @@ import java.util.List; import java.util.stream.Collectors; +/** + * A class for mapping GraphQL value to a java value + */ public class ValueMapper { private static final String NULL_STRING = "null"; @@ -36,10 +39,13 @@ private static String mapBoolean(BooleanValue value) { return value.isValue() ? "true" : "false"; } - //TODO It should also be abstracted. Different languages have different default values(It is now implemented in templates (templates are extremely complex)) + //TODO It should also be abstracted. Different languages have different default values(It is now implemented in + // templates (templates are extremely complex)) private static String mapInt(MappingContext mappingContext, IntValue value, Type graphQLType) { - //default java basic type is `int`. so, default value like 123 that must wrap or append suffix `L` when it be defined as `int` in graphql schema. - //`int` cannot assign to `Long`, also `double` cannot assign to `Float`, but graphql Float default mapping is Double in java, so, not modify `mapFloat`. + //default java basic type is `int`. so, default value like 123 that must wrap or append suffix `L` when it be + // defined as `int` in graphql schema. + //`int` cannot assign to `Long`, also `double` cannot assign to `Float`, but graphql Float default mapping is + // Double in java, so, not modify `mapFloat`. if (graphQLType instanceof TypeName) { String customType = mappingContext.getCustomTypesMapping().get("Long"); String typeName = ((TypeName) graphQLType).getName(); @@ -67,6 +73,15 @@ public String map(MappingContext mappingContext, Value value, Type graphQL return map(mappingContext, value, graphQLType, null); } + /** + * Map GraphQL value of a given type according to a formatter + * + * @param mappingContext Global mapping context + * @param value GraphQL Value + * @param graphQLType GraphQL Type + * @param formatter value formatter + * @return formatted value + */ public String map(MappingContext mappingContext, Value value, Type graphQLType, String formatter) { if (value instanceof NullValue) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiInterfaceStrategy.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiInterfaceStrategy.java index c4e1a00e2..1eeb7efc9 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiInterfaceStrategy.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiInterfaceStrategy.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Strategy for creating API interface calsses + */ public enum ApiInterfaceStrategy { /** diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiNamePrefixStrategy.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiNamePrefixStrategy.java index a88746255..4a332486b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiNamePrefixStrategy.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiNamePrefixStrategy.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Strategy of defining the prefix for all generated API interface classes + */ public enum ApiNamePrefixStrategy { /** diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiRootInterfaceStrategy.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiRootInterfaceStrategy.java index 772bea4f8..e83003368 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiRootInterfaceStrategy.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiRootInterfaceStrategy.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Strategy of how root API interface (Query/Mutation/Subscription) will be generated + */ public enum ApiRootInterfaceStrategy { /** diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java index 7eb9eb48d..2a9c59c8a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java @@ -14,7 +14,8 @@ public class EnumValueDefinition { private final List javaDoc; private final DeprecatedDefinition deprecated; - public EnumValueDefinition(String javaName, String graphqlName, List javaDoc, DeprecatedDefinition deprecated) { + public EnumValueDefinition(String javaName, String graphqlName, List javaDoc, + DeprecatedDefinition deprecated) { this.javaName = javaName; this.graphqlName = graphqlName; this.javaDoc = javaDoc; 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 ab6d244f2..b47024c09 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java @@ -4,6 +4,9 @@ import java.time.format.DateTimeFormatter; import java.util.function.Supplier; +/** + * A class used for building a @Generated annotation on top of each generated class + */ public class GeneratedInformation { public static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedLanguage.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedLanguage.java index 70ddd559e..2eb310734 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedLanguage.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedLanguage.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Enum containing all supported langugages for code generation + */ public enum GeneratedLanguage { JAVA(".java"), 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 fbaadc16d..2095db193 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java @@ -11,14 +11,14 @@ public interface GraphQLCodegenConfiguration { /** * Can be used to supply custom mappings for scalars. - *

- * Supports: + * + *

Supports: *

    *
  • Map of (GraphqlObjectName.fieldName) to (JavaType)
  • *
  • Map of (GraphqlType) to (JavaType)
  • *
- *

- * E.g.: + * + *

E.g.: *

    *
  • {@code DateTime --- String}
  • *
  • {@code Price.amount --- java.math.BigDecimal}
  • @@ -30,15 +30,16 @@ public interface GraphQLCodegenConfiguration { /** * Can be used to supply custom annotations (serializers) for scalars. - *

    - * Supports: + * + *

    Supports: *

      *
    • Map of (GraphqlObjectName.fieldName) to (JavaAnnotation)
    • *
    • Map of (GraphqlType) to (JavaAnnotation)
    • *
    - *

    - * E.g.: - * {@code EpochMillis --- @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.EpochMillisScalarDeserializer.class)} + * + *

    E.g.: + * {@code EpochMillis --- @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json + * .EpochMillisScalarDeserializer.class)} * * @return mappings from GraphqlType to JavaAnnotation */ @@ -46,14 +47,15 @@ public interface GraphQLCodegenConfiguration { /** * Map GraphQL directives to Java annotations. - *

    - * Directive fields can be used in annotations via: {{directiveFieldName}} - *

    - * Example: - *

    - * schema: directive @auth (roles: [String]) - *

    - * {@code directiveAnnotationsMapping: auth --- @org.springframework.security.access.annotation.Secured({{roles}})} + * + *

    Directive fields can be used in annotations via: {{directiveFieldName}} + * + *

    Example: + * + *

    schema: directive @auth (roles: [String]) + * + *

    {@code directiveAnnotationsMapping: + * auth --- @org.springframework.security.access.annotation.Secured({{roles}})} * * @return mappings from GraphQL directives to Java annotations. */ @@ -266,12 +268,12 @@ public interface GraphQLCodegenConfiguration { /** * Fields that require Resolvers. - *

    - * Values should be defined here in format: TypeName, TypeName.fieldName, @directive - *

    - * If just type is specified, then all fields of this type will have resolvers. - *

    - * E.g.: + * + *

    Values should be defined here in format: TypeName, TypeName.fieldName, @directive + * + *

    If just type is specified, then all fields of this type will have resolvers. + * + *

    E.g.: *

      *
    • {@code Person}
    • *
    • {@code Person.friends}
    • @@ -284,14 +286,14 @@ public interface GraphQLCodegenConfiguration { /** * Fields that DO NOT require Resolvers. - *

      - * Values should be defined here in format: TypeName, TypeName.fieldName, @directive - *

      - * If just type is specified, then all fields of this type will NOT have resolvers. - *

      - * Can be used in conjunction with {@code generateExtensionFieldsResolvers} - *

      - * E.g.: + * + *

      Values should be defined here in format: TypeName, TypeName.fieldName, @directive + * + *

      If just type is specified, then all fields of this type will NOT have resolvers. + * + *

      Can be used in conjunction with {@code generateExtensionFieldsResolvers} + * + *

      E.g.: *

        *
      • {@code Person}
      • *
      • {@code Person.friends}
      • @@ -383,12 +385,12 @@ public interface GraphQLCodegenConfiguration { /** * Fields that require serialization using * {@link com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)} - *

        - * Values should be defined here in format: GraphqlObjectName.fieldName or GraphqlTypeName - *

        - * If just type is specified, then all fields of this type will be serialized using ObjectMapper. - *

        - * E.g.: + * + *

        Values should be defined here in format: GraphqlObjectName.fieldName or GraphqlTypeName + * + *

        If just type is specified, then all fields of this type will be serialized using ObjectMapper. + * + *

        E.g.: *

          *
        • {@code Person.createdDateTime}
        • *
        • {@code ZonedDateTime}
        • 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 9f9e9b6db..c1dab9333 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java @@ -116,45 +116,66 @@ public void combine(MappingConfig source) { modelNameSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getModelNameSuffix); apiNamePrefix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiNamePrefix); apiNameSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiNameSuffix); - apiRootInterfaceStrategy = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiRootInterfaceStrategy); + apiRootInterfaceStrategy = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getApiRootInterfaceStrategy); apiInterfaceStrategy = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiInterfaceStrategy); apiNamePrefixStrategy = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiNamePrefixStrategy); typeResolverPrefix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getTypeResolverPrefix); typeResolverSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getTypeResolverSuffix); - modelValidationAnnotation = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getModelValidationAnnotation); + modelValidationAnnotation = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getModelValidationAnnotation); apiReturnType = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiReturnType); apiReturnListType = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiReturnListType); - subscriptionReturnType = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getSubscriptionReturnType); + subscriptionReturnType = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getSubscriptionReturnType); generateBuilder = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateBuilder); - generateEqualsAndHashCode = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateEqualsAndHashCode); - generateImmutableModels = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateImmutableModels); + generateEqualsAndHashCode = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateEqualsAndHashCode); + generateImmutableModels = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateImmutableModels); generateToString = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateToString); - generateParameterizedFieldsResolvers = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateParameterizedFieldsResolvers); - generateExtensionFieldsResolvers = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateExtensionFieldsResolvers); - generateDataFetchingEnvironmentArgumentInApis = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateDataFetchingEnvironmentArgumentInApis); - generateModelsForRootTypes = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateModelsForRootTypes); - useOptionalForNullableReturnTypes = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getUseOptionalForNullableReturnTypes); - generateApisWithThrowsException = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateApisWithThrowsException); - addGeneratedAnnotation = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getAddGeneratedAnnotation); + generateParameterizedFieldsResolvers = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateParameterizedFieldsResolvers); + generateExtensionFieldsResolvers = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateExtensionFieldsResolvers); + generateDataFetchingEnvironmentArgumentInApis = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateDataFetchingEnvironmentArgumentInApis); + generateModelsForRootTypes = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateModelsForRootTypes); + useOptionalForNullableReturnTypes = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getUseOptionalForNullableReturnTypes); + generateApisWithThrowsException = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateApisWithThrowsException); + addGeneratedAnnotation = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getAddGeneratedAnnotation); relayConfig = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getRelayConfig); - queryResolverParentInterface = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getQueryResolverParentInterface); - mutationResolverParentInterface = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getMutationResolverParentInterface); - subscriptionResolverParentInterface = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getSubscriptionResolverParentInterface); - resolverParentInterface = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getResolverParentInterface); + queryResolverParentInterface = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getQueryResolverParentInterface); + mutationResolverParentInterface = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getMutationResolverParentInterface); + subscriptionResolverParentInterface = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getSubscriptionResolverParentInterface); + resolverParentInterface = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getResolverParentInterface); generateClient = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateClient); requestSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getRequestSuffix); responseSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getResponseSuffix); - responseProjectionSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getResponseProjectionSuffix); - parametrizedInputSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getParametrizedInputSuffix); + responseProjectionSuffix = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getResponseProjectionSuffix); + parametrizedInputSuffix = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getParametrizedInputSuffix); fieldsWithResolvers = combineSet(fieldsWithResolvers, source.fieldsWithResolvers); fieldsWithoutResolvers = combineSet(fieldsWithoutResolvers, source.fieldsWithoutResolvers); customTypesMapping = combineMap(customTypesMapping, source.customTypesMapping); customAnnotationsMapping = combineMap(customAnnotationsMapping, source.customAnnotationsMapping); directiveAnnotationsMapping = combineMap(directiveAnnotationsMapping, source.directiveAnnotationsMapping); - responseProjectionMaxDepth = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getResponseProjectionMaxDepth); - useObjectMapperForRequestSerialization = combineSet(useObjectMapperForRequestSerialization, source.useObjectMapperForRequestSerialization); + responseProjectionMaxDepth = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getResponseProjectionMaxDepth); + useObjectMapperForRequestSerialization = combineSet(useObjectMapperForRequestSerialization, + source.useObjectMapperForRequestSerialization); generatedLanguage = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGeneratedLanguage); - generateModelOpenClasses = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::isGenerateModelOpenClasses); + generateModelOpenClasses = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::isGenerateModelOpenClasses); } private T getValueOrDefaultToThis(MappingConfig source, Function getValueFunction) { @@ -414,7 +435,8 @@ public Boolean getGenerateDataFetchingEnvironmentArgumentInApis() { return generateDataFetchingEnvironmentArgumentInApis; } - public void setGenerateDataFetchingEnvironmentArgumentInApis(Boolean generateDataFetchingEnvironmentArgumentInApis) { + public void setGenerateDataFetchingEnvironmentArgumentInApis( + Boolean generateDataFetchingEnvironmentArgumentInApis) { this.generateDataFetchingEnvironmentArgumentInApis = generateDataFetchingEnvironmentArgumentInApis; } 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 46a73963f..b971e9986 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Various constants used in code generation process + */ public class MappingConfigConstants { public static final String DEFAULT_VALIDATION_ANNOTATION = "javax.validation.constraints.NotNull"; @@ -30,9 +33,11 @@ public class MappingConfigConstants { 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 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 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 99d200f0c..2103de6cc 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -2,7 +2,11 @@ import com.kobylynskyi.graphql.codegen.mapper.DataModelMapper; import com.kobylynskyi.graphql.codegen.mapper.DataModelMapperFactory; -import com.kobylynskyi.graphql.codegen.model.definitions.*; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedDefinition; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedDocument; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedEnumTypeDefinition; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedFieldDefinition; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedInterfaceTypeDefinition; import java.util.HashMap; import java.util.List; @@ -10,6 +14,10 @@ import java.util.Set; import java.util.stream.Collectors; +/** + * A context of a single mapping process. + * Contains mapping configuration, parsed schema elements and other things used in code generation process + */ public class MappingContext implements GraphQLCodegenConfiguration { private final MappingConfig config; @@ -18,9 +26,9 @@ public class MappingContext implements GraphQLCodegenConfiguration { private final Set interfacesName; private final Map> interfaceChildren; private final GeneratedInformation generatedInformation; + private final DataModelMapperFactory dataModelMapperFactory; private Set enumImportItSelfInScala = null; private Map> parentInterfaceProperties = null; - private final DataModelMapperFactory dataModelMapperFactory; public MappingContext(MappingConfig mappingConfig, ExtendedDocument document, @@ -292,22 +300,31 @@ public GeneratedInformation getGeneratedInformation() { public Set getEnumImportItSelfInScala() { // Only for scala if (GeneratedLanguage.SCALA.equals(this.config.getGeneratedLanguage()) && enumImportItSelfInScala == null) { - enumImportItSelfInScala = this.document.getEnumDefinitions().stream().map(this::getModelClassNameWithPrefixAndSuffix).collect(Collectors.toSet()); + enumImportItSelfInScala = this.document.getEnumDefinitions().stream() + .map(this::getModelClassNameWithPrefixAndSuffix) + .collect(Collectors.toSet()); } return enumImportItSelfInScala; } + /** + * Get a list of fields for each interface + * This method is used only for Scala and Kotlin + * + * @return a map of interface name to a list of fields + */ public Map> getParentInterfaceProperties() { // In this way, we no longer need to rely on the order in which files are created // Only for scala/kotlin if ((GeneratedLanguage.SCALA.equals(this.config.getGeneratedLanguage()) || - GeneratedLanguage.KOTLIN.equals(this.config.getGeneratedLanguage())) - && parentInterfaceProperties == null) { + GeneratedLanguage.KOTLIN.equals(this.config.getGeneratedLanguage())) && + parentInterfaceProperties == null) { parentInterfaceProperties = new HashMap<>(); - for (ExtendedInterfaceTypeDefinition extendedInterfaceTypeDefinition : this.document.getInterfaceDefinitions()) { - String clazzName = getModelClassNameWithPrefixAndSuffix(extendedInterfaceTypeDefinition); - Set fields = getFields(extendedInterfaceTypeDefinition.getFieldDefinitions(), - extendedInterfaceTypeDefinition).stream().map(ParameterDefinition::getName).collect(Collectors.toSet()); + for (ExtendedInterfaceTypeDefinition interfaceDef : this.document.getInterfaceDefinitions()) { + String clazzName = getModelClassNameWithPrefixAndSuffix(interfaceDef); + Set fields = getFields(interfaceDef.getFieldDefinitions(), interfaceDef).stream() + .map(ParameterDefinition::getName) + .collect(Collectors.toSet()); if (parentInterfaceProperties.containsKey(clazzName)) { parentInterfaceProperties.get(clazzName).addAll(fields); } else { @@ -323,11 +340,14 @@ private String getModelClassNameWithPrefixAndSuffix(ExtendedEnumTypeDefinition e } private String getModelClassNameWithPrefixAndSuffix(ExtendedDefinition extendedDefinition) { - return this.dataModelMapperFactory.getDataModelMapper().getModelClassNameWithPrefixAndSuffix(this, extendedDefinition); + return this.dataModelMapperFactory.getDataModelMapper() + .getModelClassNameWithPrefixAndSuffix(this, extendedDefinition); } - private List getFields(List fieldDefinitions, ExtendedDefinition parentDefinition) { - return this.dataModelMapperFactory.getFieldDefinitionToParameterMapper().mapFields(this, fieldDefinitions, parentDefinition); + private List getFields(List fieldDefinitions, + ExtendedDefinition parentDefinition) { + return this.dataModelMapperFactory.getFieldDefToParamMapper() + .mapFields(this, fieldDefinitions, parentDefinition); } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java index 1a4a994b3..9e9a38126 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java @@ -17,6 +17,13 @@ public class MultiLanguageDeprecated { private MultiLanguageDeprecated() { } + /** + * Get a definition of @deprecated annotation for a specified language. + * + * @param generatedLanguage Language of code generation + * @param directive GraphQL @deprecated directive + * @return a definition of a deprecation having reason and annotation + */ public static DeprecatedDefinition getLanguageDeprecated(GeneratedLanguage generatedLanguage, Directive directive) { String msg = null; if (directive.getArguments().stream().anyMatch(argument -> argument.getName().equals(REASON))) { 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 0c05aa274..ab8658dde 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Class describes a specific GraphQL type converted to a specific JVM language + */ public class NamedDefinition { private String javaName; 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 bce282e3e..98d4a5290 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java @@ -117,11 +117,11 @@ public void setSerializeUsingObjectMapper(boolean serializeUsingObjectMapper) { this.serializeUsingObjectMapper = serializeUsingObjectMapper; } - public void setDefinitionInParentType(ParameterDefinition definitionInParentType) { - this.definitionInParentType = definitionInParentType; - } - public ParameterDefinition getDefinitionInParentType() { return definitionInParentType; } + + public void setDefinitionInParentType(ParameterDefinition definitionInParentType) { + this.definitionInParentType = definitionInParentType; + } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/RelayConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/RelayConfig.java index 210c280a2..d386c5274 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/RelayConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/RelayConfig.java @@ -2,6 +2,9 @@ import java.io.Serializable; +/** + * Relay-related configurations + */ public class RelayConfig implements Serializable { // Increment this when the serialization output changes diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java index 5a0bbb966..d04de0352 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java @@ -53,6 +53,11 @@ public List getJavaDoc() { return javaDocFromDescription; } + /** + * Get java doc from description for this definition + * + * @return List of java docs + */ public List getJavaDocFromDescription() { List descriptions = new ArrayList<>(); if (this.definition instanceof AbstractDescribedNode) { @@ -70,6 +75,11 @@ public List getJavaDocFromDescription() { return descriptions; } + /** + * Get java doc from description for this definition + * + * @return List of java docs + */ public List getJavaDocFromComments() { List comments = new ArrayList<>(); if (definition != null && definition.getComments() != null) { @@ -85,6 +95,11 @@ public List getJavaDocFromComments() { return comments; } + /** + * Return all directives for this definition + * + * @return list of directive names + */ public List getDirectiveNames() { List directives = new ArrayList<>(); if (this.definition instanceof DirectivesContainer) { 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 0272eb8ba..f8e089dca 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 @@ -40,6 +40,11 @@ public ExtendedDocument(Collection operationDefini this.unionDefinitions = unionDefinitions; } + /** + * Get a joint list of names of all types, unions and interfaces + * + * @return Set containing all type names, union names, interface names + */ public Set getTypesUnionsInterfacesNames() { Set typesUnionsInterfaces = new LinkedHashSet<>(); typeDefinitions.stream() @@ -54,6 +59,11 @@ public Set getTypesUnionsInterfacesNames() { return typesUnionsInterfaces; } + /** + * Construct a map having interface name as a key and all children (that are extending this interface) as a value + * + * @return a map of interface name to all its children + */ public Map> getInterfaceChildren() { Map> interfaceChildren = new HashMap<>(); for (ExtendedObjectTypeDefinition typeDefinition : typeDefinitions) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java index 461176200..d8facbc8e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java @@ -7,6 +7,9 @@ import java.util.ArrayList; import java.util.List; +/** + * Extended definition of GraphQL enum type: based definition + its extensions + */ public class ExtendedEnumTypeDefinition extends ExtendedDefinition { /** diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedFieldDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedFieldDefinition.java index cd83ea197..e349e6f78 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedFieldDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedFieldDefinition.java @@ -31,10 +31,16 @@ public DeprecatedDefinition getDeprecated(MappingContext mappingContext) { .stream() .filter(d -> d.getName().equalsIgnoreCase(Deprecated.class.getSimpleName())) .findFirst() - .map(directive -> MultiLanguageDeprecated.getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive)) + .map(directive -> MultiLanguageDeprecated + .getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive)) .orElse(null); } + /** + * Get java doc of GraphQL field + * + * @return a list of Java docs for this GraphQL field + */ public List getJavaDoc() { Description description = getDescription(); if (description != null && Utils.isNotBlank(description.getContent())) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedImplementingTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedImplementingTypeDefinition.java index 7b4a7dae3..fb9a69dc2 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedImplementingTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedImplementingTypeDefinition.java @@ -12,7 +12,8 @@ * @param base type * @param extension type */ -public abstract class ExtendedImplementingTypeDefinition, E extends T> extends ExtendedDefinition { +public abstract class ExtendedImplementingTypeDefinition, E extends T> + extends ExtendedDefinition { @SuppressWarnings({"rawtypes", "java:S3740"}) public List getImplements() { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java index 2bc341de6..8228c6c04 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java @@ -7,7 +7,11 @@ import java.util.ArrayList; import java.util.List; -public class ExtendedInputObjectTypeDefinition extends ExtendedDefinition { +/** + * Extended definition of GraphQL input type: based definition + its extensions + */ +public class ExtendedInputObjectTypeDefinition + extends ExtendedDefinition { public List getValueDefinitions() { List definitions = new ArrayList<>(); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java index 26501dba6..27e893ce2 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java @@ -7,8 +7,17 @@ import java.util.Collection; import java.util.List; -public class ExtendedInterfaceTypeDefinition extends ExtendedImplementingTypeDefinition { +/** + * Extended definition of GraphQL interface type: based definition + its extensions + */ +public class ExtendedInterfaceTypeDefinition + extends ExtendedImplementingTypeDefinition { + /** + * Get fields with extended information of the given interface + * + * @return List of field definitions + */ public List getFieldDefinitions() { List definitions = new ArrayList<>(); if (definition != null) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java index 735e3f52f..81d5af051 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java @@ -12,7 +12,11 @@ import java.util.Map; import java.util.function.Function; -public class ExtendedObjectTypeDefinition extends ExtendedImplementingTypeDefinition { +/** + * Extended definition of GraphQL object type: based definition + its extensions + */ +public class ExtendedObjectTypeDefinition + extends ExtendedImplementingTypeDefinition { /** * Get source location of the node. @@ -24,6 +28,11 @@ private static String getSourceLocationName(Node node) { return node.getSourceLocation() != null ? node.getSourceLocation().getSourceName() : "unknown"; } + /** + * Get fields with extended information of the given object + * + * @return List of field definitions + */ public List getFieldDefinitions() { List definitions = new ArrayList<>(); if (definition != null) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedScalarTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedScalarTypeDefinition.java index 9ae6395ef..acf380961 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedScalarTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedScalarTypeDefinition.java @@ -3,6 +3,10 @@ import graphql.language.ScalarTypeDefinition; import graphql.language.ScalarTypeExtensionDefinition; -public class ExtendedScalarTypeDefinition extends ExtendedDefinition { +/** + * Extended definition of GraphQL scalar type: based definition + its extensions + */ +public class ExtendedScalarTypeDefinition + extends ExtendedDefinition { } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java index e49f3c084..dd521955f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java @@ -8,6 +8,9 @@ import java.util.HashSet; import java.util.Set; +/** + * Extended definition of GraphQL union type: based definition + its extensions + */ public class ExtendedUnionTypeDefinition extends ExtendedDefinition { private Set memberTypeNames; @@ -16,7 +19,8 @@ public class ExtendedUnionTypeDefinition extends ExtendedDefinitiontrue if definition is a part of union. falseif definition is a part of union. + * @return true if definition is a part of union. falseif + * definition is a part of union. */ public boolean isDefinitionPartOfUnion(ExtendedDefinition definition) { return getMemberTypeNames().contains(definition.getName()); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/exception/LanguageNotSupportedException.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/exception/LanguageNotSupportedException.java index 063a6220c..d93ecc19a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/exception/LanguageNotSupportedException.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/exception/LanguageNotSupportedException.java @@ -2,6 +2,9 @@ import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; +/** + * Eception is thrown when specified language is not supportted by GraphQL Code generator + */ public class LanguageNotSupportedException extends IllegalArgumentException { public LanguageNotSupportedException(GeneratedLanguage generatedLanguage) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLError.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLError.java index 016ec25db..30c6dfb0c 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLError.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLError.java @@ -4,6 +4,9 @@ import java.util.Map; import java.util.Objects; +/** + * A class describing GraphQL error + */ public class GraphQLError { private String message; @@ -66,8 +69,12 @@ public void setExtensions(Map extensions) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } GraphQLError that = (GraphQLError) o; return Objects.equals(message, that.message) && Objects.equals(locations, that.locations) && diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorSourceLocation.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorSourceLocation.java index 6f0c77316..05d9c89d5 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorSourceLocation.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorSourceLocation.java @@ -2,6 +2,9 @@ import java.util.Objects; +/** + * Source location of GraphQL error in the schema + */ public class GraphQLErrorSourceLocation { private int line; @@ -43,8 +46,12 @@ public void setSourceName(String sourceName) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } GraphQLErrorSourceLocation that = (GraphQLErrorSourceLocation) o; return line == that.line && column == that.column && diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorType.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorType.java index eccf6a31c..999478b06 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorType.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorType.java @@ -1,6 +1,10 @@ package com.kobylynskyi.graphql.codegen.model.graphql; -@SuppressWarnings({"java:S115"}) // comes from graphql-java library +/** + * Possible types of GraphQL errors + * Copied from graphql-java library + */ +@SuppressWarnings({"java:S115"}) public enum GraphQLErrorType { InvalidSyntax, ValidationError, diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperation.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperation.java index d3d90890c..b03bc82f6 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperation.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperation.java @@ -1,7 +1,12 @@ package com.kobylynskyi.graphql.codegen.model.graphql; +/** + * GraphQL operations + */ public enum GraphQLOperation { - QUERY, MUTATION, SUBSCRIPTION + QUERY, + MUTATION, + SUBSCRIPTION } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperationRequest.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperationRequest.java index 80ea5ffd1..4a2a72830 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperationRequest.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperationRequest.java @@ -43,12 +43,12 @@ public interface GraphQLOperationRequest { /** * Fields that require serialization using * {@link com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)} - *

          - * Values should be defined here in format: GraphqlObjectName.fieldName or GraphqlTypeName - *

          - * If just type is specified, then all fields of this type will be serialized using ObjectMapper. - *

          - * E.g.: + * + *

          Values should be defined here in format: GraphqlObjectName.fieldName or GraphqlTypeName + * + *

          If just type is specified, then all fields of this type will be serialized using ObjectMapper. + * + *

          E.g.: *

            *
          • {@code Person.createdDateTime}
          • *
          • {@code ZonedDateTime}
          • diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializer.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializer.java index 275cace1a..151517a7a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializer.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializer.java @@ -12,6 +12,10 @@ import java.util.Set; import java.util.StringJoiner; +/** + * Serializer of GraphQL request. + * Provides ability to convert GraphQLRequest object to HTTP Json body, as well as to raw query string. + */ public class GraphQLRequestSerializer { public static final ObjectMapper OBJECT_MAPPER = Utils.OBJECT_MAPPER; @@ -37,7 +41,8 @@ public static String toHttpJsonBody(GraphQLRequests graphQLRequests) { throw new IllegalArgumentException("Null GraphQL request was supplied"); } if (operation != null && operation != request.getRequest().getOperationType()) { - throw new IllegalArgumentException("Only operations of the same type (query/mutation/subscription) can be executed at once"); + throw new IllegalArgumentException( + "Only operations of the same type (query/mutation/subscription) can be executed at once"); } queryBuilder.append(buildQuery(request)).append(" "); } @@ -130,6 +135,14 @@ public static String getEntry(Object input) { return getEntry(input, false); } + /** + * Serialize object to a string + * + * @param input can be any object or collection of objects. + * @param useObjectMapper if true, then use Jackson's ObjectMapper to convert from object to string, + * otherwise use toString + * @return serialized object + */ @SuppressWarnings("java:S1872") public static String getEntry(Object input, boolean useObjectMapper) { if (input == null) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponse.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponse.java index 4fbde6e3d..5fa4f064f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponse.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponse.java @@ -2,6 +2,9 @@ import java.util.Map; +/** + * Generic class having content of GraphQL response + */ public class GraphQLResponse extends GraphQLResult> { public GraphQLResponse() { 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 a823a8b26..7ee5f530b 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 @@ -29,13 +29,20 @@ public abstract class GraphQLResponseProjection { * } * }} * Map Notes: - * `key` is parentProjection.childProjection.currentMethod. e.g. `CharacterResponseProjection.CharacterResponseProjection.friends` (excluding the first layer, so if only want the first child layer, use `all$(1)`) - * `value` is current depth for Character type. Each projection has a new instance of `projectionDepthOnFields`, so it always be `1` or `0`. + * `key` is parentProjection.childProjection.currentMethod. e.g. `CharacterResponseProjection + * .CharacterResponseProjection.friends` (excluding the first layer, so if only want the first child layer, use + * `all$(1)`) + * `value` is current depth for Character type. Each projection has a new instance of `projectionDepthOnFields`, + * so it always be `1` or `0`. * and `responseProjectionMaxDepth` will reduce by recursive. */ protected final Map projectionDepthOnFields = new HashMap<>(); - //Defined at the parent level to use dynamic calls, default null. + /** + * Defined at the parent level to use dynamic calls, default null. + * + * @return projection of all fields that are present in the given type + */ public abstract GraphQLResponseProjection all$(); public abstract GraphQLResponseProjection all$(int maxDepth); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/UnableToBuildJsonQueryException.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/UnableToBuildJsonQueryException.java index a181e6ec3..7295bca9b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/UnableToBuildJsonQueryException.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/UnableToBuildJsonQueryException.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model.graphql; +/** + * Exception is thrown when it is unable to serialize GraphQL request to a string + */ public class UnableToBuildJsonQueryException extends IllegalArgumentException { public UnableToBuildJsonQueryException(Exception e) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaDataModelMapper.java index 2fef593ca..4fead00b8 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaDataModelMapper.java @@ -10,6 +10,9 @@ import static com.kobylynskyi.graphql.codegen.utils.Utils.wrapString; +/** + * Data model mapper for SCALA generated classes + */ public class ScalaDataModelMapper implements DataModelMapper { private static final String RESTRICTED_WORDS_WRAP_WITH = "`"; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java index ad0680d4b..10d62b60f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java @@ -12,24 +12,34 @@ import java.util.Collection; import java.util.List; +/** + * Class having only Scala-specific methods for code-generation + * Most of the logic is still residing in the parent class + */ public class ScalaGraphQLCodegen extends GraphQLCodegen { private static final MapperFactory MAPPER_FACTORY = new ScalaMapperFactoryImpl(); - public ScalaGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public ScalaGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(schemas, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public ScalaGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public ScalaGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(introspectionResult, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public ScalaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { + public ScalaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, MAPPER_FACTORY); } - public ScalaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, GeneratedInformation generatedInformation) { - super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, generatedInformation, MAPPER_FACTORY); + public ScalaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, + GeneratedInformation generatedInformation) { + super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, + generatedInformation, MAPPER_FACTORY); } @Override @@ -56,9 +66,11 @@ protected void initCustomTypeMappings(Collection s mappingConfig.putCustomTypeMappingIfAbsent("String", String.class.getSimpleName()); mappingConfig.putCustomTypeMappingIfAbsent("Int", "Option[Int]"); mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); - mappingConfig.putCustomTypeMappingIfAbsent("Float", Utils.wrapString(Double.class.getSimpleName(), "Option[", "]")); + mappingConfig.putCustomTypeMappingIfAbsent("Float", + Utils.wrapString(Double.class.getSimpleName(), "Option[", "]")); mappingConfig.putCustomTypeMappingIfAbsent("Float!", Double.class.getSimpleName()); - mappingConfig.putCustomTypeMappingIfAbsent("Boolean", Utils.wrapString(Boolean.class.getSimpleName(), "Option[", "]")); + mappingConfig.putCustomTypeMappingIfAbsent("Boolean", + Utils.wrapString(Boolean.class.getSimpleName(), "Option[", "]")); mappingConfig.putCustomTypeMappingIfAbsent("Boolean!", Boolean.class.getSimpleName()); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java index fddc86f05..40b72cfa9 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java @@ -13,6 +13,9 @@ import static com.kobylynskyi.graphql.codegen.java.JavaGraphQLTypeMapper.JAVA_UTIL_LIST; import static java.util.Arrays.asList; +/** + * Mapper class for converting GraphQL types to Scala types + */ public class ScalaGraphQLTypeMapper implements GraphQLTypeMapper { private static final String SCALA_UTIL_LIST = "Seq"; @@ -63,7 +66,8 @@ public String wrapApiReturnTypeIfRequired(MappingContext mappingContext, && !namedDefinition.isMandatory() && !computedTypeName.startsWith(SCALA_UTIL_LIST) && !computedTypeName.startsWith(JAVA_UTIL_LIST) - && !computedTypeName.startsWith(SCALA_UTIL_OPTIONAL)) {// The primitive types is Option by default + && !computedTypeName.startsWith(SCALA_UTIL_OPTIONAL)) { + // Kotlin/Scala: primitive types is Option by default // wrap the type into scala.Option (except java list and scala list) computedTypeName = getGenericsString(mappingContext, SCALA_UTIL_OPTIONAL, computedTypeName); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaMapperFactoryImpl.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaMapperFactoryImpl.java index 619eb5392..ae79cb8e0 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaMapperFactoryImpl.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaMapperFactoryImpl.java @@ -6,6 +6,9 @@ import com.kobylynskyi.graphql.codegen.mapper.ValueFormatter; import com.kobylynskyi.graphql.codegen.mapper.ValueMapper; +/** + * A factory of various mappers for Scala language + */ public class ScalaMapperFactoryImpl implements MapperFactory { @Override diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java index 35743a0f4..df031b3a8 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java @@ -4,6 +4,9 @@ import java.util.StringJoiner; +/** + * Class contains various formatting logic that is specific only for Scala language + */ public class ScalaValueFormatter implements ValueFormatter { @Override 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 b9d12fb19..f369876ea 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java @@ -40,17 +40,23 @@ public static boolean isGraphqlOperation(String typeDef) { /** * Capitalize a string. Make first letter as capital * - * @param aString string to capitalize + * @param stringToCapitalize string to capitalize * @return capitalized string */ - public static String capitalize(String aString) { - char[] chars = aString.toCharArray(); + public static String capitalize(String stringToCapitalize) { + char[] chars = stringToCapitalize.toCharArray(); chars[0] = Character.toUpperCase(chars[0]); return new String(chars); } - public static String capitalizeString(String aString) { - char[] chars = aString.toLowerCase().toCharArray(); + /** + * Make a string as CamelCase + * + * @param stringToCamelCase string to convert to CamelCase + * @return CamelCasedString + */ + public static String camelCaseString(String stringToCamelCase) { + char[] chars = stringToCamelCase.toLowerCase().toCharArray(); boolean found = false; for (int i = 0; i < chars.length; i++) { if (!found && Character.isLetter(chars[i])) { @@ -64,13 +70,13 @@ public static String capitalizeString(String aString) { } /** - * Uncapitalize a string. Make first letter as lowercase + * Un-capitalize a string. Make first letter as lowercase * - * @param aString string to uncapitalize + * @param stringToUncapitalize string to un-capitalize * @return uncapitalized string */ - public static String uncapitalize(String aString) { - char[] chars = aString.toCharArray(); + public static String unCapitalize(String stringToUncapitalize) { + char[] chars = stringToUncapitalize.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); } @@ -208,8 +214,8 @@ public static String replaceLeadingAtSign(String value) { /** * Copy of org.apache.commons.lang3.StringUtils#substringBetween(String, String, String) - *

            - * Gets the String that is nested in between two Strings. + * + *

            Gets the String that is nested in between two Strings. * Only the first match is returned. * * @param str the String containing the substring, may be null diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java index 07e5ba48c..0e916b6e5 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java @@ -41,16 +41,19 @@ void cleanup() { @Test void generate_CustomAnnotationMappings() throws Exception { - mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("Event.createdDateTime", "org.joda.time.DateTime"))); + mappingConfig.setCustomTypesMapping(new HashMap<>( + singletonMap("Event.createdDateTime", "org.joda.time.DateTime"))); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime", - singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)")))); + 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(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)" + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); } @@ -58,14 +61,16 @@ void generate_CustomAnnotationMappings() throws Exception { void generate_CustomAnnotationMappings_Type() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime"))); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("DateTime", - singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)")))); + 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(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)" + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); } @@ -73,14 +78,16 @@ void generate_CustomAnnotationMappings_Type() throws Exception { void generate_CustomAnnotationMappings_FieldType() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime"))); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime", - singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)")))); + 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(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)" + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); } @@ -88,15 +95,25 @@ void generate_CustomAnnotationMappings_FieldType() throws Exception { void generate_CustomAnnotationMappings_Class() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // input - customAnnotationsMapping.put("AcceptTopicSuggestionInput", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AcceptTopicSuggestionInputDeserializer.class)")); + customAnnotationsMapping.put("AcceptTopicSuggestionInput", + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AcceptTopicSuggestionInputDeserializer.class)")); // type - customAnnotationsMapping.put("AcceptTopicSuggestionPayload", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AcceptTopicSuggestionPayloadDeserializer.class)")); + customAnnotationsMapping.put("AcceptTopicSuggestionPayload", + singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AcceptTopicSuggestionPayloadDeserializer.class)")); // interface - customAnnotationsMapping.put("Actor", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ActorDeserializer.class)")); + customAnnotationsMapping.put("Actor", + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = ActorDeserializer.class)")); // union - customAnnotationsMapping.put("Assignee", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AssigneeDeserializer.class)")); + customAnnotationsMapping.put("Assignee", + singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AssigneeDeserializer.class)")); // enum - customAnnotationsMapping.put("DeploymentOrderField", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = DeploymentOrderFieldDeserializer.class)")); + customAnnotationsMapping.put("DeploymentOrderField", + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = DeploymentOrderFieldDeserializer.class)")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), @@ -104,19 +121,24 @@ 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)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AcceptTopicSuggestionInputDeserializer.class)" + System.lineSeparator() + "public class AcceptTopicSuggestionInput "); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AcceptTopicSuggestionPayloadDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AcceptTopicSuggestionPayloadDeserializer.class)" + System.lineSeparator() + "public class AcceptTopicSuggestionPayload "); assertFileContainsElements(files, "Actor.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ActorDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = ActorDeserializer.class)" + System.lineSeparator() + "public interface Actor "); assertFileContainsElements(files, "Assignee.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AssigneeDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AssigneeDeserializer.class)" + System.lineSeparator() + "public interface Assignee "); assertFileContainsElements(files, "DeploymentOrderField.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = DeploymentOrderFieldDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = DeploymentOrderFieldDeserializer.class)" + System.lineSeparator() + "public enum DeploymentOrderField "); } @@ -125,8 +147,11 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // type customAnnotationsMapping.put("AcceptTopicSuggestionPayload", Arrays.asList( - "@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)")); + "@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)")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), @@ -134,9 +159,11 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { 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\")" + "@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)" + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(" + + "io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver.class)" + System.lineSeparator() + "public class AcceptTopicSuggestionPayload "); } @@ -145,9 +172,13 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // request - customAnnotationsMapping.put("CodeOfConductQueryRequest", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CodeOfConductQueryRequestDeserializer.class)")); + customAnnotationsMapping.put("CodeOfConductQueryRequest", + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = CodeOfConductQueryRequestDeserializer.class)")); // response - customAnnotationsMapping.put("CodeOfConductQueryResponse", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CodeOfConductQueryResponseDeserializer.class)")); + customAnnotationsMapping.put("CodeOfConductQueryResponse", + singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = CodeOfConductQueryResponseDeserializer.class)")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); mappingConfig.setGenerateClient(true); @@ -156,18 +187,27 @@ 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)" + + System.lineSeparator() + + "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)" + + System.lineSeparator() + + "public class CodeOfConductQueryResponse extends GraphQLResult> {"); } @Test void generate_Directives() throws Exception { Map> directiveAnnotationsMapping = new HashMap<>(); directiveAnnotationsMapping.put("auth", - singletonList("@com.example.CustomAnnotation(roles={{roles?toArray}}, boo={{boo?toArray}}, float={{float?toArrayOfStrings}}, int={{int}}, n={{n?toString}})")); + singletonList("@com.example.CustomAnnotation(" + + "roles={{roles?toArray}}, " + + "boo={{boo?toArray}}, " + + "float={{float?toArrayOfStrings}}, " + + "int={{int}}, " + + "n={{n?toString}})")); mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java index 78c5b080d..371ffe5f4 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java @@ -44,7 +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()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -57,7 +58,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()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -70,7 +72,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()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -84,13 +87,15 @@ 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()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .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")), generatedFileNames); + "SubProj1QueryResolver.java", "SubProj2QueryResolver.java")), + generatedFileNames); } @Test @@ -98,13 +103,15 @@ 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()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .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")), generatedFileNames); + "SubSchema1QueryResolver.java", "SubSchema2QueryResolver.java")), + generatedFileNames); } @Test @@ -115,7 +122,8 @@ void generate_InterfacePerSchemaAndConstantPrefix() throws IOException { GeneratedInformation generatedInformation = TestUtils.getStaticGeneratedInfo(); List schemas = schemaFinder.findSchemas(); Assertions.assertThrows(IllegalArgumentException.class, - () -> new JavaGraphQLCodegen(schemas, outputBuildDir, mappingConfig, generatedInformation)); + () -> new JavaGraphQLCodegen(schemas, outputBuildDir, mappingConfig, + generatedInformation)); } @Test @@ -123,7 +131,8 @@ void generate_DoNotGenerateApiInterfaceForOperations() throws IOException { schemaFinder.setIncludePattern("test.*\\.graphqls"); mappingConfig.setApiInterfaceStrategy(ApiInterfaceStrategy.DO_NOT_GENERATE); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -138,7 +147,8 @@ void generate_DoNotGenerateRootApiInterfaces() throws IOException { schemaFinder.setIncludePattern("test.*\\.graphqls"); mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.DO_NOT_GENERATE); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -154,16 +164,17 @@ void generate_WithoutThrowsException() throws IOException { schemaFinder.setIncludePattern("github.*\\.graphqls"); mappingConfig.setGenerateApisWithThrowsException(false); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent( - new File("src/test/resources/expected-classes/apis/CodeOfConductQueryResolver_withoutThrowsException.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/apis/" + + "CodeOfConductQueryResolver_withoutThrowsException.java.txt"), getFileByName(files, "CodeOfConductQueryResolver.java")); - assertSameTrimmedContent( - new File("src/test/resources/expected-classes/apis/MutationResolver_withoutThrowsException.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/apis/" + + "MutationResolver_withoutThrowsException.java.txt"), getFileByName(files, "MutationResolver.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java index 535838eee..d64c706ac 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java @@ -14,6 +14,7 @@ import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; +import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static java.util.stream.Collectors.toList; @@ -43,7 +44,7 @@ void generate_CheckFiles() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("InputWithDefaults.java", "MyEnum.java", "SomeObject.java"), generatedFileNames); + assertEquals(asList("InputWithDefaults.java", "MyEnum.java", "SomeObject.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", @@ -61,7 +62,7 @@ void generate_CheckFiles_WithPrefixSuffix() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("InputWithDefaultsTO.java", "MyEnumTO.java", "SomeObjectTO.java"), generatedFileNames); + assertEquals(asList("InputWithDefaultsTO.java", "MyEnumTO.java", "SomeObjectTO.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", @@ -78,7 +79,7 @@ void generate_CheckFiles_OnLongDefault() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("InputWithDefaultsDTO.java", "MyEnumDTO.java", "SomeObjectDTO.java"), generatedFileNames); + 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", diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java index 4197047ad..02866ace9 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java @@ -40,7 +40,8 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -59,7 +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(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java index 35249188a..5a64dd72e 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java @@ -40,7 +40,8 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -60,18 +61,22 @@ 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(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); assertEquals(new HashSet<>(asList("SubscriptionResolver.java", "UserQueryResolver.java", "User.java", - "UsersCreatedSubscriptionResolver.java", "CreateUserMutationResolver.java", "MutationResolver.java", "QueryResolver.java", - "UserInput.java")), Arrays.stream(Objects.requireNonNull(outputJavaClassesDir.listFiles())) - .map(File::getName).collect(toSet())); + "UsersCreatedSubscriptionResolver.java", "CreateUserMutationResolver.java", + "MutationResolver.java", "QueryResolver.java", + "UserInput.java")), + Arrays.stream(Objects.requireNonNull(outputJavaClassesDir.listFiles())) + .map(File::getName).collect(toSet())); } @Test void generateServerSideClasses_ExtensionFieldsResolvers() throws Exception { mappingConfig.setGenerateExtensionFieldsResolvers(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -84,7 +89,8 @@ void generateServerSideClasses_ExtensionFieldsResolvers() throws Exception { for (File file : files) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/extend-with-resolvers/%s.txt", file.getName())), + new File(String.format("src/test/resources/expected-classes/extend-with-resolvers/%s.txt", + file.getName())), file); } } @@ -93,7 +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(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -114,7 +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(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -130,7 +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(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExternalConfigTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExternalConfigTest.java index 0a75bc703..ad1ba9b77 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExternalConfigTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExternalConfigTest.java @@ -20,7 +20,8 @@ class GraphQLCodegenExternalConfigTest { */ @Test void check_mappingConfigFromJsonFile() { - MappingConfig externalMappingConfig = new JsonMappingConfigSupplier("src/test/resources/json/mappingconfig.json").get(); + MappingConfig externalMappingConfig = + new JsonMappingConfigSupplier("src/test/resources/json/mappingconfig.json").get(); assertEquals("com.kobylynskyi.graphql.testconfigjson", externalMappingConfig.getPackageName()); assertTrue(externalMappingConfig.getGenerateApis()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java index 19f1bed6f..da58c0f1e 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java @@ -38,7 +38,8 @@ void generate_ParametrizedFields() throws Exception { mappingConfig.setGenerateParameterizedFieldsResolvers(true); mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Commit.blame", - singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)")))); + 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(); @@ -60,7 +61,8 @@ void generate_ParametrizedFieldsInInterface() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "ProductLinkCodeParametrizedInput.java.txt"), getFileByName(files, "ProductLinkCodeParametrizedInput.java")); } @@ -76,9 +78,11 @@ void generate_CustomFieldsResolvers() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/GithubAcceptTopicSuggestionPayloadTO.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/" + + "GithubAcceptTopicSuggestionPayloadTO.java.txt"), getFileByName(files, "GithubAcceptTopicSuggestionPayloadTO.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/AcceptTopicSuggestionPayloadResolver.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/" + + "AcceptTopicSuggestionPayloadResolver.java.txt"), getFileByName(files, "AcceptTopicSuggestionPayloadResolver.java")); } @@ -112,7 +116,8 @@ void generate_FieldResolversViaDirective() throws Exception { assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/Event.java.txt"), getFileByName(files, "Event.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/EventPropertyResolver.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/" + + "EventPropertyResolver.java.txt"), getFileByName(files, "EventPropertyResolver.java")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/EventProperty.java.txt"), getFileByName(files, "EventProperty.java")); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java index 0e96a1e23..0eccacd44 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java @@ -36,8 +36,8 @@ void cleanup() { void generateFile() throws IOException { MappingConfig mappingConfig = new MappingConfig(); mappingConfig.setGeneratedLanguage(GeneratedLanguage.JAVA); - ExtendedDocument extendedDocument = GraphQLDocumentParser.getDocumentFromSchemas(mappingConfig, singletonList("src/test/resources/schemas/test.graphqls")); - MappingContext mappingContext = new MappingContext(mappingConfig, extendedDocument, new GeneratedInformation(), new DataModelMapperFactory(MAPPER_FACTORY)); + ExtendedDocument extendedDocument = GraphQLDocumentParser.getDocumentFromSchemas( + mappingConfig, singletonList("src/test/resources/schemas/test.graphqls")); Map dataModel = new HashMap<>(); dataModel.put(DataModelFields.CLASS_NAME, "Class1"); @@ -45,8 +45,12 @@ void generateFile() throws IOException { dataModel.put(DataModelFields.GENERATED_ANNOTATION, false); dataModel.put(DataModelFields.GENERATED_INFO, new GeneratedInformation()); + MappingContext mappingContext = new MappingContext(mappingConfig, extendedDocument, + new GeneratedInformation(), new DataModelMapperFactory(MAPPER_FACTORY)); + GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.ENUM, dataModel, OUTPUT_DIR); assertThrows(UnableToCreateFileException.class, - () -> GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.ENUM, dataModel, OUTPUT_DIR)); + () -> GraphQLCodegenFileCreator.generateFile( + mappingContext, FreeMarkerTemplateType.ENUM, dataModel, OUTPUT_DIR)); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java index 6d97318b3..5e6a70437 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java @@ -23,6 +23,10 @@ class GraphQLCodegenGitHubTest { private final File outputJavaClassesDir = 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); @@ -101,9 +105,12 @@ void generate_Client_ConditionalFragments() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/SearchResultItemConnectionResponseProjection.java.txt"), + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/response" + + "/SearchResultItemConnectionResponseProjection.java.txt"), getFileByName(files, "SearchResultItemConnectionResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt"), getFileByName(files, "SearchResultItemResponseProjection.java")); } @@ -122,8 +129,4 @@ void generate_NoPrimitives() throws Exception { getFileByName(files, "Commit.java")); } - private static String getFileContent(File[] files, String fileName) throws IOException { - return Utils.getFileContent(getFileByName(files, fileName).getPath()); - } - } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java index eb99c4acf..eecd2afc5 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java @@ -19,11 +19,10 @@ class GraphQLCodegenInterfacesTest { - private GraphQLCodegen generator; private final MappingConfig mappingConfig = new MappingConfig(); - private final File outputBuildDir = new File("build/generated"); private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/interfaces"); + private GraphQLCodegen generator; @BeforeEach void init() { @@ -43,7 +42,8 @@ void generate_CheckFiles() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("Bar.java", "Bar1.java", "BarBar.java", "Foo.java", "Foo1.java"), generatedFileNames); + assertEquals(Arrays.asList("Bar.java", "Bar1.java", "BarBar.java", "Foo.java", "Foo1.java"), + generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/interfaces/%s.txt", diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java index 93e109e2c..5872a05f6 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java @@ -76,7 +76,8 @@ private void checkGeneratedFiles() throws IOException { "ProductsQueryResponse.java", "QueryResolver.java", "StockStatus.java"), generatedFileNames); for (File file : files) { - File expected = new File(String.format("src/test/resources/expected-classes/from-introspection-result/%s.txt", file.getName())); + File expected = new File(String.format( + "src/test/resources/expected-classes/from-introspection-result/%s.txt", file.getName())); assertSameTrimmedContent(expected, file); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java index 6ced3f851..3f2f20f2b 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java @@ -20,11 +20,11 @@ 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 File outputBuildDir = new File("build/generated"); private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/rootmodels"); - public static final List SCHEMAS = singletonList("src/test/resources/schemas/test.graphqls"); @BeforeEach void init() { @@ -59,8 +59,8 @@ void generate_sameResolverSuffixes() { () -> new JavaGraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo), "Expected generate() to throw, but it didn't"); - assertEquals("Either disable APIs generation or set different Prefix/Suffix for API classes and type resolver classes", - thrown.getMessage()); + assertEquals("Either disable APIs generation or set different Prefix/Suffix for API classes and " + + "type resolver classes", thrown.getMessage()); } @Test diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java index b8f80850f..7a24c7ca6 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java @@ -35,8 +35,8 @@ void cleanup() { @Test void generate_Optional() throws Exception { schemaFinder.setIncludePattern("github.*\\.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) - .generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -63,13 +63,14 @@ 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(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); // node(id: ID!): Node - assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/NodeQueryResolver_mono.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/" + + "NodeQueryResolver_mono.java.txt"), getFileByName(files, "NodeQueryResolver.java")); } @@ -83,14 +84,16 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setGenerateEqualsAndHashCode(true); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) - .generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/InterfaceWithOptionalField.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/" + + "InterfaceWithOptionalField.java.txt"), getFileByName(files, "InterfaceWithOptionalField.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/TypeWithMandatoryField.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/" + + "TypeWithMandatoryField.java.txt"), getFileByName(files, "TypeWithMandatoryField.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java index afe2c5fee..29344841f 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java @@ -42,25 +42,32 @@ void generate_CheckFiles() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/QueryResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "QueryResolver.java.txt"), getFileByName(files, "QueryResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/MutationResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "MutationResolver.java.txt"), getFileByName(files, "MutationResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/SubscriptionResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "SubscriptionResolver.java.txt"), getFileByName(files, "SubscriptionResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/VersionQueryResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "VersionQueryResolver.java.txt"), getFileByName(files, "VersionQueryResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/CreateEventMutationResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "CreateEventMutationResolver.java.txt"), getFileByName(files, "CreateEventMutationResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/EventsCreatedSubscriptionResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "EventsCreatedSubscriptionResolver.java.txt"), getFileByName(files, "EventsCreatedSubscriptionResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/EventResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "EventResolver.java.txt"), getFileByName(files, "EventResolver.java")); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java index 6ead7c18c..7cc4826bc 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java @@ -41,7 +41,8 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -59,11 +60,13 @@ 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(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/relay/UsersQueryResolver_reactive.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/relay/UsersQueryResolver_reactive.java.txt"), getFileByName(files, "UsersQueryResolver.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java index 4051b22a7..a7cf49bd2 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java @@ -8,7 +8,6 @@ import org.junit.jupiter.api.Test; import java.io.File; -import java.util.Collections; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; @@ -48,19 +47,26 @@ void generate_RequestAndResponseProjections() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventResponseProjection.java.txt"), getFileByName(files, "EventResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyResponseProjection.java.txt"), getFileByName(files, "EventPropertyResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyParentParametrizedInput.java.txt"), getFileByName(files, "EventPropertyParentParametrizedInput.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyChildParametrizedInput.java.txt"), getFileByName(files, "EventPropertyChildParametrizedInput.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByCategoryAndStatusQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByCategoryAndStatusQueryRequest.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryRequest.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/VersionQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "VersionQueryRequest.java.txt"), getFileByName(files, "VersionQueryRequest.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByIdsQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByIdsQueryRequest.java.txt"), getFileByName(files, "EventsByIdsQueryRequest.java")); } @@ -72,11 +78,14 @@ void generate_WithModelSuffix() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventStatusTO.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventStatusTO.java.txt"), getFileByName(files, "EventStatusTO.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByCategoryAndStatusQueryRequest_withModelSuffix.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByCategoryAndStatusQueryRequest_withModelSuffix.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryRequest.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput_withModelSuffix.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyParentParametrizedInput_withModelSuffix.java.txt"), getFileByName(files, "EventPropertyParentParametrizedInput.java")); } @@ -87,7 +96,8 @@ void generate_PrimitivesInsideParametrizedInput() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ClientDataParametrizedInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "ClientDataParametrizedInput.java.txt"), getFileByName(files, "ClientDataParametrizedInput.java")); } @@ -98,10 +108,12 @@ void generate_RequestAndResponseProjections_github() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/CodeOfConductResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "CodeOfConductResponseProjection.java.txt"), getFileByName(files, "CodeOfConductResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/UpdateRepositoryMutationRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "UpdateRepositoryMutationRequest.java.txt"), getFileByName(files, "UpdateRepositoryMutationRequest.java")); } @@ -112,7 +124,8 @@ void generate_ToStringIsEnabledForInput() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/AcceptTopicSuggestionInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "AcceptTopicSuggestionInput.java.txt"), getFileByName(files, "AcceptTopicSuggestionInput.java")); } @@ -149,7 +162,8 @@ void generate_apiImportForModelClassesIfResolverIsPresent() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByCategoryAndStatusQueryRequest_withApiImport.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByCategoryAndStatusQueryRequest_withApiImport.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryRequest.java")); } @@ -163,7 +177,8 @@ void generate_apiImportForModelClassesIfResolversExtensions() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByCategoryAndStatusQueryRequest_withApiImport.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByCategoryAndStatusQueryRequest_withApiImport.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryRequest.java")); } @@ -174,10 +189,12 @@ void generate_QueriesWithSameName() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ProductsByCategoryIdAndStatusQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "ProductsByCategoryIdAndStatusQueryRequest.java.txt"), getFileByName(files, "ProductsByCategoryIdAndStatusQueryRequest.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ProductsByIdsQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "ProductsByIdsQueryRequest.java.txt"), getFileByName(files, "ProductsByIdsQueryRequest.java")); } @@ -189,7 +206,8 @@ void generate_ClassesWithoutPrimitiveTypes() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput_withoutPrimitives.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyChildParametrizedInput_withoutPrimitives.java.txt"), getFileByName(files, "EventPropertyChildParametrizedInput.java")); } @@ -202,7 +220,8 @@ void generate_UseObjectMapperToSerializeFields_Type() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/Event_useObjectMapperForRequestSerialization.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "Event_useObjectMapperForRequestSerialization.java.txt"), getFileByName(files, "Event.java")); } @@ -215,7 +234,8 @@ void generate_UseObjectMapperToSerializeFields_Field() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/Event_useObjectMapperForRequestSerialization.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "Event_useObjectMapperForRequestSerialization.java.txt"), getFileByName(files, "Event.java")); } @@ -227,7 +247,8 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/QueryINeedQueryRequest_custom_serializer.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "QueryINeedQueryRequest_custom_serializer.java.txt"), getFileByName(files, "QueryINeedQueryRequest.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java index 4c120ff00..32fb4e604 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java @@ -41,11 +41,14 @@ void generate_RequestAndResponseProjections() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/EventsByCategoryAndStatusQueryResponse.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "EventsByCategoryAndStatusQueryResponse.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryResponse.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/VersionQueryResponse.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "VersionQueryResponse.java.txt"), getFileByName(files, "VersionQueryResponse.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/EventsByIdsQueryResponse.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "EventsByIdsQueryResponse.java.txt"), getFileByName(files, "EventsByIdsQueryResponse.java")); } @@ -57,9 +60,11 @@ void generate_RequestAndResponseProjections_Interfaces() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/VehicleResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "VehicleResponseProjection.java.txt"), getFileByName(files, "VehicleResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/LocationResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "LocationResponseProjection.java.txt"), getFileByName(files, "LocationResponseProjection.java")); } @@ -71,9 +76,11 @@ void generate_projections_with_selectAll() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/projection-with-selectAll/VehicleResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/projection-with-selectAll/" + + "VehicleResponseProjection.java.txt"), getFileByName(files, "VehicleResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/projection-with-selectAll/LocationResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/projection-with-selectAll/" + + "LocationResponseProjection.java.txt"), getFileByName(files, "LocationResponseProjection.java")); } @@ -84,7 +91,8 @@ void generate_ResponseWithPrimitiveType() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/VersionQueryResponse_int.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "VersionQueryResponse_int.java.txt"), getFileByName(files, "VersionQueryResponse.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java index 156cc90fd..9def4f494 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java @@ -51,8 +51,8 @@ void generate() throws Exception { "Synchronized.java", "SynchronizedResponseProjection.java", "TestEnum.java"), generatedFileNames); for (File file : files) { - assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/restricted-words/%s.txt", file.getName())), + assertSameTrimmedContent(new File( + String.format("src/test/resources/expected-classes/restricted-words/%s.txt", file.getName())), file); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java index 24c0e8cc9..fb75abf12 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java @@ -69,7 +69,8 @@ void generate_CheckFiles() throws Exception { assertEquals(Arrays.asList( "CreateEventMutationResolver.java", "Event.java", "EventByIdQueryResolver.java", "EventProperty.java", "EventStatus.java", "EventsByCategoryAndStatusQueryResolver.java", "EventsByIdsQueryResolver.java", - "EventsCreatedSubscriptionResolver.java", "MutationResolver.java", "QueryResolver.java", "SubscriptionResolver.java", + "EventsCreatedSubscriptionResolver.java", "MutationResolver.java", "QueryResolver.java", + "SubscriptionResolver.java", "VersionQueryResolver.java"), generatedFileNames); for (File file : files) { @@ -101,7 +102,8 @@ void generate_CustomMappings() throws Exception { @Test void generate_CustomMappings_Nested() throws Exception { - mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("EventProperty.intVal", "java.math.BigInteger"))); + mappingConfig + .setCustomTypesMapping(new HashMap<>(singletonMap("EventProperty.intVal", "java.math.BigInteger"))); generate("src/test/resources/schemas/test.graphqls"); @@ -141,7 +143,8 @@ void generate_NoPackage() throws Exception { File[] files = Objects.requireNonNull(outputBuildDir.listFiles()); assertFileContainsElements(files, "Event.java", System.lineSeparator() + "/**" + System.lineSeparator() + - " * An event that describes a thing that happens" + System.lineSeparator() + + " * An event that describes a thing that happens" + System + .lineSeparator() + " */" + System.lineSeparator()); } @@ -155,7 +158,9 @@ void generate_CustomModelAndApiPackages() throws Exception { File[] apiFiles = Objects.requireNonNull(new File(outputJavaClassesDir, "api").listFiles()); List generatedApiFileNames = Arrays.stream(apiFiles).map(File::getName).sorted().collect(toList()); assertEquals(Arrays.asList("CreateEventMutationResolver.java", "EventByIdQueryResolver.java", - "EventsByCategoryAndStatusQueryResolver.java", "EventsByIdsQueryResolver.java", "EventsCreatedSubscriptionResolver.java", "MutationResolver.java", "QueryResolver.java", + "EventsByCategoryAndStatusQueryResolver.java", "EventsByIdsQueryResolver.java", + "EventsCreatedSubscriptionResolver.java", "MutationResolver.java", + "QueryResolver.java", "SubscriptionResolver.java", "VersionQueryResolver.java"), generatedApiFileNames); for (File apiFile : apiFiles) { @@ -197,7 +202,8 @@ void generate_EqualsAndHashCode() throws Exception { } } - assertSameTrimmedContent(new File("src/test/resources/expected-classes/EventPropertyTO_withEqualsAndHashCode.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/EventPropertyTO_withEqualsAndHashCode.java.txt"), getFileByName(files, "EventPropertyTO.java")); } @@ -236,7 +242,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/EventPropertyTO_withoutGeneratedAnnotation.java.txt"), getFileByName(files, "EventPropertyTO.java")); } @@ -250,7 +257,8 @@ void generate_NoSchemas() { @Test void generate_WrongSchema() { - GraphQLCodegen graphQLCodegen = new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/wrong.graphqls"), + GraphQLCodegen graphQLCodegen = new JavaGraphQLCodegen( + singletonList("src/test/resources/schemas/wrong.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()); assertThrows(NoSuchFileException.class, graphQLCodegen::generate); @@ -332,7 +340,8 @@ void generate_CustomSubscriptionReturnType() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "EventsCreatedSubscriptionResolver.java", - "org.reactivestreams.Publisher> eventsCreated() throws Exception;"); + "org.reactivestreams.Publisher> eventsCreated() throws " + + "Exception;"); } @Test @@ -341,8 +350,10 @@ void generate_deprecated() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("CreateEventMutationResolver.java", "Event.java", "EventInput.java", "EventsQueryResolver.java", - "MutationResolver.java", "Node.java", "PinnableItem.java", "QueryResolver.java", "Status.java"), generatedFileNames); + assertEquals(Arrays.asList("CreateEventMutationResolver.java", "Event.java", "EventInput.java", + "EventsQueryResolver.java", + "MutationResolver.java", "Node.java", "PinnableItem.java", "QueryResolver.java", + "Status.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent( @@ -357,7 +368,8 @@ void generate_QueriesWithSameName() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/ProductsByCategoryIdAndStatusQueryResolver.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/ProductsByCategoryIdAndStatusQueryResolver.java.txt"), getFileByName(files, "ProductsByCategoryIdAndStatusQueryResolver.java")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/ProductsByIdsQueryResolver.java.txt"), diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenValidateTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenValidateTest.java index 33cb53e49..b318b9151 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenValidateTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenValidateTest.java @@ -13,7 +13,8 @@ class GraphQLCodegenValidateTest { @Test void validate_Invalid() { - GraphQLCodegenValidate graphQLCodegenValidate = new GraphQLCodegenValidate(singletonList("src/test/resources/schemas/invalid.graphqls")); + GraphQLCodegenValidate graphQLCodegenValidate = new GraphQLCodegenValidate(singletonList( + "src/test/resources/schemas/invalid.graphqls")); assertThrows(SchemaValidationException.class, graphQLCodegenValidate::validate); } 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 8cf7075e9..cc2e54c74 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java @@ -14,7 +14,9 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; -import static java.util.Collections.*; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; class GraphQLCodegenCustomScalarMappingTest { @@ -47,7 +49,8 @@ void generate_CustomTypeMapping_WholeScalar() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/kt/custom-type/QueryINeedQueryRequest_whole_scalar.kt.txt"), + new File("src/test/resources/expected-classes/kt/custom-type/" + + "QueryINeedQueryRequest_whole_scalar.kt.txt"), getFileByName(files, "QueryINeedQueryRequest.kt")); } @@ -83,7 +86,8 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/QueryINeedQueryRequest_custom_serializer.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/QueryINeedQueryRequest_custom_serializer.kt.txt"), getFileByName(files, "QueryINeedQueryRequest.kt")); } } 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 547eed890..7662cd652 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java @@ -39,12 +39,15 @@ 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(); + new KotlinGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/deprecated-with-msg.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("CreateEventMutationResolver.kt", "Event.kt", "EventInput.kt", "EventsQueryResolver.kt", - "MutationResolver.kt", "Node.kt", "PinnableItem.kt", "QueryResolver.kt", "Status.kt"), generatedFileNames); + assertEquals( + Arrays.asList("CreateEventMutationResolver.kt", "Event.kt", "EventInput.kt", "EventsQueryResolver.kt", + "MutationResolver.kt", "Node.kt", "PinnableItem.kt", "QueryResolver.kt", "Status.kt"), + generatedFileNames); for (File file : files) { assertSameTrimmedContent( 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 2725259ed..8124f7757 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java @@ -44,7 +44,8 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -63,7 +64,8 @@ void generateServerSideClasses() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).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 bdd30f041..9a3672ab0 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java @@ -25,6 +25,10 @@ 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); @@ -57,7 +61,8 @@ void generate_MultipleInterfacesPerType() throws Exception { assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/ProfileOwner.kt.txt"), getFileByName(files, "ProfileOwner.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AcceptTopicSuggestionMutationResponse.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/AcceptTopicSuggestionMutationResponse.kt.txt"), getFileByName(files, "AcceptTopicSuggestionMutationResponse.kt")); } @@ -103,17 +108,14 @@ void generate_Client_ConditionalFragments() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/SearchResultItemConnectionResponseProjection.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/SearchResultItemConnectionResponseProjection.kt.txt"), getFileByName(files, "SearchResultItemConnectionResponseProjection.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt"), getFileByName(files, "SearchResultItemResponseProjection.kt")); } - private static String getFileContent(File[] files, String fileName) throws IOException { - return Utils.getFileContent(getFileByName(files, fileName).getPath()); - } - - @Test void generate_ResponseWithPrimitiveType() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); @@ -135,11 +137,14 @@ void generate_ktList() throws Exception { File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableInput.kt.txt"), getFileByName(files, "AddLabelsToLabelableInput.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationRequest.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationRequest.kt.txt"), getFileByName(files, "AddLabelsToLabelableMutationRequest.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationResolver.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationResolver.kt.txt"), getFileByName(files, "AddLabelsToLabelableMutationResolver.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationResponse.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationResponse.kt.txt"), getFileByName(files, "AddLabelsToLabelableMutationResponse.kt")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelablePayload.kt.txt"), getFileByName(files, "AddLabelsToLabelablePayload.kt")); @@ -172,9 +177,13 @@ void generate_CustomFieldsResolvers() throws Exception { File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/field-resolver/GithubAcceptTopicSuggestionPayloadTO.kt.txt"), + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/kt/field-resolver/" + + "GithubAcceptTopicSuggestionPayloadTO.kt.txt"), getFileByName(files, "GithubAcceptTopicSuggestionPayloadTO.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionPayloadResolver.kt.txt"), + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/kt/field-resolver/" + + "AcceptTopicSuggestionPayloadResolver.kt.txt"), getFileByName(files, "AcceptTopicSuggestionPayloadResolver.kt")); } 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 33819556f..805680375 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java @@ -21,17 +21,17 @@ class GraphQLCodegenInterfacesTest { - private GraphQLCodegen generator; private final MappingConfig mappingConfig = new MappingConfig(); - private final File outputBuildDir = new File("build/generated"); private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/interfaces"); + private GraphQLCodegen generator; @BeforeEach void init() { mappingConfig.setGeneratedLanguage(GeneratedLanguage.KOTLIN); mappingConfig.setPackageName("com.kobylynskyi.graphql.interfaces"); - generator = new KotlinGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/interfaces.graphqls"), + generator = new KotlinGraphQLCodegen( + Collections.singletonList("src/test/resources/schemas/interfaces.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()); } 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 2c6e3e2a4..5809ac722 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java @@ -38,7 +38,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(); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -72,13 +73,14 @@ void generatePrimitiveTypesResponseResolverClasses_nullable() throws Exception { } @Test - void generatePrimitiveTypesResponseResolverClasses_nullable_WITH_Prefix_Suffix() throws Exception { + void generatePrimitiveTypesResponseResolverClasses_nullable_With_Prefix_Suffix() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); mappingConfig.setModelNamePrefix("Test"); mappingConfig.setModelNameSuffix("DTO"); schemaFinder.setIncludePattern("nullable-extend.graphqls"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( @@ -96,14 +98,17 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setGenerateEqualsAndHashCode(true); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/optional/InterfaceWithOptionalField.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/optional/InterfaceWithOptionalField.kt.txt"), getFileByName(files, "InterfaceWithOptionalField.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/optional/TypeWithMandatoryField.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/optional/TypeWithMandatoryField.kt.txt"), getFileByName(files, "TypeWithMandatoryField.kt")); } } 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 0cd75a2d3..fc5d62209 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java @@ -43,7 +43,8 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -61,11 +62,13 @@ 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(); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt"), getFileByName(files, "UsersQueryResolver.kt")); } 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 a4f03724d..b1d3df2bf 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java @@ -44,16 +44,21 @@ void generate() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List filters = Arrays.asList("Char.kt", "CharResponseProjection.kt", "FunQueryRequest.kt", "FunQueryResponse.kt", "QueryFunParametrizedInput.kt", - "Super.kt", "TestEnum.kt", "WhenQueryAPI.kt"); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> filters.contains(f)).sorted().collect(toList()); - assertEquals(Arrays.asList("Char.kt", "CharResponseProjection.kt", "FunQueryRequest.kt", "FunQueryResponse.kt", "QueryFunParametrizedInput.kt", + List filters = Arrays + .asList("Char.kt", "CharResponseProjection.kt", "FunQueryRequest.kt", "FunQueryResponse.kt", + "QueryFunParametrizedInput.kt", + "Super.kt", "TestEnum.kt", "WhenQueryAPI.kt"); + List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> filters.contains(f)) + .sorted().collect(toList()); + assertEquals(Arrays.asList("Char.kt", "CharResponseProjection.kt", "FunQueryRequest.kt", "FunQueryResponse.kt", + "QueryFunParametrizedInput.kt", "Super.kt", "TestEnum.kt", "WhenQueryAPI.kt"), generatedFileNames); for (File file : files) { if (filters.contains(file.getName())) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/kt/restricted-words/%s.txt", file.getName())), + new File(String.format("src/test/resources/expected-classes/kt/restricted-words/%s.txt", + file.getName())), file); } } 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 183c08486..61baead97 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java @@ -19,6 +19,150 @@ @SuppressWarnings("unchecked") class MappingConfigTest { + private static Map hashMap(AbstractMap.SimpleEntry... entries) { + return Arrays.stream(entries).collect( + Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue, (a, b) -> b)); + } + + private static MappingConfig buildMappingConfig() { + MappingConfig config = new MappingConfig(); + config.setCustomTypesMapping(new HashMap<>(singletonMap("1", "2"))); + config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("3", singletonList("4")))); + config.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("5", singletonList("6")))); + config.setApiPackageName("ApiPackageName"); + config.setGenerateBuilder(true); + config.setGenerateApis(true); + config.setGenerateEqualsAndHashCode(true); + config.setGenerateImmutableModels(false); + config.setGenerateToString(true); + config.setModelNamePrefix("ModelNamePrefix"); + config.setModelNameSuffix("ModelNameSuffix"); + config.setModelPackageName("ModelPackageName"); + config.setModelValidationAnnotation("ModelValidationAnnotation"); + config.setPackageName("PackageName"); + config.setApiReturnType("ApiReturnType"); + config.setApiReturnListType("ApiReturnListType"); + config.setSubscriptionReturnType("SubscriptionsReturnType"); + config.setGenerateParameterizedFieldsResolvers(true); + config.setGenerateExtensionFieldsResolvers(true); + config.setUseOptionalForNullableReturnTypes(true); + config.setApiInterfaceStrategy(ApiInterfaceStrategy.INTERFACE_PER_OPERATION); + config.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); + config.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.SINGLE_INTERFACE); + config.setFieldsWithResolvers(new HashSet<>(singletonList("5"))); + config.setFieldsWithoutResolvers(new HashSet<>(singleton("8"))); + config.setRequestSuffix("6"); + config.setResponseSuffix("10"); + config.setResponseProjectionSuffix("7"); + config.setGenerateClient(false); + config.setGenerateModelsForRootTypes(false); + config.setGenerateApisWithThrowsException(true); + config.setAddGeneratedAnnotation(true); + config.setParametrizedInputSuffix("9"); + config.setTypeResolverPrefix("11"); + config.setTypeResolverSuffix("12"); + RelayConfig relayConfig = new RelayConfig(); + relayConfig.setDirectiveArgumentName("key"); + config.setRelayConfig(relayConfig); + return config; + } + + private static MappingConfig buildMappingConfig2() { + MappingConfig config = new MappingConfig(); + config.setCustomTypesMapping(new HashMap<>(singletonMap("11", "22"))); + config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("33", singletonList("44")))); + config.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("55", singletonList("66")))); + config.setApiPackageName("ApiPackageName2"); + config.setGenerateBuilder(false); + config.setGenerateApis(false); + config.setGenerateImmutableModels(true); + config.setGenerateEqualsAndHashCode(false); + config.setGenerateToString(false); + config.setModelNamePrefix("ModelNamePrefix2"); + config.setModelNameSuffix("ModelNameSuffix2"); + config.setModelPackageName("ModelPackageName2"); + config.setModelValidationAnnotation("ModelValidationAnnotation2"); + config.setPackageName("PackageName2"); + config.setApiReturnType("ApiReturnType2"); + config.setApiReturnListType("ApiReturnListType2"); + config.setSubscriptionReturnType("SubscriptionsReturnType2"); + config.setGenerateParameterizedFieldsResolvers(false); + config.setGenerateExtensionFieldsResolvers(false); + config.setUseOptionalForNullableReturnTypes(false); + config.setApiInterfaceStrategy(ApiInterfaceStrategy.DO_NOT_GENERATE); + config.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FILE_NAME_AS_PREFIX); + config.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.DO_NOT_GENERATE); + config.setFieldsWithResolvers(singleton("55")); + config.setFieldsWithoutResolvers(singleton("88")); + config.setRequestSuffix("66"); + config.setResponseSuffix("1010"); + config.setResponseProjectionSuffix("77"); + config.setGenerateClient(true); + config.setGenerateModelsForRootTypes(true); + config.setGenerateApisWithThrowsException(false); + config.setAddGeneratedAnnotation(false); + config.setParametrizedInputSuffix("99"); + config.setTypeResolverPrefix("1111"); + config.setTypeResolverSuffix("1212"); + RelayConfig relayConfig = new RelayConfig(); + relayConfig.setDirectiveArgumentName("for"); + config.setRelayConfig(relayConfig); + return config; + } + + private static MappingConfig buildEmptyMappingConfig() { + MappingConfig mappingConfig = new MappingConfig(); + mappingConfig.setCustomTypesMapping(null); + mappingConfig.setCustomAnnotationsMapping(null); + mappingConfig.setDirectiveAnnotationsMapping(null); + mappingConfig.setFieldsWithResolvers(null); + mappingConfig.setFieldsWithoutResolvers(null); + mappingConfig.setRelayConfig(null); + return mappingConfig; + } + + private static void compareMappingConfigs(MappingConfig mappingConfig, MappingConfig expectedMappingConfig) { + assertEquals(expectedMappingConfig.getCustomTypesMapping(), mappingConfig.getCustomTypesMapping()); + assertEquals(expectedMappingConfig.getCustomAnnotationsMapping(), mappingConfig.getCustomAnnotationsMapping()); + assertEquals(expectedMappingConfig.getDirectiveAnnotationsMapping(), + mappingConfig.getDirectiveAnnotationsMapping()); + assertEquals(expectedMappingConfig.getApiPackageName(), mappingConfig.getApiPackageName()); + assertEquals(expectedMappingConfig.getGenerateBuilder(), mappingConfig.getGenerateBuilder()); + assertEquals(expectedMappingConfig.getGenerateApis(), mappingConfig.getGenerateApis()); + assertEquals(expectedMappingConfig.getGenerateEqualsAndHashCode(), + mappingConfig.getGenerateEqualsAndHashCode()); + assertEquals(expectedMappingConfig.getGenerateImmutableModels(), mappingConfig.getGenerateImmutableModels()); + assertEquals(expectedMappingConfig.getGenerateToString(), mappingConfig.getGenerateToString()); + assertEquals(expectedMappingConfig.getSubscriptionReturnType(), mappingConfig.getSubscriptionReturnType()); + assertEquals(expectedMappingConfig.getApiReturnType(), mappingConfig.getApiReturnType()); + assertEquals(expectedMappingConfig.getApiReturnListType(), mappingConfig.getApiReturnListType()); + assertEquals(expectedMappingConfig.getModelNamePrefix(), mappingConfig.getModelNamePrefix()); + assertEquals(expectedMappingConfig.getModelNameSuffix(), mappingConfig.getModelNameSuffix()); + assertEquals(expectedMappingConfig.getModelPackageName(), mappingConfig.getModelPackageName()); + assertEquals(expectedMappingConfig.getModelValidationAnnotation(), + mappingConfig.getModelValidationAnnotation()); + assertEquals(expectedMappingConfig.getPackageName(), mappingConfig.getPackageName()); + assertEquals(expectedMappingConfig.getGenerateParameterizedFieldsResolvers(), + mappingConfig.getGenerateParameterizedFieldsResolvers()); + assertEquals(expectedMappingConfig.getGenerateExtensionFieldsResolvers(), + mappingConfig.getGenerateExtensionFieldsResolvers()); + assertEquals(expectedMappingConfig.getFieldsWithResolvers(), mappingConfig.getFieldsWithResolvers()); + assertEquals(expectedMappingConfig.getFieldsWithoutResolvers(), mappingConfig.getFieldsWithoutResolvers()); + assertEquals(expectedMappingConfig.getRequestSuffix(), mappingConfig.getRequestSuffix()); + assertEquals(expectedMappingConfig.getResponseSuffix(), mappingConfig.getResponseSuffix()); + assertEquals(expectedMappingConfig.getResponseProjectionSuffix(), mappingConfig.getResponseProjectionSuffix()); + assertEquals(expectedMappingConfig.getGenerateClient(), mappingConfig.getGenerateClient()); + assertEquals(expectedMappingConfig.getGenerateModelsForRootTypes(), + mappingConfig.getGenerateModelsForRootTypes()); + assertEquals(expectedMappingConfig.getGenerateApisWithThrowsException(), + mappingConfig.getGenerateApisWithThrowsException()); + assertEquals(expectedMappingConfig.getTypeResolverPrefix(), mappingConfig.getTypeResolverPrefix()); + assertEquals(expectedMappingConfig.getTypeResolverSuffix(), mappingConfig.getTypeResolverSuffix()); + assertEquals(expectedMappingConfig.getUseOptionalForNullableReturnTypes(), + mappingConfig.getUseOptionalForNullableReturnTypes()); + assertEquals(expectedMappingConfig.getRelayConfig(), mappingConfig.getRelayConfig()); + } + @Test void combineDefaultWithNull() { MappingConfig mappingConfig = buildEmptyMappingConfig(); @@ -127,9 +271,11 @@ void combineCustomWithCustom() { assertEquals(hashMap(new HashMap.SimpleEntry<>("1", "2"), new HashMap.SimpleEntry<>("11", "22")), mappingConfig.getCustomTypesMapping()); - assertEquals(hashMap(new HashMap.SimpleEntry<>("3", singletonList("4")), new HashMap.SimpleEntry<>("33", singletonList("44"))), + assertEquals(hashMap(new HashMap.SimpleEntry<>("3", singletonList("4")), + new HashMap.SimpleEntry<>("33", singletonList("44"))), mappingConfig.getCustomAnnotationsMapping()); - assertEquals(hashMap(new HashMap.SimpleEntry<>("5", singletonList("6")), new HashMap.SimpleEntry<>("55", singletonList("66"))), + assertEquals(hashMap(new HashMap.SimpleEntry<>("5", singletonList("6")), + new HashMap.SimpleEntry<>("55", singletonList("66"))), mappingConfig.getDirectiveAnnotationsMapping()); assertEquals("ApiPackageName2", mappingConfig.getApiPackageName()); assertFalse(mappingConfig.getGenerateBuilder()); @@ -166,140 +312,4 @@ void combineCustomWithCustom() { assertEquals("for", mappingConfig.getRelayConfig().getDirectiveArgumentName()); } - private static Map hashMap(AbstractMap.SimpleEntry... entries) { - return Arrays.stream(entries).collect( - Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue, (a, b) -> b)); - } - - private static MappingConfig buildMappingConfig() { - MappingConfig config = new MappingConfig(); - config.setCustomTypesMapping(new HashMap<>(singletonMap("1", "2"))); - config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("3", singletonList("4")))); - config.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("5", singletonList("6")))); - config.setApiPackageName("ApiPackageName"); - config.setGenerateBuilder(true); - config.setGenerateApis(true); - config.setGenerateEqualsAndHashCode(true); - config.setGenerateImmutableModels(false); - config.setGenerateToString(true); - config.setModelNamePrefix("ModelNamePrefix"); - config.setModelNameSuffix("ModelNameSuffix"); - config.setModelPackageName("ModelPackageName"); - config.setModelValidationAnnotation("ModelValidationAnnotation"); - config.setPackageName("PackageName"); - config.setApiReturnType("ApiReturnType"); - config.setApiReturnListType("ApiReturnListType"); - config.setSubscriptionReturnType("SubscriptionsReturnType"); - config.setGenerateParameterizedFieldsResolvers(true); - config.setGenerateExtensionFieldsResolvers(true); - config.setUseOptionalForNullableReturnTypes(true); - config.setApiInterfaceStrategy(ApiInterfaceStrategy.INTERFACE_PER_OPERATION); - config.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); - config.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.SINGLE_INTERFACE); - config.setFieldsWithResolvers(new HashSet<>(singletonList("5"))); - config.setFieldsWithoutResolvers(new HashSet<>(singleton("8"))); - config.setRequestSuffix("6"); - config.setResponseSuffix("10"); - config.setResponseProjectionSuffix("7"); - config.setGenerateClient(false); - config.setGenerateModelsForRootTypes(false); - config.setGenerateApisWithThrowsException(true); - config.setAddGeneratedAnnotation(true); - config.setParametrizedInputSuffix("9"); - config.setTypeResolverPrefix("11"); - config.setTypeResolverSuffix("12"); - RelayConfig relayConfig = new RelayConfig(); - relayConfig.setDirectiveArgumentName("key"); - config.setRelayConfig(relayConfig); - return config; - } - - private static MappingConfig buildMappingConfig2() { - MappingConfig config = new MappingConfig(); - config.setCustomTypesMapping(new HashMap<>(singletonMap("11", "22"))); - config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("33", singletonList("44")))); - config.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("55", singletonList("66")))); - config.setApiPackageName("ApiPackageName2"); - config.setGenerateBuilder(false); - config.setGenerateApis(false); - config.setGenerateImmutableModels(true); - config.setGenerateEqualsAndHashCode(false); - config.setGenerateToString(false); - config.setModelNamePrefix("ModelNamePrefix2"); - config.setModelNameSuffix("ModelNameSuffix2"); - config.setModelPackageName("ModelPackageName2"); - config.setModelValidationAnnotation("ModelValidationAnnotation2"); - config.setPackageName("PackageName2"); - config.setApiReturnType("ApiReturnType2"); - config.setApiReturnListType("ApiReturnListType2"); - config.setSubscriptionReturnType("SubscriptionsReturnType2"); - config.setGenerateParameterizedFieldsResolvers(false); - config.setGenerateExtensionFieldsResolvers(false); - config.setUseOptionalForNullableReturnTypes(false); - config.setApiInterfaceStrategy(ApiInterfaceStrategy.DO_NOT_GENERATE); - config.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FILE_NAME_AS_PREFIX); - config.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.DO_NOT_GENERATE); - config.setFieldsWithResolvers(singleton("55")); - config.setFieldsWithoutResolvers(singleton("88")); - config.setRequestSuffix("66"); - config.setResponseSuffix("1010"); - config.setResponseProjectionSuffix("77"); - config.setGenerateClient(true); - config.setGenerateModelsForRootTypes(true); - config.setGenerateApisWithThrowsException(false); - config.setAddGeneratedAnnotation(false); - config.setParametrizedInputSuffix("99"); - config.setTypeResolverPrefix("1111"); - config.setTypeResolverSuffix("1212"); - RelayConfig relayConfig = new RelayConfig(); - relayConfig.setDirectiveArgumentName("for"); - config.setRelayConfig(relayConfig); - return config; - } - - private static MappingConfig buildEmptyMappingConfig() { - MappingConfig mappingConfig = new MappingConfig(); - mappingConfig.setCustomTypesMapping(null); - mappingConfig.setCustomAnnotationsMapping(null); - mappingConfig.setDirectiveAnnotationsMapping(null); - mappingConfig.setFieldsWithResolvers(null); - mappingConfig.setFieldsWithoutResolvers(null); - mappingConfig.setRelayConfig(null); - return mappingConfig; - } - - private static void compareMappingConfigs(MappingConfig mappingConfig, MappingConfig expectedMappingConfig) { - assertEquals(expectedMappingConfig.getCustomTypesMapping(), mappingConfig.getCustomTypesMapping()); - assertEquals(expectedMappingConfig.getCustomAnnotationsMapping(), mappingConfig.getCustomAnnotationsMapping()); - assertEquals(expectedMappingConfig.getDirectiveAnnotationsMapping(), mappingConfig.getDirectiveAnnotationsMapping()); - assertEquals(expectedMappingConfig.getApiPackageName(), mappingConfig.getApiPackageName()); - assertEquals(expectedMappingConfig.getGenerateBuilder(), mappingConfig.getGenerateBuilder()); - assertEquals(expectedMappingConfig.getGenerateApis(), mappingConfig.getGenerateApis()); - assertEquals(expectedMappingConfig.getGenerateEqualsAndHashCode(), mappingConfig.getGenerateEqualsAndHashCode()); - assertEquals(expectedMappingConfig.getGenerateImmutableModels(), mappingConfig.getGenerateImmutableModels()); - assertEquals(expectedMappingConfig.getGenerateToString(), mappingConfig.getGenerateToString()); - assertEquals(expectedMappingConfig.getSubscriptionReturnType(), mappingConfig.getSubscriptionReturnType()); - assertEquals(expectedMappingConfig.getApiReturnType(), mappingConfig.getApiReturnType()); - assertEquals(expectedMappingConfig.getApiReturnListType(), mappingConfig.getApiReturnListType()); - assertEquals(expectedMappingConfig.getModelNamePrefix(), mappingConfig.getModelNamePrefix()); - assertEquals(expectedMappingConfig.getModelNameSuffix(), mappingConfig.getModelNameSuffix()); - assertEquals(expectedMappingConfig.getModelPackageName(), mappingConfig.getModelPackageName()); - assertEquals(expectedMappingConfig.getModelValidationAnnotation(), mappingConfig.getModelValidationAnnotation()); - assertEquals(expectedMappingConfig.getPackageName(), mappingConfig.getPackageName()); - assertEquals(expectedMappingConfig.getGenerateParameterizedFieldsResolvers(), mappingConfig.getGenerateParameterizedFieldsResolvers()); - assertEquals(expectedMappingConfig.getGenerateExtensionFieldsResolvers(), mappingConfig.getGenerateExtensionFieldsResolvers()); - assertEquals(expectedMappingConfig.getFieldsWithResolvers(), mappingConfig.getFieldsWithResolvers()); - assertEquals(expectedMappingConfig.getFieldsWithoutResolvers(), mappingConfig.getFieldsWithoutResolvers()); - assertEquals(expectedMappingConfig.getRequestSuffix(), mappingConfig.getRequestSuffix()); - assertEquals(expectedMappingConfig.getResponseSuffix(), mappingConfig.getResponseSuffix()); - assertEquals(expectedMappingConfig.getResponseProjectionSuffix(), mappingConfig.getResponseProjectionSuffix()); - assertEquals(expectedMappingConfig.getGenerateClient(), mappingConfig.getGenerateClient()); - assertEquals(expectedMappingConfig.getGenerateModelsForRootTypes(), mappingConfig.getGenerateModelsForRootTypes()); - assertEquals(expectedMappingConfig.getGenerateApisWithThrowsException(), mappingConfig.getGenerateApisWithThrowsException()); - assertEquals(expectedMappingConfig.getTypeResolverPrefix(), mappingConfig.getTypeResolverPrefix()); - assertEquals(expectedMappingConfig.getTypeResolverSuffix(), mappingConfig.getTypeResolverSuffix()); - assertEquals(expectedMappingConfig.getUseOptionalForNullableReturnTypes(), mappingConfig.getUseOptionalForNullableReturnTypes()); - assertEquals(expectedMappingConfig.getRelayConfig(), mappingConfig.getRelayConfig()); - } - } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerScalaTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerScalaTest.java index a0f9a05c8..018f2d918 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerScalaTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerScalaTest.java @@ -7,12 +7,6 @@ class GraphQLRequestSerializerScalaTest { - @Test - void scalaOptionToString() { - assertEquals("1", getEntry(new Some())); - assertNull(getEntry(new None$())); - } - //Original method cannot test in Java public static String getEntry(Object input) { if (input.getClass().getSimpleName().equals("Some")) { @@ -23,6 +17,12 @@ public static String getEntry(Object input) { return input.toString(); } + @Test + void scalaOptionToString() { + assertEquals("1", getEntry(new Some())); + assertNull(getEntry(new None$())); + } + interface Option { } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerTest.java index a5c339036..1e597bdf2 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerTest.java @@ -29,7 +29,9 @@ import java.util.function.Function; import java.util.stream.Stream; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class GraphQLRequestSerializerTest { @@ -64,21 +66,28 @@ private static Stream provideStaticSerializerForMultiRequest() { (Function) GraphQLRequestSerializerTest::jsonQuery)); } + private static String jsonQuery(String expectedQueryDecorator) { + return String.format("{\"query\":\"%s\"}", expectedQueryDecorator.replace("\\", "\\\\").replace("\"", "\\\"")); + } + @ParameterizedTest(name = "{0}") @MethodSource("provideStaticSerializers") - void serialize_Null(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_Null(String name, Function serializer, + Function expectedQueryDecorator) { assertNull(serializer.apply(null)); } @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_Empty(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_Empty(String name, Function serializer, + Function expectedQueryDecorator) { assertNull(serializer.apply(new GraphQLRequest(null))); } @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_noResponseProjection(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_noResponseProjection(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequest graphQLRequest = new GraphQLRequest(new VersionQueryRequest()); String serializedQuery = serializer.apply(graphQLRequest).replaceAll(" +", " ").trim(); String expectedQueryStr = "query { version }"; @@ -87,7 +96,8 @@ void serialize_noResponseProjection(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withResponseProjection(String name, Function serializer, + Function expectedQueryDecorator) { EventsByCategoryAndStatusQueryRequest request = new EventsByCategoryAndStatusQueryRequest.Builder() .setCategoryId("categoryIdValue1") .setStatus(Status.OPEN) @@ -98,10 +108,12 @@ void serialize_withResponseProjection(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withResponseProjectionAndAlias(String name, Function serializer, + Function expectedQueryDecorator) { EventsByCategoryAndStatusQueryRequest request = new EventsByCategoryAndStatusQueryRequest.Builder() .setCategoryId("categoryIdValue1") .setStatus(Status.OPEN) @@ -129,13 +142,16 @@ void serialize_withResponseProjectionAndAlias(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withResponseProjectionAndParametrizedInput(String name, Function serializer, + Function expectedQueryDecorator) { EventsByCategoryAndStatusQueryRequest request = new EventsByCategoryAndStatusQueryRequest.Builder() .setCategoryId("categoryIdValue1") .setStatus(Status.OPEN) @@ -164,12 +182,14 @@ void serialize_withResponseProjectionAndParametrizedInput(String name, Function< .active() .properties(new EventPropertyResponseProjection() .floatVal() - .child(new EventPropertyChildParametrizedInput() + .child( + new EventPropertyChildParametrizedInput() .last(-10) .first(+10), new EventPropertyResponseProjection() .intVal() - .parent(new EventPropertyParentParametrizedInput() + .parent( + new EventPropertyParentParametrizedInput() .withStatus(Status.OPEN), new EventResponseProjection() .id())) @@ -182,7 +202,8 @@ void serialize_withResponseProjectionAndParametrizedInput(String name, Function< "id " + "active " + "properties { " + - "floatVal child (first: 10, last: -10) { intVal parent (withStatus: OPEN) { id } } booleanVal } " + + "floatVal child (first: 10, last: -10) { intVal parent (withStatus: OPEN) { id } } " + + "booleanVal } " + "status " + "} " + "}"; @@ -191,7 +212,9 @@ void serialize_withResponseProjectionAndParametrizedInput(String name, Function< @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, + Function serializer, + Function expectedQueryDecorator) { EventsByCategoryAndStatusQueryRequest request = new EventsByCategoryAndStatusQueryRequest.Builder() .setCategoryId("categoryIdValue1") .setStatus(Status.OPEN) @@ -202,13 +225,16 @@ void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, F .active() .properties(new EventPropertyResponseProjection() .floatVal() - .child("myChild", new EventPropertyChildParametrizedInput() + .child("myChild", + new EventPropertyChildParametrizedInput() .last(-10) .first(+10), new EventPropertyResponseProjection() .intVal() - .parent("myParent", new EventPropertyParentParametrizedInput() - .withStatus(Status.OPEN), + .parent("myParent", + new EventPropertyParentParametrizedInput() + .withStatus( + Status.OPEN), new EventResponseProjection() .id())) .booleanVal()) @@ -220,7 +246,8 @@ void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, F "id " + "active " + "properties { " + - "floatVal myChild : child (first: 10, last: -10) { intVal myParent : parent (withStatus: OPEN) { id } } booleanVal } " + + "floatVal myChild : child (first: 10, last: -10) { intVal myParent : parent " + + "(withStatus: OPEN) { id } } booleanVal } " + "status " + "} " + "}"; @@ -229,7 +256,8 @@ void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, F @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_complexRequestWithDefaultData(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_complexRequestWithDefaultData(String name, Function serializer, + Function expectedQueryDecorator) { UpdateIssueMutationRequest requestWithDefaultData = new UpdateIssueMutationRequest(); requestWithDefaultData.setInput(new UpdateIssueInput()); GraphQLRequest graphQLRequest = new GraphQLRequest(requestWithDefaultData, @@ -249,7 +277,8 @@ void serialize_complexRequestWithDefaultData(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_UseObjectMapperForSomeFields(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequestSerializer.OBJECT_MAPPER.registerModule( new SimpleModule().addSerializer(new ZonedDateTimeSerializer())); @@ -267,7 +296,8 @@ void serialize_UseObjectMapperForSomeFields(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_UseObjectMapperForQueryParameter(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequestSerializer.OBJECT_MAPPER.registerModule( new SimpleModule().addSerializer(new ZonedDateTimeSerializer())); @@ -282,7 +312,8 @@ void serialize_UseObjectMapperForQueryParameter(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_UseObjectMapperForParameterizedInput(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequestSerializer.OBJECT_MAPPER.registerModule( new SimpleModule().addSerializer(new ZonedDateTimeSerializer())); @@ -293,9 +324,15 @@ void serialize_UseObjectMapperForParameterizedInput(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_complexRequest(String name, Function serializer, + Function expectedQueryDecorator) { UpdateIssueMutationRequest updateIssueMutationRequest = new UpdateIssueMutationRequest(); UpdateIssueInput input = new UpdateIssueInput(); input.setStringListEmptyDefault(Arrays.asList("", "1", null, "\"")); @@ -326,31 +364,36 @@ void serialize_complexRequest(String name, Function seri String expectedQueryStr = "mutation { updateIssue(input: { " + "floatVal: 1.23, booleanVal: false, intVal: 42, " + "stringVal: \"default \\\" \\\\ \\b \\f \\n \\r \\t ሴ \", " + - "enumVal: OPEN, intList: [ 1, 2, 3 ], intListEmptyDefault: [ \"\", \"1\", null, \"\\\"\" ] }){ " + + "enumVal: OPEN, intList: [ 1, 2, 3 ], intListEmptyDefault: [ \"\", \"1\", null, " + + "\"\\\"\" ] }){ " + "clientMutationId issue { activeLockReason } } }"; assertEquals(expectedQueryDecorator.apply(expectedQueryStr), serializedQuery); } @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_withConditionalFragments(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withConditionalFragments(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequest graphQLRequest = new GraphQLRequest(new UpdateIssueMutationRequest(), new UpdateIssuePayloadResponseProjection() .union(new UpdateNodeUnionResponseProjection() .onIssue(new IssueResponseProjection() .activeLockReason()) - .onOrganization(new OrganizationResponseProjection() - .name()) + .onOrganization( + new OrganizationResponseProjection() + .name()) .typename())); String serializedQuery = serializer.apply(graphQLRequest).replaceAll(" +", " ").trim(); String expectedQueryStr = "mutation { updateIssue{ " + - "union { ...on Issue { activeLockReason } ...on Organization { name } __typename } } }"; + "union { ...on Issue { activeLockReason } ...on Organization { name } __typename } " + + "} }"; assertEquals(expectedQueryDecorator.apply(expectedQueryStr), serializedQuery); } @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_collectionRequest(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_collectionRequest(String name, Function serializer, + Function expectedQueryDecorator) { EventsByIdsQueryRequest request = new EventsByIdsQueryRequest.Builder() .setIds(Arrays.asList("\"", "\\", "\b", "\f", "\n", "\r", "\t", "\u1234")) .build(); @@ -373,7 +416,8 @@ void serialize_collectionRequest(String name, Function s @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_collectionRequest_Null(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_collectionRequest_Null(String name, Function serializer, + Function expectedQueryDecorator) { EventsByIdsQueryRequest request = new EventsByIdsQueryRequest.Builder() .setContextId("something") .setIds(null) @@ -390,7 +434,8 @@ void serialize_collectionRequest_Null(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_AllInputsNull(String name, Function serializer, + Function expectedQueryDecorator) { EventsByIdsQueryRequest request = new EventsByIdsQueryRequest.Builder() .setContextId(null) .setIds(null) @@ -407,8 +452,10 @@ void serialize_AllInputsNull(String name, Function seria @ParameterizedTest(name = "{0}") @MethodSource("provideStaticSerializerForMultiRequest") - void serialize_multipleRequests(String name, Function serializer, Function expectedQueryDecorator) { - EventsByCategoryAndStatusQueryRequest request1 = new EventsByCategoryAndStatusQueryRequest.Builder().alias("req1").setStatus(Status.OPEN).build(); + void serialize_multipleRequests(String name, Function serializer, + Function expectedQueryDecorator) { + EventsByCategoryAndStatusQueryRequest request1 = new EventsByCategoryAndStatusQueryRequest.Builder() + .alias("req1").setStatus(Status.OPEN).build(); GraphQLRequest graphQLRequest1 = new GraphQLRequest(request1, new EventResponseProjection().id()); EventsByCategoryAndStatusQueryRequest request2 = new EventsByCategoryAndStatusQueryRequest("req2"); @@ -417,7 +464,9 @@ void serialize_multipleRequests(String name, Function s EventsByCategoryAndStatusQueryRequest request21 = new EventsByCategoryAndStatusQueryRequest(); GraphQLRequest graphQLRequest21 = new GraphQLRequest(request21); - String serializedQuery = serializer.apply(new GraphQLRequests(graphQLRequest1, graphQLRequest2, graphQLRequest21)).replaceAll(" +", " ").trim(); + String serializedQuery = serializer + .apply(new GraphQLRequests(graphQLRequest1, graphQLRequest2, graphQLRequest21)).replaceAll(" +", " ") + .trim(); String expectedQueryStr = "query { " + "req1: eventsByCategoryAndStatus(status: OPEN){ id } " + "req2: eventsByCategoryAndStatus{ id status } " + @@ -428,7 +477,8 @@ void serialize_multipleRequests(String name, Function s @ParameterizedTest(name = "{0}") @MethodSource("provideStaticSerializerForMultiRequest") - void serialize_multipleRequests_DiffTypes(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_multipleRequests_DiffTypes(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequests graphQLRequests = new GraphQLRequests( new GraphQLRequest(new EventsByCategoryAndStatusQueryRequest()), new GraphQLRequest(new UpdateIssueMutationRequest())); @@ -438,7 +488,8 @@ void serialize_multipleRequests_DiffTypes(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_multipleRequests_NullRequest(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequests graphQLRequests = new GraphQLRequests( new GraphQLRequest(new EventsByCategoryAndStatusQueryRequest()), null); @@ -448,7 +499,8 @@ void serialize_multipleRequests_NullRequest(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_multipleRequests_NullRequestRequest(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequests graphQLRequests = new GraphQLRequests( new GraphQLRequest(new EventsByCategoryAndStatusQueryRequest()), new GraphQLRequest(null)); @@ -458,14 +510,11 @@ void serialize_multipleRequests_NullRequestRequest(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_multipleRequests_NoRequests(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequests graphQLRequests = new GraphQLRequests(); assertThrows(IllegalArgumentException.class, () -> serializer.apply(graphQLRequests)); } - private static String jsonQuery(String expectedQueryDecorator) { - return String.format("{\"query\":\"%s\"}", expectedQueryDecorator.replace("\\", "\\\\").replace("\"", "\\\"")); - } - } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResultTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResultTest.java index c84180ef1..47cfcc48b 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResultTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResultTest.java @@ -13,6 +13,28 @@ class GraphQLResultTest { + private static GraphQLError getGraphQLErrorO() { + GraphQLErrorSourceLocation sourceLocation = new GraphQLErrorSourceLocation(); + sourceLocation.setColumn(4); + sourceLocation.setLine(5); + sourceLocation.setSourceName("6"); + GraphQLError graphQLError = new GraphQLError(); + graphQLError.setErrorType(GraphQLErrorType.ValidationError); + graphQLError.setExtensions(singletonMap("extKey", "extValue")); + graphQLError.setLocations(singletonList(sourceLocation)); + graphQLError.setMessage("something went wrong"); + graphQLError.setPath(singletonList("/order/items[0]/product")); + return graphQLError; + } + + private static GraphQLError getGraphQLError1() { + return new GraphQLError("something went very wrong", + singletonList(new GraphQLErrorSourceLocation(1, 2, "3")), + GraphQLErrorType.ExecutionAborted, + singletonList("/order/items[1]/product"), + singletonMap("extKey1", "extValue1")); + } + @Test void noErrorsEmpty() { assertFalse(new GraphQLResult<>(new UpdateIssueInput(), emptyList()).hasErrors()); @@ -51,26 +73,4 @@ void checkGetters() { assertEquals("extValue", graphQLError.getExtensions().get("extKey").toString()); } - private static GraphQLError getGraphQLErrorO() { - GraphQLErrorSourceLocation sourceLocation = new GraphQLErrorSourceLocation(); - sourceLocation.setColumn(4); - sourceLocation.setLine(5); - sourceLocation.setSourceName("6"); - GraphQLError graphQLError = new GraphQLError(); - graphQLError.setErrorType(GraphQLErrorType.ValidationError); - graphQLError.setExtensions(singletonMap("extKey", "extValue")); - graphQLError.setLocations(singletonList(sourceLocation)); - graphQLError.setMessage("something went wrong"); - graphQLError.setPath(singletonList("/order/items[0]/product")); - return graphQLError; - } - - private static GraphQLError getGraphQLError1() { - return new GraphQLError("something went very wrong", - singletonList(new GraphQLErrorSourceLocation(1, 2, "3")), - GraphQLErrorType.ExecutionAborted, - singletonList("/order/items[1]/product"), - singletonMap("extKey1", "extValue1")); - } - } \ 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 f1e5a42b6..c07845db8 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 @@ -2,8 +2,9 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer; -import java.util.StringJoiner; + import java.util.Objects; +import java.util.StringJoiner; /** * Parametrized input for field parent in type EventProperty 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 a26bd8348..8e23e057c 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 @@ -56,11 +56,13 @@ public EventPropertyResponseProjection child(String alias, EventPropertyResponse return this; } - public EventPropertyResponseProjection child(EventPropertyChildParametrizedInput input, EventPropertyResponseProjection subProjection) { + public EventPropertyResponseProjection child(EventPropertyChildParametrizedInput input, + EventPropertyResponseProjection subProjection) { return child(null, input, subProjection); } - public EventPropertyResponseProjection child(String alias, EventPropertyChildParametrizedInput input, EventPropertyResponseProjection subProjection) { + public EventPropertyResponseProjection child(String alias, EventPropertyChildParametrizedInput input, + EventPropertyResponseProjection subProjection) { fields.add(new GraphQLResponseField("child").alias(alias).parameters(input).projection(subProjection)); return this; } @@ -74,11 +76,13 @@ public EventPropertyResponseProjection parent(String alias, EventResponseProject return this; } - public EventPropertyResponseProjection parent(EventPropertyParentParametrizedInput input, EventResponseProjection subProjection) { + public EventPropertyResponseProjection parent(EventPropertyParentParametrizedInput input, + EventResponseProjection subProjection) { return parent(null, input, subProjection); } - public EventPropertyResponseProjection parent(String alias, EventPropertyParentParametrizedInput input, EventResponseProjection subProjection) { + public EventPropertyResponseProjection parent(String alias, EventPropertyParentParametrizedInput input, + EventResponseProjection subProjection) { fields.add(new GraphQLResponseField("parent").alias(alias).parameters(input).projection(subProjection)); return this; } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByCategoryAndStatusQueryRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByCategoryAndStatusQueryRequest.java index abe64b721..a6688e988 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByCategoryAndStatusQueryRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByCategoryAndStatusQueryRequest.java @@ -1,16 +1,21 @@ package com.kobylynskyi.graphql.codegen.model.graphql.data; -import java.util.*; -import com.kobylynskyi.graphql.codegen.model.graphql.*; +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation; +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest; + +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; public class EventsByCategoryAndStatusQueryRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.QUERY; private static final String OPERATION_NAME = "eventsByCategoryAndStatus"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public EventsByCategoryAndStatusQueryRequest() { } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByIdsQueryRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByIdsQueryRequest.java index f9494be21..9964789d9 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByIdsQueryRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByIdsQueryRequest.java @@ -14,10 +14,9 @@ public class EventsByIdsQueryRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.QUERY; private static final String OPERATION_NAME = "eventsByIds"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public EventsByIdsQueryRequest() { } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDate2MutationRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDate2MutationRequest.java index 3ca513952..aad4443ac 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDate2MutationRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDate2MutationRequest.java @@ -13,10 +13,9 @@ public class UpdateDate2MutationRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.MUTATION; private static final String OPERATION_NAME = "updateDate"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public UpdateDate2MutationRequest() { } @@ -25,11 +24,6 @@ public UpdateDate2MutationRequest(String alias) { this.alias = alias; } - public void setInput(ZonedDateTime input) { - this.input.put("input", input); - this.useObjectMapperForInputSerialization.add("input"); - } - @Override public GraphQLOperation getOperationType() { return OPERATION_TYPE; @@ -50,6 +44,11 @@ public Map getInput() { return input; } + public void setInput(ZonedDateTime input) { + this.input.put("input", input); + this.useObjectMapperForInputSerialization.add("input"); + } + @Override public Set getUseObjectMapperForInputSerialization() { return useObjectMapperForInputSerialization; diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDateMutationRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDateMutationRequest.java index 869e5aa05..a89caff37 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDateMutationRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDateMutationRequest.java @@ -12,10 +12,9 @@ public class UpdateDateMutationRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.MUTATION; private static final String OPERATION_NAME = "updateDate"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public UpdateDateMutationRequest() { } @@ -24,10 +23,6 @@ public UpdateDateMutationRequest(String alias) { this.alias = alias; } - public void setInput(DateInput input) { - this.input.put("input", input); - } - @Override public GraphQLOperation getOperationType() { return OPERATION_TYPE; @@ -48,4 +43,8 @@ public Map getInput() { return input; } + public void setInput(DateInput input) { + this.input.put("input", input); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueInput.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueInput.java index 15098d89e..c913d8373 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueInput.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueInput.java @@ -22,7 +22,8 @@ public UpdateIssueInput() { } public UpdateIssueInput(Double floatVal, Boolean booleanVal, Integer intVal, String stringVal, Status enumVal, - UpdateIssueInput objectWithNullDefault, Collection intList, Collection stringListEmptyDefault) { + UpdateIssueInput objectWithNullDefault, Collection intList, + Collection stringListEmptyDefault) { this.floatVal = floatVal; this.booleanVal = booleanVal; this.intVal = intVal; @@ -183,7 +184,8 @@ public Builder setStringListEmptyDefault(Collection stringListEmptyDefau } public UpdateIssueInput build() { - return new UpdateIssueInput(floatVal, booleanVal, intVal, stringVal, enumVal, objectWithNullDefault, intList, stringListEmptyDefault); + return new UpdateIssueInput(floatVal, booleanVal, intVal, stringVal, enumVal, objectWithNullDefault, + intList, stringListEmptyDefault); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueMutationRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueMutationRequest.java index 27acd6766..cfa8b3f75 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueMutationRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueMutationRequest.java @@ -12,10 +12,9 @@ public class UpdateIssueMutationRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.MUTATION; private static final String OPERATION_NAME = "updateIssue"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public UpdateIssueMutationRequest() { } @@ -24,10 +23,6 @@ public UpdateIssueMutationRequest(String alias) { this.alias = alias; } - public void setInput(UpdateIssueInput input) { - this.input.put("input", input); - } - @Override public GraphQLOperation getOperationType() { return OPERATION_TYPE; @@ -48,4 +43,8 @@ public Map getInput() { return input; } + public void setInput(UpdateIssueInput input) { + this.input.put("input", input); + } + } 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 ff799ba42..7103f6063 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 @@ -24,7 +24,8 @@ public UpdateNodeUnionResponseProjection onOrganization(OrganizationResponseProj return onOrganization(null, subProjection); } - public UpdateNodeUnionResponseProjection onOrganization(String alias, OrganizationResponseProjection subProjection) { + public UpdateNodeUnionResponseProjection onOrganization(String alias, + OrganizationResponseProjection subProjection) { fields.add(new GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)); return this; } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/VersionQueryRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/VersionQueryRequest.java index b275eb46e..5a8bf8782 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/VersionQueryRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/VersionQueryRequest.java @@ -13,10 +13,9 @@ public class VersionQueryRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.QUERY; private static final String OPERATION_NAME = "version"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public VersionQueryRequest() { } @@ -25,6 +24,10 @@ public VersionQueryRequest(String alias) { this.alias = alias; } + public static Builder builder() { + return new Builder(); + } + @Override public GraphQLOperation getOperationType() { return OPERATION_TYPE; @@ -55,10 +58,6 @@ public String toString() { return Objects.toString(input); } - public static Builder builder() { - return new Builder(); - } - public static class Builder { 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 c86a58cec..91c545a5d 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java @@ -43,16 +43,22 @@ void cleanup() { @Test void generate_CustomAnnotationMappings() throws Exception { - mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("Event.createdDateTime", "org.joda.time.DateTime"))); + mappingConfig + .setCustomTypesMapping(new HashMap<>(singletonMap("Event.createdDateTime", "org.joda.time.DateTime"))); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime", - singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[com.example.json.DateTimeScalarDeserializer])")))); + singletonList( + "@com.fasterxml.jackson.databind" + + ".annotation.JsonDeserialize(using =" + + " classOf[com.example.json" + + ".DateTimeScalarDeserializer])")))); new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.scala", - " @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[com.example.json.DateTimeScalarDeserializer])\n" + + " @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[com.example.json.DateTimeScalarDeserializer])\n" + " createdDateTime: org.joda.time.DateTime,"); } @@ -60,15 +66,23 @@ void generate_CustomAnnotationMappings() throws Exception { void generate_CustomAnnotationMappings_Class() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // input - customAnnotationsMapping.put("AcceptTopicSuggestionInput", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AcceptTopicSuggestionInputDeserializer])")); + customAnnotationsMapping.put("AcceptTopicSuggestionInput", singletonList( + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AcceptTopicSuggestionInputDeserializer])")); // type - customAnnotationsMapping.put("AcceptTopicSuggestionPayload", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AcceptTopicSuggestionPayloadDeserializer])")); + customAnnotationsMapping.put("AcceptTopicSuggestionPayload", singletonList( + "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AcceptTopicSuggestionPayloadDeserializer])")); // interface - customAnnotationsMapping.put("Actor", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[ActorDeserializer])")); + customAnnotationsMapping.put("Actor", singletonList( + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[ActorDeserializer])")); // union - customAnnotationsMapping.put("Assignee", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AssigneeDeserializer])")); + customAnnotationsMapping.put("Assignee", singletonList( + "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AssigneeDeserializer])")); // enum - customAnnotationsMapping.put("DeploymentOrderField", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[DeploymentOrderFieldDeserializer])")); + customAnnotationsMapping.put("DeploymentOrderField", singletonList( + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[DeploymentOrderFieldDeserializer])")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), @@ -76,19 +90,24 @@ 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" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AcceptTopicSuggestionInputDeserializer])\n" + "case class AcceptTopicSuggestionInput"); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AcceptTopicSuggestionPayloadDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AcceptTopicSuggestionPayloadDeserializer])\n" + "case class AcceptTopicSuggestionPayload"); assertFileContainsElements(files, "Actor.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[ActorDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[ActorDeserializer])\n" + "trait Actor"); assertFileContainsElements(files, "Assignee.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AssigneeDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AssigneeDeserializer])\n" + "trait Assignee"); assertFileContainsElements(files, "DeploymentOrderField.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[DeploymentOrderFieldDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[DeploymentOrderFieldDeserializer])\n" + "object DeploymentOrderField extends Enumeration"); } @@ -97,26 +116,35 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // type customAnnotationsMapping.put("AcceptTopicSuggestionPayload", Arrays.asList( - "@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])")); + "@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])")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); 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" + - "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])\n" + - "case class AcceptTopicSuggestionPayload"); + assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", + "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson" + + ".annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")\n" + + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github" + + ".kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])\n" + + "case class AcceptTopicSuggestionPayload"); } @Test void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // request - customAnnotationsMapping.put("CodeOfConductQueryRequest", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[CodeOfConductQueryRequestDeserializer])")); + customAnnotationsMapping.put("CodeOfConductQueryRequest", singletonList( + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[CodeOfConductQueryRequestDeserializer])")); // response - customAnnotationsMapping.put("CodeOfConductQueryResponse", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[CodeOfConductQueryResponseDeserializer])")); + customAnnotationsMapping.put("CodeOfConductQueryResponse", singletonList( + "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[CodeOfConductQueryResponseDeserializer])")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); mappingConfig.setGenerateClient(true); @@ -125,18 +153,24 @@ 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" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[CodeOfConductQueryRequestDeserializer])\n" + "class CodeOfConductQueryRequest"); assertFileContainsElements(files, "CodeOfConductQueryResponse.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[CodeOfConductQueryResponseDeserializer])\n" + - "class CodeOfConductQueryResponse extends GraphQLResult[JMap[String, CodeOfConduct]]"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[CodeOfConductQueryResponseDeserializer])\n" + + "class CodeOfConductQueryResponse extends GraphQLResult[JMap[String, " + + "CodeOfConduct]]"); } @Test void generate_Directives() throws Exception { Map> directiveAnnotationsMapping = new HashMap<>(); directiveAnnotationsMapping.put("auth", - singletonList("@com.example.CustomAnnotation(roles={{roles?toArray}}, boo={{boo?toArray}}, float={{float?toArrayOfStrings}}, int={{int}}, n={{n?toString}})")); + singletonList( + "@com.example.CustomAnnotation(roles={{roles?toArray}}, " + + "boo={{boo?toArray}}, float={{float?toArrayOfStrings}}, int={{int}}, " + + "n={{n?toString}})")); mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping); new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), 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 cd8fd670e..edfd19d0d 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java @@ -1,7 +1,6 @@ package com.kobylynskyi.graphql.codegen.scala; import com.kobylynskyi.graphql.codegen.TestUtils; -import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; import com.kobylynskyi.graphql.codegen.utils.Utils; @@ -15,7 +14,9 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; -import static java.util.Collections.*; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; class GraphQLCodegenCustomScalarMappingTest { @@ -48,7 +49,8 @@ void generate_CustomTypeMapping_WholeScalar() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt"), + new File("src/test/resources/expected-classes/scala/custom-type/" + + "QueryINeedQueryRequest_whole_scalar.scala.txt"), getFileByName(files, "QueryINeedQueryRequest.scala")); } @@ -84,7 +86,9 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/" + + "QueryINeedQueryRequest_custom_serializer.scala.txt"), getFileByName(files, "QueryINeedQueryRequest.scala")); } } 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 aa9057d72..37c0828a8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java @@ -39,16 +39,20 @@ 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(); + new ScalaGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/deprecated-with-msg.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("CreateEventMutationResolver.scala", "Event.scala", "EventInput.scala", "EventsQueryResolver.scala", - "MutationResolver.scala", "Node.scala", "PinnableItem.scala", "QueryResolver.scala", "Status.scala"), generatedFileNames); + assertEquals(Arrays.asList("CreateEventMutationResolver.scala", "Event.scala", "EventInput.scala", + "EventsQueryResolver.scala", + "MutationResolver.scala", "Node.scala", "PinnableItem.scala", "QueryResolver.scala", + "Status.scala"), generatedFileNames); for (File file : files) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/scala/deprecated/%s.txt", file.getName())), + new File(String.format("src/test/resources/expected-classes/scala/deprecated/%s.txt", + file.getName())), file); } } 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 bddbed4ed..e23c86c10 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java @@ -43,12 +43,14 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); assertEquals(new HashSet<>(asList("Node.scala", "Event.scala", "MutationResolver.scala", - "EventInput.scala", "QueryResolver.scala", "Status.scala", "PinnableItem.scala")), + "EventInput.scala", "QueryResolver.scala", "Status.scala", + "PinnableItem.scala")), generatedFileNames); for (File file : files) { @@ -62,7 +64,8 @@ void generateServerSideClasses() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).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 52b680ed2..cad60cdf5 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java @@ -11,7 +11,12 @@ import java.io.File; import java.nio.file.Paths; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; @@ -39,7 +44,8 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -60,7 +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(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -81,7 +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(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -102,7 +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(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -120,24 +129,30 @@ void generatePrimitiveTypesResponseResolverClasses() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); schemaFinder.setIncludePattern("null-extend1.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/resolver/" + + "SimpleEventCountsQueryResponse.scala.txt"), getFileByName(files, "SimpleEventCountsQueryResponse.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/resolver/" + + "SimpleEventCountsQueryResolver.scala.txt"), getFileByName(files, "SimpleEventCountsQueryResolver.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountQueryResolver.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/resolver/" + + "SimpleEventCountQueryResolver.scala.txt"), getFileByName(files, "SimpleEventCountQueryResolver.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountQueryResponse.scala.txt"), + new File( + "src/test/resources/expected-classes/scala/extend/resolver/" + + "SimpleEventCountQueryResponse.scala.txt"), getFileByName(files, "SimpleEventCountQueryResponse.scala")); } @@ -145,10 +160,12 @@ void generatePrimitiveTypesResponseResolverClasses() throws Exception { void generatePrimitiveTypesResponseResolverClasses_With_SetUseOptionalForNullableReturnTypes() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); - //Therefore, when the return type is a primitive type, the return option is automatically turned on, and this is mandatory. + //Therefore, when the return type is a primitive type, the return option is automatically turned on, and this + // is mandatory. mappingConfig.setUseOptionalForNullableReturnTypes(true); schemaFinder.setIncludePattern("null-extend2.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -167,20 +184,25 @@ void generatePrimitiveTypesResponseResolverClasses_Without_SetUseOptionalForNull mappingConfig.setGenerateClient(true); mappingConfig.setUseOptionalForNullableReturnTypes(false); schemaFinder.setIncludePattern("null-extend2.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).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 is mandatory. + //Therefore, when the return type is a primitive type, the return option is automatically turned on, and this + // is mandatory. assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountQueryResolver.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/nullreturn/" + + "SimpleEventCountQueryResolver.scala.txt"), getFileByName(files, "SimpleEventCountQueryResolver.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/nullreturn/" + + "SimpleEventCountsQueryResolver.scala.txt"), getFileByName(files, "SimpleEventCountsQueryResolver.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver_without_option.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/nullreturn/" + + "SimplesQueryResolver_without_option.scala.txt"), getFileByName(files, "SimplesQueryResolver.scala")); } @@ -190,7 +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(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -225,18 +248,21 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setGenerateToString(true); mappingConfig.setGenerateEqualsAndHashCode(true); Map maps = new HashMap<>(); - maps.put("Int", "Int");// Now, That's the only way to do it. + maps.put("Int", "Int"); // Now, That's the only way to do it. mappingConfig.setCustomTypesMapping(maps); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/optional/InterfaceWithOptionalField.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/optional/InterfaceWithOptionalField.scala.txt"), getFileByName(files, "InterfaceWithOptionalField.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt"), getFileByName(files, "TypeWithMandatoryField.scala")); } } \ 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 0556513f1..4d8f9cdef 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java @@ -1,6 +1,5 @@ package com.kobylynskyi.graphql.codegen.scala; -import com.kobylynskyi.graphql.codegen.GraphQLCodegen; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -25,6 +24,10 @@ class GraphQLCodegenGitHubTest { private final File outputScalaClassesDir = 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); @@ -97,7 +100,8 @@ void generate_NoValidationAnnotation() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File commitFile = getFileByName(Objects.requireNonNull(outputScalaClassesDir.listFiles()), "Commit.scala"); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt"), commitFile); } @@ -110,9 +114,12 @@ void generate_Client_ConditionalFragments() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/SearchResultItemConnectionResponseProjection.scala.txt"), + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/scala" + + "/SearchResultItemConnectionResponseProjection.scala.txt"), getFileByName(files, "SearchResultItemConnectionResponseProjection.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/SearchResultItemResponseProjection.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/SearchResultItemResponseProjection.scala.txt"), getFileByName(files, "SearchResultItemResponseProjection.scala")); } @@ -127,7 +134,8 @@ void generate_NoPrimitives() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt"), getFileByName(files, "Commit.scala")); } @@ -146,10 +154,6 @@ void generate_Primitives() throws Exception { getFileByName(files, "Commit.scala")); } - private static String getFileContent(File[] files, String fileName) throws IOException { - return Utils.getFileContent(getFileByName(files, fileName).getPath()); - } - @Test void generate_ResponseWithPrimitiveType() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); @@ -159,7 +163,8 @@ void generate_ResponseWithPrimitiveType() throws Exception { File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/VersionQueryResponse_int.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/VersionQueryResponse_int.scala.txt"), getFileByName(files, "VersionQueryResponse.scala")); } @@ -169,18 +174,24 @@ void generate_ScalaList() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt"), getFileByName(files, "AddLabelsToLabelableInput.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt"), getFileByName(files, "AddLabelsToLabelableMutationRequest.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationResolver.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationResolver.scala.txt"), getFileByName(files, "AddLabelsToLabelableMutationResolver.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationResponse.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationResponse.scala.txt"), getFileByName(files, "AddLabelsToLabelableMutationResponse.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt"), getFileByName(files, "AddLabelsToLabelablePayload.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt"), getFileByName(files, "CodesOfConductQueryResolver.scala")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java index c7fef53b3..f5d0cd588 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java @@ -37,9 +37,10 @@ public void setup() { } @Test - void generate_SetGenerateBuilder_FALSE() throws Exception { + void generate_SetGenerateBuilder_False() throws Exception { mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot"); - mappingConfig.setGenerateBuilder(false);// fix bug when, set generate builder = false, can not use object.OPERATION_NAME, + // fix an issue when generateBuilder=false => can not use object.OPERATION_NAME + mappingConfig.setGenerateBuilder(false); mappingConfig.setGenerateEqualsAndHashCode(true); mappingConfig.setGenerateClient(true); mappingConfig.setGenerateModelsForRootTypes(true); @@ -48,7 +49,9 @@ void generate_SetGenerateBuilder_FALSE() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> f.equals("CaseQueryRequest.scala")).sorted().collect(toList()); + List generatedFileNames = Arrays.stream(files).map(File::getName) + .filter(f -> f.equals("CaseQueryRequest.scala")).sorted() + .collect(toList()); assertEquals(singletonList("CaseQueryRequest.scala"), generatedFileNames); for (File file : files) { @@ -60,7 +63,7 @@ void generate_SetGenerateBuilder_FALSE() throws Exception { } @Test - void generate_SetGenerateClient_TRUE() throws Exception { + void generate_SetGenerateClient_True() throws Exception { mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot"); mappingConfig.setGenerateEqualsAndHashCode(true); mappingConfig.setGenerateClient(true); @@ -75,13 +78,16 @@ void generate_SetGenerateClient_TRUE() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).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().collect(toList()); + 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); for (File file : files) { if (Arrays.asList("QueryPrivateParametrizedInput.scala", "Synchronized.scala").contains(file.getName())) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", file.getName())), + new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", + file.getName())), file); } } @@ -103,14 +109,17 @@ void generate_SetGenerateClient_False() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> Objects.equals("Synchronized.scala", f) - || Objects.equals("QueryCaseParametrizedInput.scala", f)).sorted().collect(toList()); + List generatedFileNames = Arrays.stream(files).map(File::getName) + .filter(f -> Objects.equals("Synchronized.scala", f) + || Objects.equals("QueryCaseParametrizedInput.scala", f)) + .sorted().collect(toList()); assertEquals(singletonList("Synchronized.scala"), generatedFileNames); for (File file : files) { if (Arrays.asList("QueryCaseParametrizedInput.scala", "Synchronized.scala").contains(file.getName())) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", "TOSTRING_Synchronized.scala", + new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", + "TOSTRING_Synchronized.scala", "QueryCaseParametrizedInput")), 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 57f978299..d2dd0c9aa 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java @@ -43,7 +43,8 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -61,11 +62,13 @@ 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(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt"), getFileByName(files, "UsersQueryResolver.scala")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/supplier/JsonMappingConfigSupplierTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/supplier/JsonMappingConfigSupplierTest.java index 055120fdb..554692662 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/supplier/JsonMappingConfigSupplierTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/supplier/JsonMappingConfigSupplierTest.java @@ -12,7 +12,8 @@ class JsonMappingConfigSupplierTest { @Test void loadCorrect() { - MappingConfig externalMappingConfig = new JsonMappingConfigSupplier("src/test/resources/json/mappingconfig.json").get(); + MappingConfig externalMappingConfig = new JsonMappingConfigSupplier( + "src/test/resources/json/mappingconfig.json").get(); assertEquals("com.kobylynskyi.graphql.testconfigjson", externalMappingConfig.getPackageName()); assertTrue(externalMappingConfig.getGenerateApis()); assertEquals("java.math.BigDecimal", externalMappingConfig.getCustomTypesMapping().get("Price.amount")); diff --git a/src/test/resources/schemas/defaults-with-Long.graphqls b/src/test/resources/schemas/defaults-with-Long.graphqls index 514ea79d7..ce1a610c3 100644 --- a/src/test/resources/schemas/defaults-with-Long.graphqls +++ b/src/test/resources/schemas/defaults-with-Long.graphqls @@ -1,4 +1,3 @@ - # This input has all possible types input InputWithDefaults { floatVal: Float = 1.23 diff --git a/src/test/resources/schemas/defaults.graphqls b/src/test/resources/schemas/defaults.graphqls index ef1bc5c00..5347493fc 100644 --- a/src/test/resources/schemas/defaults.graphqls +++ b/src/test/resources/schemas/defaults.graphqls @@ -1,4 +1,3 @@ - # This input has all possible types input InputWithDefaults { floatVal: Float = 1.23 diff --git a/src/test/resources/schemas/github.graphqls b/src/test/resources/schemas/github.graphqls index 10b2417bf..84c12beb4 100644 --- a/src/test/resources/schemas/github.graphqls +++ b/src/test/resources/schemas/github.graphqls @@ -1,1589 +1,1588 @@ - input AcceptTopicSuggestionInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - repositoryId: ID! + repositoryId: ID! } type AcceptTopicSuggestionPayload { - clientMutationId: String + clientMutationId: String - topic: Topic + topic: Topic } interface Actor { - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - login: String! + login: String! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } input AddAssigneesToAssignableInput { - assignableId: ID! + assignableId: ID! - assigneeIds: [ID!]! + assigneeIds: [ID!]! - clientMutationId: String + clientMutationId: String } type AddAssigneesToAssignablePayload { - assignable: Assignable + assignable: Assignable - clientMutationId: String + clientMutationId: String } input AddCommentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - subjectId: ID! + subjectId: ID! } type AddCommentPayload { - clientMutationId: String + clientMutationId: String - commentEdge: IssueCommentEdge + commentEdge: IssueCommentEdge - subject: Node + subject: Node - timelineEdge: IssueTimelineItemEdge + timelineEdge: IssueTimelineItemEdge } input AddLabelsToLabelableInput { - clientMutationId: String + clientMutationId: String - labelIds: [ID!]! + labelIds: [ID!]! - labelableId: ID! + labelableId: ID! } type AddLabelsToLabelablePayload { - clientMutationId: String + clientMutationId: String - labelable: Labelable + labelable: Labelable } input AddProjectCardInput { - clientMutationId: String + clientMutationId: String - contentId: ID + contentId: ID - note: String + note: String - projectColumnId: ID! + projectColumnId: ID! } type AddProjectCardPayload { - cardEdge: ProjectCardEdge + cardEdge: ProjectCardEdge - clientMutationId: String + clientMutationId: String - projectColumn: ProjectColumn + projectColumn: ProjectColumn } input AddProjectColumnInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - projectId: ID! + projectId: ID! } type AddProjectColumnPayload { - clientMutationId: String + clientMutationId: String - columnEdge: ProjectColumnEdge + columnEdge: ProjectColumnEdge - project: Project + project: Project } input AddPullRequestReviewCommentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - commitOID: GitObjectID + commitOID: GitObjectID - inReplyTo: ID + inReplyTo: ID - path: String + path: String - position: Int + position: Int - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type AddPullRequestReviewCommentPayload { - clientMutationId: String + clientMutationId: String - comment: PullRequestReviewComment + comment: PullRequestReviewComment - commentEdge: PullRequestReviewCommentEdge + commentEdge: PullRequestReviewCommentEdge } input AddPullRequestReviewInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - comments: [DraftPullRequestReviewComment] + comments: [DraftPullRequestReviewComment] - commitOID: GitObjectID + commitOID: GitObjectID - event: PullRequestReviewEvent + event: PullRequestReviewEvent - pullRequestId: ID! + pullRequestId: ID! } type AddPullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview - reviewEdge: PullRequestReviewEdge + reviewEdge: PullRequestReviewEdge } input AddReactionInput { - clientMutationId: String + clientMutationId: String - content: ReactionContent! + content: ReactionContent! - subjectId: ID! + subjectId: ID! } type AddReactionPayload { - clientMutationId: String + clientMutationId: String - reaction: Reaction + reaction: Reaction - subject: Reactable + subject: Reactable } input AddStarInput { - clientMutationId: String + clientMutationId: String - starrableId: ID! + starrableId: ID! } type AddStarPayload { - clientMutationId: String + clientMutationId: String - starrable: Starrable + starrable: Starrable } type AddedToProjectEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type App implements Node { - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - description: String - id: ID! + description: String + id: ID! - logoBackgroundColor: String! + logoBackgroundColor: String! - logoUrl( - size: Int - ): URI! + logoUrl( + size: Int + ): URI! - name: String! + name: String! - slug: String! + slug: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type AppEdge { - cursor: String! + cursor: String! - node: App + node: App } interface Assignable { - assignees( - after: String + assignees( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! } type AssignedEvent implements Node { - actor: Actor + actor: Actor - assignable: Assignable! + assignable: Assignable! - assignee: Assignee + assignee: Assignee - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - user: User @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") + user: User @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") } union Assignee = Bot | Mannequin | Organization | User type BaseRefChangedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type BaseRefForcePushedEvent implements Node { - actor: Actor + actor: Actor - afterCommit: Commit + afterCommit: Commit - beforeCommit: Commit + beforeCommit: Commit - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - ref: Ref + ref: Ref } type Blame { - ranges: [BlameRange!]! + ranges: [BlameRange!]! } type BlameRange { - age: Int! + age: Int! - commit: Commit! + commit: Commit! - endingLine: Int! + endingLine: Int! - startingLine: Int! + startingLine: Int! } type Blob implements GitObject & Node { - abbreviatedOid: String! + abbreviatedOid: String! - byteSize: Int! + byteSize: Int! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! - id: ID! + commitUrl: URI! + id: ID! - isBinary: Boolean! + isBinary: Boolean! - isTruncated: Boolean! + isTruncated: Boolean! - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! - text: String + text: String } type Bot implements Actor & Node & UniformResourceLocatable { - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - login: String! + login: String! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type BranchProtectionRule implements Node { - branchProtectionRuleConflicts( - after: String + branchProtectionRuleConflicts( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): BranchProtectionRuleConflictConnection! + last: Int + ): BranchProtectionRuleConflictConnection! - creator: Actor + creator: Actor - databaseId: Int + databaseId: Int - dismissesStaleReviews: Boolean! - id: ID! + dismissesStaleReviews: Boolean! + id: ID! - isAdminEnforced: Boolean! + isAdminEnforced: Boolean! - matchingRefs( - after: String + matchingRefs( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RefConnection! + last: Int + ): RefConnection! - pattern: String! + pattern: String! - pushAllowances( - after: String + pushAllowances( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PushAllowanceConnection! + last: Int + ): PushAllowanceConnection! - repository: Repository + repository: Repository - requiredApprovingReviewCount: Int + requiredApprovingReviewCount: Int - requiredStatusCheckContexts: [String] + requiredStatusCheckContexts: [String] - requiresApprovingReviews: Boolean! + requiresApprovingReviews: Boolean! - requiresCodeOwnerReviews: Boolean! + requiresCodeOwnerReviews: Boolean! - requiresCommitSignatures: Boolean! + requiresCommitSignatures: Boolean! - requiresStatusChecks: Boolean! + requiresStatusChecks: Boolean! - requiresStrictStatusChecks: Boolean! + requiresStrictStatusChecks: Boolean! - restrictsPushes: Boolean! + restrictsPushes: Boolean! - restrictsReviewDismissals: Boolean! + restrictsReviewDismissals: Boolean! - reviewDismissalAllowances( - after: String + reviewDismissalAllowances( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ReviewDismissalAllowanceConnection! + last: Int + ): ReviewDismissalAllowanceConnection! } type BranchProtectionRuleConflict { - branchProtectionRule: BranchProtectionRule + branchProtectionRule: BranchProtectionRule - conflictingBranchProtectionRule: BranchProtectionRule + conflictingBranchProtectionRule: BranchProtectionRule - ref: Ref + ref: Ref } type BranchProtectionRuleConflictConnection { - edges: [BranchProtectionRuleConflictEdge] + edges: [BranchProtectionRuleConflictEdge] - nodes: [BranchProtectionRuleConflict] + nodes: [BranchProtectionRuleConflict] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type BranchProtectionRuleConflictEdge { - cursor: String! + cursor: String! - node: BranchProtectionRuleConflict + node: BranchProtectionRuleConflict } type BranchProtectionRuleConnection { - edges: [BranchProtectionRuleEdge] + edges: [BranchProtectionRuleEdge] - nodes: [BranchProtectionRule] + nodes: [BranchProtectionRule] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type BranchProtectionRuleEdge { - cursor: String! + cursor: String! - node: BranchProtectionRule + node: BranchProtectionRule } input ChangeUserStatusInput { - clientMutationId: String + clientMutationId: String - emoji: String + emoji: String - expiresAt: DateTime + expiresAt: DateTime - limitedAvailability: Boolean = false + limitedAvailability: Boolean = false - message: String + message: String - organizationId: ID + organizationId: ID } type ChangeUserStatusPayload { - clientMutationId: String + clientMutationId: String - status: UserStatus + status: UserStatus } input ClearLabelsFromLabelableInput { - clientMutationId: String + clientMutationId: String - labelableId: ID! + labelableId: ID! } type ClearLabelsFromLabelablePayload { - clientMutationId: String + clientMutationId: String - labelable: Labelable + labelable: Labelable } input CloneProjectInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - includeWorkflows: Boolean! + includeWorkflows: Boolean! - name: String! + name: String! - public: Boolean + public: Boolean - sourceId: ID! + sourceId: ID! - targetOwnerId: ID! + targetOwnerId: ID! } type CloneProjectPayload { - clientMutationId: String + clientMutationId: String - jobStatusId: String + jobStatusId: String - project: Project + project: Project } input CloneTemplateRepositoryInput { - clientMutationId: String + clientMutationId: String - description: String + description: String - name: String! + name: String! - ownerId: ID! + ownerId: ID! - repositoryId: ID! + repositoryId: ID! - visibility: RepositoryVisibility! + visibility: RepositoryVisibility! } type CloneTemplateRepositoryPayload { - clientMutationId: String + clientMutationId: String - repository: Repository + repository: Repository } interface Closable { - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime } input CloseIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } type CloseIssuePayload { - clientMutationId: String + clientMutationId: String - issue: Issue + issue: Issue } input ClosePullRequestInput { - clientMutationId: String + clientMutationId: String - pullRequestId: ID! + pullRequestId: ID! } type ClosePullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } type ClosedEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - closable: Closable! + closable: Closable! - closer: Closer + closer: Closer - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } union Closer = Commit | PullRequest type CodeOfConduct implements Node { - body: String - id: ID! + body: String + id: ID! - key: String! + key: String! - name: String! + name: String! - resourcePath: URI + resourcePath: URI - url: URI + url: URI } enum CollaboratorAffiliation { - ALL + ALL - DIRECT + DIRECT - OUTSIDE + OUTSIDE } union CollectionItemContent = Organization | Repository | User interface Comment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - publishedAt: DateTime + publishedAt: DateTime - updatedAt: DateTime! + updatedAt: DateTime! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } enum CommentAuthorAssociation { - COLLABORATOR + COLLABORATOR - CONTRIBUTOR + CONTRIBUTOR - FIRST_TIMER + FIRST_TIMER - FIRST_TIME_CONTRIBUTOR + FIRST_TIME_CONTRIBUTOR - MEMBER + MEMBER - NONE + NONE - OWNER + OWNER } enum CommentCannotUpdateReason { - DENIED + DENIED - INSUFFICIENT_ACCESS + INSUFFICIENT_ACCESS - LOCKED + LOCKED - LOGIN_REQUIRED + LOGIN_REQUIRED - MAINTENANCE + MAINTENANCE - VERIFIED_EMAIL_REQUIRED + VERIFIED_EMAIL_REQUIRED } type CommentDeletedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type Commit implements GitObject & Node & Subscribable & UniformResourceLocatable { - abbreviatedOid: String! + abbreviatedOid: String! - additions: Int! + additions: Int! - associatedPullRequests( - after: String + associatedPullRequests( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: PullRequestOrder = {field: CREATED_AT, direction: ASC} - ): PullRequestConnection + orderBy: PullRequestOrder = {field: CREATED_AT, direction: ASC} + ): PullRequestConnection - author: GitActor + author: GitActor - authoredByCommitter: Boolean! + authoredByCommitter: Boolean! - authoredDate: DateTime! + authoredDate: DateTime! - blame( - path: String! - ): Blame! + blame( + path: String! + ): Blame! - changedFiles: Int! + changedFiles: Int! - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! + commitUrl: URI! - committedDate: DateTime! + committedDate: DateTime! - committedViaWeb: Boolean! + committedViaWeb: Boolean! - committer: GitActor + committer: GitActor - deletions: Int! + deletions: Int! - deployments( - after: String + deployments( + after: String - before: String + before: String - environments: [String!] + environments: [String!] - first: Int + first: Int - last: Int + last: Int - orderBy: DeploymentOrder = {field: CREATED_AT, direction: ASC} - ): DeploymentConnection + orderBy: DeploymentOrder = {field: CREATED_AT, direction: ASC} + ): DeploymentConnection - history( - after: String + history( + after: String - author: CommitAuthor + author: CommitAuthor - before: String + before: String - first: Int + first: Int - last: Int + last: Int - path: String + path: String - since: GitTimestamp + since: GitTimestamp - until: GitTimestamp - ): CommitHistoryConnection! - id: ID! + until: GitTimestamp + ): CommitHistoryConnection! + id: ID! - message: String! + message: String! - messageBody: String! + messageBody: String! - messageBodyHTML: HTML! + messageBodyHTML: HTML! - messageHeadline: String! + messageHeadline: String! - messageHeadlineHTML: HTML! + messageHeadlineHTML: HTML! - oid: GitObjectID! + oid: GitObjectID! - parents( - after: String + parents( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitConnection! + last: Int + ): CommitConnection! - pushedDate: DateTime + pushedDate: DateTime - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - signature: GitSignature + signature: GitSignature - status: Status + status: Status - tarballUrl: URI! + tarballUrl: URI! - tree: Tree! + tree: Tree! - treeResourcePath: URI! + treeResourcePath: URI! - treeUrl: URI! + treeUrl: URI! - url: URI! + url: URI! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState - zipballUrl: URI! + zipballUrl: URI! } input CommitAuthor { - emails: [String!] + emails: [String!] - id: ID + id: ID } type CommitComment implements Comment & Deletable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - commit: Commit + commit: Commit - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isMinimized: Boolean! + isMinimized: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - minimizedReason: String + minimizedReason: String - path: String + path: String - position: Int + position: Int - publishedAt: DateTime + publishedAt: DateTime - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanMinimize: Boolean! + viewerCanMinimize: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type CommitCommentConnection { - edges: [CommitCommentEdge] + edges: [CommitCommentEdge] - nodes: [CommitComment] + nodes: [CommitComment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CommitCommentEdge { - cursor: String! + cursor: String! - node: CommitComment + node: CommitComment } type CommitCommentThread implements Node & RepositoryNode { - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - commit: Commit! - id: ID! + commit: Commit! + id: ID! - path: String + path: String - position: Int + position: Int - repository: Repository! + repository: Repository! } type CommitConnection { - edges: [CommitEdge] + edges: [CommitEdge] - nodes: [Commit] + nodes: [Commit] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } input CommitContributionOrder { - direction: OrderDirection! + direction: OrderDirection! - field: CommitContributionOrderField! + field: CommitContributionOrderField! } enum CommitContributionOrderField { - COMMIT_COUNT + COMMIT_COUNT - OCCURRED_AT + OCCURRED_AT } type CommitContributionsByRepository { - contributions( - after: String + contributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: CommitContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedCommitContributionConnection! + orderBy: CommitContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedCommitContributionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type CommitEdge { - cursor: String! + cursor: String! - node: Commit + node: Commit } type CommitHistoryConnection { - edges: [CommitEdge] + edges: [CommitEdge] - nodes: [Commit] + nodes: [Commit] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ContentAttachment { - body: String! + body: String! - contentReference: ContentReference! + contentReference: ContentReference! - databaseId: Int! - id: ID! + databaseId: Int! + id: ID! - title: String! + title: String! } type ContentReference { - databaseId: Int! - id: ID! + databaseId: Int! + id: ID! - reference: String! + reference: String! } interface Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type ContributionCalendar { - colors: [String!]! + colors: [String!]! - isHalloween: Boolean! + isHalloween: Boolean! - months: [ContributionCalendarMonth!]! + months: [ContributionCalendarMonth!]! - totalContributions: Int! + totalContributions: Int! - weeks: [ContributionCalendarWeek!]! + weeks: [ContributionCalendarWeek!]! } type ContributionCalendarDay { - color: String! + color: String! - contributionCount: Int! + contributionCount: Int! - date: Date! + date: Date! - weekday: Int! + weekday: Int! } type ContributionCalendarMonth { - firstDay: Date! + firstDay: Date! - name: String! + name: String! - totalWeeks: Int! + totalWeeks: Int! - year: Int! + year: Int! } type ContributionCalendarWeek { - contributionDays: [ContributionCalendarDay!]! + contributionDays: [ContributionCalendarDay!]! - firstDay: Date! + firstDay: Date! } input ContributionOrder { - direction: OrderDirection! + direction: OrderDirection! - field: ContributionOrderField + field: ContributionOrderField } enum ContributionOrderField { - OCCURRED_AT + OCCURRED_AT } type ContributionsCollection { - commitContributionsByRepository( - maxRepositories: Int = 25 - ): [CommitContributionsByRepository!]! + commitContributionsByRepository( + maxRepositories: Int = 25 + ): [CommitContributionsByRepository!]! - contributionCalendar: ContributionCalendar! + contributionCalendar: ContributionCalendar! - contributionYears: [Int!]! + contributionYears: [Int!]! - doesEndInCurrentMonth: Boolean! + doesEndInCurrentMonth: Boolean! - earliestRestrictedContributionDate: Date + earliestRestrictedContributionDate: Date - endedAt: DateTime! + endedAt: DateTime! - firstIssueContribution: CreatedIssueOrRestrictedContribution + firstIssueContribution: CreatedIssueOrRestrictedContribution - firstPullRequestContribution: CreatedPullRequestOrRestrictedContribution + firstPullRequestContribution: CreatedPullRequestOrRestrictedContribution - firstRepositoryContribution: CreatedRepositoryOrRestrictedContribution + firstRepositoryContribution: CreatedRepositoryOrRestrictedContribution - hasActivityInThePast: Boolean! + hasActivityInThePast: Boolean! - hasAnyContributions: Boolean! + hasAnyContributions: Boolean! - hasAnyRestrictedContributions: Boolean! + hasAnyRestrictedContributions: Boolean! - isSingleDay: Boolean! + isSingleDay: Boolean! - issueContributions( - after: String + issueContributions( + after: String - before: String + before: String - excludeFirst: Boolean = false + excludeFirst: Boolean = false - excludePopular: Boolean = false + excludePopular: Boolean = false - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedIssueContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedIssueContributionConnection! - issueContributionsByRepository( - excludeFirst: Boolean = false + issueContributionsByRepository( + excludeFirst: Boolean = false - excludePopular: Boolean = false + excludePopular: Boolean = false - maxRepositories: Int = 25 - ): [IssueContributionsByRepository!]! + maxRepositories: Int = 25 + ): [IssueContributionsByRepository!]! - joinedGitHubContribution: JoinedGitHubContribution + joinedGitHubContribution: JoinedGitHubContribution - latestRestrictedContributionDate: Date + latestRestrictedContributionDate: Date - mostRecentCollectionWithActivity: ContributionsCollection + mostRecentCollectionWithActivity: ContributionsCollection - mostRecentCollectionWithoutActivity: ContributionsCollection + mostRecentCollectionWithoutActivity: ContributionsCollection - popularIssueContribution: CreatedIssueContribution + popularIssueContribution: CreatedIssueContribution - popularPullRequestContribution: CreatedPullRequestContribution + popularPullRequestContribution: CreatedPullRequestContribution - pullRequestContributions( - after: String + pullRequestContributions( + after: String - before: String + before: String - excludeFirst: Boolean = false + excludeFirst: Boolean = false - excludePopular: Boolean = false + excludePopular: Boolean = false - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedPullRequestContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedPullRequestContributionConnection! - pullRequestContributionsByRepository( - excludeFirst: Boolean = false + pullRequestContributionsByRepository( + excludeFirst: Boolean = false - excludePopular: Boolean = false + excludePopular: Boolean = false - maxRepositories: Int = 25 - ): [PullRequestContributionsByRepository!]! + maxRepositories: Int = 25 + ): [PullRequestContributionsByRepository!]! - pullRequestReviewContributions( - after: String + pullRequestReviewContributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedPullRequestReviewContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedPullRequestReviewContributionConnection! - pullRequestReviewContributionsByRepository( - maxRepositories: Int = 25 - ): [PullRequestReviewContributionsByRepository!]! + pullRequestReviewContributionsByRepository( + maxRepositories: Int = 25 + ): [PullRequestReviewContributionsByRepository!]! - repositoryContributions( - after: String + repositoryContributions( + after: String - before: String + before: String - excludeFirst: Boolean = false + excludeFirst: Boolean = false - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedRepositoryContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedRepositoryContributionConnection! - restrictedContributionsCount: Int! + restrictedContributionsCount: Int! - startedAt: DateTime! + startedAt: DateTime! - totalCommitContributions: Int! + totalCommitContributions: Int! - totalIssueContributions( - excludeFirst: Boolean = false + totalIssueContributions( + excludeFirst: Boolean = false - excludePopular: Boolean = false - ): Int! + excludePopular: Boolean = false + ): Int! - totalPullRequestContributions( - excludeFirst: Boolean = false + totalPullRequestContributions( + excludeFirst: Boolean = false - excludePopular: Boolean = false - ): Int! + excludePopular: Boolean = false + ): Int! - totalPullRequestReviewContributions: Int! + totalPullRequestReviewContributions: Int! - totalRepositoriesWithContributedCommits: Int! + totalRepositoriesWithContributedCommits: Int! - totalRepositoriesWithContributedIssues( - excludeFirst: Boolean = false + totalRepositoriesWithContributedIssues( + excludeFirst: Boolean = false - excludePopular: Boolean = false - ): Int! + excludePopular: Boolean = false + ): Int! - totalRepositoriesWithContributedPullRequestReviews: Int! + totalRepositoriesWithContributedPullRequestReviews: Int! - totalRepositoriesWithContributedPullRequests( - excludeFirst: Boolean = false + totalRepositoriesWithContributedPullRequests( + excludeFirst: Boolean = false - excludePopular: Boolean = false - ): Int! + excludePopular: Boolean = false + ): Int! - totalRepositoryContributions( - excludeFirst: Boolean = false - ): Int! + totalRepositoryContributions( + excludeFirst: Boolean = false + ): Int! - user: User! + user: User! } input ConvertProjectCardNoteToIssueInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - projectCardId: ID! + projectCardId: ID! - repositoryId: ID! + repositoryId: ID! - title: String + title: String } type ConvertProjectCardNoteToIssuePayload { - clientMutationId: String + clientMutationId: String - projectCard: ProjectCard + projectCard: ProjectCard } type ConvertedNoteToIssueEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } input CreateBranchProtectionRuleInput { - clientMutationId: String + clientMutationId: String - dismissesStaleReviews: Boolean + dismissesStaleReviews: Boolean - isAdminEnforced: Boolean + isAdminEnforced: Boolean - pattern: String! + pattern: String! - pushActorIds: [ID!] + pushActorIds: [ID!] - repositoryId: ID! + repositoryId: ID! - requiredApprovingReviewCount: Int + requiredApprovingReviewCount: Int - requiredStatusCheckContexts: [String!] + requiredStatusCheckContexts: [String!] - requiresApprovingReviews: Boolean + requiresApprovingReviews: Boolean - requiresCodeOwnerReviews: Boolean + requiresCodeOwnerReviews: Boolean - requiresCommitSignatures: Boolean + requiresCommitSignatures: Boolean - requiresStatusChecks: Boolean + requiresStatusChecks: Boolean - requiresStrictStatusChecks: Boolean + requiresStrictStatusChecks: Boolean - restrictsPushes: Boolean + restrictsPushes: Boolean - restrictsReviewDismissals: Boolean + restrictsReviewDismissals: Boolean - reviewDismissalActorIds: [ID!] + reviewDismissalActorIds: [ID!] } type CreateBranchProtectionRulePayload { - branchProtectionRule: BranchProtectionRule + branchProtectionRule: BranchProtectionRule - clientMutationId: String + clientMutationId: String } input CreateContentAttachmentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - contentReferenceId: ID! + contentReferenceId: ID! - title: String! + title: String! } input CreateIssueInput { - assigneeIds: [ID!] + assigneeIds: [ID!] - body: String + body: String - clientMutationId: String + clientMutationId: String - labelIds: [ID!] + labelIds: [ID!] - milestoneId: ID + milestoneId: ID - projectIds: [ID!] + projectIds: [ID!] - repositoryId: ID! + repositoryId: ID! - title: String! + title: String! } type CreateIssuePayload { - clientMutationId: String + clientMutationId: String - issue: Issue + issue: Issue } input CreateProjectInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - name: String! + name: String! - ownerId: ID! + ownerId: ID! - repositoryIds: [ID!] + repositoryIds: [ID!] - template: ProjectTemplate + template: ProjectTemplate } type CreateProjectPayload { - clientMutationId: String + clientMutationId: String - project: Project + project: Project } input CreatePullRequestInput { - baseRefName: String! + baseRefName: String! - body: String + body: String - clientMutationId: String + clientMutationId: String - headRefName: String! + headRefName: String! - maintainerCanModify: Boolean = true + maintainerCanModify: Boolean = true - repositoryId: ID! + repositoryId: ID! - title: String! + title: String! } type CreatePullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } input CreateRefInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - oid: GitObjectID! + oid: GitObjectID! - repositoryId: ID! + repositoryId: ID! } type CreateRefPayload { - clientMutationId: String + clientMutationId: String - ref: Ref + ref: Ref } input CreateRepositoryInput { - clientMutationId: String + clientMutationId: String - description: String + description: String - hasIssuesEnabled: Boolean = true + hasIssuesEnabled: Boolean = true - hasWikiEnabled: Boolean = false + hasWikiEnabled: Boolean = false - homepageUrl: URI + homepageUrl: URI - name: String! + name: String! - ownerId: ID + ownerId: ID - teamId: ID + teamId: ID - template: Boolean = false + template: Boolean = false - visibility: RepositoryVisibility! + visibility: RepositoryVisibility! } type CreateRepositoryPayload { - clientMutationId: String + clientMutationId: String - repository: Repository + repository: Repository } type CreatedCommitContribution implements Contribution { - commitCount: Int! + commitCount: Int! - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedCommitContributionConnection { - edges: [CreatedCommitContributionEdge] + edges: [CreatedCommitContributionEdge] - nodes: [CreatedCommitContribution] + nodes: [CreatedCommitContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedCommitContributionEdge { - cursor: String! + cursor: String! - node: CreatedCommitContribution + node: CreatedCommitContribution } type CreatedIssueContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - issue: Issue! + issue: Issue! - occurredAt: DateTime! + occurredAt: DateTime! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedIssueContributionConnection { - edges: [CreatedIssueContributionEdge] + edges: [CreatedIssueContributionEdge] - nodes: [CreatedIssueContribution] + nodes: [CreatedIssueContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedIssueContributionEdge { - cursor: String! + cursor: String! - node: CreatedIssueContribution + node: CreatedIssueContribution } union CreatedIssueOrRestrictedContribution = CreatedIssueContribution | RestrictedContribution type CreatedPullRequestContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - pullRequest: PullRequest! + pullRequest: PullRequest! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedPullRequestContributionConnection { - edges: [CreatedPullRequestContributionEdge] + edges: [CreatedPullRequestContributionEdge] - nodes: [CreatedPullRequestContribution] + nodes: [CreatedPullRequestContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedPullRequestContributionEdge { - cursor: String! + cursor: String! - node: CreatedPullRequestContribution + node: CreatedPullRequestContribution } union CreatedPullRequestOrRestrictedContribution = CreatedPullRequestContribution | RestrictedContribution type CreatedPullRequestReviewContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - pullRequest: PullRequest! + pullRequest: PullRequest! - pullRequestReview: PullRequestReview! + pullRequestReview: PullRequestReview! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedPullRequestReviewContributionConnection { - edges: [CreatedPullRequestReviewContributionEdge] + edges: [CreatedPullRequestReviewContributionEdge] - nodes: [CreatedPullRequestReviewContribution] + nodes: [CreatedPullRequestReviewContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedPullRequestReviewContributionEdge { - cursor: String! + cursor: String! - node: CreatedPullRequestReviewContribution + node: CreatedPullRequestReviewContribution } type CreatedRepositoryContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedRepositoryContributionConnection { - edges: [CreatedRepositoryContributionEdge] + edges: [CreatedRepositoryContributionEdge] - nodes: [CreatedRepositoryContribution] + nodes: [CreatedRepositoryContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedRepositoryContributionEdge { - cursor: String! + cursor: String! - node: CreatedRepositoryContribution + node: CreatedRepositoryContribution } union CreatedRepositoryOrRestrictedContribution = CreatedRepositoryContribution | RestrictedContribution type CrossReferencedEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - isCrossRepository: Boolean! + isCrossRepository: Boolean! - referencedAt: DateTime! + referencedAt: DateTime! - resourcePath: URI! + resourcePath: URI! - source: ReferencedSubject! + source: ReferencedSubject! - target: ReferencedSubject! + target: ReferencedSubject! - url: URI! + url: URI! - willCloseTarget: Boolean! + willCloseTarget: Boolean! } scalar Date @@ -1591,659 +1590,659 @@ scalar Date scalar DateTime input DeclineTopicSuggestionInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - reason: TopicSuggestionDeclineReason! + reason: TopicSuggestionDeclineReason! - repositoryId: ID! + repositoryId: ID! } type DeclineTopicSuggestionPayload { - clientMutationId: String + clientMutationId: String - topic: Topic + topic: Topic } enum DefaultRepositoryPermissionField { - ADMIN + ADMIN - NONE + NONE - READ + READ - WRITE + WRITE } interface Deletable { - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! } input DeleteBranchProtectionRuleInput { - branchProtectionRuleId: ID! + branchProtectionRuleId: ID! - clientMutationId: String + clientMutationId: String } type DeleteBranchProtectionRulePayload { - clientMutationId: String + clientMutationId: String } input DeleteIssueCommentInput { - clientMutationId: String + clientMutationId: String - id: ID! + id: ID! } type DeleteIssueCommentPayload { - clientMutationId: String + clientMutationId: String } input DeleteIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } type DeleteIssuePayload { - clientMutationId: String + clientMutationId: String - repository: Repository + repository: Repository } input DeleteProjectCardInput { - cardId: ID! + cardId: ID! - clientMutationId: String + clientMutationId: String } type DeleteProjectCardPayload { - clientMutationId: String + clientMutationId: String - column: ProjectColumn + column: ProjectColumn - deletedCardId: ID + deletedCardId: ID } input DeleteProjectColumnInput { - clientMutationId: String + clientMutationId: String - columnId: ID! + columnId: ID! } type DeleteProjectColumnPayload { - clientMutationId: String + clientMutationId: String - deletedColumnId: ID + deletedColumnId: ID - project: Project + project: Project } input DeleteProjectInput { - clientMutationId: String + clientMutationId: String - projectId: ID! + projectId: ID! } type DeleteProjectPayload { - clientMutationId: String + clientMutationId: String - owner: ProjectOwner + owner: ProjectOwner } input DeletePullRequestReviewCommentInput { - clientMutationId: String + clientMutationId: String - id: ID! + id: ID! } type DeletePullRequestReviewCommentPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } input DeletePullRequestReviewInput { - clientMutationId: String + clientMutationId: String - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type DeletePullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } input DeleteRefInput { - clientMutationId: String + clientMutationId: String - refId: ID! + refId: ID! } type DeleteRefPayload { - clientMutationId: String + clientMutationId: String } type DemilestonedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - milestoneTitle: String! + milestoneTitle: String! - subject: MilestoneItem! + subject: MilestoneItem! } type DeployKey implements Node { - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - key: String! + key: String! - readOnly: Boolean! + readOnly: Boolean! - title: String! + title: String! - verified: Boolean! + verified: Boolean! } type DeployKeyConnection { - edges: [DeployKeyEdge] + edges: [DeployKeyEdge] - nodes: [DeployKey] + nodes: [DeployKey] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type DeployKeyEdge { - cursor: String! + cursor: String! - node: DeployKey + node: DeployKey } type DeployedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - deployment: Deployment! - id: ID! + deployment: Deployment! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - ref: Ref + ref: Ref } type Deployment implements Node { - commit: Commit + commit: Commit - commitOid: String! + commitOid: String! - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - databaseId: Int + databaseId: Int - description: String + description: String - environment: String - id: ID! + environment: String + id: ID! - latestStatus: DeploymentStatus + latestStatus: DeploymentStatus - payload: String + payload: String - ref: Ref + ref: Ref - repository: Repository! + repository: Repository! - state: DeploymentState + state: DeploymentState - statuses( - after: String + statuses( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): DeploymentStatusConnection + last: Int + ): DeploymentStatusConnection - task: String + task: String - updatedAt: DateTime! + updatedAt: DateTime! } type DeploymentConnection { - edges: [DeploymentEdge] + edges: [DeploymentEdge] - nodes: [Deployment] + nodes: [Deployment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type DeploymentEdge { - cursor: String! + cursor: String! - node: Deployment + node: Deployment } type DeploymentEnvironmentChangedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - deploymentStatus: DeploymentStatus! - id: ID! + deploymentStatus: DeploymentStatus! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! } input DeploymentOrder { - direction: OrderDirection! + direction: OrderDirection! - field: DeploymentOrderField! + field: DeploymentOrderField! } enum DeploymentOrderField { - CREATED_AT + CREATED_AT } enum DeploymentState { - ABANDONED + ABANDONED - ACTIVE + ACTIVE - DESTROYED + DESTROYED - ERROR + ERROR - FAILURE + FAILURE - INACTIVE + INACTIVE - IN_PROGRESS + IN_PROGRESS - PENDING + PENDING - QUEUED + QUEUED } type DeploymentStatus implements Node { - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - deployment: Deployment! + deployment: Deployment! - description: String + description: String - environmentUrl: URI - id: ID! + environmentUrl: URI + id: ID! - logUrl: URI + logUrl: URI - state: DeploymentStatusState! + state: DeploymentStatusState! - updatedAt: DateTime! + updatedAt: DateTime! } type DeploymentStatusConnection { - edges: [DeploymentStatusEdge] + edges: [DeploymentStatusEdge] - nodes: [DeploymentStatus] + nodes: [DeploymentStatus] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type DeploymentStatusEdge { - cursor: String! + cursor: String! - node: DeploymentStatus + node: DeploymentStatus } enum DeploymentStatusState { - ERROR + ERROR - FAILURE + FAILURE - INACTIVE + INACTIVE - IN_PROGRESS + IN_PROGRESS - PENDING + PENDING - QUEUED + QUEUED - SUCCESS + SUCCESS } input DismissPullRequestReviewInput { - clientMutationId: String + clientMutationId: String - message: String! + message: String! - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type DismissPullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } input DraftPullRequestReviewComment { - body: String! + body: String! - path: String! + path: String! - position: Int! + position: Int! } type ExternalIdentity implements Node { - guid: String! - id: ID! + guid: String! + id: ID! - organizationInvitation: OrganizationInvitation + organizationInvitation: OrganizationInvitation - samlIdentity: ExternalIdentitySamlAttributes + samlIdentity: ExternalIdentitySamlAttributes - scimIdentity: ExternalIdentityScimAttributes + scimIdentity: ExternalIdentityScimAttributes - user: User + user: User } type ExternalIdentityConnection { - edges: [ExternalIdentityEdge] + edges: [ExternalIdentityEdge] - nodes: [ExternalIdentity] + nodes: [ExternalIdentity] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ExternalIdentityEdge { - cursor: String! + cursor: String! - node: ExternalIdentity + node: ExternalIdentity } type ExternalIdentitySamlAttributes { - nameId: String + nameId: String } type ExternalIdentityScimAttributes { - username: String + username: String } type FollowerConnection { - edges: [UserEdge] + edges: [UserEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type FollowingConnection { - edges: [UserEdge] + edges: [UserEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type Gist implements Node & Starrable & UniformResourceLocatable { - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): GistCommentConnection! + last: Int + ): GistCommentConnection! - createdAt: DateTime! + createdAt: DateTime! - description: String + description: String - files( - limit: Int = 10 + files( + limit: Int = 10 - oid: GitObjectID - ): [GistFile] + oid: GitObjectID + ): [GistFile] - forks( - after: String + forks( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: GistOrder - ): GistConnection! - id: ID! + orderBy: GistOrder + ): GistConnection! + id: ID! - isFork: Boolean! + isFork: Boolean! - isPublic: Boolean! + isPublic: Boolean! - name: String! + name: String! - owner: RepositoryOwner + owner: RepositoryOwner - pushedAt: DateTime + pushedAt: DateTime - resourcePath: URI! + resourcePath: URI! - stargazers( - after: String + stargazers( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder - ): StargazerConnection! + orderBy: StarOrder + ): StargazerConnection! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - viewerHasStarred: Boolean! + viewerHasStarred: Boolean! } type GistComment implements Comment & Deletable & Node & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor + editor: Actor - gist: Gist! - id: ID! + gist: Gist! + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isMinimized: Boolean! + isMinimized: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - minimizedReason: String + minimizedReason: String - publishedAt: DateTime + publishedAt: DateTime - updatedAt: DateTime! + updatedAt: DateTime! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanMinimize: Boolean! + viewerCanMinimize: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type GistCommentConnection { - edges: [GistCommentEdge] + edges: [GistCommentEdge] - nodes: [GistComment] + nodes: [GistComment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type GistCommentEdge { - cursor: String! + cursor: String! - node: GistComment + node: GistComment } type GistConnection { - edges: [GistEdge] + edges: [GistEdge] - nodes: [Gist] + nodes: [Gist] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type GistEdge { - cursor: String! + cursor: String! - node: Gist + node: Gist } type GistFile { - encodedName: String + encodedName: String - encoding: String + encoding: String - extension: String + extension: String - isImage: Boolean! + isImage: Boolean! - isTruncated: Boolean! + isTruncated: Boolean! - language: Language + language: Language - name: String + name: String - size: Int + size: Int - text( - truncate: Int - ): String + text( + truncate: Int + ): String } input GistOrder { - direction: OrderDirection! + direction: OrderDirection! - field: GistOrderField! + field: GistOrderField! } enum GistOrderField { - CREATED_AT + CREATED_AT - PUSHED_AT + PUSHED_AT - UPDATED_AT + UPDATED_AT } enum GistPrivacy { - ALL + ALL - PUBLIC + PUBLIC - SECRET + SECRET } type GitActor { - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - date: GitTimestamp + date: GitTimestamp - email: String + email: String - name: String + name: String - user: User + user: User } type GitHubMetadata { - gitHubServicesSha: GitObjectID! + gitHubServicesSha: GitObjectID! - gitIpAddresses: [String!] + gitIpAddresses: [String!] - hookIpAddresses: [String!] + hookIpAddresses: [String!] - importerIpAddresses: [String!] + importerIpAddresses: [String!] - isPasswordAuthenticationVerifiable: Boolean! + isPasswordAuthenticationVerifiable: Boolean! - pagesIpAddresses: [String!] + pagesIpAddresses: [String!] } interface GitObject { - abbreviatedOid: String! + abbreviatedOid: String! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! - id: ID! + commitUrl: URI! + id: ID! - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! } scalar GitObjectID @@ -2251,6749 +2250,6749 @@ scalar GitObjectID scalar GitSSHRemote interface GitSignature { - email: String! + email: String! - isValid: Boolean! + isValid: Boolean! - payload: String! + payload: String! - signature: String! + signature: String! - signer: User + signer: User - state: GitSignatureState! + state: GitSignatureState! - wasSignedByGitHub: Boolean! + wasSignedByGitHub: Boolean! } enum GitSignatureState { - BAD_CERT + BAD_CERT - BAD_EMAIL + BAD_EMAIL - EXPIRED_KEY + EXPIRED_KEY - GPGVERIFY_ERROR + GPGVERIFY_ERROR - GPGVERIFY_UNAVAILABLE + GPGVERIFY_UNAVAILABLE - INVALID + INVALID - MALFORMED_SIG + MALFORMED_SIG - NOT_SIGNING_KEY + NOT_SIGNING_KEY - NO_USER + NO_USER - OCSP_ERROR + OCSP_ERROR - OCSP_PENDING + OCSP_PENDING - OCSP_REVOKED + OCSP_REVOKED - UNKNOWN_KEY + UNKNOWN_KEY - UNKNOWN_SIG_TYPE + UNKNOWN_SIG_TYPE - UNSIGNED + UNSIGNED - UNVERIFIED_EMAIL + UNVERIFIED_EMAIL - VALID + VALID } scalar GitTimestamp type GpgSignature implements GitSignature { - email: String! + email: String! - isValid: Boolean! + isValid: Boolean! - keyId: String + keyId: String - payload: String! + payload: String! - signature: String! + signature: String! - signer: User + signer: User - state: GitSignatureState! + state: GitSignatureState! - wasSignedByGitHub: Boolean! + wasSignedByGitHub: Boolean! } scalar HTML type HeadRefDeletedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - headRef: Ref + headRef: Ref - headRefName: String! - id: ID! + headRefName: String! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! } type HeadRefForcePushedEvent implements Node { - actor: Actor + actor: Actor - afterCommit: Commit + afterCommit: Commit - beforeCommit: Commit + beforeCommit: Commit - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - ref: Ref + ref: Ref } type HeadRefRestoredEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! } enum IdentityProviderConfigurationState { - CONFIGURED + CONFIGURED - ENFORCED + ENFORCED - UNCONFIGURED + UNCONFIGURED } input ImportProjectInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - columnImports: [ProjectColumnImport!]! + columnImports: [ProjectColumnImport!]! - name: String! + name: String! - ownerName: String! + ownerName: String! - public: Boolean = false + public: Boolean = false } type Issue implements Assignable & Closable & Comment & Labelable & Lockable & Node & Reactable & RepositoryNode & Subscribable & UniformResourceLocatable & Updatable & UpdatableComment { - activeLockReason: LockReason + activeLockReason: LockReason - assignees( - after: String + assignees( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): IssueCommentConnection! + last: Int + ): IssueCommentConnection! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - labels( - after: String + labels( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): LabelConnection + last: Int + ): LabelConnection - lastEditedAt: DateTime + lastEditedAt: DateTime - locked: Boolean! + locked: Boolean! - milestone: Milestone + milestone: Milestone - number: Int! + number: Int! - participants( - after: String + participants( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - projectCards( - after: String + projectCards( + after: String - archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] + archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectCardConnection! + last: Int + ): ProjectCardConnection! - publishedAt: DateTime + publishedAt: DateTime - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - state: IssueState! + state: IssueState! - timeline( - after: String + timeline( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - since: DateTime - ): IssueTimelineConnection! @deprecated(reason: "`timeline` will be removed Use Issue.timelineItems instead. Removal on 2019-10-01 UTC.") + since: DateTime + ): IssueTimelineConnection! @deprecated(reason: "`timeline` will be removed Use Issue.timelineItems instead. Removal on 2019-10-01 UTC.") - timelineItems( - after: String + timelineItems( + after: String - before: String + before: String - first: Int + first: Int - itemTypes: [IssueTimelineItemsItemType!] + itemTypes: [IssueTimelineItemsItemType!] - last: Int + last: Int - since: DateTime + since: DateTime - skip: Int - ): IssueTimelineItemsConnection! + skip: Int + ): IssueTimelineItemsConnection! - title: String! + title: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState } type IssueComment implements Comment & Deletable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isMinimized: Boolean! + isMinimized: Boolean! - issue: Issue! + issue: Issue! - lastEditedAt: DateTime + lastEditedAt: DateTime - minimizedReason: String + minimizedReason: String - publishedAt: DateTime + publishedAt: DateTime - pullRequest: PullRequest + pullRequest: PullRequest - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanMinimize: Boolean! + viewerCanMinimize: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type IssueCommentConnection { - edges: [IssueCommentEdge] + edges: [IssueCommentEdge] - nodes: [IssueComment] + nodes: [IssueComment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type IssueCommentEdge { - cursor: String! + cursor: String! - node: IssueComment + node: IssueComment } type IssueConnection { - edges: [IssueEdge] + edges: [IssueEdge] - nodes: [Issue] + nodes: [Issue] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type IssueContributionsByRepository { - contributions( - after: String + contributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedIssueContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedIssueContributionConnection! - repository: Repository! + repository: Repository! } type IssueEdge { - cursor: String! + cursor: String! - node: Issue + node: Issue } input IssueFilters { - assignee: String + assignee: String - createdBy: String + createdBy: String - labels: [String!] + labels: [String!] - mentioned: String + mentioned: String - milestone: String + milestone: String - since: DateTime + since: DateTime - states: [IssueState!] + states: [IssueState!] - viewerSubscribed: Boolean = false + viewerSubscribed: Boolean = false } union IssueOrPullRequest = Issue | PullRequest type IssueOrPullRequestEdge { - cursor: String! + cursor: String! - node: IssueOrPullRequest + node: IssueOrPullRequest } input IssueOrder { - direction: OrderDirection! + direction: OrderDirection! - field: IssueOrderField! + field: IssueOrderField! } enum IssueOrderField { - COMMENTS + COMMENTS - CREATED_AT + CREATED_AT - UPDATED_AT + UPDATED_AT } enum IssuePubSubTopic { - MARKASREAD + MARKASREAD - STATE + STATE - TIMELINE + TIMELINE - UPDATED + UPDATED } enum IssueState { - CLOSED + CLOSED - OPEN + OPEN } type IssueTimelineConnection { - edges: [IssueTimelineItemEdge] + edges: [IssueTimelineItemEdge] - nodes: [IssueTimelineItem] + nodes: [IssueTimelineItem] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } union IssueTimelineItem = AssignedEvent | ClosedEvent | Commit | CrossReferencedEvent | DemilestonedEvent | IssueComment | LabeledEvent | LockedEvent | MilestonedEvent | ReferencedEvent | RenamedTitleEvent | ReopenedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnsubscribedEvent | UserBlockedEvent type IssueTimelineItemEdge { - cursor: String! + cursor: String! - node: IssueTimelineItem + node: IssueTimelineItem } union IssueTimelineItems = AddedToProjectEvent | AssignedEvent | ClosedEvent | CommentDeletedEvent | ConvertedNoteToIssueEvent | CrossReferencedEvent | DemilestonedEvent | IssueComment | LabeledEvent | LockedEvent | MarkedAsDuplicateEvent | MentionedEvent | MilestonedEvent | MovedColumnsInProjectEvent | PinnedEvent | ReferencedEvent | RemovedFromProjectEvent | RenamedTitleEvent | ReopenedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnpinnedEvent | UnsubscribedEvent | UserBlockedEvent type IssueTimelineItemsConnection { - edges: [IssueTimelineItemsEdge] + edges: [IssueTimelineItemsEdge] - filteredCount: Int! + filteredCount: Int! - nodes: [IssueTimelineItems] + nodes: [IssueTimelineItems] - pageCount: Int! + pageCount: Int! - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - updatedAt: DateTime! + updatedAt: DateTime! } type IssueTimelineItemsEdge { - cursor: String! + cursor: String! - node: IssueTimelineItems + node: IssueTimelineItems } enum IssueTimelineItemsItemType { - ADDED_TO_PROJECT_EVENT + ADDED_TO_PROJECT_EVENT - ASSIGNED_EVENT + ASSIGNED_EVENT - CLOSED_EVENT + CLOSED_EVENT - COMMENT_DELETED_EVENT + COMMENT_DELETED_EVENT - CONVERTED_NOTE_TO_ISSUE_EVENT + CONVERTED_NOTE_TO_ISSUE_EVENT - CROSS_REFERENCED_EVENT + CROSS_REFERENCED_EVENT - DEMILESTONED_EVENT + DEMILESTONED_EVENT - ISSUE_COMMENT + ISSUE_COMMENT - LABELED_EVENT + LABELED_EVENT - LOCKED_EVENT + LOCKED_EVENT - MARKED_AS_DUPLICATE_EVENT + MARKED_AS_DUPLICATE_EVENT - MENTIONED_EVENT + MENTIONED_EVENT - MILESTONED_EVENT + MILESTONED_EVENT - MOVED_COLUMNS_IN_PROJECT_EVENT + MOVED_COLUMNS_IN_PROJECT_EVENT - PINNED_EVENT + PINNED_EVENT - REFERENCED_EVENT + REFERENCED_EVENT - REMOVED_FROM_PROJECT_EVENT + REMOVED_FROM_PROJECT_EVENT - RENAMED_TITLE_EVENT + RENAMED_TITLE_EVENT - REOPENED_EVENT + REOPENED_EVENT - SUBSCRIBED_EVENT + SUBSCRIBED_EVENT - TRANSFERRED_EVENT + TRANSFERRED_EVENT - UNASSIGNED_EVENT + UNASSIGNED_EVENT - UNLABELED_EVENT + UNLABELED_EVENT - UNLOCKED_EVENT + UNLOCKED_EVENT - UNPINNED_EVENT + UNPINNED_EVENT - UNSUBSCRIBED_EVENT + UNSUBSCRIBED_EVENT - USER_BLOCKED_EVENT + USER_BLOCKED_EVENT } type JoinedGitHubContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type Label implements Node { - color: String! + color: String! - createdAt: DateTime + createdAt: DateTime - description: String - id: ID! + description: String + id: ID! - isDefault: Boolean! + isDefault: Boolean! - issues( - after: String + issues( + after: String - before: String + before: String - filterBy: IssueFilters + filterBy: IssueFilters - first: Int + first: Int - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [IssueState!] - ): IssueConnection! + states: [IssueState!] + ): IssueConnection! - name: String! + name: String! - pullRequests( - after: String + pullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! + states: [PullRequestState!] + ): PullRequestConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime + updatedAt: DateTime - url: URI! + url: URI! } type LabelConnection { - edges: [LabelEdge] + edges: [LabelEdge] - nodes: [Label] + nodes: [Label] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type LabelEdge { - cursor: String! + cursor: String! - node: Label + node: Label } interface Labelable { - labels( - after: String + labels( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): LabelConnection + last: Int + ): LabelConnection } type LabeledEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - label: Label! + label: Label! - labelable: Labelable! + labelable: Labelable! } type Language implements Node { - color: String - id: ID! + color: String + id: ID! - name: String! + name: String! } type LanguageConnection { - edges: [LanguageEdge] + edges: [LanguageEdge] - nodes: [Language] + nodes: [Language] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - totalSize: Int! + totalSize: Int! } type LanguageEdge { - cursor: String! - node: Language! + cursor: String! + node: Language! - size: Int! + size: Int! } input LanguageOrder { - direction: OrderDirection! + direction: OrderDirection! - field: LanguageOrderField! + field: LanguageOrderField! } enum LanguageOrderField { - SIZE + SIZE } type License implements Node { - body: String! + body: String! - conditions: [LicenseRule]! + conditions: [LicenseRule]! - description: String + description: String - featured: Boolean! + featured: Boolean! - hidden: Boolean! - id: ID! + hidden: Boolean! + id: ID! - implementation: String + implementation: String - key: String! + key: String! - limitations: [LicenseRule]! + limitations: [LicenseRule]! - name: String! + name: String! - nickname: String + nickname: String - permissions: [LicenseRule]! + permissions: [LicenseRule]! - pseudoLicense: Boolean! + pseudoLicense: Boolean! - spdxId: String + spdxId: String - url: URI + url: URI } type LicenseRule { - description: String! + description: String! - key: String! + key: String! - label: String! + label: String! } input LinkRepositoryToProjectInput { - clientMutationId: String + clientMutationId: String - projectId: ID! + projectId: ID! - repositoryId: ID! + repositoryId: ID! } type LinkRepositoryToProjectPayload { - clientMutationId: String + clientMutationId: String - project: Project + project: Project - repository: Repository + repository: Repository } input LockLockableInput { - clientMutationId: String + clientMutationId: String - lockReason: LockReason + lockReason: LockReason - lockableId: ID! + lockableId: ID! } type LockLockablePayload { - clientMutationId: String + clientMutationId: String - lockedRecord: Lockable + lockedRecord: Lockable } enum LockReason { - OFF_TOPIC + OFF_TOPIC - RESOLVED + RESOLVED - SPAM + SPAM - TOO_HEATED + TOO_HEATED } interface Lockable { - activeLockReason: LockReason + activeLockReason: LockReason - locked: Boolean! + locked: Boolean! } type LockedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - lockReason: LockReason + lockReason: LockReason - lockable: Lockable! + lockable: Lockable! } type Mannequin implements Actor & Node & UniformResourceLocatable { - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - login: String! + login: String! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type MarkedAsDuplicateEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! } type MarketplaceCategory implements Node { - description: String + description: String - howItWorks: String - id: ID! + howItWorks: String + id: ID! - name: String! + name: String! - primaryListingCount: Int! + primaryListingCount: Int! - resourcePath: URI! + resourcePath: URI! - secondaryListingCount: Int! + secondaryListingCount: Int! - slug: String! + slug: String! - url: URI! + url: URI! } type MarketplaceListing implements Node { - app: App + app: App - companyUrl: URI + companyUrl: URI - configurationResourcePath: URI! + configurationResourcePath: URI! - configurationUrl: URI! + configurationUrl: URI! - documentationUrl: URI + documentationUrl: URI - extendedDescription: String + extendedDescription: String - extendedDescriptionHTML: HTML! + extendedDescriptionHTML: HTML! - fullDescription: String! + fullDescription: String! - fullDescriptionHTML: HTML! + fullDescriptionHTML: HTML! - hasApprovalBeenRequested: Boolean! @deprecated(reason: "`hasApprovalBeenRequested` will be removed. Use `isVerificationPendingFromDraft` instead. Removal on 2019-10-01 UTC.") + hasApprovalBeenRequested: Boolean! @deprecated(reason: "`hasApprovalBeenRequested` will be removed. Use `isVerificationPendingFromDraft` instead. Removal on 2019-10-01 UTC.") - hasPublishedFreeTrialPlans: Boolean! + hasPublishedFreeTrialPlans: Boolean! - hasTermsOfService: Boolean! + hasTermsOfService: Boolean! - howItWorks: String + howItWorks: String - howItWorksHTML: HTML! - id: ID! + howItWorksHTML: HTML! + id: ID! - installationUrl: URI + installationUrl: URI - installedForViewer: Boolean! + installedForViewer: Boolean! - isApproved: Boolean! @deprecated(reason: "`isApproved` will be removed. Use `isPublic` instead. Removal on 2019-10-01 UTC.") + isApproved: Boolean! @deprecated(reason: "`isApproved` will be removed. Use `isPublic` instead. Removal on 2019-10-01 UTC.") - isArchived: Boolean! + isArchived: Boolean! - isDelisted: Boolean! @deprecated(reason: "`isDelisted` will be removed. Use `isArchived` instead. Removal on 2019-10-01 UTC.") + isDelisted: Boolean! @deprecated(reason: "`isDelisted` will be removed. Use `isArchived` instead. Removal on 2019-10-01 UTC.") - isDraft: Boolean! + isDraft: Boolean! - isPaid: Boolean! + isPaid: Boolean! - isPublic: Boolean! + isPublic: Boolean! - isRejected: Boolean! + isRejected: Boolean! - isUnverified: Boolean! + isUnverified: Boolean! - isUnverifiedPending: Boolean! + isUnverifiedPending: Boolean! - isVerificationPendingFromDraft: Boolean! + isVerificationPendingFromDraft: Boolean! - isVerificationPendingFromUnverified: Boolean! + isVerificationPendingFromUnverified: Boolean! - isVerified: Boolean! + isVerified: Boolean! - logoBackgroundColor: String! + logoBackgroundColor: String! - logoUrl( - size: Int = 400 - ): URI + logoUrl( + size: Int = 400 + ): URI - name: String! + name: String! - normalizedShortDescription: String! + normalizedShortDescription: String! - pricingUrl: URI + pricingUrl: URI - primaryCategory: MarketplaceCategory! + primaryCategory: MarketplaceCategory! - privacyPolicyUrl: URI! + privacyPolicyUrl: URI! - resourcePath: URI! + resourcePath: URI! - screenshotUrls: [String]! + screenshotUrls: [String]! - secondaryCategory: MarketplaceCategory + secondaryCategory: MarketplaceCategory - shortDescription: String! + shortDescription: String! - slug: String! + slug: String! - statusUrl: URI + statusUrl: URI - supportEmail: String + supportEmail: String - supportUrl: URI! + supportUrl: URI! - termsOfServiceUrl: URI + termsOfServiceUrl: URI - url: URI! + url: URI! - viewerCanAddPlans: Boolean! + viewerCanAddPlans: Boolean! - viewerCanApprove: Boolean! + viewerCanApprove: Boolean! - viewerCanDelist: Boolean! + viewerCanDelist: Boolean! - viewerCanEdit: Boolean! + viewerCanEdit: Boolean! - viewerCanEditCategories: Boolean! + viewerCanEditCategories: Boolean! - viewerCanEditPlans: Boolean! + viewerCanEditPlans: Boolean! - viewerCanRedraft: Boolean! + viewerCanRedraft: Boolean! - viewerCanReject: Boolean! + viewerCanReject: Boolean! - viewerCanRequestApproval: Boolean! + viewerCanRequestApproval: Boolean! - viewerHasPurchased: Boolean! + viewerHasPurchased: Boolean! - viewerHasPurchasedForAllOrganizations: Boolean! + viewerHasPurchasedForAllOrganizations: Boolean! - viewerIsListingAdmin: Boolean! + viewerIsListingAdmin: Boolean! } type MarketplaceListingConnection { - edges: [MarketplaceListingEdge] + edges: [MarketplaceListingEdge] - nodes: [MarketplaceListing] + nodes: [MarketplaceListing] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type MarketplaceListingEdge { - cursor: String! + cursor: String! - node: MarketplaceListing + node: MarketplaceListing } interface MemberStatusable { - memberStatuses( - after: String + memberStatuses( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} - ): UserStatusConnection! + orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} + ): UserStatusConnection! } type MentionedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } input MergeBranchInput { - base: String! + base: String! - clientMutationId: String + clientMutationId: String - commitMessage: String + commitMessage: String - head: String! + head: String! - repositoryId: ID! + repositoryId: ID! } type MergeBranchPayload { - clientMutationId: String + clientMutationId: String - mergeCommit: Commit + mergeCommit: Commit } input MergePullRequestInput { - clientMutationId: String + clientMutationId: String - commitBody: String + commitBody: String - commitHeadline: String + commitHeadline: String - expectedHeadOid: GitObjectID + expectedHeadOid: GitObjectID - pullRequestId: ID! + pullRequestId: ID! } type MergePullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } enum MergeableState { - CONFLICTING + CONFLICTING - MERGEABLE + MERGEABLE - UNKNOWN + UNKNOWN } type MergedEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - commit: Commit + commit: Commit - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - mergeRef: Ref + mergeRef: Ref - mergeRefName: String! + mergeRefName: String! - pullRequest: PullRequest! + pullRequest: PullRequest! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type Milestone implements Closable & Node & UniformResourceLocatable { - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - description: String + description: String - dueOn: DateTime - id: ID! + dueOn: DateTime + id: ID! - issuePrioritiesDebug: String! + issuePrioritiesDebug: String! - issues( - after: String + issues( + after: String - before: String + before: String - filterBy: IssueFilters + filterBy: IssueFilters - first: Int + first: Int - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [IssueState!] - ): IssueConnection! + states: [IssueState!] + ): IssueConnection! - number: Int! + number: Int! - pullRequests( - after: String + pullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! + states: [PullRequestState!] + ): PullRequestConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - state: MilestoneState! + state: MilestoneState! - title: String! + title: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type MilestoneConnection { - edges: [MilestoneEdge] + edges: [MilestoneEdge] - nodes: [Milestone] + nodes: [Milestone] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type MilestoneEdge { - cursor: String! + cursor: String! - node: Milestone + node: Milestone } union MilestoneItem = Issue | PullRequest input MilestoneOrder { - direction: OrderDirection! + direction: OrderDirection! - field: MilestoneOrderField! + field: MilestoneOrderField! } enum MilestoneOrderField { - CREATED_AT + CREATED_AT - DUE_DATE + DUE_DATE - NUMBER + NUMBER - UPDATED_AT + UPDATED_AT } enum MilestoneState { - CLOSED + CLOSED - OPEN + OPEN } type MilestonedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - milestoneTitle: String! + milestoneTitle: String! - subject: MilestoneItem! + subject: MilestoneItem! } input MinimizeCommentInput { - classifier: ReportedContentClassifiers! + classifier: ReportedContentClassifiers! - clientMutationId: String + clientMutationId: String - subjectId: ID! + subjectId: ID! } input MoveProjectCardInput { - afterCardId: ID + afterCardId: ID - cardId: ID! + cardId: ID! - clientMutationId: String + clientMutationId: String - columnId: ID! + columnId: ID! } type MoveProjectCardPayload { - cardEdge: ProjectCardEdge + cardEdge: ProjectCardEdge - clientMutationId: String + clientMutationId: String } input MoveProjectColumnInput { - afterColumnId: ID + afterColumnId: ID - clientMutationId: String + clientMutationId: String - columnId: ID! + columnId: ID! } type MoveProjectColumnPayload { - clientMutationId: String + clientMutationId: String - columnEdge: ProjectColumnEdge + columnEdge: ProjectColumnEdge } type MovedColumnsInProjectEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type Mutation { - acceptTopicSuggestion(input: AcceptTopicSuggestionInput!): AcceptTopicSuggestionPayload + acceptTopicSuggestion(input: AcceptTopicSuggestionInput!): AcceptTopicSuggestionPayload - addAssigneesToAssignable(input: AddAssigneesToAssignableInput!): AddAssigneesToAssignablePayload + addAssigneesToAssignable(input: AddAssigneesToAssignableInput!): AddAssigneesToAssignablePayload - addComment(input: AddCommentInput!): AddCommentPayload + addComment(input: AddCommentInput!): AddCommentPayload - addLabelsToLabelable(input: AddLabelsToLabelableInput!): AddLabelsToLabelablePayload + addLabelsToLabelable(input: AddLabelsToLabelableInput!): AddLabelsToLabelablePayload - addProjectCard(input: AddProjectCardInput!): AddProjectCardPayload + addProjectCard(input: AddProjectCardInput!): AddProjectCardPayload - addProjectColumn(input: AddProjectColumnInput!): AddProjectColumnPayload + addProjectColumn(input: AddProjectColumnInput!): AddProjectColumnPayload - addPullRequestReview(input: AddPullRequestReviewInput!): AddPullRequestReviewPayload + addPullRequestReview(input: AddPullRequestReviewInput!): AddPullRequestReviewPayload - addPullRequestReviewComment(input: AddPullRequestReviewCommentInput!): AddPullRequestReviewCommentPayload + addPullRequestReviewComment(input: AddPullRequestReviewCommentInput!): AddPullRequestReviewCommentPayload - addReaction(input: AddReactionInput!): AddReactionPayload + addReaction(input: AddReactionInput!): AddReactionPayload - addStar(input: AddStarInput!): AddStarPayload + addStar(input: AddStarInput!): AddStarPayload - changeUserStatus(input: ChangeUserStatusInput!): ChangeUserStatusPayload + changeUserStatus(input: ChangeUserStatusInput!): ChangeUserStatusPayload - clearLabelsFromLabelable(input: ClearLabelsFromLabelableInput!): ClearLabelsFromLabelablePayload + clearLabelsFromLabelable(input: ClearLabelsFromLabelableInput!): ClearLabelsFromLabelablePayload - cloneProject(input: CloneProjectInput!): CloneProjectPayload + cloneProject(input: CloneProjectInput!): CloneProjectPayload - cloneTemplateRepository(input: CloneTemplateRepositoryInput!): CloneTemplateRepositoryPayload + cloneTemplateRepository(input: CloneTemplateRepositoryInput!): CloneTemplateRepositoryPayload - closeIssue(input: CloseIssueInput!): CloseIssuePayload + closeIssue(input: CloseIssueInput!): CloseIssuePayload - closePullRequest(input: ClosePullRequestInput!): ClosePullRequestPayload + closePullRequest(input: ClosePullRequestInput!): ClosePullRequestPayload - convertProjectCardNoteToIssue(input: ConvertProjectCardNoteToIssueInput!): ConvertProjectCardNoteToIssuePayload + convertProjectCardNoteToIssue(input: ConvertProjectCardNoteToIssueInput!): ConvertProjectCardNoteToIssuePayload - createBranchProtectionRule(input: CreateBranchProtectionRuleInput!): CreateBranchProtectionRulePayload + createBranchProtectionRule(input: CreateBranchProtectionRuleInput!): CreateBranchProtectionRulePayload - createIssue(input: CreateIssueInput!): CreateIssuePayload + createIssue(input: CreateIssueInput!): CreateIssuePayload - createProject(input: CreateProjectInput!): CreateProjectPayload + createProject(input: CreateProjectInput!): CreateProjectPayload - createPullRequest(input: CreatePullRequestInput!): CreatePullRequestPayload + createPullRequest(input: CreatePullRequestInput!): CreatePullRequestPayload - createRef(input: CreateRefInput!): CreateRefPayload + createRef(input: CreateRefInput!): CreateRefPayload - createRepository(input: CreateRepositoryInput!): CreateRepositoryPayload + createRepository(input: CreateRepositoryInput!): CreateRepositoryPayload - declineTopicSuggestion(input: DeclineTopicSuggestionInput!): DeclineTopicSuggestionPayload + declineTopicSuggestion(input: DeclineTopicSuggestionInput!): DeclineTopicSuggestionPayload - deleteBranchProtectionRule(input: DeleteBranchProtectionRuleInput!): DeleteBranchProtectionRulePayload + deleteBranchProtectionRule(input: DeleteBranchProtectionRuleInput!): DeleteBranchProtectionRulePayload - deleteIssue(input: DeleteIssueInput!): DeleteIssuePayload + deleteIssue(input: DeleteIssueInput!): DeleteIssuePayload - deleteIssueComment(input: DeleteIssueCommentInput!): DeleteIssueCommentPayload + deleteIssueComment(input: DeleteIssueCommentInput!): DeleteIssueCommentPayload - deleteProject(input: DeleteProjectInput!): DeleteProjectPayload + deleteProject(input: DeleteProjectInput!): DeleteProjectPayload - deleteProjectCard(input: DeleteProjectCardInput!): DeleteProjectCardPayload + deleteProjectCard(input: DeleteProjectCardInput!): DeleteProjectCardPayload - deleteProjectColumn(input: DeleteProjectColumnInput!): DeleteProjectColumnPayload + deleteProjectColumn(input: DeleteProjectColumnInput!): DeleteProjectColumnPayload - deletePullRequestReview(input: DeletePullRequestReviewInput!): DeletePullRequestReviewPayload + deletePullRequestReview(input: DeletePullRequestReviewInput!): DeletePullRequestReviewPayload - deletePullRequestReviewComment(input: DeletePullRequestReviewCommentInput!): DeletePullRequestReviewCommentPayload + deletePullRequestReviewComment(input: DeletePullRequestReviewCommentInput!): DeletePullRequestReviewCommentPayload - deleteRef(input: DeleteRefInput!): DeleteRefPayload + deleteRef(input: DeleteRefInput!): DeleteRefPayload - dismissPullRequestReview(input: DismissPullRequestReviewInput!): DismissPullRequestReviewPayload + dismissPullRequestReview(input: DismissPullRequestReviewInput!): DismissPullRequestReviewPayload - linkRepositoryToProject(input: LinkRepositoryToProjectInput!): LinkRepositoryToProjectPayload + linkRepositoryToProject(input: LinkRepositoryToProjectInput!): LinkRepositoryToProjectPayload - lockLockable(input: LockLockableInput!): LockLockablePayload + lockLockable(input: LockLockableInput!): LockLockablePayload - mergeBranch(input: MergeBranchInput!): MergeBranchPayload + mergeBranch(input: MergeBranchInput!): MergeBranchPayload - mergePullRequest(input: MergePullRequestInput!): MergePullRequestPayload + mergePullRequest(input: MergePullRequestInput!): MergePullRequestPayload - moveProjectCard(input: MoveProjectCardInput!): MoveProjectCardPayload + moveProjectCard(input: MoveProjectCardInput!): MoveProjectCardPayload - moveProjectColumn(input: MoveProjectColumnInput!): MoveProjectColumnPayload + moveProjectColumn(input: MoveProjectColumnInput!): MoveProjectColumnPayload - removeAssigneesFromAssignable(input: RemoveAssigneesFromAssignableInput!): RemoveAssigneesFromAssignablePayload + removeAssigneesFromAssignable(input: RemoveAssigneesFromAssignableInput!): RemoveAssigneesFromAssignablePayload - removeLabelsFromLabelable(input: RemoveLabelsFromLabelableInput!): RemoveLabelsFromLabelablePayload + removeLabelsFromLabelable(input: RemoveLabelsFromLabelableInput!): RemoveLabelsFromLabelablePayload - removeOutsideCollaborator(input: RemoveOutsideCollaboratorInput!): RemoveOutsideCollaboratorPayload + removeOutsideCollaborator(input: RemoveOutsideCollaboratorInput!): RemoveOutsideCollaboratorPayload - removeReaction(input: RemoveReactionInput!): RemoveReactionPayload + removeReaction(input: RemoveReactionInput!): RemoveReactionPayload - removeStar(input: RemoveStarInput!): RemoveStarPayload + removeStar(input: RemoveStarInput!): RemoveStarPayload - reopenIssue(input: ReopenIssueInput!): ReopenIssuePayload + reopenIssue(input: ReopenIssueInput!): ReopenIssuePayload - reopenPullRequest(input: ReopenPullRequestInput!): ReopenPullRequestPayload + reopenPullRequest(input: ReopenPullRequestInput!): ReopenPullRequestPayload - requestReviews(input: RequestReviewsInput!): RequestReviewsPayload + requestReviews(input: RequestReviewsInput!): RequestReviewsPayload - resolveReviewThread(input: ResolveReviewThreadInput!): ResolveReviewThreadPayload + resolveReviewThread(input: ResolveReviewThreadInput!): ResolveReviewThreadPayload - submitPullRequestReview(input: SubmitPullRequestReviewInput!): SubmitPullRequestReviewPayload + submitPullRequestReview(input: SubmitPullRequestReviewInput!): SubmitPullRequestReviewPayload - unlinkRepositoryFromProject(input: UnlinkRepositoryFromProjectInput!): UnlinkRepositoryFromProjectPayload + unlinkRepositoryFromProject(input: UnlinkRepositoryFromProjectInput!): UnlinkRepositoryFromProjectPayload - unlockLockable(input: UnlockLockableInput!): UnlockLockablePayload + unlockLockable(input: UnlockLockableInput!): UnlockLockablePayload - unmarkIssueAsDuplicate(input: UnmarkIssueAsDuplicateInput!): UnmarkIssueAsDuplicatePayload + unmarkIssueAsDuplicate(input: UnmarkIssueAsDuplicateInput!): UnmarkIssueAsDuplicatePayload - unresolveReviewThread(input: UnresolveReviewThreadInput!): UnresolveReviewThreadPayload + unresolveReviewThread(input: UnresolveReviewThreadInput!): UnresolveReviewThreadPayload - updateBranchProtectionRule(input: UpdateBranchProtectionRuleInput!): UpdateBranchProtectionRulePayload + updateBranchProtectionRule(input: UpdateBranchProtectionRuleInput!): UpdateBranchProtectionRulePayload - updateIssue(input: UpdateIssueInput!): UpdateIssuePayload + updateIssue(input: UpdateIssueInput!): UpdateIssuePayload - updateIssueComment(input: UpdateIssueCommentInput!): UpdateIssueCommentPayload + updateIssueComment(input: UpdateIssueCommentInput!): UpdateIssueCommentPayload - updateProject(input: UpdateProjectInput!): UpdateProjectPayload + updateProject(input: UpdateProjectInput!): UpdateProjectPayload - updateProjectCard(input: UpdateProjectCardInput!): UpdateProjectCardPayload + updateProjectCard(input: UpdateProjectCardInput!): UpdateProjectCardPayload - updateProjectColumn(input: UpdateProjectColumnInput!): UpdateProjectColumnPayload + updateProjectColumn(input: UpdateProjectColumnInput!): UpdateProjectColumnPayload - updatePullRequest(input: UpdatePullRequestInput!): UpdatePullRequestPayload + updatePullRequest(input: UpdatePullRequestInput!): UpdatePullRequestPayload - updatePullRequestReview(input: UpdatePullRequestReviewInput!): UpdatePullRequestReviewPayload + updatePullRequestReview(input: UpdatePullRequestReviewInput!): UpdatePullRequestReviewPayload - updatePullRequestReviewComment(input: UpdatePullRequestReviewCommentInput!): UpdatePullRequestReviewCommentPayload + updatePullRequestReviewComment(input: UpdatePullRequestReviewCommentInput!): UpdatePullRequestReviewCommentPayload - updateRef(input: UpdateRefInput!): UpdateRefPayload + updateRef(input: UpdateRefInput!): UpdateRefPayload - updateRepository(input: UpdateRepositoryInput!): UpdateRepositoryPayload + updateRepository(input: UpdateRepositoryInput!): UpdateRepositoryPayload - updateSubscription(input: UpdateSubscriptionInput!): UpdateSubscriptionPayload + updateSubscription(input: UpdateSubscriptionInput!): UpdateSubscriptionPayload - updateTopics(input: UpdateTopicsInput!): UpdateTopicsPayload + updateTopics(input: UpdateTopicsInput!): UpdateTopicsPayload } interface Node { - id: ID! + id: ID! } enum OrderDirection { - ASC + ASC - DESC + DESC } type Organization implements Actor & MemberStatusable & Node & ProfileOwner & ProjectOwner & RegistryPackageOwner & RegistryPackageSearch & RepositoryOwner & UniformResourceLocatable { - anyPinnableItems( - type: PinnableItemType - ): Boolean! + anyPinnableItems( + type: PinnableItemType + ): Boolean! - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - databaseId: Int + databaseId: Int - description: String + description: String - email: String - id: ID! + email: String + id: ID! - isVerified: Boolean! + isVerified: Boolean! - itemShowcase: ProfileItemShowcase! + itemShowcase: ProfileItemShowcase! - location: String + location: String - login: String! + login: String! - memberStatuses( - after: String + memberStatuses( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} - ): UserStatusConnection! + orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} + ): UserStatusConnection! - membersWithRole( - after: String + membersWithRole( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): OrganizationMemberConnection! + last: Int + ): OrganizationMemberConnection! - name: String + name: String - newTeamResourcePath: URI! + newTeamResourcePath: URI! - newTeamUrl: URI! + newTeamUrl: URI! - organizationBillingEmail: String + organizationBillingEmail: String - pendingMembers( - after: String + pendingMembers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - pinnableItems( - after: String + pinnableItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItems( - after: String + pinnedItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItemsRemaining: Int! + pinnedItemsRemaining: Int! - pinnedRepositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + pinnedRepositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + privacy: RepositoryPrivacy + ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") - project( - number: Int! - ): Project + project( + number: Int! + ): Project - projects( - after: String + projects( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ProjectOrder + orderBy: ProjectOrder - search: String + search: String - states: [ProjectState!] - ): ProjectConnection! + states: [ProjectState!] + ): ProjectConnection! - projectsResourcePath: URI! + projectsResourcePath: URI! - projectsUrl: URI! + projectsUrl: URI! - registryPackages( - after: String + registryPackages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String + name: String - names: [String] + names: [String] - packageType: RegistryPackageType + packageType: RegistryPackageType - publicOnly: Boolean = false + publicOnly: Boolean = false - registryPackageType: String + registryPackageType: String - repositoryId: ID - ): RegistryPackageConnection! + repositoryId: ID + ): RegistryPackageConnection! - registryPackagesForQuery( - after: String + registryPackagesForQuery( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - packageType: RegistryPackageType + packageType: RegistryPackageType - query: String - ): RegistryPackageConnection! + query: String + ): RegistryPackageConnection! - repositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + repositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isFork: Boolean + isFork: Boolean - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - repository( - name: String! - ): Repository + repository( + name: String! + ): Repository - requiresTwoFactorAuthentication: Boolean + requiresTwoFactorAuthentication: Boolean - resourcePath: URI! + resourcePath: URI! - samlIdentityProvider: OrganizationIdentityProvider + samlIdentityProvider: OrganizationIdentityProvider - team( - slug: String! - ): Team + team( + slug: String! + ): Team - teams( - after: String + teams( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - ldapMapped: Boolean + ldapMapped: Boolean - orderBy: TeamOrder + orderBy: TeamOrder - privacy: TeamPrivacy + privacy: TeamPrivacy - query: String + query: String - role: TeamRole + role: TeamRole - rootTeamsOnly: Boolean = false + rootTeamsOnly: Boolean = false - userLogins: [String!] - ): TeamConnection! + userLogins: [String!] + ): TeamConnection! - teamsResourcePath: URI! + teamsResourcePath: URI! - teamsUrl: URI! + teamsUrl: URI! - url: URI! + url: URI! - viewerCanAdminister: Boolean! + viewerCanAdminister: Boolean! - viewerCanChangePinnedItems: Boolean! + viewerCanChangePinnedItems: Boolean! - viewerCanCreateProjects: Boolean! + viewerCanCreateProjects: Boolean! - viewerCanCreateRepositories: Boolean! + viewerCanCreateRepositories: Boolean! - viewerCanCreateTeams: Boolean! + viewerCanCreateTeams: Boolean! - viewerIsAMember: Boolean! + viewerIsAMember: Boolean! - websiteUrl: URI + websiteUrl: URI } type OrganizationConnection { - edges: [OrganizationEdge] + edges: [OrganizationEdge] - nodes: [Organization] + nodes: [Organization] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type OrganizationEdge { - cursor: String! + cursor: String! - node: Organization + node: Organization } type OrganizationIdentityProvider implements Node { - digestMethod: URI + digestMethod: URI - externalIdentities( - after: String + externalIdentities( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ExternalIdentityConnection! - id: ID! + last: Int + ): ExternalIdentityConnection! + id: ID! - idpCertificate: X509Certificate + idpCertificate: X509Certificate - issuer: String + issuer: String - organization: Organization + organization: Organization - signatureMethod: URI + signatureMethod: URI - ssoUrl: URI + ssoUrl: URI } type OrganizationInvitation implements Node { - createdAt: DateTime! + createdAt: DateTime! - email: String - id: ID! + email: String + id: ID! - invitationType: OrganizationInvitationType! + invitationType: OrganizationInvitationType! - invitee: User + invitee: User - inviter: User! + inviter: User! - organization: Organization! + organization: Organization! - role: OrganizationInvitationRole! + role: OrganizationInvitationRole! } type OrganizationInvitationConnection { - edges: [OrganizationInvitationEdge] + edges: [OrganizationInvitationEdge] - nodes: [OrganizationInvitation] + nodes: [OrganizationInvitation] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type OrganizationInvitationEdge { - cursor: String! + cursor: String! - node: OrganizationInvitation + node: OrganizationInvitation } enum OrganizationInvitationRole { - ADMIN + ADMIN - BILLING_MANAGER + BILLING_MANAGER - DIRECT_MEMBER + DIRECT_MEMBER - REINSTATE + REINSTATE } enum OrganizationInvitationType { - EMAIL + EMAIL - USER + USER } type OrganizationMemberConnection { - edges: [OrganizationMemberEdge] + edges: [OrganizationMemberEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type OrganizationMemberEdge { - cursor: String! + cursor: String! - hasTwoFactorEnabled: Boolean + hasTwoFactorEnabled: Boolean - node: User + node: User - role: OrganizationMemberRole + role: OrganizationMemberRole } enum OrganizationMemberRole { - ADMIN + ADMIN - MEMBER + MEMBER } type PageInfo { - endCursor: String + endCursor: String - hasNextPage: Boolean! + hasNextPage: Boolean! - hasPreviousPage: Boolean! + hasPreviousPage: Boolean! - startCursor: String + startCursor: String } union PermissionGranter = Organization | Repository | Team type PermissionSource { - organization: Organization! + organization: Organization! - permission: DefaultRepositoryPermissionField! + permission: DefaultRepositoryPermissionField! - source: PermissionGranter! + source: PermissionGranter! } input PinIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } union PinnableItem = Gist | Repository type PinnableItemConnection { - edges: [PinnableItemEdge] + edges: [PinnableItemEdge] - nodes: [PinnableItem] + nodes: [PinnableItem] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PinnableItemEdge { - cursor: String! + cursor: String! - node: PinnableItem + node: PinnableItem } enum PinnableItemType { - GIST + GIST - ISSUE + ISSUE - ORGANIZATION + ORGANIZATION - PROJECT + PROJECT - PULL_REQUEST + PULL_REQUEST - REPOSITORY + REPOSITORY - TEAM + TEAM - USER + USER } type PinnedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - issue: Issue! + issue: Issue! } type ProfileItemShowcase { - hasPinnedItems: Boolean! + hasPinnedItems: Boolean! - items( - after: String + items( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PinnableItemConnection! + last: Int + ): PinnableItemConnection! } interface ProfileOwner { - anyPinnableItems( - type: PinnableItemType - ): Boolean! + anyPinnableItems( + type: PinnableItemType + ): Boolean! - email: String - id: ID! + email: String + id: ID! - itemShowcase: ProfileItemShowcase! + itemShowcase: ProfileItemShowcase! - location: String + location: String - login: String! + login: String! - name: String + name: String - pinnableItems( - after: String + pinnableItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItems( - after: String + pinnedItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItemsRemaining: Int! + pinnedItemsRemaining: Int! - viewerCanChangePinnedItems: Boolean! + viewerCanChangePinnedItems: Boolean! - websiteUrl: URI + websiteUrl: URI } type Project implements Closable & Node & Updatable { - body: String + body: String - bodyHTML: HTML! + bodyHTML: HTML! - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime - columns( - after: String + columns( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectColumnConnection! + last: Int + ): ProjectColumnConnection! - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - databaseId: Int - id: ID! + databaseId: Int + id: ID! - name: String! + name: String! - number: Int! + number: Int! - owner: ProjectOwner! + owner: ProjectOwner! - pendingCards( - after: String + pendingCards( + after: String - archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] + archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectCardConnection! + last: Int + ): ProjectCardConnection! - resourcePath: URI! + resourcePath: URI! - state: ProjectState! + state: ProjectState! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! } type ProjectCard implements Node { - column: ProjectColumn + column: ProjectColumn - content: ProjectCardItem + content: ProjectCardItem - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - databaseId: Int - id: ID! + databaseId: Int + id: ID! - isArchived: Boolean! + isArchived: Boolean! - note: String + note: String - project: Project! + project: Project! - resourcePath: URI! + resourcePath: URI! - state: ProjectCardState + state: ProjectCardState - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } enum ProjectCardArchivedState { - ARCHIVED + ARCHIVED - NOT_ARCHIVED + NOT_ARCHIVED } type ProjectCardConnection { - edges: [ProjectCardEdge] + edges: [ProjectCardEdge] - nodes: [ProjectCard] + nodes: [ProjectCard] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ProjectCardEdge { - cursor: String! + cursor: String! - node: ProjectCard + node: ProjectCard } input ProjectCardImport { - number: Int! + number: Int! - repository: String! + repository: String! } union ProjectCardItem = Issue | PullRequest enum ProjectCardState { - CONTENT_ONLY + CONTENT_ONLY - NOTE_ONLY + NOTE_ONLY - REDACTED + REDACTED } type ProjectColumn implements Node { - cards( - after: String + cards( + after: String - archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] + archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectCardConnection! + last: Int + ): ProjectCardConnection! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - name: String! + name: String! - project: Project! + project: Project! - purpose: ProjectColumnPurpose + purpose: ProjectColumnPurpose - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type ProjectColumnConnection { - edges: [ProjectColumnEdge] + edges: [ProjectColumnEdge] - nodes: [ProjectColumn] + nodes: [ProjectColumn] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ProjectColumnEdge { - cursor: String! + cursor: String! - node: ProjectColumn + node: ProjectColumn } input ProjectColumnImport { - columnName: String! + columnName: String! - issues: [ProjectCardImport!] + issues: [ProjectCardImport!] - position: Int! + position: Int! } enum ProjectColumnPurpose { - DONE + DONE - IN_PROGRESS + IN_PROGRESS - TODO + TODO } type ProjectConnection { - edges: [ProjectEdge] + edges: [ProjectEdge] - nodes: [Project] + nodes: [Project] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ProjectEdge { - cursor: String! + cursor: String! - node: Project + node: Project } input ProjectOrder { - direction: OrderDirection! + direction: OrderDirection! - field: ProjectOrderField! + field: ProjectOrderField! } enum ProjectOrderField { - CREATED_AT + CREATED_AT - NAME + NAME - UPDATED_AT + UPDATED_AT } interface ProjectOwner { - id: ID! + id: ID! - project( - number: Int! - ): Project + project( + number: Int! + ): Project - projects( - after: String + projects( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ProjectOrder + orderBy: ProjectOrder - search: String + search: String - states: [ProjectState!] - ): ProjectConnection! + states: [ProjectState!] + ): ProjectConnection! - projectsResourcePath: URI! + projectsResourcePath: URI! - projectsUrl: URI! + projectsUrl: URI! - viewerCanCreateProjects: Boolean! + viewerCanCreateProjects: Boolean! } enum ProjectState { - CLOSED + CLOSED - OPEN + OPEN } enum ProjectTemplate { - AUTOMATED_KANBAN_V2 + AUTOMATED_KANBAN_V2 - AUTOMATED_REVIEWS_KANBAN + AUTOMATED_REVIEWS_KANBAN - BASIC_KANBAN + BASIC_KANBAN - BUG_TRIAGE + BUG_TRIAGE } type PublicKey implements Node { - accessedAt: DateTime + accessedAt: DateTime - createdAt: DateTime + createdAt: DateTime - fingerprint: String! - id: ID! + fingerprint: String! + id: ID! - isReadOnly: Boolean + isReadOnly: Boolean - key: String! + key: String! - updatedAt: DateTime + updatedAt: DateTime } type PublicKeyConnection { - edges: [PublicKeyEdge] + edges: [PublicKeyEdge] - nodes: [PublicKey] + nodes: [PublicKey] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PublicKeyEdge { - cursor: String! + cursor: String! - node: PublicKey + node: PublicKey } type PullRequest implements Assignable & Closable & Comment & Labelable & Lockable & Node & Reactable & RepositoryNode & Subscribable & UniformResourceLocatable & Updatable & UpdatableComment { - activeLockReason: LockReason + activeLockReason: LockReason - additions: Int! + additions: Int! - assignees( - after: String + assignees( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - baseRef: Ref + baseRef: Ref - baseRefName: String! + baseRefName: String! - baseRefOid: GitObjectID! + baseRefOid: GitObjectID! - baseRepository: Repository + baseRepository: Repository - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - changedFiles: Int! + changedFiles: Int! - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): IssueCommentConnection! + last: Int + ): IssueCommentConnection! - commits( - after: String + commits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestCommitConnection! + last: Int + ): PullRequestCommitConnection! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - deletions: Int! + deletions: Int! - editor: Actor + editor: Actor - files( - after: String + files( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestChangedFileConnection + last: Int + ): PullRequestChangedFileConnection - headRef: Ref + headRef: Ref - headRefName: String! + headRefName: String! - headRefOid: GitObjectID! + headRefOid: GitObjectID! - headRepository: Repository + headRepository: Repository - headRepositoryOwner: RepositoryOwner - id: ID! + headRepositoryOwner: RepositoryOwner + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isCrossRepository: Boolean! + isCrossRepository: Boolean! - labels( - after: String + labels( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): LabelConnection + last: Int + ): LabelConnection - lastEditedAt: DateTime + lastEditedAt: DateTime - locked: Boolean! + locked: Boolean! - maintainerCanModify: Boolean! + maintainerCanModify: Boolean! - mergeCommit: Commit + mergeCommit: Commit - mergeable: MergeableState! + mergeable: MergeableState! - merged: Boolean! + merged: Boolean! - mergedAt: DateTime + mergedAt: DateTime - mergedBy: Actor + mergedBy: Actor - milestone: Milestone + milestone: Milestone - number: Int! + number: Int! - participants( - after: String + participants( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - permalink: URI! + permalink: URI! - potentialMergeCommit: Commit + potentialMergeCommit: Commit - projectCards( - after: String + projectCards( + after: String - archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] + archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectCardConnection! + last: Int + ): ProjectCardConnection! - publishedAt: DateTime + publishedAt: DateTime - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - revertResourcePath: URI! + revertResourcePath: URI! - revertUrl: URI! + revertUrl: URI! - reviewRequests( - after: String + reviewRequests( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ReviewRequestConnection + last: Int + ): ReviewRequestConnection - reviewThreads( - after: String + reviewThreads( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestReviewThreadConnection! + last: Int + ): PullRequestReviewThreadConnection! - reviews( - after: String + reviews( + after: String - author: String + author: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - states: [PullRequestReviewState!] - ): PullRequestReviewConnection + states: [PullRequestReviewState!] + ): PullRequestReviewConnection - state: PullRequestState! + state: PullRequestState! - suggestedReviewers: [SuggestedReviewer]! + suggestedReviewers: [SuggestedReviewer]! - timeline( - after: String + timeline( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - since: DateTime - ): PullRequestTimelineConnection! @deprecated(reason: "`timeline` will be removed Use PullRequest.timelineItems instead. Removal on 2019-10-01 UTC.") + since: DateTime + ): PullRequestTimelineConnection! @deprecated(reason: "`timeline` will be removed Use PullRequest.timelineItems instead. Removal on 2019-10-01 UTC.") - timelineItems( - after: String + timelineItems( + after: String - before: String + before: String - first: Int + first: Int - itemTypes: [PullRequestTimelineItemsItemType!] + itemTypes: [PullRequestTimelineItemsItemType!] - last: Int + last: Int - since: DateTime + since: DateTime - skip: Int - ): PullRequestTimelineItemsConnection! + skip: Int + ): PullRequestTimelineItemsConnection! - title: String! + title: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanApplySuggestion: Boolean! + viewerCanApplySuggestion: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState } type PullRequestChangedFile { - additions: Int! + additions: Int! - deletions: Int! + deletions: Int! - path: String! + path: String! } type PullRequestChangedFileConnection { - edges: [PullRequestChangedFileEdge] + edges: [PullRequestChangedFileEdge] - nodes: [PullRequestChangedFile] + nodes: [PullRequestChangedFile] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestChangedFileEdge { - cursor: String! + cursor: String! - node: PullRequestChangedFile + node: PullRequestChangedFile } type PullRequestCommit implements Node & UniformResourceLocatable { - commit: Commit! - id: ID! + commit: Commit! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type PullRequestCommitCommentThread implements Node & RepositoryNode { - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - commit: Commit! - id: ID! + commit: Commit! + id: ID! - path: String + path: String - position: Int + position: Int - pullRequest: PullRequest! + pullRequest: PullRequest! - repository: Repository! + repository: Repository! } type PullRequestCommitConnection { - edges: [PullRequestCommitEdge] + edges: [PullRequestCommitEdge] - nodes: [PullRequestCommit] + nodes: [PullRequestCommit] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestCommitEdge { - cursor: String! + cursor: String! - node: PullRequestCommit + node: PullRequestCommit } type PullRequestConnection { - edges: [PullRequestEdge] + edges: [PullRequestEdge] - nodes: [PullRequest] + nodes: [PullRequest] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestContributionsByRepository { - contributions( - after: String + contributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedPullRequestContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedPullRequestContributionConnection! - repository: Repository! + repository: Repository! } type PullRequestEdge { - cursor: String! + cursor: String! - node: PullRequest + node: PullRequest } input PullRequestOrder { - direction: OrderDirection! + direction: OrderDirection! - field: PullRequestOrderField! + field: PullRequestOrderField! } enum PullRequestOrderField { - CREATED_AT + CREATED_AT - UPDATED_AT + UPDATED_AT } enum PullRequestPubSubTopic { - HEAD_REF + HEAD_REF - MARKASREAD + MARKASREAD - STATE + STATE - TIMELINE + TIMELINE - UPDATED + UPDATED } type PullRequestReview implements Comment & Deletable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestReviewCommentConnection! + last: Int + ): PullRequestReviewCommentConnection! - commit: Commit + commit: Commit - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - onBehalfOf( - after: String + onBehalfOf( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): TeamConnection! + last: Int + ): TeamConnection! - publishedAt: DateTime + publishedAt: DateTime - pullRequest: PullRequest! + pullRequest: PullRequest! - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - state: PullRequestReviewState! + state: PullRequestReviewState! - submittedAt: DateTime + submittedAt: DateTime - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type PullRequestReviewComment implements Comment & Deletable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - commit: Commit! + commit: Commit! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - diffHunk: String! + diffHunk: String! - draftedAt: DateTime! + draftedAt: DateTime! - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isMinimized: Boolean! + isMinimized: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - minimizedReason: String + minimizedReason: String - originalCommit: Commit + originalCommit: Commit - originalPosition: Int! + originalPosition: Int! - outdated: Boolean! + outdated: Boolean! - path: String! + path: String! - position: Int + position: Int - publishedAt: DateTime + publishedAt: DateTime - pullRequest: PullRequest! + pullRequest: PullRequest! - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - replyTo: PullRequestReviewComment + replyTo: PullRequestReviewComment - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - state: PullRequestReviewCommentState! + state: PullRequestReviewCommentState! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanMinimize: Boolean! + viewerCanMinimize: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type PullRequestReviewCommentConnection { - edges: [PullRequestReviewCommentEdge] + edges: [PullRequestReviewCommentEdge] - nodes: [PullRequestReviewComment] + nodes: [PullRequestReviewComment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestReviewCommentEdge { - cursor: String! + cursor: String! - node: PullRequestReviewComment + node: PullRequestReviewComment } enum PullRequestReviewCommentState { - PENDING + PENDING - SUBMITTED + SUBMITTED } type PullRequestReviewConnection { - edges: [PullRequestReviewEdge] + edges: [PullRequestReviewEdge] - nodes: [PullRequestReview] + nodes: [PullRequestReview] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestReviewContributionsByRepository { - contributions( - after: String + contributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedPullRequestReviewContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedPullRequestReviewContributionConnection! - repository: Repository! + repository: Repository! } type PullRequestReviewEdge { - cursor: String! + cursor: String! - node: PullRequestReview + node: PullRequestReview } enum PullRequestReviewEvent { - APPROVE + APPROVE - COMMENT + COMMENT - DISMISS + DISMISS - REQUEST_CHANGES + REQUEST_CHANGES } enum PullRequestReviewState { - APPROVED + APPROVED - CHANGES_REQUESTED + CHANGES_REQUESTED - COMMENTED + COMMENTED - DISMISSED + DISMISSED - PENDING + PENDING } type PullRequestReviewThread implements Node { - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestReviewCommentConnection! - id: ID! + last: Int + ): PullRequestReviewCommentConnection! + id: ID! - isResolved: Boolean! + isResolved: Boolean! - pullRequest: PullRequest! + pullRequest: PullRequest! - repository: Repository! + repository: Repository! - resolvedBy: User + resolvedBy: User - viewerCanResolve: Boolean! + viewerCanResolve: Boolean! - viewerCanUnresolve: Boolean! + viewerCanUnresolve: Boolean! } type PullRequestReviewThreadConnection { - edges: [PullRequestReviewThreadEdge] + edges: [PullRequestReviewThreadEdge] - nodes: [PullRequestReviewThread] + nodes: [PullRequestReviewThread] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestReviewThreadEdge { - cursor: String! + cursor: String! - node: PullRequestReviewThread + node: PullRequestReviewThread } type PullRequestRevisionMarker { - createdAt: DateTime! + createdAt: DateTime! - lastSeenCommit: Commit! + lastSeenCommit: Commit! - pullRequest: PullRequest! + pullRequest: PullRequest! } enum PullRequestState { - CLOSED + CLOSED - MERGED + MERGED - OPEN + OPEN } type PullRequestTimelineConnection { - edges: [PullRequestTimelineItemEdge] + edges: [PullRequestTimelineItemEdge] - nodes: [PullRequestTimelineItem] + nodes: [PullRequestTimelineItem] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } union PullRequestTimelineItem = AssignedEvent | BaseRefForcePushedEvent | ClosedEvent | Commit | CommitCommentThread | CrossReferencedEvent | DemilestonedEvent | DeployedEvent | DeploymentEnvironmentChangedEvent | HeadRefDeletedEvent | HeadRefForcePushedEvent | HeadRefRestoredEvent | IssueComment | LabeledEvent | LockedEvent | MergedEvent | MilestonedEvent | PullRequestReview | PullRequestReviewComment | PullRequestReviewThread | ReferencedEvent | RenamedTitleEvent | ReopenedEvent | ReviewDismissedEvent | ReviewRequestRemovedEvent | ReviewRequestedEvent | SubscribedEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnsubscribedEvent | UserBlockedEvent type PullRequestTimelineItemEdge { - cursor: String! + cursor: String! - node: PullRequestTimelineItem + node: PullRequestTimelineItem } union PullRequestTimelineItems = AddedToProjectEvent | AssignedEvent | BaseRefChangedEvent | BaseRefForcePushedEvent | ClosedEvent | CommentDeletedEvent | ConvertedNoteToIssueEvent | CrossReferencedEvent | DemilestonedEvent | DeployedEvent | DeploymentEnvironmentChangedEvent | HeadRefDeletedEvent | HeadRefForcePushedEvent | HeadRefRestoredEvent | IssueComment | LabeledEvent | LockedEvent | MarkedAsDuplicateEvent | MentionedEvent | MergedEvent | MilestonedEvent | MovedColumnsInProjectEvent | PinnedEvent | PullRequestCommit | PullRequestCommitCommentThread | PullRequestReview | PullRequestReviewThread | PullRequestRevisionMarker | ReadyForReviewEvent | ReferencedEvent | RemovedFromProjectEvent | RenamedTitleEvent | ReopenedEvent | ReviewDismissedEvent | ReviewRequestRemovedEvent | ReviewRequestedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnpinnedEvent | UnsubscribedEvent | UserBlockedEvent type PullRequestTimelineItemsConnection { - edges: [PullRequestTimelineItemsEdge] + edges: [PullRequestTimelineItemsEdge] - filteredCount: Int! + filteredCount: Int! - nodes: [PullRequestTimelineItems] + nodes: [PullRequestTimelineItems] - pageCount: Int! + pageCount: Int! - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - updatedAt: DateTime! + updatedAt: DateTime! } type PullRequestTimelineItemsEdge { - cursor: String! + cursor: String! - node: PullRequestTimelineItems + node: PullRequestTimelineItems } enum PullRequestTimelineItemsItemType { - ADDED_TO_PROJECT_EVENT + ADDED_TO_PROJECT_EVENT - ASSIGNED_EVENT + ASSIGNED_EVENT - BASE_REF_CHANGED_EVENT + BASE_REF_CHANGED_EVENT - BASE_REF_FORCE_PUSHED_EVENT + BASE_REF_FORCE_PUSHED_EVENT - CLOSED_EVENT + CLOSED_EVENT - COMMENT_DELETED_EVENT + COMMENT_DELETED_EVENT - CONVERTED_NOTE_TO_ISSUE_EVENT + CONVERTED_NOTE_TO_ISSUE_EVENT - CROSS_REFERENCED_EVENT + CROSS_REFERENCED_EVENT - DEMILESTONED_EVENT + DEMILESTONED_EVENT - DEPLOYED_EVENT + DEPLOYED_EVENT - DEPLOYMENT_ENVIRONMENT_CHANGED_EVENT + DEPLOYMENT_ENVIRONMENT_CHANGED_EVENT - HEAD_REF_DELETED_EVENT + HEAD_REF_DELETED_EVENT - HEAD_REF_FORCE_PUSHED_EVENT + HEAD_REF_FORCE_PUSHED_EVENT - HEAD_REF_RESTORED_EVENT + HEAD_REF_RESTORED_EVENT - ISSUE_COMMENT + ISSUE_COMMENT - LABELED_EVENT + LABELED_EVENT - LOCKED_EVENT + LOCKED_EVENT - MARKED_AS_DUPLICATE_EVENT + MARKED_AS_DUPLICATE_EVENT - MENTIONED_EVENT + MENTIONED_EVENT - MERGED_EVENT + MERGED_EVENT - MILESTONED_EVENT + MILESTONED_EVENT - MOVED_COLUMNS_IN_PROJECT_EVENT + MOVED_COLUMNS_IN_PROJECT_EVENT - PINNED_EVENT + PINNED_EVENT - PULL_REQUEST_COMMIT + PULL_REQUEST_COMMIT - PULL_REQUEST_COMMIT_COMMENT_THREAD + PULL_REQUEST_COMMIT_COMMENT_THREAD - PULL_REQUEST_REVIEW + PULL_REQUEST_REVIEW - PULL_REQUEST_REVIEW_THREAD + PULL_REQUEST_REVIEW_THREAD - PULL_REQUEST_REVISION_MARKER + PULL_REQUEST_REVISION_MARKER - READY_FOR_REVIEW_EVENT + READY_FOR_REVIEW_EVENT - REFERENCED_EVENT + REFERENCED_EVENT - REMOVED_FROM_PROJECT_EVENT + REMOVED_FROM_PROJECT_EVENT - RENAMED_TITLE_EVENT + RENAMED_TITLE_EVENT - REOPENED_EVENT + REOPENED_EVENT - REVIEW_DISMISSED_EVENT + REVIEW_DISMISSED_EVENT - REVIEW_REQUESTED_EVENT + REVIEW_REQUESTED_EVENT - REVIEW_REQUEST_REMOVED_EVENT + REVIEW_REQUEST_REMOVED_EVENT - SUBSCRIBED_EVENT + SUBSCRIBED_EVENT - TRANSFERRED_EVENT + TRANSFERRED_EVENT - UNASSIGNED_EVENT + UNASSIGNED_EVENT - UNLABELED_EVENT + UNLABELED_EVENT - UNLOCKED_EVENT + UNLOCKED_EVENT - UNPINNED_EVENT + UNPINNED_EVENT - UNSUBSCRIBED_EVENT + UNSUBSCRIBED_EVENT - USER_BLOCKED_EVENT + USER_BLOCKED_EVENT } type PushAllowance implements Node { - actor: PushAllowanceActor + actor: PushAllowanceActor - branchProtectionRule: BranchProtectionRule - id: ID! + branchProtectionRule: BranchProtectionRule + id: ID! } union PushAllowanceActor = Team | User type PushAllowanceConnection { - edges: [PushAllowanceEdge] + edges: [PushAllowanceEdge] - nodes: [PushAllowance] + nodes: [PushAllowance] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PushAllowanceEdge { - cursor: String! + cursor: String! - node: PushAllowance + node: PushAllowance } type Query { - codeOfConduct( - key: String! - ): CodeOfConduct + codeOfConduct( + key: String! + ): CodeOfConduct - codesOfConduct: [CodeOfConduct] + codesOfConduct: [CodeOfConduct] - license( - key: String! - ): License + license( + key: String! + ): License - licenses: [License]! + licenses: [License]! - marketplaceCategories( - excludeEmpty: Boolean + marketplaceCategories( + excludeEmpty: Boolean - excludeSubcategories: Boolean + excludeSubcategories: Boolean - includeCategories: [String!] - ): [MarketplaceCategory!]! + includeCategories: [String!] + ): [MarketplaceCategory!]! - marketplaceCategory( - slug: String! + marketplaceCategory( + slug: String! - useTopicAliases: Boolean - ): MarketplaceCategory + useTopicAliases: Boolean + ): MarketplaceCategory - marketplaceListing( - slug: String! - ): MarketplaceListing + marketplaceListing( + slug: String! + ): MarketplaceListing - marketplaceListings( - adminId: ID + marketplaceListings( + adminId: ID - after: String + after: String - allStates: Boolean + allStates: Boolean - before: String + before: String - categorySlug: String + categorySlug: String - first: Int + first: Int - last: Int + last: Int - organizationId: ID + organizationId: ID - primaryCategoryOnly: Boolean = false + primaryCategoryOnly: Boolean = false - slugs: [String] + slugs: [String] - useTopicAliases: Boolean + useTopicAliases: Boolean - viewerCanAdmin: Boolean + viewerCanAdmin: Boolean - withFreeTrialsOnly: Boolean = false - ): MarketplaceListingConnection! + withFreeTrialsOnly: Boolean = false + ): MarketplaceListingConnection! - meta: GitHubMetadata! + meta: GitHubMetadata! - node( - id: ID! - ): Node + node( + id: ID! + ): Node - nodes( - ids: [ID!]! - ): [Node]! + nodes( + ids: [ID!]! + ): [Node]! - organization( - login: String! - ): Organization + organization( + login: String! + ): Organization - rateLimit( - dryRun: Boolean = false - ): RateLimit + rateLimit( + dryRun: Boolean = false + ): RateLimit - relay: Query! + relay: Query! - repository( - name: String! + repository( + name: String! - owner: String! - ): Repository + owner: String! + ): Repository - repositoryOwner( - login: String! - ): RepositoryOwner + repositoryOwner( + login: String! + ): RepositoryOwner - resource( - url: URI! - ): UniformResourceLocatable + resource( + url: URI! + ): UniformResourceLocatable - search( - after: String + search( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - query: String! + query: String! - type: SearchType! - ): SearchResultItemConnection! + type: SearchType! + ): SearchResultItemConnection! - securityAdvisories( - after: String + securityAdvisories( + after: String - before: String + before: String - first: Int + first: Int - identifier: SecurityAdvisoryIdentifierFilter + identifier: SecurityAdvisoryIdentifierFilter - last: Int + last: Int - orderBy: SecurityAdvisoryOrder = {field: UPDATED_AT, direction: DESC} + orderBy: SecurityAdvisoryOrder = {field: UPDATED_AT, direction: DESC} - publishedSince: DateTime + publishedSince: DateTime - updatedSince: DateTime - ): SecurityAdvisoryConnection! + updatedSince: DateTime + ): SecurityAdvisoryConnection! - securityAdvisory( - ghsaId: String! - ): SecurityAdvisory + securityAdvisory( + ghsaId: String! + ): SecurityAdvisory - securityVulnerabilities( - after: String + securityVulnerabilities( + after: String - before: String + before: String - ecosystem: SecurityAdvisoryEcosystem + ecosystem: SecurityAdvisoryEcosystem - first: Int + first: Int - last: Int + last: Int - orderBy: SecurityVulnerabilityOrder = {field: UPDATED_AT, direction: DESC} + orderBy: SecurityVulnerabilityOrder = {field: UPDATED_AT, direction: DESC} - package: String + package: String - severities: [SecurityAdvisorySeverity!] - ): SecurityVulnerabilityConnection! + severities: [SecurityAdvisorySeverity!] + ): SecurityVulnerabilityConnection! - sponsorsListing( - slug: String! - ): SponsorsListing + sponsorsListing( + slug: String! + ): SponsorsListing - topic( - name: String! - ): Topic + topic( + name: String! + ): Topic - user( - login: String! - ): User + user( + login: String! + ): User - viewer: User! + viewer: User! } type RateLimit { - cost: Int! + cost: Int! - limit: Int! + limit: Int! - nodeCount: Int! + nodeCount: Int! - remaining: Int! + remaining: Int! - resetAt: DateTime! + resetAt: DateTime! } interface Reactable { - databaseId: Int - id: ID! + databaseId: Int + id: ID! - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - viewerCanReact: Boolean! + viewerCanReact: Boolean! } type ReactingUserConnection { - edges: [ReactingUserEdge] + edges: [ReactingUserEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReactingUserEdge { - cursor: String! - node: User! + cursor: String! + node: User! - reactedAt: DateTime! + reactedAt: DateTime! } type Reaction implements Node { - content: ReactionContent! + content: ReactionContent! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - reactable: Reactable! + reactable: Reactable! - user: User + user: User } type ReactionConnection { - edges: [ReactionEdge] + edges: [ReactionEdge] - nodes: [Reaction] + nodes: [Reaction] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - viewerHasReacted: Boolean! + viewerHasReacted: Boolean! } enum ReactionContent { - CONFUSED + CONFUSED - EYES + EYES - HEART + HEART - HOORAY + HOORAY - LAUGH + LAUGH - ROCKET + ROCKET - THUMBS_DOWN + THUMBS_DOWN - THUMBS_UP + THUMBS_UP } type ReactionEdge { - cursor: String! + cursor: String! - node: Reaction + node: Reaction } type ReactionGroup { - content: ReactionContent! + content: ReactionContent! - createdAt: DateTime + createdAt: DateTime - subject: Reactable! + subject: Reactable! - users( - after: String + users( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ReactingUserConnection! + last: Int + ): ReactingUserConnection! - viewerHasReacted: Boolean! + viewerHasReacted: Boolean! } input ReactionOrder { - direction: OrderDirection! + direction: OrderDirection! - field: ReactionOrderField! + field: ReactionOrderField! } enum ReactionOrderField { - CREATED_AT + CREATED_AT } type ReadyForReviewEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type Ref implements Node { - associatedPullRequests( - after: String + associatedPullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! - id: ID! + states: [PullRequestState!] + ): PullRequestConnection! + id: ID! - name: String! + name: String! - prefix: String! + prefix: String! - repository: Repository! + repository: Repository! - target: GitObject! + target: GitObject! } type RefConnection { - edges: [RefEdge] + edges: [RefEdge] - nodes: [Ref] + nodes: [Ref] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RefEdge { - cursor: String! + cursor: String! - node: Ref + node: Ref } input RefOrder { - direction: OrderDirection! + direction: OrderDirection! - field: RefOrderField! + field: RefOrderField! } enum RefOrderField { - ALPHABETICAL + ALPHABETICAL - TAG_COMMIT_DATE + TAG_COMMIT_DATE } type ReferencedEvent implements Node { - actor: Actor + actor: Actor - commit: Commit + commit: Commit - commitRepository: Repository! + commitRepository: Repository! - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - isCrossRepository: Boolean! + isCrossRepository: Boolean! - isDirectReference: Boolean! + isDirectReference: Boolean! - subject: ReferencedSubject! + subject: ReferencedSubject! } union ReferencedSubject = Issue | PullRequest type RegistryPackage implements Node { - color: String! - id: ID! + color: String! + id: ID! - latestVersion: RegistryPackageVersion + latestVersion: RegistryPackageVersion - name: String! + name: String! - nameWithOwner: String! + nameWithOwner: String! - packageFileByGuid( - guid: String! - ): RegistryPackageFile + packageFileByGuid( + guid: String! + ): RegistryPackageFile - packageFileBySha256( - sha256: String! - ): RegistryPackageFile + packageFileBySha256( + sha256: String! + ): RegistryPackageFile - packageType: RegistryPackageType! + packageType: RegistryPackageType! - preReleaseVersions( - after: String + preReleaseVersions( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RegistryPackageVersionConnection + last: Int + ): RegistryPackageVersionConnection - registryPackageType: String + registryPackageType: String - repository: Repository + repository: Repository - statistics: RegistryPackageStatistics + statistics: RegistryPackageStatistics - tags( - after: String + tags( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RegistryPackageTagConnection! + last: Int + ): RegistryPackageTagConnection! - topics( - after: String + topics( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): TopicConnection + last: Int + ): TopicConnection - version( - version: String! - ): RegistryPackageVersion + version( + version: String! + ): RegistryPackageVersion - versionByPlatform( - platform: String! + versionByPlatform( + platform: String! - version: String! - ): RegistryPackageVersion + version: String! + ): RegistryPackageVersion - versionBySha256( - sha256: String! - ): RegistryPackageVersion + versionBySha256( + sha256: String! + ): RegistryPackageVersion - versions( - after: String + versions( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RegistryPackageVersionConnection! + last: Int + ): RegistryPackageVersionConnection! - versionsByMetadatum( - after: String + versionsByMetadatum( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - metadatum: RegistryPackageMetadatum! - ): RegistryPackageVersionConnection + metadatum: RegistryPackageMetadatum! + ): RegistryPackageVersionConnection } type RegistryPackageConnection { - edges: [RegistryPackageEdge] + edges: [RegistryPackageEdge] - nodes: [RegistryPackage] + nodes: [RegistryPackage] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageDependency implements Node { - dependencyType: RegistryPackageDependencyType! - id: ID! + dependencyType: RegistryPackageDependencyType! + id: ID! - name: String! + name: String! - version: String! + version: String! } type RegistryPackageDependencyConnection { - edges: [RegistryPackageDependencyEdge] + edges: [RegistryPackageDependencyEdge] - nodes: [RegistryPackageDependency] + nodes: [RegistryPackageDependency] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageDependencyEdge { - cursor: String! + cursor: String! - node: RegistryPackageDependency + node: RegistryPackageDependency } enum RegistryPackageDependencyType { - BUNDLED + BUNDLED - DEFAULT + DEFAULT - DEV + DEV - OPTIONAL + OPTIONAL - PEER + PEER - TEST + TEST } type RegistryPackageEdge { - cursor: String! + cursor: String! - node: RegistryPackage + node: RegistryPackage } type RegistryPackageFile implements Node { - guid: String - id: ID! + guid: String + id: ID! - md5: String + md5: String - metadataUrl: URI! + metadataUrl: URI! - name: String! + name: String! - packageVersion: RegistryPackageVersion! + packageVersion: RegistryPackageVersion! - sha1: String + sha1: String - sha256: String + sha256: String - size: Int + size: Int - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type RegistryPackageFileConnection { - edges: [RegistryPackageFileEdge] + edges: [RegistryPackageFileEdge] - nodes: [RegistryPackageFile] + nodes: [RegistryPackageFile] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageFileEdge { - cursor: String! + cursor: String! - node: RegistryPackageFile + node: RegistryPackageFile } enum RegistryPackageFileState { - NEW + NEW - UPLOADED + UPLOADED } input RegistryPackageMetadatum { - name: String! + name: String! - update: Boolean + update: Boolean - value: String! + value: String! } interface RegistryPackageOwner { - id: ID! + id: ID! - registryPackages( - after: String + registryPackages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String + name: String - names: [String] + names: [String] - packageType: RegistryPackageType + packageType: RegistryPackageType - publicOnly: Boolean = false + publicOnly: Boolean = false - registryPackageType: String + registryPackageType: String - repositoryId: ID - ): RegistryPackageConnection! + repositoryId: ID + ): RegistryPackageConnection! } interface RegistryPackageSearch { - id: ID! + id: ID! - registryPackagesForQuery( - after: String + registryPackagesForQuery( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - packageType: RegistryPackageType + packageType: RegistryPackageType - query: String - ): RegistryPackageConnection! + query: String + ): RegistryPackageConnection! } type RegistryPackageStatistics { - downloadsThisMonth: Int! + downloadsThisMonth: Int! - downloadsThisWeek: Int! + downloadsThisWeek: Int! - downloadsThisYear: Int! + downloadsThisYear: Int! - downloadsToday: Int! + downloadsToday: Int! - downloadsTotalCount: Int! + downloadsTotalCount: Int! } type RegistryPackageTag implements Node { - id: ID! + id: ID! - name: String! + name: String! - version: RegistryPackageVersion + version: RegistryPackageVersion } type RegistryPackageTagConnection { - edges: [RegistryPackageTagEdge] + edges: [RegistryPackageTagEdge] - nodes: [RegistryPackageTag] + nodes: [RegistryPackageTag] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageTagEdge { - cursor: String! + cursor: String! - node: RegistryPackageTag + node: RegistryPackageTag } enum RegistryPackageType { - DEBIAN + DEBIAN - DOCKER + DOCKER - MAVEN + MAVEN - NPM + NPM - NUGET + NUGET - PYTHON + PYTHON - RUBYGEMS + RUBYGEMS } type RegistryPackageVersion implements Node { - dependencies( - after: String + dependencies( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - type: RegistryPackageDependencyType - ): RegistryPackageDependencyConnection! + type: RegistryPackageDependencyType + ): RegistryPackageDependencyConnection! - fileByName( - filename: String! - ): RegistryPackageFile + fileByName( + filename: String! + ): RegistryPackageFile - files( - after: String + files( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RegistryPackageFileConnection! - id: ID! + last: Int + ): RegistryPackageFileConnection! + id: ID! - installationCommand: String + installationCommand: String - manifest: String + manifest: String - platform: String + platform: String - readme: String + readme: String - readmeHtml: HTML + readmeHtml: HTML - registryPackage: RegistryPackage + registryPackage: RegistryPackage - release: Release + release: Release - sha256: String + sha256: String - size: Int + size: Int - statistics: RegistryPackageVersionStatistics + statistics: RegistryPackageVersionStatistics - summary: String + summary: String - updatedAt: DateTime! + updatedAt: DateTime! - version: String! + version: String! - viewerCanEdit: Boolean! + viewerCanEdit: Boolean! } type RegistryPackageVersionConnection { - edges: [RegistryPackageVersionEdge] + edges: [RegistryPackageVersionEdge] - nodes: [RegistryPackageVersion] + nodes: [RegistryPackageVersion] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageVersionEdge { - cursor: String! + cursor: String! - node: RegistryPackageVersion + node: RegistryPackageVersion } type RegistryPackageVersionStatistics { - downloadsThisMonth: Int! + downloadsThisMonth: Int! - downloadsThisWeek: Int! + downloadsThisWeek: Int! - downloadsThisYear: Int! + downloadsThisYear: Int! - downloadsToday: Int! + downloadsToday: Int! - downloadsTotalCount: Int! + downloadsTotalCount: Int! } type Release implements Node & UniformResourceLocatable { - author: User + author: User - createdAt: DateTime! + createdAt: DateTime! - description: String - id: ID! + description: String + id: ID! - isDraft: Boolean! + isDraft: Boolean! - isPrerelease: Boolean! + isPrerelease: Boolean! - name: String + name: String - publishedAt: DateTime + publishedAt: DateTime - releaseAssets( - after: String + releaseAssets( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String - ): ReleaseAssetConnection! + name: String + ): ReleaseAssetConnection! - resourcePath: URI! + resourcePath: URI! - tag: Ref + tag: Ref - tagName: String! + tagName: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type ReleaseAsset implements Node { - contentType: String! + contentType: String! - createdAt: DateTime! + createdAt: DateTime! - downloadCount: Int! + downloadCount: Int! - downloadUrl: URI! - id: ID! + downloadUrl: URI! + id: ID! - name: String! + name: String! - release: Release + release: Release - size: Int! + size: Int! - updatedAt: DateTime! + updatedAt: DateTime! - uploadedBy: User! + uploadedBy: User! - url: URI! + url: URI! } type ReleaseAssetConnection { - edges: [ReleaseAssetEdge] + edges: [ReleaseAssetEdge] - nodes: [ReleaseAsset] + nodes: [ReleaseAsset] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReleaseAssetEdge { - cursor: String! + cursor: String! - node: ReleaseAsset + node: ReleaseAsset } type ReleaseConnection { - edges: [ReleaseEdge] + edges: [ReleaseEdge] - nodes: [Release] + nodes: [Release] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReleaseEdge { - cursor: String! + cursor: String! - node: Release + node: Release } input ReleaseOrder { - direction: OrderDirection! + direction: OrderDirection! - field: ReleaseOrderField! + field: ReleaseOrderField! } enum ReleaseOrderField { - CREATED_AT + CREATED_AT - NAME + NAME } input RemoveAssigneesFromAssignableInput { - assignableId: ID! + assignableId: ID! - assigneeIds: [ID!]! + assigneeIds: [ID!]! - clientMutationId: String + clientMutationId: String } type RemoveAssigneesFromAssignablePayload { - assignable: Assignable + assignable: Assignable - clientMutationId: String + clientMutationId: String } input RemoveLabelsFromLabelableInput { - clientMutationId: String + clientMutationId: String - labelIds: [ID!]! + labelIds: [ID!]! - labelableId: ID! + labelableId: ID! } type RemoveLabelsFromLabelablePayload { - clientMutationId: String + clientMutationId: String - labelable: Labelable + labelable: Labelable } input RemoveOutsideCollaboratorInput { - clientMutationId: String + clientMutationId: String - organizationId: ID! + organizationId: ID! - userId: ID! + userId: ID! } type RemoveOutsideCollaboratorPayload { - clientMutationId: String + clientMutationId: String - removedUser: User + removedUser: User } input RemoveReactionInput { - clientMutationId: String + clientMutationId: String - content: ReactionContent! + content: ReactionContent! - subjectId: ID! + subjectId: ID! } type RemoveReactionPayload { - clientMutationId: String + clientMutationId: String - reaction: Reaction + reaction: Reaction - subject: Reactable + subject: Reactable } input RemoveStarInput { - clientMutationId: String + clientMutationId: String - starrableId: ID! + starrableId: ID! } type RemoveStarPayload { - clientMutationId: String + clientMutationId: String - starrable: Starrable + starrable: Starrable } type RemovedFromProjectEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type RenamedTitleEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - currentTitle: String! - id: ID! + currentTitle: String! + id: ID! - previousTitle: String! + previousTitle: String! - subject: RenamedTitleSubject! + subject: RenamedTitleSubject! } union RenamedTitleSubject = Issue | PullRequest input ReopenIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } type ReopenIssuePayload { - clientMutationId: String + clientMutationId: String - issue: Issue + issue: Issue } input ReopenPullRequestInput { - clientMutationId: String + clientMutationId: String - pullRequestId: ID! + pullRequestId: ID! } type ReopenPullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } type ReopenedEvent implements Node { - actor: Actor + actor: Actor - closable: Closable! + closable: Closable! - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! } enum ReportedContentClassifiers { - ABUSE + ABUSE - OFF_TOPIC + OFF_TOPIC - OUTDATED + OUTDATED - RESOLVED + RESOLVED - SPAM + SPAM } type Repository implements Node & ProjectOwner & RegistryPackageOwner & RepositoryInfo & Starrable & Subscribable & UniformResourceLocatable { - assignableUsers( - after: String + assignableUsers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - branchProtectionRules( - after: String + branchProtectionRules( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): BranchProtectionRuleConnection! + last: Int + ): BranchProtectionRuleConnection! - codeOfConduct: CodeOfConduct + codeOfConduct: CodeOfConduct - collaborators( - affiliation: CollaboratorAffiliation + collaborators( + affiliation: CollaboratorAffiliation - after: String + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RepositoryCollaboratorConnection + last: Int + ): RepositoryCollaboratorConnection - commitComments( - after: String + commitComments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - defaultBranchRef: Ref + defaultBranchRef: Ref - deployKeys( - after: String + deployKeys( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): DeployKeyConnection! + last: Int + ): DeployKeyConnection! - deployments( - after: String + deployments( + after: String - before: String + before: String - environments: [String!] + environments: [String!] - first: Int + first: Int - last: Int + last: Int - orderBy: DeploymentOrder = {field: CREATED_AT, direction: ASC} - ): DeploymentConnection! + orderBy: DeploymentOrder = {field: CREATED_AT, direction: ASC} + ): DeploymentConnection! - description: String + description: String - descriptionHTML: HTML! + descriptionHTML: HTML! - diskUsage: Int + diskUsage: Int - forkCount: Int! + forkCount: Int! - forks( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + forks( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - hasIssuesEnabled: Boolean! + hasIssuesEnabled: Boolean! - hasWikiEnabled: Boolean! + hasWikiEnabled: Boolean! - homepageUrl: URI - id: ID! + homepageUrl: URI + id: ID! - isArchived: Boolean! + isArchived: Boolean! - isDisabled: Boolean! + isDisabled: Boolean! - isFork: Boolean! + isFork: Boolean! - isLocked: Boolean! + isLocked: Boolean! - isMirror: Boolean! + isMirror: Boolean! - isPrivate: Boolean! + isPrivate: Boolean! - isTemplate: Boolean! + isTemplate: Boolean! - issue( - number: Int! - ): Issue + issue( + number: Int! + ): Issue - issueOrPullRequest( - number: Int! - ): IssueOrPullRequest + issueOrPullRequest( + number: Int! + ): IssueOrPullRequest - issues( - after: String + issues( + after: String - before: String + before: String - filterBy: IssueFilters + filterBy: IssueFilters - first: Int + first: Int - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [IssueState!] - ): IssueConnection! + states: [IssueState!] + ): IssueConnection! - label( - name: String! - ): Label + label( + name: String! + ): Label - labels( - after: String + labels( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - query: String - ): LabelConnection + query: String + ): LabelConnection - languages( - after: String + languages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: LanguageOrder - ): LanguageConnection + orderBy: LanguageOrder + ): LanguageConnection - licenseInfo: License + licenseInfo: License - lockReason: RepositoryLockReason + lockReason: RepositoryLockReason - mentionableUsers( - after: String + mentionableUsers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - mergeCommitAllowed: Boolean! + mergeCommitAllowed: Boolean! - milestone( - number: Int! - ): Milestone + milestone( + number: Int! + ): Milestone - milestones( - after: String + milestones( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: MilestoneOrder + orderBy: MilestoneOrder - states: [MilestoneState!] - ): MilestoneConnection + states: [MilestoneState!] + ): MilestoneConnection - mirrorUrl: URI + mirrorUrl: URI - name: String! + name: String! - nameWithOwner: String! + nameWithOwner: String! - object( - expression: String + object( + expression: String - oid: GitObjectID - ): GitObject + oid: GitObjectID + ): GitObject - openGraphImageUrl: URI! + openGraphImageUrl: URI! - owner: RepositoryOwner! + owner: RepositoryOwner! - parent: Repository + parent: Repository - primaryLanguage: Language + primaryLanguage: Language - project( - number: Int! - ): Project + project( + number: Int! + ): Project - projects( - after: String + projects( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ProjectOrder + orderBy: ProjectOrder - search: String + search: String - states: [ProjectState!] - ): ProjectConnection! + states: [ProjectState!] + ): ProjectConnection! - projectsResourcePath: URI! + projectsResourcePath: URI! - projectsUrl: URI! + projectsUrl: URI! - pullRequest( - number: Int! - ): PullRequest + pullRequest( + number: Int! + ): PullRequest - pullRequests( - after: String + pullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! + states: [PullRequestState!] + ): PullRequestConnection! - pushedAt: DateTime + pushedAt: DateTime - rebaseMergeAllowed: Boolean! + rebaseMergeAllowed: Boolean! - ref( - qualifiedName: String! - ): Ref + ref( + qualifiedName: String! + ): Ref - refs( - after: String + refs( + after: String - before: String + before: String - direction: OrderDirection + direction: OrderDirection - first: Int + first: Int - last: Int + last: Int - orderBy: RefOrder + orderBy: RefOrder - refPrefix: String! - ): RefConnection + refPrefix: String! + ): RefConnection - registryPackages( - after: String + registryPackages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String + name: String - names: [String] + names: [String] - packageType: RegistryPackageType + packageType: RegistryPackageType - publicOnly: Boolean = false + publicOnly: Boolean = false - registryPackageType: String + registryPackageType: String - repositoryId: ID - ): RegistryPackageConnection! + repositoryId: ID + ): RegistryPackageConnection! - release( - tagName: String! - ): Release + release( + tagName: String! + ): Release - releases( - after: String + releases( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ReleaseOrder - ): ReleaseConnection! + orderBy: ReleaseOrder + ): ReleaseConnection! - repositoryTopics( - after: String + repositoryTopics( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RepositoryTopicConnection! + last: Int + ): RepositoryTopicConnection! - resourcePath: URI! + resourcePath: URI! - shortDescriptionHTML( - limit: Int = 200 - ): HTML! + shortDescriptionHTML( + limit: Int = 200 + ): HTML! - squashMergeAllowed: Boolean! + squashMergeAllowed: Boolean! - sshUrl: GitSSHRemote! + sshUrl: GitSSHRemote! - stargazers( - after: String + stargazers( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder - ): StargazerConnection! + orderBy: StarOrder + ): StargazerConnection! - templateRepository: Repository + templateRepository: Repository - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - usesCustomOpenGraphImage: Boolean! + usesCustomOpenGraphImage: Boolean! - viewerCanAdminister: Boolean! + viewerCanAdminister: Boolean! - viewerCanCreateProjects: Boolean! + viewerCanCreateProjects: Boolean! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerCanUpdateTopics: Boolean! + viewerCanUpdateTopics: Boolean! - viewerHasStarred: Boolean! + viewerHasStarred: Boolean! - viewerPermission: RepositoryPermission + viewerPermission: RepositoryPermission - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState - watchers( - after: String + watchers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! } enum RepositoryAffiliation { - COLLABORATOR + COLLABORATOR - ORGANIZATION_MEMBER + ORGANIZATION_MEMBER - OWNER + OWNER } enum RepositoryCollaboratorAffiliation { - ALL + ALL - OUTSIDE + OUTSIDE } type RepositoryCollaboratorConnection { - edges: [RepositoryCollaboratorEdge] + edges: [RepositoryCollaboratorEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RepositoryCollaboratorEdge { - cursor: String! - node: User! + cursor: String! + node: User! - permission: RepositoryPermission! + permission: RepositoryPermission! - permissionSources: [PermissionSource!] + permissionSources: [PermissionSource!] } type RepositoryConnection { - edges: [RepositoryEdge] + edges: [RepositoryEdge] - nodes: [Repository] + nodes: [Repository] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - totalDiskUsage: Int! + totalDiskUsage: Int! } enum RepositoryContributionType { - COMMIT + COMMIT - ISSUE + ISSUE - PULL_REQUEST + PULL_REQUEST - PULL_REQUEST_REVIEW + PULL_REQUEST_REVIEW - REPOSITORY + REPOSITORY } type RepositoryEdge { - cursor: String! + cursor: String! - node: Repository + node: Repository } interface RepositoryInfo { - createdAt: DateTime! + createdAt: DateTime! - description: String + description: String - descriptionHTML: HTML! + descriptionHTML: HTML! - forkCount: Int! + forkCount: Int! - hasIssuesEnabled: Boolean! + hasIssuesEnabled: Boolean! - hasWikiEnabled: Boolean! + hasWikiEnabled: Boolean! - homepageUrl: URI + homepageUrl: URI - isArchived: Boolean! + isArchived: Boolean! - isFork: Boolean! + isFork: Boolean! - isLocked: Boolean! + isLocked: Boolean! - isMirror: Boolean! + isMirror: Boolean! - isPrivate: Boolean! + isPrivate: Boolean! - isTemplate: Boolean! + isTemplate: Boolean! - licenseInfo: License + licenseInfo: License - lockReason: RepositoryLockReason + lockReason: RepositoryLockReason - mirrorUrl: URI + mirrorUrl: URI - name: String! + name: String! - nameWithOwner: String! + nameWithOwner: String! - openGraphImageUrl: URI! + openGraphImageUrl: URI! - owner: RepositoryOwner! + owner: RepositoryOwner! - pushedAt: DateTime + pushedAt: DateTime - resourcePath: URI! + resourcePath: URI! - shortDescriptionHTML( - limit: Int = 200 - ): HTML! + shortDescriptionHTML( + limit: Int = 200 + ): HTML! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - usesCustomOpenGraphImage: Boolean! + usesCustomOpenGraphImage: Boolean! } type RepositoryInvitation implements Node { - id: ID! + id: ID! - invitee: User! + invitee: User! - inviter: User! + inviter: User! - permission: RepositoryPermission! + permission: RepositoryPermission! - repository: RepositoryInfo + repository: RepositoryInfo } type RepositoryInvitationEdge { - cursor: String! + cursor: String! - node: RepositoryInvitation + node: RepositoryInvitation } enum RepositoryLockReason { - BILLING + BILLING - MIGRATING + MIGRATING - MOVING + MOVING - RENAME + RENAME } interface RepositoryNode { - repository: Repository! + repository: Repository! } input RepositoryOrder { - direction: OrderDirection! + direction: OrderDirection! - field: RepositoryOrderField! + field: RepositoryOrderField! } enum RepositoryOrderField { - CREATED_AT + CREATED_AT - NAME + NAME - PUSHED_AT + PUSHED_AT - STARGAZERS + STARGAZERS - UPDATED_AT + UPDATED_AT } interface RepositoryOwner { - avatarUrl( - size: Int - ): URI! - id: ID! + avatarUrl( + size: Int + ): URI! + id: ID! - login: String! + login: String! - pinnedRepositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + pinnedRepositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + privacy: RepositoryPrivacy + ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") - repositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + repositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isFork: Boolean + isFork: Boolean - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - repository( - name: String! - ): Repository + repository( + name: String! + ): Repository - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } enum RepositoryPermission { - ADMIN + ADMIN - MAINTAIN + MAINTAIN - READ + READ - TRIAGE + TRIAGE - WRITE + WRITE } enum RepositoryPrivacy { - PRIVATE + PRIVATE - PUBLIC + PUBLIC } type RepositoryTopic implements Node & UniformResourceLocatable { - id: ID! + id: ID! - resourcePath: URI! + resourcePath: URI! - topic: Topic! + topic: Topic! - url: URI! + url: URI! } type RepositoryTopicConnection { - edges: [RepositoryTopicEdge] + edges: [RepositoryTopicEdge] - nodes: [RepositoryTopic] + nodes: [RepositoryTopic] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RepositoryTopicEdge { - cursor: String! + cursor: String! - node: RepositoryTopic + node: RepositoryTopic } enum RepositoryVisibility { - INTERNAL + INTERNAL - PRIVATE + PRIVATE - PUBLIC + PUBLIC } input RequestReviewsInput { - clientMutationId: String + clientMutationId: String - pullRequestId: ID! + pullRequestId: ID! - teamIds: [ID!] + teamIds: [ID!] - union: Boolean + union: Boolean - userIds: [ID!] + userIds: [ID!] } type RequestReviewsPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest - requestedReviewersEdge: UserEdge + requestedReviewersEdge: UserEdge } union RequestedReviewer = Mannequin | Team | User input ResolveReviewThreadInput { - clientMutationId: String + clientMutationId: String - threadId: ID! + threadId: ID! } type ResolveReviewThreadPayload { - clientMutationId: String + clientMutationId: String - thread: PullRequestReviewThread + thread: PullRequestReviewThread } type RestrictedContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type ReviewDismissalAllowance implements Node { - actor: ReviewDismissalAllowanceActor + actor: ReviewDismissalAllowanceActor - branchProtectionRule: BranchProtectionRule - id: ID! + branchProtectionRule: BranchProtectionRule + id: ID! } union ReviewDismissalAllowanceActor = Team | User type ReviewDismissalAllowanceConnection { - edges: [ReviewDismissalAllowanceEdge] + edges: [ReviewDismissalAllowanceEdge] - nodes: [ReviewDismissalAllowance] + nodes: [ReviewDismissalAllowance] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReviewDismissalAllowanceEdge { - cursor: String! + cursor: String! - node: ReviewDismissalAllowance + node: ReviewDismissalAllowance } type ReviewDismissedEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - dismissalMessage: String + dismissalMessage: String - dismissalMessageHTML: String - id: ID! + dismissalMessageHTML: String + id: ID! - previousReviewState: PullRequestReviewState! + previousReviewState: PullRequestReviewState! - pullRequest: PullRequest! + pullRequest: PullRequest! - pullRequestCommit: PullRequestCommit + pullRequestCommit: PullRequestCommit - resourcePath: URI! + resourcePath: URI! - review: PullRequestReview + review: PullRequestReview - url: URI! + url: URI! } type ReviewRequest implements Node { - databaseId: Int - id: ID! + databaseId: Int + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - requestedReviewer: RequestedReviewer + requestedReviewer: RequestedReviewer } type ReviewRequestConnection { - edges: [ReviewRequestEdge] + edges: [ReviewRequestEdge] - nodes: [ReviewRequest] + nodes: [ReviewRequest] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReviewRequestEdge { - cursor: String! + cursor: String! - node: ReviewRequest + node: ReviewRequest } type ReviewRequestRemovedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - requestedReviewer: RequestedReviewer + requestedReviewer: RequestedReviewer } type ReviewRequestedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - requestedReviewer: RequestedReviewer + requestedReviewer: RequestedReviewer } type SavedReply implements Node { - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - title: String! + title: String! - user: Actor + user: Actor } type SavedReplyConnection { - edges: [SavedReplyEdge] + edges: [SavedReplyEdge] - nodes: [SavedReply] + nodes: [SavedReply] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type SavedReplyEdge { - cursor: String! + cursor: String! - node: SavedReply + node: SavedReply } input SavedReplyOrder { - direction: OrderDirection! + direction: OrderDirection! - field: SavedReplyOrderField! + field: SavedReplyOrderField! } enum SavedReplyOrderField { - UPDATED_AT + UPDATED_AT } union SearchResultItem = App | Issue | MarketplaceListing | Organization | PullRequest | Repository | User type SearchResultItemConnection { - codeCount: Int! + codeCount: Int! - edges: [SearchResultItemEdge] + edges: [SearchResultItemEdge] - issueCount: Int! + issueCount: Int! - nodes: [SearchResultItem] + nodes: [SearchResultItem] - pageInfo: PageInfo! + pageInfo: PageInfo! - repositoryCount: Int! + repositoryCount: Int! - userCount: Int! + userCount: Int! - wikiCount: Int! + wikiCount: Int! } type SearchResultItemEdge { - cursor: String! + cursor: String! - node: SearchResultItem + node: SearchResultItem - textMatches: [TextMatch] + textMatches: [TextMatch] } enum SearchType { - ISSUE + ISSUE - REPOSITORY + REPOSITORY - USER + USER } type SecurityAdvisory implements Node { - databaseId: Int + databaseId: Int - description: String! + description: String! - ghsaId: String! - id: ID! + ghsaId: String! + id: ID! - identifiers: [SecurityAdvisoryIdentifier!]! + identifiers: [SecurityAdvisoryIdentifier!]! - origin: String! + origin: String! - publishedAt: DateTime! + publishedAt: DateTime! - references: [SecurityAdvisoryReference!]! + references: [SecurityAdvisoryReference!]! - severity: SecurityAdvisorySeverity! + severity: SecurityAdvisorySeverity! - summary: String! + summary: String! - updatedAt: DateTime! + updatedAt: DateTime! - vulnerabilities( - after: String + vulnerabilities( + after: String - before: String + before: String - ecosystem: SecurityAdvisoryEcosystem + ecosystem: SecurityAdvisoryEcosystem - first: Int + first: Int - last: Int + last: Int - orderBy: SecurityVulnerabilityOrder = {field: UPDATED_AT, direction: DESC} + orderBy: SecurityVulnerabilityOrder = {field: UPDATED_AT, direction: DESC} - package: String + package: String - severities: [SecurityAdvisorySeverity!] - ): SecurityVulnerabilityConnection! + severities: [SecurityAdvisorySeverity!] + ): SecurityVulnerabilityConnection! - withdrawnAt: DateTime + withdrawnAt: DateTime } type SecurityAdvisoryConnection { - edges: [SecurityAdvisoryEdge] + edges: [SecurityAdvisoryEdge] - nodes: [SecurityAdvisory] + nodes: [SecurityAdvisory] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } enum SecurityAdvisoryEcosystem { - MAVEN + MAVEN - NPM + NPM - NUGET + NUGET - PIP + PIP - RUBYGEMS + RUBYGEMS } type SecurityAdvisoryEdge { - cursor: String! + cursor: String! - node: SecurityAdvisory + node: SecurityAdvisory } type SecurityAdvisoryIdentifier { - type: String! + type: String! - value: String! + value: String! } input SecurityAdvisoryIdentifierFilter { - type: SecurityAdvisoryIdentifierType! + type: SecurityAdvisoryIdentifierType! - value: String! + value: String! } enum SecurityAdvisoryIdentifierType { - CVE + CVE - GHSA + GHSA } input SecurityAdvisoryOrder { - direction: OrderDirection! + direction: OrderDirection! - field: SecurityAdvisoryOrderField! + field: SecurityAdvisoryOrderField! } enum SecurityAdvisoryOrderField { - PUBLISHED_AT + PUBLISHED_AT - UPDATED_AT + UPDATED_AT } type SecurityAdvisoryPackage { - ecosystem: SecurityAdvisoryEcosystem! + ecosystem: SecurityAdvisoryEcosystem! - name: String! + name: String! } type SecurityAdvisoryPackageVersion { - identifier: String! + identifier: String! } type SecurityAdvisoryReference { - url: URI! + url: URI! } enum SecurityAdvisorySeverity { - CRITICAL + CRITICAL - HIGH + HIGH - LOW + LOW - MODERATE + MODERATE } type SecurityVulnerability { - advisory: SecurityAdvisory! + advisory: SecurityAdvisory! - firstPatchedVersion: SecurityAdvisoryPackageVersion + firstPatchedVersion: SecurityAdvisoryPackageVersion - package: SecurityAdvisoryPackage! + package: SecurityAdvisoryPackage! - severity: SecurityAdvisorySeverity! + severity: SecurityAdvisorySeverity! - updatedAt: DateTime! + updatedAt: DateTime! - vulnerableVersionRange: String! + vulnerableVersionRange: String! } type SecurityVulnerabilityConnection { - edges: [SecurityVulnerabilityEdge] + edges: [SecurityVulnerabilityEdge] - nodes: [SecurityVulnerability] + nodes: [SecurityVulnerability] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type SecurityVulnerabilityEdge { - cursor: String! + cursor: String! - node: SecurityVulnerability + node: SecurityVulnerability } input SecurityVulnerabilityOrder { - direction: OrderDirection! + direction: OrderDirection! - field: SecurityVulnerabilityOrderField! + field: SecurityVulnerabilityOrderField! } enum SecurityVulnerabilityOrderField { - UPDATED_AT + UPDATED_AT } type SmimeSignature implements GitSignature { - email: String! + email: String! - isValid: Boolean! + isValid: Boolean! - payload: String! + payload: String! - signature: String! + signature: String! - signer: User + signer: User - state: GitSignatureState! + state: GitSignatureState! - wasSignedByGitHub: Boolean! + wasSignedByGitHub: Boolean! } interface Sponsorable { - sponsorshipsAsMaintainer( - after: String + sponsorshipsAsMaintainer( + after: String - before: String + before: String - first: Int + first: Int - includePrivate: Boolean = false + includePrivate: Boolean = false - last: Int + last: Int - orderBy: SponsorshipOrder - ): SponsorshipConnection! + orderBy: SponsorshipOrder + ): SponsorshipConnection! - sponsorshipsAsSponsor( - after: String + sponsorshipsAsSponsor( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: SponsorshipOrder - ): SponsorshipConnection! + orderBy: SponsorshipOrder + ): SponsorshipConnection! } type SponsorsListing implements Node { - fullDescription: String! - id: ID! + fullDescription: String! + id: ID! - shortDescription: String! + shortDescription: String! - slug: String! + slug: String! } type Sponsorship implements Node { - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - maintainer: User! + maintainer: User! - privacyLevel: SponsorshipPrivacy! + privacyLevel: SponsorshipPrivacy! - sponsor: User + sponsor: User } type SponsorshipConnection { - edges: [SponsorshipEdge] + edges: [SponsorshipEdge] - nodes: [Sponsorship] + nodes: [Sponsorship] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type SponsorshipEdge { - cursor: String! + cursor: String! - node: Sponsorship + node: Sponsorship } input SponsorshipOrder { - direction: OrderDirection! + direction: OrderDirection! } enum SponsorshipPrivacy { - PRIVATE + PRIVATE - PUBLIC + PUBLIC } input StarOrder { - direction: OrderDirection! + direction: OrderDirection! - field: StarOrderField! + field: StarOrderField! } enum StarOrderField { - STARRED_AT + STARRED_AT } type StargazerConnection { - edges: [StargazerEdge] + edges: [StargazerEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type StargazerEdge { - cursor: String! - node: User! + cursor: String! + node: User! - starredAt: DateTime! + starredAt: DateTime! } interface Starrable { - id: ID! + id: ID! - stargazers( - after: String + stargazers( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder - ): StargazerConnection! + orderBy: StarOrder + ): StargazerConnection! - viewerHasStarred: Boolean! + viewerHasStarred: Boolean! } type StarredRepositoryConnection { - edges: [StarredRepositoryEdge] + edges: [StarredRepositoryEdge] - nodes: [Repository] + nodes: [Repository] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type StarredRepositoryEdge { - cursor: String! - node: Repository! + cursor: String! + node: Repository! - starredAt: DateTime! + starredAt: DateTime! } type Status implements Node { - commit: Commit + commit: Commit - context( - name: String! - ): StatusContext + context( + name: String! + ): StatusContext - contexts: [StatusContext!]! - id: ID! + contexts: [StatusContext!]! + id: ID! - state: StatusState! + state: StatusState! } type StatusContext implements Node { - avatarUrl( - size: Int = 40 - ): URI + avatarUrl( + size: Int = 40 + ): URI - commit: Commit + commit: Commit - context: String! + context: String! - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - description: String - id: ID! + description: String + id: ID! - state: StatusState! + state: StatusState! - targetUrl: URI + targetUrl: URI } enum StatusState { - ERROR + ERROR - EXPECTED + EXPECTED - FAILURE + FAILURE - PENDING + PENDING - SUCCESS + SUCCESS } input SubmitPullRequestReviewInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - event: PullRequestReviewEvent! + event: PullRequestReviewEvent! - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type SubmitPullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } interface Subscribable { - id: ID! + id: ID! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState } type SubscribedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - subscribable: Subscribable! + subscribable: Subscribable! } enum SubscriptionState { - IGNORED + IGNORED - SUBSCRIBED + SUBSCRIBED - UNSUBSCRIBED + UNSUBSCRIBED } type SuggestedReviewer { - isAuthor: Boolean! + isAuthor: Boolean! - isCommenter: Boolean! + isCommenter: Boolean! - reviewer: User! + reviewer: User! } type Tag implements GitObject & Node { - abbreviatedOid: String! + abbreviatedOid: String! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! - id: ID! + commitUrl: URI! + id: ID! - message: String + message: String - name: String! + name: String! - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! - tagger: GitActor + tagger: GitActor - target: GitObject! + target: GitObject! } type Team implements MemberStatusable & Node & Subscribable { - ancestors( - after: String + ancestors( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): TeamConnection! + last: Int + ): TeamConnection! - avatarUrl( - size: Int = 400 - ): URI + avatarUrl( + size: Int = 400 + ): URI - childTeams( - after: String + childTeams( + after: String - before: String + before: String - first: Int + first: Int - immediateOnly: Boolean = true + immediateOnly: Boolean = true - last: Int + last: Int - orderBy: TeamOrder + orderBy: TeamOrder - userLogins: [String!] - ): TeamConnection! + userLogins: [String!] + ): TeamConnection! - combinedSlug: String! + combinedSlug: String! - createdAt: DateTime! + createdAt: DateTime! - description: String + description: String - editTeamResourcePath: URI! + editTeamResourcePath: URI! - editTeamUrl: URI! - id: ID! + editTeamUrl: URI! + id: ID! - invitations( - after: String + invitations( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): OrganizationInvitationConnection + last: Int + ): OrganizationInvitationConnection - memberStatuses( - after: String + memberStatuses( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} - ): UserStatusConnection! + orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} + ): UserStatusConnection! - members( - after: String + members( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - membership: TeamMembershipType = ALL + membership: TeamMembershipType = ALL - orderBy: TeamMemberOrder + orderBy: TeamMemberOrder - query: String + query: String - role: TeamMemberRole - ): TeamMemberConnection! + role: TeamMemberRole + ): TeamMemberConnection! - membersResourcePath: URI! + membersResourcePath: URI! - membersUrl: URI! + membersUrl: URI! - name: String! + name: String! - newTeamResourcePath: URI! + newTeamResourcePath: URI! - newTeamUrl: URI! + newTeamUrl: URI! - organization: Organization! + organization: Organization! - parentTeam: Team + parentTeam: Team - privacy: TeamPrivacy! + privacy: TeamPrivacy! - repositories( - after: String + repositories( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: TeamRepositoryOrder + orderBy: TeamRepositoryOrder - query: String - ): TeamRepositoryConnection! + query: String + ): TeamRepositoryConnection! - repositoriesResourcePath: URI! + repositoriesResourcePath: URI! - repositoriesUrl: URI! + repositoriesUrl: URI! - resourcePath: URI! + resourcePath: URI! - slug: String! + slug: String! - teamsResourcePath: URI! + teamsResourcePath: URI! - teamsUrl: URI! + teamsUrl: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - viewerCanAdminister: Boolean! + viewerCanAdminister: Boolean! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState } type TeamConnection { - edges: [TeamEdge] + edges: [TeamEdge] - nodes: [Team] + nodes: [Team] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type TeamEdge { - cursor: String! + cursor: String! - node: Team + node: Team } type TeamMemberConnection { - edges: [TeamMemberEdge] + edges: [TeamMemberEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type TeamMemberEdge { - cursor: String! + cursor: String! - memberAccessResourcePath: URI! + memberAccessResourcePath: URI! - memberAccessUrl: URI! - node: User! + memberAccessUrl: URI! + node: User! - role: TeamMemberRole! + role: TeamMemberRole! } input TeamMemberOrder { - direction: OrderDirection! + direction: OrderDirection! - field: TeamMemberOrderField! + field: TeamMemberOrderField! } enum TeamMemberOrderField { - CREATED_AT + CREATED_AT - LOGIN + LOGIN } enum TeamMemberRole { - MAINTAINER + MAINTAINER - MEMBER + MEMBER } enum TeamMembershipType { - ALL + ALL - CHILD_TEAM + CHILD_TEAM - IMMEDIATE + IMMEDIATE } input TeamOrder { - direction: OrderDirection! + direction: OrderDirection! - field: TeamOrderField! + field: TeamOrderField! } enum TeamOrderField { - NAME + NAME } enum TeamPrivacy { - SECRET + SECRET - VISIBLE + VISIBLE } type TeamRepositoryConnection { - edges: [TeamRepositoryEdge] + edges: [TeamRepositoryEdge] - nodes: [Repository] + nodes: [Repository] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type TeamRepositoryEdge { - cursor: String! - node: Repository! + cursor: String! + node: Repository! - permission: RepositoryPermission! + permission: RepositoryPermission! } input TeamRepositoryOrder { - direction: OrderDirection! + direction: OrderDirection! - field: TeamRepositoryOrderField! + field: TeamRepositoryOrderField! } enum TeamRepositoryOrderField { - CREATED_AT + CREATED_AT - NAME + NAME - PERMISSION + PERMISSION - PUSHED_AT + PUSHED_AT - STARGAZERS + STARGAZERS - UPDATED_AT + UPDATED_AT } enum TeamRole { - ADMIN + ADMIN - MEMBER + MEMBER } type TextMatch { - fragment: String! + fragment: String! - highlights: [TextMatchHighlight!]! + highlights: [TextMatchHighlight!]! - property: String! + property: String! } type TextMatchHighlight { - beginIndice: Int! + beginIndice: Int! - endIndice: Int! + endIndice: Int! - text: String! + text: String! } type Topic implements Node & Starrable { - id: ID! + id: ID! - name: String! + name: String! - relatedTopics( - first: Int = 3 - ): [Topic!]! + relatedTopics( + first: Int = 3 + ): [Topic!]! - stargazers( - after: String + stargazers( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder - ): StargazerConnection! + orderBy: StarOrder + ): StargazerConnection! - viewerHasStarred: Boolean! + viewerHasStarred: Boolean! } type TopicConnection { - edges: [TopicEdge] + edges: [TopicEdge] - nodes: [Topic] + nodes: [Topic] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type TopicEdge { - cursor: String! + cursor: String! - node: Topic + node: Topic } enum TopicSuggestionDeclineReason { - NOT_RELEVANT + NOT_RELEVANT - PERSONAL_PREFERENCE + PERSONAL_PREFERENCE - TOO_GENERAL + TOO_GENERAL - TOO_SPECIFIC + TOO_SPECIFIC } type TransferredEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - fromRepository: Repository - id: ID! + fromRepository: Repository + id: ID! - issue: Issue! + issue: Issue! } type Tree implements GitObject & Node { - abbreviatedOid: String! + abbreviatedOid: String! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! + commitUrl: URI! - entries: [TreeEntry!] - id: ID! + entries: [TreeEntry!] + id: ID! - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! } type TreeEntry { - mode: Int! + mode: Int! - name: String! + name: String! - object: GitObject + object: GitObject - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! - type: String! + type: String! } scalar URI type UnassignedEvent implements Node { - actor: Actor + actor: Actor - assignable: Assignable! + assignable: Assignable! - assignee: Assignee + assignee: Assignee - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - user: User @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") + user: User @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") } interface UniformResourceLocatable { - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type UnknownSignature implements GitSignature { - email: String! + email: String! - isValid: Boolean! + isValid: Boolean! - payload: String! + payload: String! - signature: String! + signature: String! - signer: User + signer: User - state: GitSignatureState! + state: GitSignatureState! - wasSignedByGitHub: Boolean! + wasSignedByGitHub: Boolean! } type UnlabeledEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - label: Label! + label: Label! - labelable: Labelable! + labelable: Labelable! } input UnlinkRepositoryFromProjectInput { - clientMutationId: String + clientMutationId: String - projectId: ID! + projectId: ID! - repositoryId: ID! + repositoryId: ID! } type UnlinkRepositoryFromProjectPayload { - clientMutationId: String + clientMutationId: String - project: Project + project: Project - repository: Repository + repository: Repository } input UnlockLockableInput { - clientMutationId: String + clientMutationId: String - lockableId: ID! + lockableId: ID! } type UnlockLockablePayload { - clientMutationId: String + clientMutationId: String - unlockedRecord: Lockable + unlockedRecord: Lockable } type UnlockedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - lockable: Lockable! + lockable: Lockable! } input UnmarkIssueAsDuplicateInput { - canonicalId: ID! + canonicalId: ID! - clientMutationId: String + clientMutationId: String - duplicateId: ID! + duplicateId: ID! } type UnmarkIssueAsDuplicatePayload { - clientMutationId: String + clientMutationId: String - duplicate: IssueOrPullRequest + duplicate: IssueOrPullRequest } input UnminimizeCommentInput { - clientMutationId: String + clientMutationId: String - subjectId: ID! + subjectId: ID! } input UnpinIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } type UnpinnedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - issue: Issue! + issue: Issue! } input UnresolveReviewThreadInput { - clientMutationId: String + clientMutationId: String - threadId: ID! + threadId: ID! } type UnresolveReviewThreadPayload { - clientMutationId: String + clientMutationId: String - thread: PullRequestReviewThread + thread: PullRequestReviewThread } type UnsubscribedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - subscribable: Subscribable! + subscribable: Subscribable! } interface Updatable { - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! } interface UpdatableComment { - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! } input UpdateBranchProtectionRuleInput { - branchProtectionRuleId: ID! + branchProtectionRuleId: ID! - clientMutationId: String + clientMutationId: String - dismissesStaleReviews: Boolean + dismissesStaleReviews: Boolean - isAdminEnforced: Boolean + isAdminEnforced: Boolean - pattern: String + pattern: String - pushActorIds: [ID!] + pushActorIds: [ID!] - requiredApprovingReviewCount: Int + requiredApprovingReviewCount: Int - requiredStatusCheckContexts: [String!] + requiredStatusCheckContexts: [String!] - requiresApprovingReviews: Boolean + requiresApprovingReviews: Boolean - requiresCodeOwnerReviews: Boolean + requiresCodeOwnerReviews: Boolean - requiresCommitSignatures: Boolean + requiresCommitSignatures: Boolean - requiresStatusChecks: Boolean + requiresStatusChecks: Boolean - requiresStrictStatusChecks: Boolean + requiresStrictStatusChecks: Boolean - restrictsPushes: Boolean + restrictsPushes: Boolean - restrictsReviewDismissals: Boolean + restrictsReviewDismissals: Boolean - reviewDismissalActorIds: [ID!] + reviewDismissalActorIds: [ID!] } type UpdateBranchProtectionRulePayload { - branchProtectionRule: BranchProtectionRule + branchProtectionRule: BranchProtectionRule - clientMutationId: String + clientMutationId: String } input UpdateIssueCommentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - id: ID! + id: ID! } type UpdateIssueCommentPayload { - clientMutationId: String + clientMutationId: String - issueComment: IssueComment + issueComment: IssueComment } input UpdateIssueInput { - assigneeIds: [ID!] + assigneeIds: [ID!] - body: String + body: String - clientMutationId: String + clientMutationId: String - id: ID! + id: ID! - labelIds: [ID!] + labelIds: [ID!] - milestoneId: ID + milestoneId: ID - projectIds: [ID!] + projectIds: [ID!] - state: IssueState + state: IssueState - title: String + title: String } type UpdateIssuePayload { - clientMutationId: String + clientMutationId: String - issue: Issue + issue: Issue } input UpdateProjectCardInput { - clientMutationId: String + clientMutationId: String - isArchived: Boolean + isArchived: Boolean - note: String + note: String - projectCardId: ID! + projectCardId: ID! } type UpdateProjectCardPayload { - clientMutationId: String + clientMutationId: String - projectCard: ProjectCard + projectCard: ProjectCard } input UpdateProjectColumnInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - projectColumnId: ID! + projectColumnId: ID! } type UpdateProjectColumnPayload { - clientMutationId: String + clientMutationId: String - projectColumn: ProjectColumn + projectColumn: ProjectColumn } input UpdateProjectInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - name: String + name: String - projectId: ID! + projectId: ID! - public: Boolean + public: Boolean - state: ProjectState + state: ProjectState } type UpdateProjectPayload { - clientMutationId: String + clientMutationId: String - project: Project + project: Project } input UpdatePullRequestInput { - baseRefName: String + baseRefName: String - body: String + body: String - clientMutationId: String + clientMutationId: String - maintainerCanModify: Boolean + maintainerCanModify: Boolean - pullRequestId: ID! + pullRequestId: ID! - title: String + title: String } type UpdatePullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } input UpdatePullRequestReviewCommentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - pullRequestReviewCommentId: ID! + pullRequestReviewCommentId: ID! } type UpdatePullRequestReviewCommentPayload { - clientMutationId: String + clientMutationId: String - pullRequestReviewComment: PullRequestReviewComment + pullRequestReviewComment: PullRequestReviewComment } input UpdatePullRequestReviewInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type UpdatePullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } input UpdateRefInput { - clientMutationId: String + clientMutationId: String - force: Boolean = false + force: Boolean = false - oid: GitObjectID! + oid: GitObjectID! - refId: ID! + refId: ID! } type UpdateRefPayload { - clientMutationId: String + clientMutationId: String - ref: Ref + ref: Ref } input UpdateRepositoryInput { - clientMutationId: String + clientMutationId: String - description: String + description: String - hasIssuesEnabled: Boolean + hasIssuesEnabled: Boolean - hasProjectsEnabled: Boolean + hasProjectsEnabled: Boolean - hasWikiEnabled: Boolean + hasWikiEnabled: Boolean - homepageUrl: URI + homepageUrl: URI - name: String + name: String - repositoryId: ID! + repositoryId: ID! - template: Boolean + template: Boolean } type UpdateRepositoryPayload { - clientMutationId: String + clientMutationId: String - repository: Repository + repository: Repository } input UpdateSubscriptionInput { - clientMutationId: String + clientMutationId: String - state: SubscriptionState! + state: SubscriptionState! - subscribableId: ID! + subscribableId: ID! } type UpdateSubscriptionPayload { - clientMutationId: String + clientMutationId: String - subscribable: Subscribable + subscribable: Subscribable } input UpdateTopicsInput { - clientMutationId: String + clientMutationId: String - repositoryId: ID! + repositoryId: ID! - topicNames: [String!]! + topicNames: [String!]! } type UpdateTopicsPayload { - clientMutationId: String + clientMutationId: String - invalidTopicNames: [String!] + invalidTopicNames: [String!] - repository: Repository + repository: Repository } type User implements Actor & Node & ProfileOwner & ProjectOwner & RegistryPackageOwner & RegistryPackageSearch & RepositoryOwner & Sponsorable & UniformResourceLocatable { - anyPinnableItems( - type: PinnableItemType - ): Boolean! + anyPinnableItems( + type: PinnableItemType + ): Boolean! - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - bio: String + bio: String - bioHTML: HTML! + bioHTML: HTML! - commitComments( - after: String + commitComments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - company: String + company: String - companyHTML: HTML! + companyHTML: HTML! - contributionsCollection( - from: DateTime + contributionsCollection( + from: DateTime - organizationID: ID + organizationID: ID - to: DateTime - ): ContributionsCollection! + to: DateTime + ): ContributionsCollection! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - email: String! + email: String! - followers( - after: String + followers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): FollowerConnection! + last: Int + ): FollowerConnection! - following( - after: String + following( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): FollowingConnection! + last: Int + ): FollowingConnection! - gist( - name: String! - ): Gist + gist( + name: String! + ): Gist - gistComments( - after: String + gistComments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): GistCommentConnection! + last: Int + ): GistCommentConnection! - gists( - after: String + gists( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: GistOrder + orderBy: GistOrder - privacy: GistPrivacy - ): GistConnection! - id: ID! + privacy: GistPrivacy + ): GistConnection! + id: ID! - isBountyHunter: Boolean! + isBountyHunter: Boolean! - isCampusExpert: Boolean! + isCampusExpert: Boolean! - isDeveloperProgramMember: Boolean! + isDeveloperProgramMember: Boolean! - isEmployee: Boolean! + isEmployee: Boolean! - isHireable: Boolean! + isHireable: Boolean! - isSiteAdmin: Boolean! + isSiteAdmin: Boolean! - isViewer: Boolean! + isViewer: Boolean! - issueComments( - after: String + issueComments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): IssueCommentConnection! + last: Int + ): IssueCommentConnection! - issues( - after: String + issues( + after: String - before: String + before: String - filterBy: IssueFilters + filterBy: IssueFilters - first: Int + first: Int - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [IssueState!] - ): IssueConnection! + states: [IssueState!] + ): IssueConnection! - itemShowcase: ProfileItemShowcase! + itemShowcase: ProfileItemShowcase! - location: String + location: String - login: String! + login: String! - name: String + name: String - organization( - login: String! - ): Organization + organization( + login: String! + ): Organization - organizations( - after: String + organizations( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): OrganizationConnection! + last: Int + ): OrganizationConnection! - pinnableItems( - after: String + pinnableItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItems( - after: String + pinnedItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItemsRemaining: Int! + pinnedItemsRemaining: Int! - pinnedRepositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + pinnedRepositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + privacy: RepositoryPrivacy + ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") - project( - number: Int! - ): Project + project( + number: Int! + ): Project - projects( - after: String + projects( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ProjectOrder + orderBy: ProjectOrder - search: String + search: String - states: [ProjectState!] - ): ProjectConnection! + states: [ProjectState!] + ): ProjectConnection! - projectsResourcePath: URI! + projectsResourcePath: URI! - projectsUrl: URI! + projectsUrl: URI! - publicKeys( - after: String + publicKeys( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PublicKeyConnection! + last: Int + ): PublicKeyConnection! - pullRequests( - after: String + pullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! + states: [PullRequestState!] + ): PullRequestConnection! - registryPackages( - after: String + registryPackages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String + name: String - names: [String] + names: [String] - packageType: RegistryPackageType + packageType: RegistryPackageType - publicOnly: Boolean = false + publicOnly: Boolean = false - registryPackageType: String + registryPackageType: String - repositoryId: ID - ): RegistryPackageConnection! + repositoryId: ID + ): RegistryPackageConnection! - registryPackagesForQuery( - after: String + registryPackagesForQuery( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - packageType: RegistryPackageType + packageType: RegistryPackageType - query: String - ): RegistryPackageConnection! + query: String + ): RegistryPackageConnection! - repositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + repositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isFork: Boolean + isFork: Boolean - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - repositoriesContributedTo( - after: String + repositoriesContributedTo( + after: String - before: String + before: String - contributionTypes: [RepositoryContributionType] + contributionTypes: [RepositoryContributionType] - first: Int + first: Int - includeUserRepositories: Boolean + includeUserRepositories: Boolean - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - repository( - name: String! - ): Repository + repository( + name: String! + ): Repository - resourcePath: URI! + resourcePath: URI! - savedReplies( - after: String + savedReplies( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: SavedReplyOrder = {field: UPDATED_AT, direction: DESC} - ): SavedReplyConnection + orderBy: SavedReplyOrder = {field: UPDATED_AT, direction: DESC} + ): SavedReplyConnection - sponsorshipsAsMaintainer( - after: String + sponsorshipsAsMaintainer( + after: String - before: String + before: String - first: Int + first: Int - includePrivate: Boolean = false + includePrivate: Boolean = false - last: Int + last: Int - orderBy: SponsorshipOrder - ): SponsorshipConnection! + orderBy: SponsorshipOrder + ): SponsorshipConnection! - sponsorshipsAsSponsor( - after: String + sponsorshipsAsSponsor( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: SponsorshipOrder - ): SponsorshipConnection! + orderBy: SponsorshipOrder + ): SponsorshipConnection! - starredRepositories( - after: String + starredRepositories( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder + orderBy: StarOrder - ownedByViewer: Boolean - ): StarredRepositoryConnection! + ownedByViewer: Boolean + ): StarredRepositoryConnection! - status: UserStatus + status: UserStatus - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - viewerCanChangePinnedItems: Boolean! + viewerCanChangePinnedItems: Boolean! - viewerCanCreateProjects: Boolean! + viewerCanCreateProjects: Boolean! - viewerCanFollow: Boolean! + viewerCanFollow: Boolean! - viewerIsFollowing: Boolean! + viewerIsFollowing: Boolean! - watching( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR, ORGANIZATION_MEMBER] + watching( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR, ORGANIZATION_MEMBER] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - websiteUrl: URI + websiteUrl: URI } enum UserBlockDuration { - ONE_DAY + ONE_DAY - ONE_MONTH + ONE_MONTH - ONE_WEEK + ONE_WEEK - PERMANENT + PERMANENT - THREE_DAYS + THREE_DAYS } type UserBlockedEvent implements Node { - actor: Actor + actor: Actor - blockDuration: UserBlockDuration! + blockDuration: UserBlockDuration! - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - subject: User + subject: User } type UserConnection { - edges: [UserEdge] + edges: [UserEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type UserContentEdit implements Node { - createdAt: DateTime! + createdAt: DateTime! - deletedAt: DateTime + deletedAt: DateTime - deletedBy: Actor + deletedBy: Actor - diff: String + diff: String - editedAt: DateTime! + editedAt: DateTime! - editor: Actor - id: ID! + editor: Actor + id: ID! - updatedAt: DateTime! + updatedAt: DateTime! } type UserContentEditConnection { - edges: [UserContentEditEdge] + edges: [UserContentEditEdge] - nodes: [UserContentEdit] + nodes: [UserContentEdit] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type UserContentEditEdge { - cursor: String! + cursor: String! - node: UserContentEdit + node: UserContentEdit } type UserEdge { - cursor: String! + cursor: String! - node: User + node: User } type UserStatus implements Node { - createdAt: DateTime! + createdAt: DateTime! - emoji: String + emoji: String - emojiHTML: HTML + emojiHTML: HTML - expiresAt: DateTime + expiresAt: DateTime - id: ID! + id: ID! - indicatesLimitedAvailability: Boolean! + indicatesLimitedAvailability: Boolean! - message: String + message: String - organization: Organization + organization: Organization - updatedAt: DateTime! + updatedAt: DateTime! - user: User! + user: User! } type UserStatusConnection { - edges: [UserStatusEdge] + edges: [UserStatusEdge] - nodes: [UserStatus] + nodes: [UserStatus] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type UserStatusEdge { - cursor: String! + cursor: String! - node: UserStatus + node: UserStatus } input UserStatusOrder { - direction: OrderDirection! + direction: OrderDirection! - field: UserStatusOrderField! + field: UserStatusOrderField! } enum UserStatusOrderField { - UPDATED_AT + UPDATED_AT } scalar X509Certificate \ No newline at end of file diff --git a/src/test/resources/schemas/type-interface-duplicate-fields.graphqls b/src/test/resources/schemas/type-interface-duplicate-fields.graphqls index 4925e1f4d..bb906b920 100644 --- a/src/test/resources/schemas/type-interface-duplicate-fields.graphqls +++ b/src/test/resources/schemas/type-interface-duplicate-fields.graphqls @@ -1,11 +1,11 @@ interface NamedEntity { - # an awesome name! - name: String @deprecated + # an awesome name! + name: String @deprecated } type Person implements NamedEntity { - name: String + name: String - # age in years - age: Int + # age in years + age: Int } \ No newline at end of file diff --git a/src/test/resources/schemas/type-interface-duplicate-fields1.graphqls b/src/test/resources/schemas/type-interface-duplicate-fields1.graphqls index dae7002a5..bb33af850 100644 --- a/src/test/resources/schemas/type-interface-duplicate-fields1.graphqls +++ b/src/test/resources/schemas/type-interface-duplicate-fields1.graphqls @@ -1,11 +1,11 @@ interface NamedEntity { - name: String @shouldnotbehere + name: String @shouldnotbehere } type Person implements NamedEntity { - # an awesome name! - name: String @deprecated + # an awesome name! + name: String @deprecated - # age in years - age: Int + # age in years + age: Int } \ No newline at end of file From a7a529a40b198aa48a1032fc533c1c6c80274288 Mon Sep 17 00:00:00 2001 From: Brayden Streibel Date: Mon, 8 Mar 2021 10:08:33 -0600 Subject: [PATCH 10/12] Revert "Bump jackson-databind from 2.12.1 to 2.12.2 (#565)" (#584) (cherry picked from commit d9bf6863ef3683209c98d419fc2124b993ca6b4d) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2fa59594f..7cffca83a 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ repositories { dependencies { implementation "org.freemarker:freemarker:2.3.31" implementation "com.graphql-java:graphql-java:15.0" - implementation "com.fasterxml.jackson.core:jackson-databind:2.12.2" + implementation "com.fasterxml.jackson.core:jackson-databind:2.12.1" testImplementation "org.junit.jupiter:junit-jupiter-api:5.7.1" testImplementation "org.junit.jupiter:junit-jupiter-params:5.7.1" From 6a457bdb6b85a8a6e903e88b4dd4e56d104c24a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= <568845948@qq.com> Date: Fri, 12 Mar 2021 20:32:21 +0800 Subject: [PATCH 11/12] Fix Scala ParameterizedInput issues and optimize templates (#588) --- .../graphql/codegen/scala/ScalaGraphQLCodegen.java | 6 +++--- .../graphql/codegen/scala/ScalaGraphQLTypeMapper.java | 8 ++++++-- .../graphql/codegen/scala/ScalaValueFormatter.java | 6 +++--- .../scala-lang/scalaClassGraphqlInterface.ftl | 5 +++-- .../scala-lang/scalaClassGraphqlOperations.ftl | 2 +- .../scala-lang/scalaClassGraphqlParametrizedInput.ftl | 6 +++--- .../templates/scala-lang/scalaClassGraphqlRequest.ftl | 6 +++--- .../templates/scala-lang/scalaClassGraphqlType.ftl | 4 ++-- .../scala/AddLabelsToLabelableInput.scala.txt | 4 ++-- .../AddLabelsToLabelableMutationRequest.scala.txt | 4 ++-- .../scala/AddLabelsToLabelablePayload.scala.txt | 2 +- .../scala/CodesOfConductQueryResolver.scala.txt | 2 +- .../resources/expected-classes/scala/Commit.scala.txt | 2 +- .../expected-classes/scala/Commit_Var_Field.scala.txt | 2 +- .../scala/Commit_noValidationAnnotation.scala.txt | 2 +- .../scala/Commit_no_final_class.scala.txt | 2 +- .../scala/Commit_withPrimitives.scala.txt | 2 +- .../scala/Commit_withoutPrimitives.scala.txt | 2 +- .../scala/GithubAcceptTopicSuggestionInputTO.scala.txt | 2 +- .../expected-classes/scala/GithubCommitTO.scala.txt | 2 +- .../scala/QueryINeedQueryRequest.scala.txt | 4 ++-- .../QueryINeedQueryRequest_custom_serializer.scala.txt | 4 ++-- .../annotation/CreateEventMutationResolver.scala.txt | 2 +- .../scala/annotation/MutationResolver.scala.txt | 2 +- .../scala/builder/CaseQueryRequest.scala.txt | 6 +++--- .../scala/custom-type/QueryINeedQueryRequest.scala.txt | 4 ++-- .../QueryINeedQueryRequest_whole_scalar.scala.txt | 4 ++-- .../scala/custom-type/ResponseContainingDate.scala.txt | 2 +- .../scala/deprecated/EventsQueryResolver.scala.txt | 2 +- .../scala/deprecated/QueryResolver.scala.txt | 2 +- .../scala/extend/AssetsQueryResolver.scala.txt | 2 +- .../expected-classes/scala/extend/Event.scala.txt | 2 +- .../expected-classes/scala/extend/EventInput.scala.txt | 2 +- .../scala/extend/EventsQueryResolver.scala.txt | 2 +- .../scala/extend/QueryResolver.scala.txt | 4 ++-- .../scala/extend/nullable/Event.scala.txt | 8 ++++---- .../extend/nullable/Null1QueryQueryResolver.scala.txt | 2 +- .../extend/nullable/Null2QueryQueryResolver.scala.txt | 2 +- .../extend/nullable/Null3QueryQueryResolver.scala.txt | 2 +- .../scala/extend/nullable/QueryResolver.scala.txt | 10 +++++----- .../SimpleEventCountsQueryResolver.scala.txt | 2 +- .../extend/nullreturn/SimplesQueryResolver.scala.txt | 2 +- .../resolver/SimpleEventCountsQueryResolver.scala.txt | 2 +- .../resolver/SimpleEventCountsQueryResponse.scala.txt | 6 +++--- .../scala/optional/TypeWithMandatoryField.scala.txt | 2 +- .../scala/relay/OrganizationsQueryResolver.scala.txt | 2 +- .../scala/relay/QueryResolver.scala.txt | 2 +- .../tostring/QueryPrivateParametrizedInput.scala.txt | 8 ++++---- .../scala/tostring/Synchronized.scala.txt | 2 +- .../scala/tostring/TOSTRING_Synchronized.scala.txt | 2 +- 50 files changed, 87 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java index 10d62b60f..7cb87241b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java @@ -64,13 +64,13 @@ protected void initCustomTypeMappings(Collection s super.initCustomTypeMappings(scalarTypeDefinitions); mappingConfig.putCustomTypeMappingIfAbsent("ID", String.class.getSimpleName()); mappingConfig.putCustomTypeMappingIfAbsent("String", String.class.getSimpleName()); - mappingConfig.putCustomTypeMappingIfAbsent("Int", "Option[Int]"); + mappingConfig.putCustomTypeMappingIfAbsent("Int", "scala.Option[Int]"); mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); mappingConfig.putCustomTypeMappingIfAbsent("Float", - Utils.wrapString(Double.class.getSimpleName(), "Option[", "]")); + Utils.wrapString(Double.class.getSimpleName(), "scala.Option[", "]")); mappingConfig.putCustomTypeMappingIfAbsent("Float!", Double.class.getSimpleName()); mappingConfig.putCustomTypeMappingIfAbsent("Boolean", - Utils.wrapString(Boolean.class.getSimpleName(), "Option[", "]")); + Utils.wrapString(Boolean.class.getSimpleName(), "scala.Option[", "]")); mappingConfig.putCustomTypeMappingIfAbsent("Boolean!", Boolean.class.getSimpleName()); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java index 40b72cfa9..170282395 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java @@ -18,8 +18,8 @@ */ public class ScalaGraphQLTypeMapper implements GraphQLTypeMapper { - private static final String SCALA_UTIL_LIST = "Seq"; - private static final String SCALA_UTIL_OPTIONAL = "Option"; + private static final String SCALA_UTIL_LIST = "scala.Seq"; + private static final String SCALA_UTIL_OPTIONAL = "scala.Option"; private static final Set SCALA_PRIMITIVE_TYPES = new HashSet<>(asList( "Byte", "Short", "Int", "Long", "Float", "Double", "Char", "Boolean")); @@ -41,6 +41,10 @@ public static boolean isScalaCollection(String scalaType) { return scalaType.startsWith(SCALA_UTIL_LIST + "[") && scalaType.endsWith("]"); } + public static String getGenericParameter(String scalaType) { + return scalaType.substring(SCALA_UTIL_LIST.length() + 1, scalaType.length() - 1); + } + @Override public String wrapIntoList(MappingContext mappingContext, String type, boolean mandatory) { return getGenericsString(mappingContext, SCALA_UTIL_LIST, type); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java index df031b3a8..09e7d6ff4 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java @@ -11,17 +11,17 @@ public class ScalaValueFormatter implements ValueFormatter { @Override public String getEmptyListValue() { - return "Seq.empty"; + return "scala.Seq.empty"; } @Override public StringJoiner getListJoiner() { - return new StringJoiner(", ", "Seq(", ")"); + return new StringJoiner(", ", "scala.Seq(", ")"); } @Override public StringJoiner getArrayJoiner() { - return new StringJoiner(", ", "Array(", ")"); + return new StringJoiner(", ", "scala.Array(", ")"); } } diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlInterface.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlInterface.ftl index 84195d17f..c1b22b864 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlInterface.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlInterface.ftl @@ -1,3 +1,4 @@ +<#assign MapperUtil=statics["com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLTypeMapper"]> <#if package?has_content> package ${package} @@ -11,8 +12,8 @@ import ${import}._ <#if enumImportItSelfInScala?has_content> <#list fields as field> <#list enumImportItSelfInScala as enum> - <#if field.type?contains("Seq[")> - <#if enum == field.type?replace("Seq[", "")?replace("]", "")> + <#if MapperUtil.isScalaCollection(field.type)> + <#if enum == MapperUtil.getGenericParameter(field.type)> import ${enum}._ <#else > diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl index 882ec46fe..680034821 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl @@ -13,7 +13,7 @@ import ${import}._ <#list operation.parameters as param> <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(param.type)> - <#if enum == param.type?replace("Seq[", "")?replace("]", "")> + <#if enum == MapperUtil.getGenericParameter(param.type)> <#if !waitImports?seq_contains(enum)> <#assign waitImports = waitImports + [enum] /> diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl index 4b1106cb4..b18ad99a6 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl @@ -11,7 +11,7 @@ import scala.collection.JavaConverters._ <#list fields as field> <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(field.type)> - <#if enum == field.type?replace("Seq[", "")?replace("]", "")> + <#if enum == MapperUtil.getGenericParameter(field.type)> import ${enum}._ <#else > @@ -54,9 +54,9 @@ case class ${className}( ) extends GraphQLParametrizedInput { - override def toString(): String = {<#--There is no Option[Seq[T]]--> + 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> - Seq(<#list fields as field><#assign getMethod = ".get"><#assign asJava = ".asJava"> + scala.Seq(<#list fields as field><#assign getMethod = ".get"><#assign asJava = ".asJava"> <#if MapperUtil.isScalaPrimitive(field.type)>"${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name})<#if field_has_next>,<#elseif MapperUtil.isScalaOption(field.type)>if (${field.name}.isDefined) "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${getMethod}) else ""<#if field_has_next>,<#else>if (${field.name} != null)<#if MapperUtil.isScalaCollection(field.type)> "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${asJava}) else ""<#if field_has_next>,<#else> "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}) else ""<#if field_has_next>, ).filter(_ != "").mkString("(", ",", ")") <#else> diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlRequest.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlRequest.ftl index 2308be2e8..3e3bc2568 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlRequest.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlRequest.ftl @@ -6,7 +6,7 @@ package ${package} import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } <#if toString || equalsAndHashCode> import java.util.Objects @@ -17,7 +17,7 @@ import scala.collection.JavaConverters._ <#list fields as field> <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(field.type)> - <#if enum == field.type?replace("Seq[", "")?replace("]", "")> + <#if enum == MapperUtil.getGenericParameter(field.type)> import ${enum}._ <#else > @@ -85,7 +85,7 @@ class ${className}(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava <#if equalsAndHashCode> override def equals(obj: Any): Boolean = { diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlType.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlType.ftl index c2354ea9f..5af61b29a 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlType.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlType.ftl @@ -20,7 +20,7 @@ import scala.collection.JavaConverters._ <#list fields as field> <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(field.type)> - <#if enum == field.type?replace("Seq[", "")?replace("]", "")> + <#if enum == MapperUtil.getGenericParameter(field.type)> import ${enum}._ <#else > @@ -88,7 +88,7 @@ import ${enum}._ <#if toString> override def toString(): String = { <#if fields?has_content><#-- When you modify it, copy it out and make sure it is one line after modification, There is no Option[Seq[T]]. --> - Seq(<#list fields as field><#assign getMethod = ""><#assign asJava = ""><#if MapperUtil.isScalaOption(field.type)><#assign getMethod = ".get"><#if MapperUtil.isScalaCollection(field.type)><#assign asJava = ".asJava"> + scala.Seq(<#list fields as field><#assign getMethod = ""><#assign asJava = ""><#if MapperUtil.isScalaOption(field.type)><#assign getMethod = ".get"><#if MapperUtil.isScalaCollection(field.type)><#assign asJava = ".asJava"> <#if MapperUtil.isScalaPrimitive(field.type)><#if toStringForRequest>"${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}<#if field.serializeUsingObjectMapper>, true)<#else>"${field.originalName}: " + ${field.name}<#else><#if MapperUtil.isScalaOption(field.type)>if (${field.name}.isDefined) <#else>if (${field.name} != null) <#if toStringForRequest>"${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${getMethod}${asJava}<#if field.serializeUsingObjectMapper>, true)<#else><#if field.type == "String"> "${field.originalName}: \"${field.name}\"" <#else> "${field.originalName}: ${field.name}" else ""<#if field_has_next>, ).filter(_ != "").mkString("{", ",", "}") <#else><#--Keep it on one line to make sure the code style remains the same--> diff --git a/src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt b/src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt index 179ac9ca4..1aa51c68b 100644 --- a/src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt +++ b/src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt @@ -10,13 +10,13 @@ import scala.collection.JavaConverters._ case class AddLabelsToLabelableInput( clientMutationId: String, @javax.validation.constraints.NotNull - labelIds: Seq[String], + labelIds: scala.Seq[String], @javax.validation.constraints.NotNull labelableId: String ) { override def toString(): String = { - Seq( + scala.Seq( if (clientMutationId != null) "clientMutationId: " + GraphQLRequestSerializer.getEntry(clientMutationId) else "", if (labelIds != null) "labelIds: " + GraphQLRequestSerializer.getEntry(labelIds.asJava) else "", if (labelableId != null) "labelableId: " + GraphQLRequestSerializer.getEntry(labelableId) else "" diff --git a/src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt b/src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt index f7d6d9097..b54492707 100644 --- a/src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt +++ b/src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt @@ -3,7 +3,7 @@ package com.github.graphql import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -29,7 +29,7 @@ class AddLabelsToLabelableMutationRequest(alias: String) extends GraphQLOperatio override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def equals(obj: Any): Boolean = { if (this == obj) { diff --git a/src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt b/src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt index 82f585ed0..4ead411df 100644 --- a/src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt +++ b/src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt @@ -13,7 +13,7 @@ case class AddLabelsToLabelablePayload( ) { override def toString(): String = { - Seq( + scala.Seq( if (clientMutationId != null) "clientMutationId: " + GraphQLRequestSerializer.getEntry(clientMutationId) else "", if (labelable != null) "labelable: " + GraphQLRequestSerializer.getEntry(labelable) else "" ).filter(_ != "").mkString("{", ",", "}") diff --git a/src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt index 274b692e8..7ed324ac9 100644 --- a/src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt @@ -8,6 +8,6 @@ package com.github.graphql trait CodesOfConductQueryResolver { @throws[Exception] - def codesOfConduct(): Seq[CodeOfConduct] + def codesOfConduct(): scala.Seq[CodeOfConduct] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/Commit.scala.txt b/src/test/resources/expected-classes/scala/Commit.scala.txt index 3cffca61a..f8070c4ab 100644 --- a/src/test/resources/expected-classes/scala/Commit.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit.scala.txt @@ -74,7 +74,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt b/src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt index 5684f4e1b..b88b4d4c4 100644 --- a/src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt @@ -74,7 +74,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt b/src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt index f92e664e2..8560400c0 100644 --- a/src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt @@ -50,7 +50,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_no_final_class.scala.txt b/src/test/resources/expected-classes/scala/Commit_no_final_class.scala.txt index a7c6a506f..8402bad3b 100644 --- a/src/test/resources/expected-classes/scala/Commit_no_final_class.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_no_final_class.scala.txt @@ -75,7 +75,7 @@ class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt b/src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt index 3cffca61a..f8070c4ab 100644 --- a/src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt @@ -74,7 +74,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt b/src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt index 316299d99..ac52c87a0 100644 --- a/src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt @@ -80,7 +80,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", if (additions != null) "additions: " + GraphQLRequestSerializer.getEntry(additions) else "", if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/GithubAcceptTopicSuggestionInputTO.scala.txt b/src/test/resources/expected-classes/scala/GithubAcceptTopicSuggestionInputTO.scala.txt index cf2335241..84ae4e8a6 100644 --- a/src/test/resources/expected-classes/scala/GithubAcceptTopicSuggestionInputTO.scala.txt +++ b/src/test/resources/expected-classes/scala/GithubAcceptTopicSuggestionInputTO.scala.txt @@ -16,7 +16,7 @@ case class GithubAcceptTopicSuggestionInputTO( ) { override def toString(): String = { - Seq( + scala.Seq( if (clientMutationId != null) "clientMutationId: " + GraphQLRequestSerializer.getEntry(clientMutationId) else "", if (name != null) "name: " + GraphQLRequestSerializer.getEntry(name) else "", if (repositoryId != null) "repositoryId: " + GraphQLRequestSerializer.getEntry(repositoryId) else "" diff --git a/src/test/resources/expected-classes/scala/GithubCommitTO.scala.txt b/src/test/resources/expected-classes/scala/GithubCommitTO.scala.txt index fe94d957e..022c18cf5 100644 --- a/src/test/resources/expected-classes/scala/GithubCommitTO.scala.txt +++ b/src/test/resources/expected-classes/scala/GithubCommitTO.scala.txt @@ -74,7 +74,7 @@ case class GithubCommitTO( ) extends GithubCloserTO with GithubIssueTimelineItemTO with GithubPullRequestTimelineItemTO with GithubGitObjectTO with GithubNodeTO with GithubSubscribableTO with GithubUniformResourceLocatableTO { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/QueryINeedQueryRequest.scala.txt b/src/test/resources/expected-classes/scala/QueryINeedQueryRequest.scala.txt index 9ae88121a..5c21fe3b8 100644 --- a/src/test/resources/expected-classes/scala/QueryINeedQueryRequest.scala.txt +++ b/src/test/resources/expected-classes/scala/QueryINeedQueryRequest.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.test1 import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import scala.collection.mutable import scala.collection.JavaConverters._ import java.util.Objects @@ -30,7 +30,7 @@ class QueryINeedQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def toString(): String = Objects.toString(input) } diff --git a/src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt b/src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt index 455c04f98..164c69480 100644 --- a/src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt +++ b/src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.test1 import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -30,7 +30,7 @@ class QueryINeedQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def toString(): String = Objects.toString(input) } diff --git a/src/test/resources/expected-classes/scala/annotation/CreateEventMutationResolver.scala.txt b/src/test/resources/expected-classes/scala/annotation/CreateEventMutationResolver.scala.txt index f7aef5025..99de67dec 100644 --- a/src/test/resources/expected-classes/scala/annotation/CreateEventMutationResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/annotation/CreateEventMutationResolver.scala.txt @@ -14,7 +14,7 @@ trait CreateEventMutationResolver { * Create a new event. */ @javax.validation.constraints.NotNull - @com.example.CustomAnnotation(roles=Array("admin", "moderator"), boo=Array(true, false, true), float=Array("12.0", "null"), int=42, n="null") + @com.example.CustomAnnotation(roles=scala.Array("admin", "moderator"), boo=scala.Array(true, false, true), float=scala.Array("12.0", "null"), int=42, n="null") @throws[Exception] def createEvent(categoryId: String, createdBy: String): Event diff --git a/src/test/resources/expected-classes/scala/annotation/MutationResolver.scala.txt b/src/test/resources/expected-classes/scala/annotation/MutationResolver.scala.txt index 8aa7c78b2..4bfa853b3 100644 --- a/src/test/resources/expected-classes/scala/annotation/MutationResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/annotation/MutationResolver.scala.txt @@ -11,7 +11,7 @@ trait MutationResolver { * Create a new event. */ @javax.validation.constraints.NotNull - @com.example.CustomAnnotation(roles=Array("admin", "moderator"), boo=Array(true, false, true), float=Array("12.0", "null"), int=42, n="null") + @com.example.CustomAnnotation(roles=scala.Array("admin", "moderator"), boo=scala.Array(true, false, true), float=scala.Array("12.0", "null"), int=42, n="null") @throws[Exception] def createEvent(categoryId: String, createdBy: String): Event diff --git a/src/test/resources/expected-classes/scala/builder/CaseQueryRequest.scala.txt b/src/test/resources/expected-classes/scala/builder/CaseQueryRequest.scala.txt index 8df770287..f5d9c1768 100644 --- a/src/test/resources/expected-classes/scala/builder/CaseQueryRequest.scala.txt +++ b/src/test/resources/expected-classes/scala/builder/CaseQueryRequest.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.codegen.prot import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -17,7 +17,7 @@ class CaseQueryRequest(alias: String) extends GraphQLOperationRequest { private final lazy val input = new JLinkedHashMap[String, java.lang.Object]() private final lazy val useObjectMapperForInputSerialization: mutable.Set[String] = mutable.Set() - def setFinal(`final`: Seq[Char]): Unit = { + def setFinal(`final`: scala.Seq[Char]): Unit = { this.input.put("final", `final`) } @@ -29,7 +29,7 @@ class CaseQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def equals(obj: Any): Boolean = { if (this == obj) { diff --git a/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest.scala.txt b/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest.scala.txt index e165467e9..b8d16e438 100644 --- a/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest.scala.txt +++ b/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.test1 import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -29,7 +29,7 @@ class QueryINeedQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def toString(): String = Objects.toString(input) } diff --git a/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt b/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt index e165467e9..b8d16e438 100644 --- a/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt +++ b/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.test1 import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -29,7 +29,7 @@ class QueryINeedQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def toString(): String = Objects.toString(input) } diff --git a/src/test/resources/expected-classes/scala/custom-type/ResponseContainingDate.scala.txt b/src/test/resources/expected-classes/scala/custom-type/ResponseContainingDate.scala.txt index e20bb9e49..6a447a300 100644 --- a/src/test/resources/expected-classes/scala/custom-type/ResponseContainingDate.scala.txt +++ b/src/test/resources/expected-classes/scala/custom-type/ResponseContainingDate.scala.txt @@ -12,7 +12,7 @@ case class ResponseContainingDate( ) { override def toString(): String = { - Seq( + scala.Seq( if (a != null) "a: " + GraphQLRequestSerializer.getEntry(a) else "" ).filter(_ != "").mkString("{", ",", "}") } diff --git a/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt index f72ba401c..1522cc395 100644 --- a/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt @@ -10,6 +10,6 @@ trait EventsQueryResolver { @deprecated(message = "No longer supported") @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt index cba7fce5e..a0aeb62c9 100644 --- a/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt @@ -10,6 +10,6 @@ trait QueryResolver { @deprecated(message = "No longer supported") @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt index 430469222..b424030e9 100644 --- a/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt @@ -7,6 +7,6 @@ trait AssetsQueryResolver { @javax.validation.constraints.NotNull @throws[Exception] - def assets(): Seq[Asset] + def assets(): scala.Seq[Asset] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/Event.scala.txt b/src/test/resources/expected-classes/scala/extend/Event.scala.txt index bfa03f416..a0e0f0fe4 100644 --- a/src/test/resources/expected-classes/scala/extend/Event.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/Event.scala.txt @@ -11,7 +11,7 @@ case class Event( @javax.validation.constraints.NotNull createdDateTime: String, @javax.validation.constraints.NotNull - assets: Seq[Asset], + assets: scala.Seq[Asset], @javax.validation.constraints.NotNull override val id: String, override val createdBy: String diff --git a/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt b/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt index 20cf37ac6..ec6d2ba5d 100644 --- a/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt @@ -9,7 +9,7 @@ case class EventInput( @javax.validation.constraints.NotNull status: Status, @javax.validation.constraints.NotNull - assets: Seq[AssetInput] + assets: scala.Seq[AssetInput] ) { } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt index f791302a9..adf69d90b 100644 --- a/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt @@ -7,6 +7,6 @@ trait EventsQueryResolver { @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt index 0b6ca5ce7..35a94c4ff 100644 --- a/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt @@ -11,10 +11,10 @@ trait QueryResolver { @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] @javax.validation.constraints.NotNull @throws[Exception] - def assets(): Seq[Asset] + def assets(): scala.Seq[Asset] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullable/Event.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/Event.scala.txt index 323064889..fc406a8e9 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/Event.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/Event.scala.txt @@ -6,13 +6,13 @@ import scala.collection.JavaConverters._ date = "2020-12-31T23:59:59-0500" ) case class Event( - nullableStatus: Seq[Option[Int]], - nonullStatus: Seq[Int], - nullablePrimitive: Option[Int] + nullableStatus: scala.Seq[scala.Option[Int]], + nonullStatus: scala.Seq[Int], + nullablePrimitive: scala.Option[Int] ) extends Node { override def toString(): String = { - Seq( + scala.Seq( if (nullableStatus != null) "nullableStatus: " + GraphQLRequestSerializer.getEntry(nullableStatus.asJava) else "", if (nonullStatus != null) "nonullStatus: " + GraphQLRequestSerializer.getEntry(nonullStatus.asJava) else "", if (nullablePrimitive.isDefined) "nullablePrimitive: " + GraphQLRequestSerializer.getEntry(nullablePrimitive.get) else "" diff --git a/src/test/resources/expected-classes/scala/extend/nullable/Null1QueryQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/Null1QueryQueryResolver.scala.txt index 4d4b446df..0ed3f12c2 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/Null1QueryQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/Null1QueryQueryResolver.scala.txt @@ -6,6 +6,6 @@ trait Null1QueryQueryResolver { @throws[Exception] - def null1Query(): Option[Int] + def null1Query(): scala.Option[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullable/Null2QueryQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/Null2QueryQueryResolver.scala.txt index b2ead01f9..442e76d45 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/Null2QueryQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/Null2QueryQueryResolver.scala.txt @@ -6,6 +6,6 @@ trait Null2QueryQueryResolver { @throws[Exception] - def null2Query(): Seq[Option[Int]] + def null2Query(): scala.Seq[scala.Option[Int]] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullable/Null3QueryQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/Null3QueryQueryResolver.scala.txt index eccf1c0ef..22336eddd 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/Null3QueryQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/Null3QueryQueryResolver.scala.txt @@ -6,6 +6,6 @@ trait Null3QueryQueryResolver { @throws[Exception] - def null3Query(): Seq[Int] + def null3Query(): scala.Seq[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt index 0dc9cef7e..df8ac926b 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt @@ -7,18 +7,18 @@ trait QueryResolver { @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] @throws[Exception] - def event(): Option[Event] + def event(): scala.Option[Event] @throws[Exception] - def null1Query(): Option[Int] + def null1Query(): scala.Option[Int] @throws[Exception] - def null2Query(): Seq[Option[Int]] + def null2Query(): scala.Seq[scala.Option[Int]] @throws[Exception] - def null3Query(): Seq[Int] + def null3Query(): scala.Seq[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt index 940401255..c04e8d8ec 100644 --- a/src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt @@ -6,6 +6,6 @@ trait SimpleEventCountsQueryResolver { @throws[Exception] - def simpleEventCounts(): Option[Int] + def simpleEventCounts(): scala.Option[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver.scala.txt index 21ec06107..08173a76f 100644 --- a/src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver.scala.txt @@ -5,6 +5,6 @@ trait SimplesQueryResolver { @throws[Exception] - def simples(): Option[Event] + def simples(): scala.Option[Event] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt index 1cc88b34d..5eaee69dd 100644 --- a/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt @@ -5,6 +5,6 @@ trait SimpleEventCountsQueryResolver { @throws[Exception] - def simpleEventCounts(): Option[Int] + def simpleEventCounts(): scala.Option[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt b/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt index b9e2c2c95..65aef63f4 100644 --- a/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt @@ -5,10 +5,10 @@ import java.util.{ Map => JMap } value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) -class SimpleEventCountsQueryResponse extends GraphQLResult[JMap[String, Option[Int]]] { +class SimpleEventCountsQueryResponse extends GraphQLResult[JMap[String, scala.Option[Int]]] { - def simpleEventCounts(): Option[Int] = { - val data: JMap[String, Option[Int]] = getData + def simpleEventCounts(): scala.Option[Int] = { + val data: JMap[String, scala.Option[Int]] = getData if (data != null) data.get(SimpleEventCountsQueryResponse.OPERATION_NAME) else None } diff --git a/src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt b/src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt index 9bdc7a2b7..63d3908e7 100644 --- a/src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt +++ b/src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt @@ -9,7 +9,7 @@ case class TypeWithMandatoryField( ) extends InterfaceWithOptionalField { override def toString(): String = { - Seq( + scala.Seq( "test: " + test ).filter(_ != "").mkString("{", ",", "}") } diff --git a/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt index 597eaadc6..884aaf942 100644 --- a/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt @@ -5,6 +5,6 @@ trait OrganizationsQueryResolver { @throws[Exception] - def organizations(first: Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] + def organizations(first: scala.Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt index ffa9a9fb0..eeb337889 100644 --- a/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt @@ -8,6 +8,6 @@ trait QueryResolver { def users(first: Int, after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[User] @throws[Exception] - def organizations(first: Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] + def organizations(first: scala.Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] } \ 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 a3dd8cb68..53357d438 100644 --- a/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt +++ b/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt @@ -14,15 +14,15 @@ import TestEnum._ ) case class QueryPrivateParametrizedInput( int: Int, - intOpt: Option[Int], - seq1: Seq[Option[Int]], - seq2: Seq[Int], + intOpt: scala.Option[Int], + seq1: scala.Seq[scala.Option[Int]], + seq2: scala.Seq[Int], `new`: String, enum: TestEnum = TestEnum.long ) extends GraphQLParametrizedInput { override def toString(): String = { - Seq( + scala.Seq( "int: " + GraphQLRequestSerializer.getEntry(int), if (intOpt.isDefined) "intOpt: " + GraphQLRequestSerializer.getEntry(intOpt.get) else "", if (seq1 != null) "seq1: " + GraphQLRequestSerializer.getEntry(seq1.asJava) else "", diff --git a/src/test/resources/expected-classes/scala/tostring/Synchronized.scala.txt b/src/test/resources/expected-classes/scala/tostring/Synchronized.scala.txt index 9b86a5628..176503556 100644 --- a/src/test/resources/expected-classes/scala/tostring/Synchronized.scala.txt +++ b/src/test/resources/expected-classes/scala/tostring/Synchronized.scala.txt @@ -22,7 +22,7 @@ case class Synchronized( ) { override def toString(): String = { - Seq( + scala.Seq( if (void != null) "void: " + GraphQLRequestSerializer.getEntry(void) else "", "wait: " + GraphQLRequestSerializer.getEntry(Wait), "this: " + GraphQLRequestSerializer.getEntry(`this`), diff --git a/src/test/resources/expected-classes/scala/tostring/TOSTRING_Synchronized.scala.txt b/src/test/resources/expected-classes/scala/tostring/TOSTRING_Synchronized.scala.txt index e9f961bcd..6f83af8f8 100644 --- a/src/test/resources/expected-classes/scala/tostring/TOSTRING_Synchronized.scala.txt +++ b/src/test/resources/expected-classes/scala/tostring/TOSTRING_Synchronized.scala.txt @@ -21,7 +21,7 @@ case class Synchronized( ) { override def toString(): String = { - Seq( + scala.Seq( if (void != null) "void: \"void\"" else "", "wait: " + Wait, "this: " + `this`, From a1c634b6d171c60ce6b753d1b95848d77f6c3bbc Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Fri, 12 Mar 2021 07:15:26 -0600 Subject: [PATCH 12/12] Fix javadoc and suppress false-positive sonar warnings --- .../graphql/codegen/mapper/ValueMapper.java | 17 ++++++++++++----- .../codegen/model/MultiLanguageDeprecated.java | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java index 8c8739e5a..665c070c1 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java @@ -39,13 +39,20 @@ private static String mapBoolean(BooleanValue value) { return value.isValue() ? "true" : "false"; } - //TODO It should also be abstracted. Different languages have different default values(It is now implemented in - // templates (templates are extremely complex)) + /** + * Map value of GraphQL Int type to a value that will be present in a generated code. + * TODO: should also be abstracted because different languages have different default values + * + * @param mappingContext Global mapping context + * @param value GraphQL Value + * @param graphQLType GraphQL Type + * @return formatted value + */ private static String mapInt(MappingContext mappingContext, IntValue value, Type graphQLType) { - //default java basic type is `int`. so, default value like 123 that must wrap or append suffix `L` when it be + // default java basic type is `int`. so, default value like 123 that must wrap or append suffix `L` when it be // defined as `int` in graphql schema. - //`int` cannot assign to `Long`, also `double` cannot assign to `Float`, but graphql Float default mapping is - // Double in java, so, not modify `mapFloat`. + // `int` cannot assign to `Long`, also `double` cannot assign to `Float`, but graphql Float default mapping is + // Double in java, so, not modify `mapFloat`. if (graphQLType instanceof TypeName) { String customType = mappingContext.getCustomTypesMapping().get("Long"); String typeName = ((TypeName) graphQLType).getName(); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java index 9e9a38126..04cbc8ebf 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java @@ -24,6 +24,7 @@ private MultiLanguageDeprecated() { * @param directive GraphQL @deprecated directive * @return a definition of a deprecation having reason and annotation */ + @SuppressWarnings({"java:S1133", "java:S1123"}) // sonar treats this is a deprecated method public static DeprecatedDefinition getLanguageDeprecated(GeneratedLanguage generatedLanguage, Directive directive) { String msg = null; if (directive.getArguments().stream().anyMatch(argument -> argument.getName().equals(REASON))) {