Skip to content

Commit 4ccdcb0

Browse files
authored
Merge pull request #1922 from Kotlin/name-normalizer
Disabled renaming to camelcase for `generateInterfaces/DataClasses` functions
2 parents 5e9d53a + 8b13b8c commit 4ccdcb0

12 files changed

Lines changed: 69 additions & 42 deletions

File tree

core/api/core.api

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2402,6 +2402,7 @@ public final class org/jetbrains/kotlinx/dataframe/api/GenerateCodeKt {
24022402
public static final fun generateInterfacesForSchema (Lorg/jetbrains/kotlinx/dataframe/schema/DataFrameSchema;Ljava/lang/String;ZLorg/jetbrains/kotlinx/dataframe/codeGen/MarkerVisibility;ZLorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;Lorg/jetbrains/kotlinx/dataframe/codeGen/MarkerNameProvider;)Ljava/lang/String;
24032403
public static synthetic fun generateInterfacesForSchema$default (Lorg/jetbrains/kotlinx/dataframe/schema/DataFrameSchema;Ljava/lang/String;ZLorg/jetbrains/kotlinx/dataframe/codeGen/MarkerVisibility;ZLorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;Lorg/jetbrains/kotlinx/dataframe/codeGen/MarkerNameProvider;ILjava/lang/Object;)Ljava/lang/String;
24042404
public static final fun getDefault (Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer$Companion;)Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;
2405+
public static final fun getToCamelCaseByDelimiter (Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer$Companion;)Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;
24052406
public static final fun toCodeString (Ljava/lang/String;)Ljava/lang/String;
24062407
}
24072408

@@ -5798,8 +5799,8 @@ public final class org/jetbrains/kotlinx/dataframe/impl/codeGen/DfReadResult$Suc
57985799
}
57995800

58005801
public final class org/jetbrains/kotlinx/dataframe/impl/codeGen/NameNormalizerImplKt {
5801-
public static final fun from (Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer$Companion;Ljava/util/Set;)Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;
58025802
public static final fun id (Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer$Companion;)Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;
5803+
public static final fun toCamelCaseFrom (Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer$Companion;Ljava/util/Set;)Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;
58035804
}
58045805

