E578 Merge pull request #188 from Netflix/bugfix/regression-5.x · optionalg/dgs-codegen@d037cee · GitHub
[go: up one dir, main page]

Skip to content

Commit d037cee

Browse files
authored
Merge pull request Netflix#188 from Netflix/bugfix/regression-5.x
2 parents 803bb91 + 07b7ce7 commit d037cee

File tree

6 files changed

+444
-205
lines changed

6 files changed

+444
-205
lines changed

.editorconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[{*.kt,*.kts}]
2+
ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,16 @@ class CodeGen(private val config: CodeGenConfig) {
9191
val entitiesRepresentationsTypes = generateJavaClientEntitiesRepresentations(definitions)
9292
val constantsClass = ConstantsGenerator(config, document).generate()
9393

94-
return dataTypesResult.merge(dataFetchersResult).merge(inputTypesResult).merge(unionsResult).merge(enumsResult).merge(interfacesResult).merge(client).merge(entitiesClient).merge(entitiesRepresentationsTypes).merge(constantsClass)
94+
return dataTypesResult
95+
.merge(dataFetchersResult)
96+
.merge(inputTypesResult)
97+
.merge(unionsResult)
98+
.merge(enumsResult)
99+
.merge(interfacesResult)
100+
.merge(client)
101+
.merge(entitiesClient)
102+
.merge(entitiesRepresentationsTypes)
103+
.merge(constantsClass)
95104
}
96105

