Skip to content

Commit

Permalink
Scala, Kotlin: Fix ParameterInput toString bug (#467)
Browse files Browse the repository at this point in the history
* fix ParameterInput toString bug

* fix ParameterInput toString bug
  • Loading branch information
jxnu-liguobin committed Dec 26, 2020
1 parent 0d95791 commit c12f765
Show file tree
Hide file tree
Showing 10 changed files with 151 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package ${package}

</#if>
import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput
import java.util.StringJoiner
<#if javaDoc?has_content>
/**
<#list javaDoc as javaDocLine>
Expand All @@ -20,7 +21,9 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput
@${annotation}
</#list>
<#if !fields?has_content>
class ${className}() : GraphQLParametrizedInput
class ${className}() : GraphQLParametrizedInput {
override fun toString(): String = "()"
}
<#else>
data class ${className}(
<#if fields?has_content>
Expand All @@ -32,5 +35,20 @@ data class ${className}(
</#list>val ${field.name}: ${field.type}<#if field.defaultValue?has_content> = ${field.defaultValue}</#if><#if field_has_next>,</#if>
</#list>
</#if>
) : GraphQLParametrizedInput
) : GraphQLParametrizedInput {

override fun toString(): String {
val joiner = StringJoiner(", ", "( ", " )")
<#list fields as field>
<#if field.type?ends_with("?")>
if (${field.name} != null) {
joiner.add("${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}))
}
<#else>
joiner.add("${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}))
</#if>
</#list>
return joiner.toString()
}
}
</#if>
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ data class ${className}(
<#if toStringForRequest>
joiner.add("${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}))
<#else>
<#if field.type == "String">
<#if field.type == "String?">
joiner.add("${field.originalName}: \"${field.name}\"")
<#else>
joiner.add(${field.originalName}: ${field.name}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package ${package}

</#if>
import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput
import scala.collection.JavaConverters._
<#if fields?has_content>
<#if enumImportItSelfInScala?has_content>
<#list fields as field>
Expand Down Expand Up @@ -47,7 +48,19 @@ case class ${className}(
<#list field.annotations as annotation>
@${annotation}
</#list>
${field.name}: ${field.type}<#if field.defaultValue?has_content> = <#if MapperUtil.isScalaOption(field.type)><#if field.defaultValue!= "null">Some(${field.defaultValue})<#else>None</#if><#else>${field.defaultValue}</#if></#if><#if field_has_next>,</#if>
${field.name}: ${field.type}<#if field.defaultValue?has_content> = <#if MapperUtil.isScalaOption(field.type)><#if field.defaultValue != "null">Some(${field.defaultValue})<#else>None</#if><#else>${field.defaultValue}</#if></#if><#if field_has_next>,</#if>
</#list>
</#if>
) extends GraphQLParametrizedInput
) extends GraphQLParametrizedInput {

override def toString(): String = {<#--There is no Option[Seq[T]]-->
<#if fields?has_content>
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>,</#if><#elseif MapperUtil.isScalaOption(field.type)>if (${field.name}.isDefined) "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${getMethod}) else ""<#if field_has_next>,</#if><#else>if (${field.name} != null)<#if MapperUtil.isScalaCollection(field.type)> "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${asJava}) else ""<#if field_has_next>,</#if><#else> "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}) else ""<#if field_has_next>,</#if></#if></#if></#list>
).filter(_ != "").mkString("(", ",", ")")
<#else>
"()"
</#if>
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -77,18 +77,18 @@ case class ${className}(
<#list field.annotations as annotation>
@${annotation}
</#list>
<#if parentInterfaces?has_content><#list parentInterfaces as parent><#if parent == field.name>override </#if></#list></#if><#if !immutableModels>var <#else><#if parentInterfaces?has_content><#list parentInterfaces as parent><#if parent == field.name>val </#if></#list></#if></#if>${field.name}: ${field.type}<#if field.defaultValue?has_content> = <#if field.type?starts_with("Option[")><#if field.defaultValue!= "null">Some(${field.defaultValue})<#else>None</#if><#else>${field.defaultValue}</#if></#if><#if field_has_next>,</#if>
<#if parentInterfaces?has_content><#list parentInterfaces as parent><#if parent == field.name>override </#if></#list></#if><#if !immutableModels>var <#else><#if parentInterfaces?has_content><#list parentInterfaces as parent><#if parent == field.name>val </#if></#list></#if></#if>${field.name}: ${field.type}<#if field.defaultValue?has_content> = <#if MapperUtil.isScalaOption(field.type)><#if field.defaultValue != "null">Some(${field.defaultValue})<#else>None</#if><#else>${field.defaultValue}</#if></#if><#if field_has_next>,</#if>
</#list>
</#if>
)<#if implements?has_content> extends <#list implements as interface>${interface}<#if interface_has_next> with </#if></#list></#if> {

<#if toString>
override def toString(): String = {
<#if fields?has_content>
<#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><#if MapperUtil.isScalaCollection(field.type)><#assign asJava = ".asJava"></#if>
<#if MapperUtil.isScalaPrimitive(field.type)><#if toStringForRequest>"${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}<#if field.serializeUsingObjectMapper>, true</#if>)<#else>"${field.originalName}: " + ${field.name}</#if><#else><#if MapperUtil.isScalaOption(field.type)>if (${field.name}.isDefined) <#else>if (${field.name} != null) </#if><#if toStringForRequest>"${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${getMethod}${asJava}<#if field.serializeUsingObjectMapper>, true</#if>)<#else><#if field.type == "String"> "${field.originalName}: \"${field.name}\"" <#else> "${field.originalName}: ${field.name}"</#if></#if> else ""</#if><#if field_has_next>,</#if></#list>
).filter(_ != "").mkString("{", ",", "}")
<#else>
<#else><#--Keep it on one line to make sure the code style remains the same-->
"{}"
</#if>
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.kobylynskyi.graphql.codegen.kotlin;

import com.kobylynskyi.graphql.codegen.TestUtils;
import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage;
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
import com.kobylynskyi.graphql.codegen.utils.Utils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
import static org.junit.jupiter.api.Assertions.assertEquals;

class GraphQLCodegenRestrictedWordsAndParameterInputTest {

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/codegen/prot");

@AfterEach
void cleanup() {
Utils.deleteDir(outputBuildDir);
}

@Test
void generate() throws Exception {
mappingConfig.setGeneratedLanguage(GeneratedLanguage.KOTLIN);
mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot");
mappingConfig.setGenerateClient(true);
mappingConfig.setGenerateBuilder(true);
mappingConfig.setGenerateEqualsAndHashCode(true);
mappingConfig.setGenerateToString(true);
mappingConfig.setGenerateModelsForRootTypes(true);
mappingConfig.setApiNameSuffix("API");

new KotlinGraphQLCodegen(singletonList("src/test/resources/schemas/kt/restricted-words.graphqls"),
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<String> 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())),
file);
}
}
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.kobylynskyi.graphql.codegen.prot

import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput
import java.util.StringJoiner
/**
* Parametrized input for field fun in type Query
*/
Expand All @@ -10,4 +11,13 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput
)
data class QueryFunParametrizedInput(
val final: Int?
) : GraphQLParametrizedInput
) : GraphQLParametrizedInput {

override fun toString(): String {
val joiner = StringJoiner(", ", "( ", " )")
if (final != null) {
joiner.add("final: " + GraphQLRequestSerializer.getEntry(final))
}
return joiner.toString()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import java.util.StringJoiner
data class Super(
@Deprecated("this is deprecated in GraphQL")
val `is`: String?,
val `in`: Char,
val Int: Super,
val date: String
val `in`: Char?,
val Int: Super?,
val date: String?
) {

companion object {
Expand All @@ -25,36 +25,42 @@ data class Super(
if (`is` != null) {
joiner.add("is: " + GraphQLRequestSerializer.getEntry(`is`))
}
joiner.add("in: " + GraphQLRequestSerializer.getEntry(`in`))
joiner.add("Int: " + GraphQLRequestSerializer.getEntry(Int))
joiner.add("date: " + GraphQLRequestSerializer.getEntry(date))
if (`in` != null) {
joiner.add("in: " + GraphQLRequestSerializer.getEntry(`in`))
}
if (Int != null) {
joiner.add("Int: " + GraphQLRequestSerializer.getEntry(Int))
}
if (date != null) {
joiner.add("date: " + GraphQLRequestSerializer.getEntry(date))
}
return joiner.toString()
}

class Builder {

private var `is`: String? = null
private var `in`: Char = 0.toChar()
private lateinit var Int: Super
private lateinit var date: String
private var `in`: Char? = null
private var Int: Super? = null
private var date: String? = null

@Deprecated("this is deprecated in GraphQL")
fun setIs(`is`: String?): Builder {
this.`is` = `is`
return this
}

fun setIn(`in`: Char): Builder {
fun setIn(`in`: Char?): Builder {
this.`in` = `in`
return this
}

fun setInt(Int: Super): Builder {
fun setInt(Int: Super?): Builder {
this.Int = Int
return this
}

fun setDate(date: String): Builder {
fun setDate(date: String?): Builder {
this.date = date
return this
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ package com.kobylynskyi.graphql.codegen.prot
interface WhenQueryAPI {

@Throws(Exception::class)
fun `when`(final: List<Char>): String?
fun `when`(final: List<Char?>?): String?

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.kobylynskyi.graphql.codegen.prot

import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput
import scala.collection.JavaConverters._
import TestEnum._

/**
Expand All @@ -11,7 +12,23 @@ import TestEnum._
date = "2020-12-31T23:59:59-0500"
)
case class QueryPrivateParametrizedInput(
int: Option[Int],
int: Int,
intOpt: Option[Int],
seq1: Seq[Option[Int]],
seq2: Seq[Int],
`new`: String,
enum: TestEnum = TestEnum.long
) extends GraphQLParametrizedInput
) extends GraphQLParametrizedInput {

override def toString(): String = {
Seq(
"int: " + GraphQLRequestSerializer.getEntry(int),
if (intOpt.isDefined) "intOpt: " + GraphQLRequestSerializer.getEntry(intOpt.get) else "",
if (seq1 != null) "seq1: " + GraphQLRequestSerializer.getEntry(seq1.asJava) else "",
if (seq2 != null) "seq2: " + GraphQLRequestSerializer.getEntry(seq2.asJava) else "",
if (`new` != null) "new: " + GraphQLRequestSerializer.getEntry(`new`) else "",
if (enum != null) "enum: " + GraphQLRequestSerializer.getEntry(enum) else ""
).filter(_ != "").mkString("(", ",", ")")
}

}
2 changes: 1 addition & 1 deletion src/test/resources/schemas/scala/restricted-words.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ schema {

type Query {
native: String
private(int: Int, new: String, enum: TestEnum = long): Synchronized
private(int: Int!, intOpt:Int, seq1:[Int], seq2:[Int!], new: String, enum: TestEnum = long): Synchronized
case(final: [char]): ID
int(final: Int): char
super: String
Expand Down

0 comments on commit c12f765

Please sign in to comment.