diff --git a/src/main/kotlin/graphql/kickstart/tools/RootTypeInfo.kt b/src/main/kotlin/graphql/kickstart/tools/RootTypeInfo.kt index e2044dc4..71ae0f9f 100644 --- a/src/main/kotlin/graphql/kickstart/tools/RootTypeInfo.kt +++ b/src/main/kotlin/graphql/kickstart/tools/RootTypeInfo.kt @@ -1,5 +1,6 @@ package graphql.kickstart.tools +import graphql.language.Description import graphql.language.SchemaDefinition import graphql.language.TypeName @@ -9,25 +10,29 @@ import graphql.language.TypeName internal class RootTypeInfo private constructor( private val queryType: TypeName?, private val mutationType: TypeName?, - private val subscriptionType: TypeName? + private val subscriptionType: TypeName?, + private val description: Description? ) { companion object { const val DEFAULT_QUERY_NAME = "Query" const val DEFAULT_MUTATION_NAME = "Mutation" const val DEFAULT_SUBSCRIPTION_NAME = "Subscription" + val DEFAULT_DESCRIPTION: String? = null // According to the GraphQL Specification description should be a string or `null` fun fromSchemaDefinitions(definitions: List): RootTypeInfo { val queryType = definitions.lastOrNull()?.operationTypeDefinitions?.find { it.name == "query" }?.typeName val mutationType = definitions.lastOrNull()?.operationTypeDefinitions?.find { it.name == "mutation" }?.typeName val subscriptionType = definitions.lastOrNull()?.operationTypeDefinitions?.find { it.name == "subscription" }?.typeName + val description = definitions.lastOrNull()?.description - return RootTypeInfo(queryType, mutationType, subscriptionType) + return RootTypeInfo(queryType, mutationType, subscriptionType, description) } } fun getQueryName() = queryType?.name ?: DEFAULT_QUERY_NAME fun getMutationName() = mutationType?.name ?: DEFAULT_MUTATION_NAME fun getSubscriptionName() = subscriptionType?.name ?: DEFAULT_SUBSCRIPTION_NAME + fun getDescription() = description?.content ?: DEFAULT_DESCRIPTION fun isMutationRequired() = mutationType != null fun isSubscriptionRequired() = subscriptionType != null diff --git a/src/main/kotlin/graphql/kickstart/tools/SchemaObjects.kt b/src/main/kotlin/graphql/kickstart/tools/SchemaObjects.kt index eebdc488..206ae721 100644 --- a/src/main/kotlin/graphql/kickstart/tools/SchemaObjects.kt +++ b/src/main/kotlin/graphql/kickstart/tools/SchemaObjects.kt @@ -13,13 +13,15 @@ data class SchemaObjects( val mutation: GraphQLObjectType?, val subscription: GraphQLObjectType?, val dictionary: Set, - val codeRegistryBuilder: GraphQLCodeRegistry.Builder + val codeRegistryBuilder: GraphQLCodeRegistry.Builder, + val description: String? ) { /** * Makes a GraphQLSchema with query, mutation and subscription. */ fun toSchema(): GraphQLSchema { return GraphQLSchema.newSchema() + .description(description) .query(query) .mutation(mutation) .subscription(subscription) diff --git a/src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt b/src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt index 75adc3cb..34ff518f 100644 --- a/src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt +++ b/src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt @@ -103,7 +103,7 @@ class SchemaParser internal constructor( val additionalObjects = objects.filter { o -> o != query && o != subscription && o != mutation } val types = (additionalObjects.toSet() as Set) + inputObjects + enums + interfaces + unions - return SchemaObjects(query, mutation, subscription, types, codeRegistryBuilder) + return SchemaObjects(query, mutation, subscription, types, codeRegistryBuilder, rootInfo.getDescription()) } /** diff --git a/src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt b/src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt index ece86bc4..d382a3cb 100644 --- a/src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt +++ b/src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt @@ -574,6 +574,57 @@ class SchemaParserTest { assertEquals(schema.queryType.getFieldDefinition("empty").description, "") } + @Test + fun `parser should include schema descriptions when declared`() { + val schema = SchemaParser.newParser() + .schemaString( + """ + "This is a schema level description" + schema { + query: SubstituteQuery + } + + type SubstituteQuery { + description: String + comment: String + omitted: String + both: String + empty: String + } + """) + .resolvers(object : GraphQLQueryResolver {}) + .options(SchemaParserOptions.newOptions().allowUnimplementedResolvers(true).build()) + .build() + .makeExecutableSchema() + + assertEquals(schema.description, "This is a schema level description") + } + + @Test + fun `parser should return null schema description when not declared`() { + val schema = SchemaParser.newParser() + .schemaString( + """ + schema { + query: SubstituteQuery + } + + type SubstituteQuery { + description: String + comment: String + omitted: String + both: String + empty: String + } + """) + .resolvers(object : GraphQLQueryResolver {}) + .options(SchemaParserOptions.newOptions().allowUnimplementedResolvers(true).build()) + .build() + .makeExecutableSchema() + + assertNull(schema.description) + } + enum class EnumType { TEST }