Skip to content

Commit 938bf05

Browse files
Merge branch 'Netflix:master' into feature/389-cusomt-generated-class-name-templates
2 parents 2cb13d9 + f890f36 commit 938bf05

File tree

8 files changed

+154
-3
lines changed

8 files changed

+154
-3
lines changed

graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/InterfaceGenerator.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ class InterfaceGenerator(private val config: CodeGenConfig, private val document
9696
.filter { node -> node.implements.any { it.isEqualTo(TypeName(definition.name)) } }
9797
.map { node ->
9898
val nodeName = if (config.generateInterfaces) "I${node.name}" else node.name
99-
ClassName.get(packageName, nodeName)
99+
typeUtils.findJavaInterfaceName(nodeName, packageName)
100100
}
101+
.filterIsInstance<ClassName>()
101102
.toList()
102103

103104
if (implementations.isNotEmpty()) {

graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/kotlin/KotlinInterfaceTypeGenerator.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ class KotlinInterfaceTypeGenerator(private val config: CodeGenConfig, private va
8888

8989
val implementations = document.getDefinitionsOfType(ObjectTypeDefinition::class.java).asSequence()
9090
.filter { node -> node.implements.any { it.isEqualTo(TypeName(definition.name)) } }
91-
.map { node -> ClassName(packageName, node.name) }
91+
.map { node -> typeUtils.findKtInterfaceName(node.name, packageName) }
92+
.filterIsInstance<ClassName>()
9293
.toList()
9394

9495
if (implementations.isNotEmpty()) {

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/CodeGenTest.kt

+55
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,61 @@ class CodeGenTest {
10811081
assertThat(dataTypes[0].typeSpec.fieldSpecs[0].type.toString()).isEqualTo("mypackage.Person")
10821082
}
10831083

1084+
@Test
1085+
fun `Use mapped type name when the type implements not-mapped interface`() {
1086+
val schema = """
1087+
interface Pet {
1088+
name: ID!
1089+
}
1090+
type Cat implements Pet {
1091+
name: ID!
1092+
}
1093+
type Dog implements Pet {
1094+
name: ID!
1095+
}
1096+
""".trimIndent()
1097+
1098+
val codeGenResult = CodeGen(
1099+
CodeGenConfig(
1100+
schemas = setOf(schema),
1101+
packageName = basePackageName,
1102+
language = Language.JAVA,
1103+
typeMapping = mapOf(
1104+
"Cat" to "mypackage.Cat"
1105+
)
1106+
)
1107+
).generate()
1108+
val interfaces = codeGenResult.javaInterfaces
1109+
1110+
assertThat(interfaces.size).isEqualTo(1)
1111+
assertThat(interfaces[0].toString()).isEqualTo(
1112+
"""
1113+
|package com.netflix.graphql.dgs.codegen.tests.generated.types;
1114+
|
1115+
|import com.fasterxml.jackson.annotation.JsonSubTypes;
1116+
|import com.fasterxml.jackson.annotation.JsonTypeInfo;
1117+
|import java.lang.String;
1118+
|import mypackage.Cat;
1119+
|
1120+
|@JsonTypeInfo(
1121+
| use = JsonTypeInfo.Id.NAME,
1122+
| include = JsonTypeInfo.As.PROPERTY,
1123+
| property = "__typename"
1124+
|)
1125+
|@JsonSubTypes({
1126+
| @JsonSubTypes.Type(value = Cat.class, name = "Cat"),
1127+
| @JsonSubTypes.Type(value = Dog.class, name = "Dog")
1128+
|})
1129+
|public interface Pet {
1130+
| String getName();
1131+
|
1132+
| void setName(String name);
1133+
|}
1134+
|
1135+
""".trimMargin()
1136+
)
1137+
}
1138+
10841139
@Test
10851140
fun `Use mapped type name when the type is mapped for interface`() {
10861141
val schema = """

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/KotlinCodeGenTest.kt

+55
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,61 @@ class KotlinCodeGenTest {
950950
assertThat((dataTypes[0].members[0] as TypeSpec).propertySpecs[0].type.toString()).isEqualTo("mypackage.Person?")
951951
}
952952

953+
@Test
954+
fun `Use mapped type name when the type implements not-mapped interface`() {
955+
val schema = """
956+
interface Pet {
957+
name: ID!
958+
}
959+
type Cat implements Pet {
960+
name: ID!
961+
}
962+
type Dog implements Pet {
963+
name: ID!
964+
}
965+
""".trimIndent()
966+
967+
val codeGenResult = CodeGen(
968+
CodeGenConfig(
969+
schemas = setOf(schema),
970+
packageName = basePackageName,
971+
language = Language.KOTLIN,
972+
typeMapping = mapOf(
973+
"Cat" to "mypackage.Cat"
974+
)
975+
)
976+
).generate()
977+
val interfaces = codeGenResult.kotlinInterfaces
978+
979+
assertThat(interfaces.size).isEqualTo(1)
980+
assertThat(interfaces[0].toString()).isEqualTo(
981+
"""
982+
|package com.netflix.graphql.dgs.codegen.tests.generated.types
983+
|
984+
|import com.fasterxml.jackson.`annotation`.JsonSubTypes
985+
|import com.fasterxml.jackson.`annotation`.JsonTypeInfo
986+
|import kotlin.String
987+
|import mypackage.Cat
988+
|
989+
|@JsonTypeInfo(
990+
| use = JsonTypeInfo.Id.NAME,
991+
| include = JsonTypeInfo.As.PROPERTY,
992+
| property = "__typename",
993+
|)
994+
|@JsonSubTypes(value = [
995+
| JsonSubTypes.Type(value = Cat::class, name = "Cat"),
996+
| JsonSubTypes.Type(value = Dog::class, name = "Dog")
997+
|])
998+
|public interface Pet {
999+
| public val name: String
1000+
|
1001+
| public companion object
1002+
|}
1003+
|
1004+
""".trimMargin()
1005+
)
1006+
}
1007+
9531008
class MappedTypesTestCases : ArgumentsProvider {
9541009
override fun provideArguments(context: ExtensionContext): Stream<out Arguments> = of(
9551010
arguments("java.time.LocalDateTime", "java.time.LocalDateTime"),

graphql-dgs-codegen-gradle/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ apply plugin: 'java-gradle-plugin'
2424

2525
dependencies {
2626
api project(":graphql-dgs-codegen-core")
27+
compileOnly "com.netflix.nebula:gradle-dependency-lock-plugin:latest.release"
2728
compileOnly "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.KOTLIN_VERSION}"
2829

2930
testApi gradleTestKit()

graphql-dgs-codegen-gradle/src/main/kotlin/com/netflix/graphql/dgs/codegen/gradle/ClientUtilsConventions.kt

+15
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
package com.netflix.graphql.dgs.codegen.gradle
2020

21+
import nebula.plugin.dependencylock.DependencyLockExtension
2122
import org.gradle.api.Project
2223
import org.gradle.api.logging.Logging
2324
import java.io.FileNotFoundException
@@ -29,6 +30,7 @@ object ClientUtilsConventions {
2930

3031
private const val CLIENT_UTILS_ARTIFACT_GROUP = "com.netflix.graphql.dgs.codegen"
3132
private const val CLIENT_UTILS_ARTIFACT_NAME = "graphql-dgs-codegen-shared-core"
33+
private const val CLIENT_UTILS_NEBULA_LOCK_ID = "com.netflix.nebula.dependency-lock"
3234

3335
private val logger = Logging.getLogger(ClientUtilsConventions::class.java)
3436

@@ -38,10 +40,23 @@ object ClientUtilsConventions {
3840
optionalCodeClientDependencyScope: Optional<String> = Optional.empty()
3941
) {
4042
clientCoreArtifact(optionalCodeUtilsVersion).ifPresent { dependencyString ->
43+
val dependencyLockString = dependencyString.split(":").take(2).joinToString(":")
44+
4145
val dependencyConfiguration = optionalCodeClientDependencyScope.orElse(GRADLE_CLASSPATH_CONFIGURATION)
4246
val configurationDependencies = project.configurations.getByName(dependencyConfiguration).dependencies
4347
configurationDependencies.add(project.dependencies.create(dependencyString))
4448
logger.info("DGS CodeGen added [{}] to the {} dependencies.", dependencyString, dependencyConfiguration)
49+
50+
project.dependencyLocking.ignoredDependencies.add(dependencyLockString)
51+
logger.info("DGS CodeGen added [{}] to the ignoredDependencies.", dependencyLockString, dependencyConfiguration)
52+
53+
project.plugins.withId(CLIENT_UTILS_NEBULA_LOCK_ID) {
54+
val extension = project.extensions.getByType(DependencyLockExtension::class.java)
55+
if (extension != null) {
56+
extension.skippedDependencies.add(dependencyLockString)
57+
logger.info("DGS CodeGen added [{}] to the skippedDependencies.", dependencyLockString, dependencyConfiguration)
58+
}
59+
}
4560
}
4661
}
4762

graphql-dgs-codegen-shared-core/src/main/kotlin/com/netflix/graphql/dgs/client/codegen/GraphQLQueryRequest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class GraphQLQueryRequest @JvmOverloads constructor(
3737
class GraphQLQueryRequestOptions(val scalars: Map<Class<*>, Coercing<*, *>> = emptyMap()) {
3838
// When enabled, input values that are derived from properties
3939
// whose values are null will be serialized in the query request
40-
val allowNullablePropertyInputValues = false
40+
var allowNullablePropertyInputValues = false
4141
}
4242

4343
val inputValueSerializer =

graphql-dgs-codegen-shared-core/src/test/kotlin/com/netflix/graphql/dgs/client/codegen/GraphQLQueryRequestTest.kt

+23
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
package com.netflix.graphql.dgs.client.codegen
2020

21+
import com.netflix.graphql.dgs.client.codegen.GraphQLQueryRequest.GraphQLQueryRequestOptions
2122
import com.netflix.graphql.dgs.client.codegen.exampleprojection.EntitiesProjectionRoot
2223
import graphql.language.OperationDefinition
2324
import graphql.language.StringValue
@@ -379,6 +380,28 @@ class GraphQLQueryRequestTest {
379380
)
380381
}
381382

383+
@Test
384+
fun serializeWithNullableInputValueSerializer() {
385+
val query = TestGraphQLQuery().apply {
386+
input["movie"] = Movie(1234, "name", null)
387+
}
388+
val options = GraphQLQueryRequestOptions().apply {
389+
allowNullablePropertyInputValues = true
390+
}
391+
val request = GraphQLQueryRequest(query, MovieProjection().name().movieId(), options)
392+
val result = request.serialize()
393+
assertValidQuery(result)
394+
assertThat(result).isEqualTo(
395+
"""{
396+
| test(movie: {movieId : 1234, name : "name", window : null}) {
397+
| name
398+
| movieId
399+
| }
400+
|}
401+
""".trimMargin()
402+
)
403+
}
404+
382405
/**
383406
* Assert that the GraphQL query is syntactically valid.
384407
*/

0 commit comments

Comments
 (0)