97106
private fun generateJavaEnums(definitions: Collection<Definition<*>>): CodeGenResult {
@@ -107,7 +116,6 @@ class CodeGen(private val config: CodeGenConfig) {
107116
if (!config.generateDataTypes) {
108117
return CodeGenResult()
109118
}
110-
111119
return definitions.asSequence()
112120
.filterIsInstance<UnionTypeDefinition>()
113121
.excludeSchemaTypeExtension()
@@ -171,14 +179,11 @@ class CodeGen(private val config: CodeGenConfig) {
171179
}
172180

173181
private fun generateJavaDataType(definitions: Collection<Definition<*>>): CodeGenResult {
174-
if (!config.generateDataTypes) {
175-
return CodeGenResult()
176-
}
177-
178182
return definitions.asSequence()
179183
.filterIsInstance<ObjectTypeDefinition>()
180184
.excludeSchemaTypeExtension()
181185
.filter { it.name != "Query" && it.name != "Mutation" && it.name != "RelayPageInfo" }
186+
.filter { config.generateDataTypes || it.name in requiredTypeCollector.requiredTypes }
182187
.map {
183188
DataTypeGenerator(config, document).generate(it, findTypeExtensions(it.name, definitions))
184189
}.fold(CodeGenResult()) { t: CodeGenResult, u: CodeGenResult -> t.merge(u) }

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

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@
1818

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

21-
import graphql.language.*
21+
import graphql.language.Document
22+
import graphql.language.EnumTypeDefinition
23+
import graphql.language.FieldDefinition
24+
import graphql.language.InputObjectTypeDefinition
25+
import graphql.language.InputValueDefinition
26+
import graphql.language.Node
27+
import graphql.language.NodeTraverser
28+
import graphql.language.NodeVisitorStub
29+
import graphql.language.ObjectTypeDefinition
30+
import graphql.language.TypeName
31+
import graphql.language.UnionTypeDefinition
2232
import graphql.util.TraversalControl
2333
import graphql.util.TraverserContext
2434

@@ -44,16 +54,55 @@ class RequiredTypeCollector(
4454
object : NodeVisitorStub() {
4555
val visitedTypes = mutableSetOf<String>()
4656

57+
override fun visitObjectTypeDefinition(
58+
node: ObjectTypeDefinition,
59+
context: TraverserContext<Node<*>>
60+
): TraversalControl {
61+
node.fieldDefinitions
62+
.flatMap { it.inputValueDefinitions }
63+
.forEach {
64+
it.type.findTypeDefinition(document)?.accept(context, this)
65+
}
66+
67+
node.fieldDefinitions
68+
.filter { !visitedTypes.contains("${node.name}.${it.name}") }
69+
.forEach {
70+
visitedTypes.add("${node.name}.${it.name}")
71+
it.type.findTypeDefinition(document)?.accept(context, this)
72+
}
73+
return TraversalControl.CONTINUE
74+
}
75+
76+
override fun visitUnionTypeDefinition(
77+
node: UnionTypeDefinition,
78+
context: TraverserContext<Node<*>>
79+
): TraversalControl {
80+
node.memberTypes.forEach {
81+
it.findTypeDefinition(document)?.accept(context, this)
82+
}
83+
return TraversalControl.CONTINUE
84+
}
85+
86+
override fun visitTypeName(
87+
node: TypeName,
88+
context: TraverserContext<Node<*>>
89+
): TraversalControl {
90+
node.findTypeDefinition(document)?.accept(context, this)
91+
return TraversalControl.CONTINUE
92+
}
93+
4794
override fun visitInputObjectTypeDefinition(
4895
node: InputObjectTypeDefinition,
4996
context: TraverserContext<Node<Node<*>>>
5097
): TraversalControl {
5198
required += node.name
5299

53-
node.inputValueDefinitions.filter { !visitedTypes.contains(it.name) }.forEach {
54-
visitedTypes.add(it.name)
55-
it.type.findTypeDefinition(document)?.accept(context, this)
56-
}
100+
node.inputValueDefinitions
101+
.filter { !visitedTypes.contains("${node.name}.${it.name}") }
102+
.forEach {
103+
visitedTypes.add("${node.name}.${it.name}")
104+
it.type.findTypeDefinition(document)?.accept(context, this)
105+
}
57106
return TraversalControl.CONTINUE
58107
}
59108

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

Lines changed: 81 additions & 19 deletions
< 8B92 td data-grid-cell-id="diff-a2e70291a4b0739f0ba5f85bf9a5fe61cd341b482571e9d791064a001efdb52f-1397-1409-1" data-selected="false" role="gridcell" style="background-color:var(--bgColor-default);text-align:center" tabindex="-1" valign="top" class="focusable-grid-cell diff-line-number position-relative diff-line-number-neutral left-side">1409
Original file line numberDiff line numberDiff line change
@@ -1062,7 +1062,7 @@ class ClientApiGenTest {
10621062
.plus(codeGenResult.javaInterfaces)
10631063
)
10641064

1065-
// And assert the Search_Result_MovieProjection instance has a excplicit schemaType
1065+
// And assert the Search_Result_MovieProjection instance has an explicit schemaType
10661066
val testClassLoader = codegenTestClassLoader(compilation, javaClass.classLoader)
10671067
// Projection class
10681068
val searchMovieProjectionClass =
@@ -1373,26 +1373,38 @@ class ClientApiGenTest {
13731373
fun generateOnlyRequiredDataTypesForQuery() {
13741374
val schema = """
13751375
type Query {
1376-
shows(showFilter: ShowFilter): [Show]
1376+
shows(showFilter: ShowFilter): [Video]
13771377
people(personFilter: PersonFilter): [Person]
13781378
}
13791379
1380-
type Show {
1380+
union Video = Show | Movie
1381+
1382+
type Movie {
13811383
title: String
1384+
duration: Int
1385+
related: Related
1386+
}
1387+
1388+
type Related {
1389+
video: Video
13821390
}
13831391
1384-
enum ShouldNotInclude {
1385-
YES,NO
1392+
type Show {
1393+
title: String
1394+
tags(from: Int, to: Int, sourceType: SourceType): [ShowTag]
1395+
isLive(countryFilter: CountryFilter): Boolean
13861396
}
13871397
1398+
enum ShouldNotInclude { YES, NO }
1399+
13881400
input NotUsed {
13891401
field: String
13901402
}
13911403
13921404
input ShowFilter {
13931405
title: String
13941406
showType: ShowType
1395-
similarTo: SimilarityInput
1407+
similarTo: SimilarityInput
13961408
}
1397
13981410
input SimilarityInput {
@@ -1403,15 +1415,44 @@ class ClientApiGenTest {
14031415
MOVIE, SERIES
14041416
}
14051417
1418+
input CountryFilter {
1419+
countriesToExclude: [String]
1420+
}
1421+
1422+
enum SourceType { FOO, BAR }
1423+
14061424
type Person {
14071425
name: String
14081426
}
14091427
""".trimIndent()
14101428

1411-
val codeGenResult = CodeGen(CodeGenConfig(schemas = setOf(schema), packageName = basePackageName, generateClientApi = true, includeQueries = setOf("shows"), generateDataTypes = false, writeToFiles = false)).generate()
1412-
assertThat(codeGenResult.javaDataTypes.size).isEqualTo(2)
1413-
assertThat(codeGenResult.javaDataTypes).extracting("typeSpec").extracting("name").containsExactly("ShowFilter", "SimilarityInput")
1414-
assertThat(codeGenResult.javaEnumTypes).extracting("typeSpec").extracting("name").containsExactly("ShowType")
1429+
val codeGenResult = CodeGen(
1430+
CodeGenConfig(
1431+
schemas = setOf(schema),
1432+
packageName = basePackageName,
1433+
generateClientApi = true,
1434+
includeQueries = setOf("shows"),
1435+
generateDataTypes = false,
1436+
writeToFiles = false
1437+
)
1438+
).generate()
1439+
1440+
assertThat(codeGenResult.javaDataTypes)
1441+
.extracting("typeSpec").extracting("name").containsExactly("ShowFilter", "SimilarityInput", "CountryFilter")
1442+
assertThat(codeGenResult.javaEnumTypes)
1443+
.extracting("typeSpec").extracting("name").containsExactly("ShowType", "SourceType")
1444+
assertThat(codeGenResult.javaQueryTypes)
1445+
.extracting("typeSpec").extracting("name").containsExactly("ShowsGraphQLQuery")
1446+
assertThat(codeGenResult.clientProjections)
1447+
.extracting("typeSpec").extracting("name").containsExactly(
1448+
"ShowsProjectionRoot",
1449+
"Shows_ShowProjection",
1450+
"Shows_MovieProjection",
1451+
"Shows_Movie_RelatedProjection",
1452+
"Shows_Movie_Related_VideoProjection",
1453+
"Shows_Movie_Related_Video_ShowProjection",
1454+
"Shows_Movie_Related_Video_MovieProjection"
1455+
)
14151456

14161457
assertCompilesJava(codeGenResult.clientProjections + codeGenResult.javaDataTypes + codeGenResult.javaEnumTypes)
14171458
}
@@ -1426,11 +1467,11 @@ class ClientApiGenTest {
14261467
14271468
type Show {
14281469
title: String
1470+
tags(from: Int, to: Int, sourceType: SourceType): [ShowTag]
1471+
isLive(countryFilter: CountryFilter): Boolean
14291472
}
14301473
1431-
enum ShouldNotInclude {
1432-
YES,NO
1433-
}
1474+
enum ShouldNotInclude { YES, NO }
14341475
14351476
input NotUsed {
14361477
field: String
@@ -1439,7 +1480,7 @@ class ClientApiGenTest {
14391480
input ShowFilter {
14401481
title: String
14411482
showType: ShowType
1442-
similarTo: SimilarityInput
1483+
similarTo: SimilarityInput
14431484
}
14441485
14451486
input SimilarityInput {
@@ -1450,15 +1491,36 @@ class ClientApiGenTest {
14501491
MOVIE, SERIES
14511492
}
14521493
1494+
input CountryFilter {
1495+
countriesToExclude: [String]
1496+
}
1497+
1498+
enum SourceType { FOO, BAR }
1499+
14531500
type Person {
14541501
name: String
14551502
}
14561503
""".trimIndent()
14571504

1458-
val codeGenResult = CodeGen(CodeGenConfig(schemas = setOf(schema), packageName = basePackageName, generateClientApi = true, includeMutations = setOf("shows"), generateDataTypes = false, writeToFiles = false)).generate()
1459-
assertThat(codeGenResult.javaDataTypes.size).isEqualTo(2)
1460-
assertThat(codeGenResult.javaDataTypes).extracting("typeSpec").extracting("name").containsExactly("ShowFilter", "SimilarityInput")
1461-
assertThat(codeGenResult.javaEnumTypes).extracting("typeSpec").extracting("name").containsExactly("ShowType")
1505+
val codeGenResult = CodeGen(
1506+
CodeGenConfig(
1507+
schemas = setOf(schema),
1508+
packageName = basePackageName,
1509+
generateClientApi = true,
1510+
includeMutations = setOf("shows"),
1511+
generateDataTypes = false,
1512+
writeToFiles = false
1513+
)
1514+
).generate()
1515+
1516+
assertThat(codeGenResult.javaDataTypes)
1517+
.extracting("typeSpec").extracting("name").containsExactly("ShowFilter", "SimilarityInput", "CountryFilter")
1518+
assertThat(codeGenResult.javaEnumTypes)
1519+
.extracting("typeSpec").extracting("name").containsExactly("ShowType", "SourceType")
1520+
assertThat(codeGenResult.javaQueryTypes)
1521+
.extracting("typeSpec").extracting("name").containsExactly("ShowsGraphQLQuery")
1522+
assertThat(codeGenResult.clientProjections)
1523+
.extracting("typeSpec").extracting("name").containsExactly("ShowsProjectionRoot")
14621524

14631525
assertCompilesJava(codeGenResult.clientProjections + codeGenResult.javaDataTypes + codeGenResult.javaEnumTypes)
14641526
}
@@ -1644,7 +1706,7 @@ class ClientApiGenTest {
16441706
assertThat(methodWithArgs.parameters[0].type.toString()).isEqualTo("java.lang.Boolean")
16451707
}
16461708

1647-
// TODO[BGP] Migrate to [CodeGentTestClassLoader]
1709+
// TODO[BGP] Migrate to [CodegentTestClassLoader]
16481710
private fun compileAndGetClass(dataTypes: List<JavaFile>, type: String): Class<*> {
16491711
val packageNameAsUnixPath = basePackageName.replace(".", "/")
16501712
val compilation = assertCompilesJava(dataTypes)

0 commit comments

Comments
 (0)
0