Skip to content

Commit 5ee7999

Browse files
author
Tom Groves
committed
Surface schema description when instantiating GraphQLSchema.
1 parent 004c964 commit 5ee7999

File tree

5 files changed

+38
-4
lines changed

5 files changed

+38
-4
lines changed

src/main/kotlin/graphql/kickstart/tools/RootTypeInfo.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package graphql.kickstart.tools
22

3+
import graphql.language.Description
34
import graphql.language.SchemaDefinition
45
import graphql.language.TypeName
56

@@ -9,25 +10,29 @@ import graphql.language.TypeName
910
internal class RootTypeInfo private constructor(
1011
private val queryType: TypeName?,
1112
private val mutationType: TypeName?,
12-
private val subscriptionType: TypeName?
13+
private val subscriptionType: TypeName?,
14+
private val description: Description?
1315
) {
1416
companion object {
1517
const val DEFAULT_QUERY_NAME = "Query"
1618
const val DEFAULT_MUTATION_NAME = "Mutation"
1719
const val DEFAULT_SUBSCRIPTION_NAME = "Subscription"
20+
const val DEFAULT_DESCRIPTION = "A GraphQL schema provides a root type for each kind of operation."
1821

1922
fun fromSchemaDefinitions(definitions: List<SchemaDefinition>): RootTypeInfo {
2023
val queryType = definitions.lastOrNull()?.operationTypeDefinitions?.find { it.name == "query" }?.typeName
2124
val mutationType = definitions.lastOrNull()?.operationTypeDefinitions?.find { it.name == "mutation" }?.typeName
2225
val subscriptionType = definitions.lastOrNull()?.operationTypeDefinitions?.find { it.name == "subscription" }?.typeName
26+
val description = definitions.lastOrNull()?.description
2327

24-
return RootTypeInfo(queryType, mutationType, subscriptionType)
28+
return RootTypeInfo(queryType, mutationType, subscriptionType, description)
2529
}
2630
}
2731

2832
fun getQueryName() = queryType?.name ?: DEFAULT_QUERY_NAME
2933
fun getMutationName() = mutationType?.name ?: DEFAULT_MUTATION_NAME
3034
fun getSubscriptionName() = subscriptionType?.name ?: DEFAULT_SUBSCRIPTION_NAME
35+
fun getDescription() = description?.content ?: DEFAULT_DESCRIPTION
3136

3237
fun isMutationRequired() = mutationType != null
3338
fun isSubscriptionRequired() = subscriptionType != null

src/main/kotlin/graphql/kickstart/tools/SchemaClassScanner.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ internal class SchemaClassScanner(
495495
val query = createRootType("query", queryDefinition, queryName, true, queryResolvers, GraphQLQueryResolver::class.java, queryResolverInfo)
496496
val mutation = createRootType("mutation", mutationDefinition, mutationName, rootInfo.isMutationRequired(), mutationResolvers, GraphQLMutationResolver::class.java, mutationResolverInfo)
497497
val subscription = createRootType("subscription", subscriptionDefinition, subscriptionName, rootInfo.isSubscriptionRequired(), subscriptionResolvers, GraphQLSubscriptionResolver::class.java, subscriptionResolverInfo)
498+
val schemaDescription = rootInfo.getDescription()
498499

499500
private fun createRootType(name: String, type: TypeDefinition<*>?, typeName: String, required: Boolean, resolvers: List<GraphQLRootResolver>, resolverInterface: Class<*>, resolverInfo: RootResolverInfo): RootType? {
500501
if (type == null) {

src/main/kotlin/graphql/kickstart/tools/SchemaObjects.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ data class SchemaObjects(
1313
val mutation: GraphQLObjectType?,
1414
val subscription: GraphQLObjectType?,
1515
val dictionary: Set<GraphQLType>,
16-
val codeRegistryBuilder: GraphQLCodeRegistry.Builder
16+
val codeRegistryBuilder: GraphQLCodeRegistry.Builder,
17+
val description: String?
1718
) {
1819
/**
1920
* Makes a GraphQLSchema with query, mutation and subscription.
2021
*/
2122
fun toSchema(): GraphQLSchema {
2223
return GraphQLSchema.newSchema()
24+
.description(description)
2325
.query(query)
2426
.mutation(mutation)
2527
.subscription(subscription)

src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class SchemaParser internal constructor(
103103
val additionalObjects = objects.filter { o -> o != query && o != subscription && o != mutation }
104104

105105
val types = (additionalObjects.toSet() as Set<GraphQLType>) + inputObjects + enums + interfaces + unions
106-
return SchemaObjects(query, mutation, subscription, types, codeRegistryBuilder)
106+
return SchemaObjects(query, mutation, subscription, types, codeRegistryBuilder, rootInfo.getDescription())
107107
}
108108

109109
/**

src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,32 @@ class SchemaParserTest {
574574
assertEquals(schema.queryType.getFieldDefinition("empty").description, "")
575575
}
576576

577+
@Test
578+
fun `parser should include schema descriptions`() {
579+
val schema = SchemaParser.newParser()
580+
.schemaString(
581+
"""
582+
"This is a schema level description"
583+
schema {
584+
query: SubstituteQuery
585+
}
586+
587+
type SubstituteQuery {
588+
description: String
589+
comment: String
590+
omitted: String
591+
both: String
592+
empty: String
593+
}
594+
""")
595+
.resolvers(object : GraphQLQueryResolver {})
596+
.options(SchemaParserOptions.newOptions().allowUnimplementedResolvers(true).build())
597+
.build()
598+
.makeExecutableSchema()
599+
600+
assertEquals(schema.description, "This is a schema level description")
601+
}
602+
577603
enum class EnumType {
578604
TEST
579605
}

0 commit comments

Comments
 (0)