Skip to content

Commit 7a31aee

Browse files
smyrickbrennantaylor
authored andcommitted
feat: move hooks into the config (#7)
1 parent b0fa841 commit 7a31aee

File tree

13 files changed

+61
-61
lines changed

13 files changed

+61
-61
lines changed

src/main/kotlin/com/expedia/graphql/KotlinDataFetcher.kt renamed to src/main/kotlin/com/expedia/graphql/schema/KotlinDataFetcher.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.expedia.graphql
1+
package com.expedia.graphql.schema
22

33
import com.expedia.graphql.annotations.GraphQLContext
44
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

src/main/kotlin/com/expedia/graphql/schema/SchemaConfig.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/main/kotlin/com/expedia/graphql/schema/SchemaGenerator.kt

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package com.expedia.graphql.schema
22

3-
import com.expedia.graphql.KotlinDataFetcher
4-
import com.expedia.graphql.Parameter
53
import com.expedia.graphql.TopLevelObjectDef
64
import com.expedia.graphql.schema.exceptions.ConflictingTypesException
75
import com.expedia.graphql.schema.exceptions.CouldNotGetNameOfEnumException
86
import com.expedia.graphql.schema.exceptions.TypeNotSupportedException
9-
import com.expedia.graphql.schema.hooks.SchemaGeneratorHooks
107
import com.expedia.graphql.schema.models.KGraphQLType
118
import graphql.TypeResolutionEnvironment
129
import graphql.schema.DataFetcher
@@ -37,18 +34,15 @@ import kotlin.reflect.jvm.jvmErasure
3734
internal class SchemaGenerator(
3835
private val queries: List<TopLevelObjectDef>,
3936
private val mutations: List<TopLevelObjectDef>,
40-
private val config: SchemaConfig,
41-
private val hooks: SchemaGeneratorHooks
37+
private val config: SchemaGeneratorConfig
4238
) {
4339

4440
private val typesCache: MutableMap<String, KGraphQLType> = mutableMapOf()
45-
private val propertyFilters: List<PropertyFilter> = listOf(isPublic, isNotGraphQLIgnored)
46-
private val functionFilters: List<FunctionFilter> = listOf(isPublic, isNotGraphQLIgnored, isNotBlackListed)
4741
private val additionTypes = mutableSetOf<GraphQLType>()
4842

4943
internal fun generate(): GraphQLSchema {
5044
val builder = generateWithReflection()
51-
return hooks.willBuildSchema(builder).build()
45+
return config.hooks.willBuildSchema(builder).build()
5246
}
5347

5448
private fun generateWithReflection(): GraphQLSchema.Builder {
@@ -68,11 +62,11 @@ internal class SchemaGenerator(
6862
queryBuilder.name(config.topLevelQueryName)
6963
for (query in queries) {
7064
query.klazz.declaredMemberFunctions
71-
.filter { hooks.isValidFunction(it) }
65+
.filter { config.hooks.isValidFunction(it) }
7266
.filter { func -> functionFilters.all { it.invoke(func) } }
7367
.forEach {
7468
val function = function(it, query.obj)
75-
val functionFromHook = hooks.didGenerateQueryType(it, function)
69+
val functionFromHook = config.hooks.didGenerateQueryType(it, function)
7670
queryBuilder.field(functionFromHook)
7771
}
7872
}
@@ -86,11 +80,11 @@ internal class SchemaGenerator(
8680

8781
for (mutation in mutations) {
8882
mutation.klazz.declaredMemberFunctions
89-
.filter { hooks.isValidFunction(it) }
83+
.filter { config.hooks.isValidFunction(it) }
9084
.filter { func -> functionFilters.all { it.invoke(func) } }
9185
.forEach {
9286
val function = function(it, mutation.obj)
93-
val functionFromHook = hooks.didGenerateMutationType(it, function)
87+
val functionFromHook = config.hooks.didGenerateMutationType(it, function)
9488
mutationBuilder.field(functionFromHook)
9589
}
9690
}
@@ -123,7 +117,7 @@ internal class SchemaGenerator(
123117
}
124118
}
125119
val dataFetcher: DataFetcher<*> = KotlinDataFetcher(target, fn, args, fn.isGraphQLInstrumentable())
126-
val hookDataFetcher = hooks.didGenerateDataFetcher(fn, dataFetcher)
120+
val hookDataFetcher = config.hooks.didGenerateDataFetcher(fn, dataFetcher)
127121
builder.dataFetcher(hookDataFetcher)
128122
builder.type(graphQLTypeOf(fn.returnType) as GraphQLOutputType)
129123
return builder.build()
@@ -143,10 +137,10 @@ internal class SchemaGenerator(
143137
.build()
144138

145139
private fun graphQLTypeOf(type: KType, inputType: Boolean = false): GraphQLType {
146-
val hookGraphQLType = hooks.willGenerateGraphQLType(type)
140+
val hookGraphQLType = config.hooks.willGenerateGraphQLType(type)
147141
val graphQLType = hookGraphQLType ?: graphQLScalar(type) ?: objectFromReflection(type, inputType)
148142
val typeWithNullityTakenIntoAccount = graphQLType.wrapInNonNull(type)
149-
hooks.didGenerateGraphQLType(type, typeWithNullityTakenIntoAccount)
143+
config.hooks.didGenerateGraphQLType(type, typeWithNullityTakenIntoAccount)
150144
return typeWithNullityTakenIntoAccount
151145
}
152146

@@ -228,12 +222,12 @@ internal class SchemaGenerator(
228222
if (interfaceType != null) builder.withInterface(interfaceType)
229223

230224
klass.declaredMemberProperties
231-
.filter { hooks.isValidProperty(it) }
225+
.filter { config.hooks.isValidProperty(it) }
232226
.filter { prop -> propertyFilters.all { it.invoke(prop) } }
233227
.forEach { builder.field(property(it)) }
234228

235229
klass.declaredMemberFunctions
236-
.filter { hooks.isValidFunction(it) }
230+
.filter { config.hooks.isValidFunction(it) }
237231
.filter { func -> functionFilters.all { it.invoke(func) } }
238232
.forEach { builder.field(function(it)) }
239233

@@ -249,7 +243,7 @@ internal class SchemaGenerator(
249243

250244
// It does not make sense to run functions against the input types so we only process data fields
251245
klass.declaredMemberProperties
252-
.filter { hooks.isValidProperty(it) }
246+
.filter { config.hooks.isValidProperty(it) }
253247
.filter { prop -> propertyFilters.all { it.invoke(prop) } }
254248
.forEach { builder.field(inputProperty(it)) }
255249

@@ -273,7 +267,7 @@ internal class SchemaGenerator(
273267
builder.description(kClass.graphQLDescription())
274268

275269
kClass.declaredMemberProperties
276-
.filter { hooks.isValidProperty(it) }
270+
.filter { config.hooks.isValidProperty(it) }
277271
.filter { prop -> propertyFilters.all { it.invoke(prop) } }
278272
.forEach { builder.field(property(it)) }
279273

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.expedia.graphql.schema
2+
3+
import com.expedia.graphql.schema.hooks.NoopSchemaGeneratorHooks
4+
import com.expedia.graphql.schema.hooks.SchemaGeneratorHooks
5+
6+
/**
7+
* Settings for generating the schema.
8+
*/
9+
data class SchemaGeneratorConfig(
10+
val supportedPackages: String,
11+
val topLevelQueryName: String = "TopLevelQuery",
12+
val topLevelMutationName: String = "TopLevelMutation",
13+
val hooks: SchemaGeneratorHooks = NoopSchemaGeneratorHooks()
14+
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.expedia.graphql.schema.exceptions
2+
3+
import kotlin.reflect.KClass
4+
5+
class CouldNotGetNameOfAnnotationException(kClass: KClass<*>)
6+
: RuntimeException("Could not get name of annotation class $kClass")

src/main/kotlin/com/expedia/graphql/schema/schemaAnnotations.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.expedia.graphql.annotations.GraphQLContext
44
import com.expedia.graphql.annotations.GraphQLDescription
55
import com.expedia.graphql.annotations.GraphQLIgnore
66
import com.expedia.graphql.annotations.GraphQLInstrumentationIgnore
7+
import com.expedia.graphql.schema.exceptions.CouldNotGetNameOfAnnotationException
78
import com.google.common.base.CaseFormat
89
import graphql.schema.GraphQLArgument
910
import graphql.schema.GraphQLDirective
@@ -57,10 +58,10 @@ internal fun KAnnotatedElement.directives() =
5758
this.annotations.mapNotNull { annotation ->
5859
annotation.getDirectiveInfo()?.let { directiveInfo ->
5960
val builder = GraphQLDirective.newDirective()
60-
val name = if (directiveInfo.name.isNotEmpty()) {
61+
val name: String = if (directiveInfo.name.isNotEmpty()) {
6162
directiveInfo.name
6263
} else {
63-
annotation.annotationClass.simpleName
64+
annotation.annotationClass.simpleName ?: throw CouldNotGetNameOfAnnotationException(annotation.annotationClass)
6465
}
6566
builder.name(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, name))
6667

src/main/kotlin/com/expedia/graphql/schema/schemaFilters.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ internal typealias FunctionFilter = (KFunction<*>) -> Boolean
1717

1818
internal val isNotBlackListed: FunctionFilter = { (blackListFunctions.contains(it.name) || it.name.matches(componentFunctionRegex)).not() }
1919

20-
internal val isPublic: CallableFilter = { it.visibility == KVisibility.PUBLIC }
20+
private val isPublic: CallableFilter = { it.visibility == KVisibility.PUBLIC }
2121

22-
internal val isNotGraphQLIgnored: AnnotatedElementFilter = { it.isGraphQLIgnored().not() }
22+
private val isNotGraphQLIgnored: AnnotatedElementFilter = { it.isGraphQLIgnored().not() }
23+
24+
internal val propertyFilters: List<PropertyFilter> = listOf(isPublic, isNotGraphQLIgnored)
25+
internal val functionFilters: List<FunctionFilter> = listOf(isPublic, isNotGraphQLIgnored, isNotBlackListed)
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.expedia.graphql
22

3-
import com.expedia.graphql.schema.SchemaConfig
3+
import com.expedia.graphql.schema.SchemaGeneratorConfig
44
import com.expedia.graphql.schema.SchemaGenerator
5-
import com.expedia.graphql.schema.hooks.NoopSchemaGeneratorHooks
6-
import com.expedia.graphql.schema.hooks.SchemaGeneratorHooks
75
import graphql.schema.GraphQLSchema
86

97
/**
@@ -12,11 +10,9 @@ import graphql.schema.GraphQLSchema
1210
* @param queries List of [TopLevelObjectDef] objects to use for GraphQL queries
1311
* @param mutations List of [TopLevelObjectDef] objects to use for GraphQL mutations
1412
* @param config Schema generation configuration
15-
* @param hooks Client specified callbacks for parts of the generation lifecycle
1613
*/
1714
fun toSchema(
1815
queries: List<TopLevelObjectDef>,
1916
mutations: List<TopLevelObjectDef> = emptyList(),
20-
config: SchemaConfig,
21-
hooks: SchemaGeneratorHooks = NoopSchemaGeneratorHooks()
22-
): GraphQLSchema = SchemaGenerator(queries, mutations, config, hooks).generate()
17+
config: SchemaGeneratorConfig
18+
): GraphQLSchema = SchemaGenerator(queries, mutations, config).generate()

src/test/kotlin/com/expedia/api/graphql/schema/testSchemaConfig.kt

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/test/kotlin/com/expedia/api/graphql/schema/SchemaGeneratorTest.kt renamed to src/test/kotlin/com/expedia/graphql/schema/SchemaGeneratorTest.kt

File renamed without changes.

0 commit comments

Comments
 (0)