Skip to content

Commit 2d4b20b

Browse files
committed
tiny bugfix for nullable types in openapi-generator to make the tests pass unchanged
1 parent 086e1ee commit 2d4b20b

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/readOpenapi.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,12 @@ private fun Schema<*>.toMarker(
332332

333333
fields += allSuperFields
334334
.filter {
335-
it.fieldName.unquoted in requiredFields && it.fieldType.isNullable()
335+
it.fieldName.unquoted in requiredFields &&
336+
it.fieldType.isNullable() &&
337+
// Don't override intrinsically nullable types (like nullable enums) to be
338+
// non-null. Their nullability comes from the type itself, not from being
339+
// optional, so being required in a child schema cannot make them non-null.
340+
!it.fieldType.refersToNullableMarker(getRefMarker, topInterfaceName)
336341
}.map {
337342
generatedFieldOf(
338343
fieldName = it.fieldName,

dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/utils.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.jetbrains.kotlinx.dataframe.io
33
import org.jetbrains.kotlinx.dataframe.codeGen.FieldType
44
import org.jetbrains.kotlinx.dataframe.codeGen.GeneratedField
55
import org.jetbrains.kotlinx.dataframe.codeGen.ValidFieldName
6+
import org.jetbrains.kotlinx.dataframe.codeGen.name
67
import org.jetbrains.kotlinx.dataframe.impl.toCamelCaseByDelimiters
78
import org.jetbrains.kotlinx.dataframe.schema.ColumnSchema
89
import kotlin.reflect.typeOf
@@ -23,6 +24,21 @@ internal fun String.snakeToUpperCamelCase(): String =
2324

2425
internal fun String.toNullable() = if (this.last() == '?') this else "$this?"
2526

27+
/**
28+
* Returns whether this [FieldType] refers to a [Marker][OpenApiMarker] that is itself nullable
29+
* (such as a nullable enum, whose nullability is defined by the type and cannot be removed by
30+
* making a property required). Returns `false` for primitives and non-nullable markers.
31+
*/
32+
internal fun FieldType.refersToNullableMarker(getRefMarker: GetRefMarker, topInterfaceName: ValidFieldName): Boolean {
33+
val refName = name
34+
.removeSuffix("?")
35+
.withoutTopInterfaceName(topInterfaceName)
36+
return when (val res = getRefMarker(refName)) {
37+
is MarkerResult.OpenApiMarker -> res.marker.nullable
38+
else -> false
39+
}
40+
}
41+
2642
internal interface IsObject {
2743
val isObject: Boolean
2844
}

0 commit comments

Comments
 (0)