Skip to content

Commit 5050232

Browse files
smyrickdariuszkuc
authored andcommitted
refactor: start moving type mappers to separate files (#47)
* refactor: start moving type mappers to separate files Start breaking up the massive class, SchemaGenerator, and move bits into their own functions in files with unit tests * rename method * move suppression of cast Move the cast supression to a location where it is known to be safe
1 parent b12de27 commit 5050232

File tree

14 files changed

+182
-54
lines changed

14 files changed

+182
-54
lines changed

detekt_baseline.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
<SmellBaseline>
33
<Blacklist timestamp="1538767296980"></Blacklist>
44
<Whitelist timestamp="1538768092037">
5-
<ID>ComplexMethod:typeMappers.kt$internal fun graphQLScalar(type: KType): GraphQLType?</ID>
65
<ID>FunctionMaxLength:SchemaGenerator.kt$SchemaGenerator$@Throws(InvalidInputFieldTypeException::class) private fun throwIfInterfaceIsNotAuthorized(parameter: KParameter)</ID>
76
<ID>FunctionOnlyReturningConstant:DirectiveTests.kt$Geography$@DirectiveOnFunction fun somethingCool(): String</ID>
87
<ID>LargeClass:SchemaGenerator.kt$SchemaGenerator</ID>

src/main/kotlin/com/expedia/graphql/schema/extensions/annotationExtensions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ 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.schema.exceptions.CouldNotGetNameOfAnnotationException
7-
import com.expedia.graphql.schema.generator.graphQLScalar
87
import com.expedia.graphql.schema.generator.isNotBlackListed
8+
import com.expedia.graphql.schema.generator.types.defaultGraphQLScalars
99
import com.google.common.base.CaseFormat
1010
import graphql.schema.GraphQLArgument
1111
import graphql.schema.GraphQLDirective
@@ -87,7 +87,7 @@ internal fun KAnnotatedElement.directives() =
8787
val propertyName = prop.name
8888
val value = prop.call(annotation)
8989
@Suppress("Detekt.UnsafeCast")
90-
val type = graphQLScalar(prop.returnType) as GraphQLInputType
90+
val type = defaultGraphQLScalars(prop.returnType) as GraphQLInputType
9191
builder.argument(GraphQLArgument.newArgument().name(propertyName).value(value).type(type).build())
9292
}
9393

src/main/kotlin/com/expedia/graphql/schema/generator/kClassExtensions.kt renamed to src/main/kotlin/com/expedia/graphql/schema/extensions/kClassExtensions.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
package com.expedia.graphql.schema.generator
1+
package com.expedia.graphql.schema.extensions
22