58055806
public final class org/jetbrains/kotlinx/dataframe/impl/codeGen/SchemaReaderKt {

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/generateCode.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ import org.jetbrains.kotlinx.dataframe.codeGen.Marker
99
import org.jetbrains.kotlinx.dataframe.codeGen.MarkerNameProvider
1010
import org.jetbrains.kotlinx.dataframe.codeGen.MarkerVisibility
1111
import org.jetbrains.kotlinx.dataframe.codeGen.NameNormalizer
12+
import org.jetbrains.kotlinx.dataframe.codeGen.ValidFieldName
1213
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
1314
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
1415
import org.jetbrains.kotlinx.dataframe.documentation.AccessApis.ExtensionPropertiesApi
1516
import org.jetbrains.kotlinx.dataframe.documentation.DocumentationUrls
1617
import org.jetbrains.kotlinx.dataframe.documentation.ExcludeFromSources
17-
import org.jetbrains.kotlinx.dataframe.impl.codeGen.from
18+
import org.jetbrains.kotlinx.dataframe.impl.codeGen.id
19+
import org.jetbrains.kotlinx.dataframe.impl.codeGen.toCamelCaseFrom
1820
import org.jetbrains.kotlinx.dataframe.schema.DataFrameSchema
1921
import org.jetbrains.kotlinx.dataframe.util.GENERATE_CODE
2022
import org.jetbrains.kotlinx.dataframe.util.GENERATE_CODE_REPLACE1
@@ -285,7 +287,19 @@ internal inline fun <reified T> markerName(): String =
285287
/**
286288
* Converts delimited 'my_name', 'my name', etc., String to camelCase 'myName'
287289
*/
288-
public val NameNormalizer.Companion.default: NameNormalizer get() = NameNormalizer.from(setOf('\t', ' ', '_'))
290+
public val NameNormalizer.Companion.toCamelCaseByDelimiter: NameNormalizer
291+
get() = NameNormalizer.toCamelCaseFrom(setOf('\t', ' ', '_'))
292+
293+
/**
294+
* Performs no name normalization.
295+
*
296+
* (Inside the [code generation][CodeGenerator.generate],
297+
* [ValidFieldName] is still used to prevent incompilable code from being generated.)
298+
*
299+
* @see [NameNormalizer.Companion.toCamelCaseByDelimiter]
300+
*/
301+
public val NameNormalizer.Companion.default: NameNormalizer
302+
get() = NameNormalizer.id()
289303

290304
/**
291305
* A value class wrapper for [String], containing

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/NameNormalizerImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import org.jetbrains.kotlinx.dataframe.codeGen.NameNormalizer
44
import org.jetbrains.kotlinx.dataframe.impl.toCamelCaseByDelimiters
55
import java.util.Locale
66

7-
public fun NameNormalizer.Companion.from(normalizationDelimiters: Set<Char>): NameNormalizer {
7+
public fun NameNormalizer.Companion.toCamelCaseFrom(normalizationDelimiters: Set<Char>): NameNormalizer {
88
val delimitersSet = normalizationDelimiters.joinToString("", "[", "]")
99
val delimitedStringRegex by lazy {
1010
".+$delimitersSet.+".toRegex()

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/CodeGenerationTests.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -540,13 +540,13 @@ class CodeGenerationTests : BaseTest() {
540540

541541
@Test
542542
fun `check name normalization for generated data classes`() {
543-
val code = dataFrameOf("my_name")(1).generateDataClasses()
543+
val code = dataFrameOf("my_[name")(1).generateDataClasses()
544544
val expected =
545545
"""
546546
@DataSchema
547547
data class DataEntry(
548-
@ColumnName("my_name")
549-
val myName: Int
548+
@ColumnName("my_[name")
549+
val `my_{name`: Int
550550
)
551551
""".trimIndent()
552552
assertEquals(expected, code.value)

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

Lines changed: 9 additions & 4 deletions
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,
@@ -450,7 +455,7 @@ private fun Schema<*>.toMarker(
450455
.additionalPropertyPaths
451456
.map { it.prepend(name) }
452457

453-
val validName = ValidFieldName.of(name.snakeToLowerCamelCase())
458+
val validName = ValidFieldName.of(name)
454459

455460
// find the field type of the marker reference
456461
val fieldType = openApiTypeResult.marker.toFieldType()
@@ -476,7 +481,7 @@ private fun Schema<*>.toMarker(
476481

477482
this += generatedFieldOf(
478483
overrides = false,
479-
fieldName = ValidFieldName.of(name.snakeToLowerCamelCase()),
484+
fieldName = ValidFieldName.of(name),
480485
columnName = name,
481486
fieldType = FieldType.ValueFieldType(
482487
typeFqName = enumMarker.name +
@@ -503,7 +508,7 @@ private fun Schema<*>.toMarker(
503508
return MarkerResult.CannotFindRefMarker
504509

505510
is FieldTypeResult.FieldType -> {
506-
val validName = ValidFieldName.of(name.snakeToLowerCamelCase())
511+
val validName = ValidFieldName.of(name)
507512

508513
keyValuePaths += fieldTypeResult
509514
.additionalPropertyPaths

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

Lines changed: 17 additions & 3 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
@@ -17,14 +18,27 @@ internal fun String.withoutTopInterfaceName(topInterfaceName: ValidFieldName): S
1718
this
1819
}
1920

20-
internal fun String.snakeToLowerCamelCase(): String = toCamelCaseByDelimiters()
21-
2221
internal fun String.snakeToUpperCamelCase(): String =
23-
snakeToLowerCamelCase()
22+
toCamelCaseByDelimiters()
2423
.replaceFirstChar { it.uppercaseChar() }
2524

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

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+
2842
internal interface IsObject {
2943
val isObject: Boolean
3044
}

dataframe-openapi-generator/src/test/kotlin/OpenApiTests.kt

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import org.jetbrains.kotlinx.jupyter.testkit.JupyterReplTestCase
1313
import org.junit.Test
1414
import java.io.File
1515
import java.io.File.separatorChar
16-
import java.io.InputStream
1716

1817
class OpenApiTests : JupyterReplTestCase() {
1918

@@ -622,14 +621,12 @@ class OpenApiTests : JupyterReplTestCase() {
622621
val petInterface = """
623622
@DataSchema(isOpen = false)
624623
interface Pet {
625-
@ColumnName("pet_type")
626-
val petType: kotlin.String
624+
val pet_type: kotlin.String
627625
val value: kotlin.Any?
628626
val name: kotlin.String
629627
val tag: kotlin.String?
630628
val other: kotlin.Any?
631-
@ColumnName("eye_color")
632-
val eyeColor: $functionName.EyeColor?
629+
val eye_color: $functionName.EyeColor?
633630
634631
public companion object {
635632
public val keyValuePaths: kotlin.collections.List<org.jetbrains.kotlinx.dataframe.api.JsonPath>
@@ -640,16 +637,16 @@ class OpenApiTests : JupyterReplTestCase() {
640637
convertTo()
641638
}
642639
""".trimLines()
643-
// petType was named pet_type, id is either Long or String, other is not integer, eyeColor is a required but nullable enum
640+
// id is either Long or String, other is not integer, eye_color is a required but nullable enum
644641

645642
code should haveSubstring(petInterface)
646643

647644
@Language("kt")
648645
val petExtensions = """
649-
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet>.eyeColor: org.jetbrains.kotlinx.dataframe.DataColumn<$functionName.EyeColor?> @JvmName("Pet_eyeColor") get() = this["eye_color"] as org.jetbrains.kotlinx.dataframe.DataColumn<$functionName.EyeColor?>
650-
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet>.eyeColor: $functionName.EyeColor? @JvmName("Pet_eyeColor") get() = this["eye_color"] as $functionName.EyeColor?
651-
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet?>.eyeColor: org.jetbrains.kotlinx.dataframe.DataColumn<$functionName.EyeColor?> @JvmName("NullablePet_eyeColor") get() = this["eye_color"] as org.jetbrains.kotlinx.dataframe.DataColumn<$functionName.EyeColor?>
652-
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet?>.eyeColor: $functionName.EyeColor? @JvmName("NullablePet_eyeColor") get() = this["eye_color"] as $functionName.EyeColor?
646+
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet>.eye_color: org.jetbrains.kotlinx.dataframe.DataColumn<$functionName.EyeColor?> @JvmName("Pet_eye_color") get() = this["eye_color"] as org.jetbrains.kotlinx.dataframe.DataColumn<$functionName.EyeColor?>
647+
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet>.eye_color: $functionName.EyeColor? @JvmName("Pet_eye_color") get() = this["eye_color"] as $functionName.EyeColor?
648+
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet?>.eye_color: org.jetbrains.kotlinx.dataframe.DataColumn<$functionName.EyeColor?> @JvmName("NullablePet_eye_color") get() = this["eye_color"] as org.jetbrains.kotlinx.dataframe.DataColumn<$functionName.EyeColor?>
649+
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet?>.eye_color: $functionName.EyeColor? @JvmName("NullablePet_eye_color") get() = this["eye_color"] as $functionName.EyeColor?
653650
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet>.name: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String> @JvmName("Pet_name") get() = this["name"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String>
654651
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet>.name: kotlin.String @JvmName("Pet_name") get() = this["name"] as kotlin.String
655652
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet?>.name: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?> @JvmName("NullablePet_name") get() = this["name"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?>
@@ -658,10 +655,10 @@ class OpenApiTests : JupyterReplTestCase() {
658655
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet>.other: kotlin.Any? @JvmName("Pet_other") get() = this["other"] as kotlin.Any?
659656
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet?>.other: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.Any?> @JvmName("NullablePet_other") get() = this["other"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.Any?>
660657
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet?>.other: kotlin.Any? @JvmName("NullablePet_other") get() = this["other"] as kotlin.Any?
661-
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet>.petType: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String> @JvmName("Pet_petType") get() = this["pet_type"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String>
662-
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet>.petType: kotlin.String @JvmName("Pet_petType") get() = this["pet_type"] as kotlin.String
663-
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet?>.petType: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?> @JvmName("NullablePet_petType") get() = this["pet_type"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?>
664-
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet?>.petType: kotlin.String? @JvmName("NullablePet_petType") get() = this["pet_type"] as kotlin.String?
658+
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet>.pet_type: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String> @JvmName("Pet_pet_type") get() = this["pet_type"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String>
659+
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet>.pet_type: kotlin.String @JvmName("Pet_pet_type") get() = this["pet_type"] as kotlin.String
660+
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet?>.pet_type: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?> @JvmName("NullablePet_pet_type") get() = this["pet_type"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?>
661+
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet?>.pet_type: kotlin.String? @JvmName("NullablePet_pet_type") get() = this["pet_type"] as kotlin.String?
665662
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet>.tag: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?> @JvmName("Pet_tag") get() = this["tag"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?>
666663
val org.jetbrains.kotlinx.dataframe.DataRow<$functionName.Pet>.tag: kotlin.String? @JvmName("Pet_tag") get() = this["tag"] as kotlin.String?
667664
val org.jetbrains.kotlinx.dataframe.ColumnsContainer<$functionName.Pet?>.tag: org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?> @JvmName("NullablePet_tag") get() = this["tag"] as org.jetbrains.kotlinx.dataframe.DataColumn<kotlin.String?>
@@ -1025,13 +1022,13 @@ class OpenApiTests : JupyterReplTestCase() {
10251022

10261023
@Language("kt")
10271024
val res1 = execRaw(
1028-
"$functionName.Pet.readJsonStr(\"\"\"$advancedData\"\"\").filter { petType == \"Cat\" }.convertTo<$functionName.Cat>(ExcessiveColumns.Remove)",
1025+
"$functionName.Pet.readJsonStr(\"\"\"$advancedData\"\"\").filter { pet_type == \"Cat\" }.convertTo<$functionName.Cat>(ExcessiveColumns.Remove)",
10291026
) as AnyFrame
10301027
val res1Schema = res1.schema()
10311028

10321029
@Language("kts")
10331030
val res2 = execRaw(
1034-
"$functionName.Pet.readJsonStr(\"\"\"$advancedData\"\"\").filter { petType == \"Dog\" }.convertTo<$functionName.Dog>(ExcessiveColumns.Remove)",
1031+
"$functionName.Pet.readJsonStr(\"\"\"$advancedData\"\"\").filter { pet_type == \"Dog\" }.convertTo<$functionName.Dog>(ExcessiveColumns.Remove)",
10351032
) as AnyFrame
10361033
val res2Schema = res2.schema()
10371034

docs/StardustDocs/resources/api/pivot/pivotInward_properties.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@
459459
/*<!--*/
460460
call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: "<span title=\"true: api.FormattedFrame<Any?>\" style=\"color:#f44336;font-family:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\">true</span>", children: [], rightAlign: false, values: [{ frameId: 1, value: "<b>DataFrame 5 x 5</b>" }] },
461461
{ name: "<span title=\"false: api.FormattedFrame<Any?>\" style=\"color:#f44336;font-family:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\">false</span>", children: [], rightAlign: false, values: [{ frameId: 2, value: "<b>DataFrame 5 x 5</b>" }] },
462-
{ name: "<span title=\"isHappy: DataRow<*>\" style=\"color:#f44336;font-family:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\">isHappy</span>", children: [0, 1], rightAlign: false, values: ["<span class=\"formatted\" title=\"true: org.jetbrains.kotlinx.dataframe.api.FormattedFrame@3c28e5b6\nfalse: org.jetbrains.kotlinx.dataframe.api.FormattedFrame@44bc2449\"><span class=\"structural\">{ </span><span class=\"structural\">true: </span>org.jetbrains.kotlinx<span class=\"structural\">...</span><span class=\"structural\">, </span><span class=\"structural\">f...</span><span class=\"structural\"> }</span></span>"] },
462+
{ name: "<span title=\"isHappy: DataRow<*>\" style=\"color:#f44336;font-family:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\">isHappy</span>", children: [0, 1], rightAlign: false, values: ["<span class=\"formatted\" title=\"true: org.jetbrains.kotlinx.dataframe.api.FormattedFrame@44bc2449\nfalse: org.jetbrains.kotlinx.dataframe.api.FormattedFrame@46a123e4\"><span class=\"structural\">{ </span><span class=\"structural\">true: </span>org.jetbrains.kotlinx<span class=\"structural\">...</span><span class=\"structural\">, </span><span class=\"structural\">f...</span><span class=\"structural\"> }</span></span>"] },
463463
], id: 0, rootId: 0, totalRows: 1 } ) });
464464
/*-->*/
465465

docs/StardustDocs/topics/guides/quickstart.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ a special method that returns a string with a schema of a receiver `DataFrame`:
257257
<!---FUN dfGenerateInterfaces-->
258258

259259
```kotlin
260-
df.generateInterfaces("Repository", nameNormalizer = NameNormalizer.id()).print()
260+
df.generateInterfaces("Repository").print()
261261
```
262262

263263
Output:

0 commit comments

Comments
 (0)