3+
import com.expedia.graphql.schema.generator.functionFilters
4+
import com.expedia.graphql.schema.generator.propertyFilters
35
import com.expedia.graphql.schema.hooks.SchemaGeneratorHooks
46
import kotlin.reflect.KClass
57
import kotlin.reflect.full.declaredMemberFunctions

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

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@ import com.expedia.graphql.schema.SchemaGeneratorConfig
77
import com.expedia.graphql.schema.exceptions.InvalidInputFieldTypeException
88
import com.expedia.graphql.schema.extensions.directives
99
import com.expedia.graphql.schema.extensions.getDeprecationReason
10+
import com.expedia.graphql.schema.extensions.getValidFunctions
11+
import com.expedia.graphql.schema.extensions.getValidProperties
1012
import com.expedia.graphql.schema.extensions.graphQLDescription
1113
import com.expedia.graphql.schema.extensions.isGraphQLContext
1214
import com.expedia.graphql.schema.extensions.wrapInNonNull
15+
import com.expedia.graphql.schema.generator.types.defaultGraphQLScalars
16+
import com.expedia.graphql.schema.generator.types.enumType
17+
import com.expedia.graphql.schema.generator.types.getInputClassName
1318
import com.expedia.graphql.schema.models.KGraphQLType
1419
import graphql.TypeResolutionEnvironment
1520
import graphql.schema.DataFetcher
1621
import graphql.schema.GraphQLArgument
1722
import graphql.schema.GraphQLDirective
18-
import graphql.schema.GraphQLEnumType
1923
import graphql.schema.GraphQLFieldDefinition
2024
import graphql.schema.GraphQLInputObjectField
2125
import graphql.schema.GraphQLInputObjectType
@@ -29,7 +33,6 @@ import graphql.schema.GraphQLSchema
2933
import graphql.schema.GraphQLType
3034
import graphql.schema.GraphQLTypeReference
3135
import graphql.schema.GraphQLUnionType
32-
import org.reflections.Reflections
3336
import kotlin.reflect.KClass
3437
import kotlin.reflect.KFunction
3538
import kotlin.reflect.KParameter
@@ -52,9 +55,9 @@ internal class SchemaGenerator(
5255
) {
5356

5457
private val cache = TypesCache(config.supportedPackages)
58+
private val subTypeMapper = SubTypeMapper(config.supportedPackages)
5559
private val additionTypes = mutableSetOf<GraphQLType>()
5660
private val directives = mutableSetOf<GraphQLDirective>()
57-
private val reflections = Reflections(config.supportedPackages)
5861

5962
internal fun generate(): GraphQLSchema {
6063
val builder = generateWithReflection()
@@ -186,7 +189,7 @@ internal class SchemaGenerator(
186189

187190
private fun graphQLTypeOf(type: KType, inputType: Boolean = false): GraphQLType {
188191
val hookGraphQLType = config.hooks.willGenerateGraphQLType(type)
189-
val graphQLType = hookGraphQLType ?: graphQLScalar(type) ?: objectFromReflection(type, inputType)
192+
val graphQLType = hookGraphQLType ?: defaultGraphQLScalars(type) ?: objectFromReflection(type, inputType)
190193
val typeWithNullityTakenIntoAccount = graphQLType.wrapInNonNull(type)
191194
config.hooks.didGenerateGraphQLType(type, typeWithNullityTakenIntoAccount)
192195
return typeWithNullityTakenIntoAccount
@@ -210,7 +213,7 @@ internal class SchemaGenerator(
210213
}
211214

212215
private fun getGraphQLType(kClass: KClass<*>, inputType: Boolean, type: KType): GraphQLType = when {
213-
kClass.isSubclassOf(Enum::class) -> enumType(kClass)
216+
kClass.isSubclassOf(Enum::class) -> @Suppress("UNCHECKED_CAST") enumType(kClass as KClass<Enum<*>>)
214217
kClass.isSubclassOf(List::class) || kClass.java.isArray -> listType(type, inputType)
215218
kClass.canBeGraphQLUnion() -> unionType(kClass)
216219
kClass.canBeGraphQLInterface() -> interfaceType(kClass)
@@ -227,16 +230,6 @@ internal class SchemaGenerator(
227230
if (parameter.type.jvmErasure.java.isInterface) throw InvalidInputFieldTypeException()
228231
}
229232

230-
private fun enumType(kClass: KClass<*>): GraphQLEnumType {
231-
val enumKClass = @Suppress("UNCHECKED_CAST") (kClass as KClass<Enum<*>>)
232-
val builder = GraphQLEnumType.newEnum()
233-
enumKClass.java.enumConstants.forEach {
234-
builder.value(it.name)
235-
}
236-
builder.name(enumKClass.simpleName)
237-
return builder.build()
238-
}
239-
240233
private fun listType(type: KType, inputType: Boolean): GraphQLList =
241234
GraphQLList.list(graphQLTypeOf(type.arguments.first().type!!, inputType))
242235

@@ -274,7 +267,7 @@ internal class SchemaGenerator(
274267

275268
private fun inputObjectType(kClass: KClass<*>): GraphQLType {
276269
val builder = GraphQLInputObjectType.newInputObject()
277-
val name = getGraphQLClassName(kClass, true)
270+
val name = getInputClassName(kClass)
278271

279272
builder.name(name)
280273
builder.description(kClass.graphQLDescription())
@@ -312,7 +305,7 @@ internal class SchemaGenerator(
312305
builder.typeResolver { env: TypeResolutionEnvironment -> env.schema.getObjectType(env.getObject<Any>().javaClass.simpleName) }
313306
val interfaceType = builder.build()
314307

315-
val implementations = getSubTypesOf(kClass)
308+
val implementations = subTypeMapper.getSubTypesOf(kClass)
316309
implementations
317310
.filterNot { it.kotlin.isAbstract }
318311
.forEach {
@@ -334,7 +327,7 @@ internal class SchemaGenerator(
334327
builder.description(kClass.graphQLDescription())
335328
builder.typeResolver { env: TypeResolutionEnvironment -> env.schema.getObjectType(env.getObject<Any>().javaClass.simpleName) }
336329

337-
val implementations = getSubTypesOf(kClass)
330+
val implementations = subTypeMapper.getSubTypesOf(kClass)
338331
implementations
339332
.filterNot { it.kotlin.isAbstract }
340333
.forEach {
@@ -351,7 +344,4 @@ internal class SchemaGenerator(
351344
builder.build()
352345
}
353346
}
354-
355-
private fun getSubTypesOf(kclass: KClass<*>): MutableSet<out Class<out Any>> =
356-
reflections.getSubTypesOf(Class.forName(kclass.javaObjectType.name))
357347
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.expedia.graphql.schema.generator
2+
3+
import org.reflections.Reflections
4+
import kotlin.reflect.KClass
5+
6+
internal class SubTypeMapper(supportedPackages: List<String>) {
7+
8+
private val reflections = Reflections(supportedPackages)
9+
10+
fun getSubTypesOf(kclass: KClass<*>): MutableSet<out Class<out Any>> =
11+
reflections.getSubTypesOf(Class.forName(kclass.javaObjectType.name))
12+
}

src/main/kotlin/com/expedia/graphql/schema/generator/typeMappers.kt

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.expedia.graphql.schema.generator.types
2+
3+
import graphql.Scalars
4+
import graphql.schema.GraphQLType
5+
import java.math.BigDecimal
6+
import java.math.BigInteger
7+
import kotlin.reflect.KClass
8+
import kotlin.reflect.KType
9+
10+
private val defaultScalarsMap = mapOf(
11+
Int::class to Scalars.GraphQLInt,
12+
Long::class to Scalars.GraphQLLong,
13+
Short::class to Scalars.GraphQLShort,
14+
Float::class to Scalars.GraphQLFloat,
15+
Double::class to Scalars.GraphQLFloat,
16+
BigDecimal::class to Scalars.GraphQLBigDecimal,
17+
BigInteger::class to Scalars.GraphQLBigInteger,
18+
Char::class to Scalars.GraphQLChar,
19+
String::class to Scalars.GraphQLString,
20+
Boolean::class to Scalars.GraphQLBoolean
21+
)
22+
23+
internal fun defaultGraphQLScalars(type: KType): GraphQLType? {
24+
val kclass = type.classifier as? KClass<*>
25+
26+
return defaultScalarsMap[kclass]
27+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.expedia.graphql.schema.generator.types
2+
3+
import graphql.schema.GraphQLEnumType
4+
import kotlin.reflect.KClass
5+
6+
internal fun enumType(kClass: KClass<out Enum<*>>): GraphQLEnumType {
7+
val builder = GraphQLEnumType.newEnum()
8+
9+
kClass.java.enumConstants.forEach {
10+
builder.value(it.name)
11+
}
12+
13+
builder.name(kClass.simpleName)
14+
return builder.build()
15+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.expedia.graphql.schema.generator.types
2+
3+
import kotlin.reflect.KClass
4+
5+
internal fun getInputClassName(klass: KClass<*>): String? = klass.simpleName?.let { "${it}Input" }

src/test/kotlin/com/expedia/graphql/schema/generator/KClassExtensionsTest.kt renamed to src/test/kotlin/com/expedia/graphql/schema/extensions/KClassExtensionsTest.kt

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

33
import com.expedia.graphql.schema.hooks.NoopSchemaGeneratorHooks
44
import org.junit.jupiter.api.Test

0 commit comments

Comments
 (0)