Skip to content

Commit f36912c

Browse files
authored
Merge pull request #521 from Kotlin/linter-for-all-modules
Linter for all modules
2 parents b3f3331 + d50002b commit f36912c

File tree

36 files changed

+919
-529
lines changed

36 files changed

+919
-529
lines changed

build.gradle.kts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2+
import org.jetbrains.kotlin.tooling.core.closure
23
import org.jetbrains.kotlinx.publisher.apache2
34
import org.jetbrains.kotlinx.publisher.developer
45
import org.jetbrains.kotlinx.publisher.githubRepo
6+
import org.jmailen.gradle.kotlinter.KotlinterExtension
57

68
@Suppress("DSL_SCOPE_VIOLATION", "UnstableApiUsage")
79
plugins {
@@ -51,6 +53,31 @@ allprojects {
5153
sourceCompatibility = JavaVersion.VERSION_1_8.toString()
5254
targetCompatibility = JavaVersion.VERSION_1_8.toString()
5355
}
56+
57+
// Attempts to configure kotlinter for each sub-project that uses the plugin
58+
afterEvaluate {
59+
try {
60+
kotlinter {
61+
ignoreFailures = false
62+
reporters = arrayOf("checkstyle", "plain")
63+
experimentalRules = true
64+
disabledRules = arrayOf(
65+
"no-wildcard-imports",
66+
"experimental:spacing-between-declarations-with-annotations",
67+
"experimental:enum-entry-name-case",
68+
"experimental:argument-list-wrapping",
69+
"experimental:annotation",
70+
"max-line-length",
71+
"filename",
72+
"comment-spacing",
73+
"curly-spacing",
74+
"experimental:annotation-spacing"
75+
)
76+
}
77+
} catch (_: UnknownDomainObjectException) {
78+
logger.warn("Could not set kotlinter config on :${this.name}")
79+
}
80+
}
5481
}
5582

5683
koverMerged {

core/build.gradle.kts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -298,24 +298,6 @@ korro {
298298
}
299299
}
300300

301-
kotlinter {
302-
ignoreFailures = false
303-
reporters = arrayOf("checkstyle", "plain")
304-
experimentalRules = true
305-
disabledRules = arrayOf(
306-
"no-wildcard-imports",
307-
"experimental:spacing-between-declarations-with-annotations",
308-
"experimental:enum-entry-name-case",
309-
"experimental:argument-list-wrapping",
310-
"experimental:annotation",
311-
"max-line-length",
312-
"filename",
313-
"comment-spacing",
314-
"curly-spacing",
315-
"experimental:annotation-spacing"
316-
)
317-
}
318-
319301
tasks.withType<KspTaskJvm> {
320302
dependsOn(tasks.generateKeywordsSrc)
321303
}

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/JupyterHtmlRenderer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ internal inline fun <reified T : Any> JupyterHtmlRenderer.render(
5050
includeCss = true,
5151
).plus(
5252
df.toHTML(
53-
configuration = reifiedDisplayConfiguration,
53+
// is added later to make sure it's put outside of potential iFrames
54+
configuration = reifiedDisplayConfiguration.copy(enableFallbackStaticTables = false),
5455
cellRenderer = contextRenderer,
55-
includeStatic = false, // is added later to make sure it's put outside of potential iFrames
5656
) { footer }
5757
).toJupyterHtmlData()
5858

dataframe-arrow/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ plugins {
22
kotlin("jvm")
33
kotlin("libs.publisher")
44
id("org.jetbrains.kotlinx.kover")
5+
id("org.jmailen.kotlinter")
56
}
67

78
group = "org.jetbrains.kotlinx"

dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/ArrowWriterImpl.kt

Lines changed: 139 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ import org.jetbrains.kotlinx.dataframe.exceptions.CellConversionException
5454
import org.jetbrains.kotlinx.dataframe.exceptions.TypeConverterNotFoundException
5555
import org.jetbrains.kotlinx.dataframe.name
5656
import org.jetbrains.kotlinx.dataframe.values
57-
import java.nio.charset.Charset
5857
import kotlin.reflect.full.isSubtypeOf
5958
import kotlin.reflect.typeOf
6059

@@ -85,15 +84,21 @@ internal class ArrowWriterImpl(
8584
private fun countTotalBytes(column: AnyCol): Long? {
8685
val columnType = column.type()
8786
return when {
88-
columnType.isSubtypeOf(typeOf<String?>()) -> column.values.fold(0L) {totalBytes, value -> totalBytes + value.toString().length * 4}
87+
columnType.isSubtypeOf(typeOf<String?>()) -> column.values.fold(0L) { totalBytes, value -> totalBytes + value.toString().length * 4 }
8988
else -> null
9089
}
9190
}
9291

9392
private fun infillWithNulls(vector: FieldVector, size: Int) {
9493
when (vector) {
95-
is BaseFixedWidthVector -> for (i in 0 until size) { vector.setNull(i) }
96-
is BaseVariableWidthVector -> for (i in 0 until size) { vector.setNull(i) }
94+
is BaseFixedWidthVector -> for (i in 0 until size) {
95+
vector.setNull(i)
96+
}
97+
98+
is BaseVariableWidthVector -> for (i in 0 until size) {
99+
vector.setNull(i)
100+
}
101+
97102
else -> throw IllegalArgumentException("Can not infill ${vector.javaClass.canonicalName}")
98103
}
99104
vector.valueCount = size
@@ -110,7 +115,8 @@ internal class ArrowWriterImpl(
110115
ArrowType.Int(32, true) -> column.convertToInt()
111116
ArrowType.Int(64, true) -> column.convertToLong()
112117
is ArrowType.Decimal -> column.convertToBigDecimal()
113-
ArrowType.FloatingPoint(FloatingPointPrecision.SINGLE) -> column.convertToDouble().convertToFloat() // Use [convertToDouble] as locale logic step
118+
ArrowType.FloatingPoint(FloatingPointPrecision.SINGLE) -> column.convertToDouble()
119+
.convertToFloat() // Use [convertToDouble] as locale logic step
114120
ArrowType.FloatingPoint(FloatingPointPrecision.DOUBLE) -> column.convertToDouble()
115121
ArrowType.Date(DateUnit.DAY) -> column.convertToLocalDate()
116122
ArrowType.Date(DateUnit.MILLISECOND) -> column.convertToLocalDateTime()
@@ -123,25 +129,108 @@ internal class ArrowWriterImpl(
123129

124130
private fun infillVector(vector: FieldVector, column: AnyCol) {
125131
when (vector) {
126-
is VarCharVector -> column.convertToString().forEachIndexed { i, value -> value?.let { vector.set(i, Text(value)); value } ?: vector.setNull(i) }
127-
is LargeVarCharVector -> column.convertToString().forEachIndexed { i, value -> value?.let { vector.set(i, Text(value)); value } ?: vector.setNull(i) }
128-
is BitVector -> column.convertToBoolean().forEachIndexed { i, value -> value?.let { vector.set(i, value.compareTo(false)); value } ?: vector.setNull(i) }
129-
is TinyIntVector -> column.convertToInt().forEachIndexed { i, value -> value?.let { vector.set(i, value); value } ?: vector.setNull(i) }
130-
is SmallIntVector -> column.convertToInt().forEachIndexed { i, value -> value?.let { vector.set(i, value); value } ?: vector.setNull(i) }
131-
is IntVector -> column.convertToInt().forEachIndexed { i, value -> value?.let { vector.set(i, value); value } ?: vector.setNull(i) }
132-
is BigIntVector -> column.convertToLong().forEachIndexed { i, value -> value?.let { vector.set(i, value); value } ?: vector.setNull(i) }
133-
is DecimalVector -> column.convertToBigDecimal().forEachIndexed { i, value -> value?.let { vector.set(i, value); value } ?: vector.setNull(i) }
134-
is Decimal256Vector -> column.convertToBigDecimal().forEachIndexed { i, value -> value?.let { vector.set(i, value); value } ?: vector.setNull(i) }
135-
is Float8Vector -> column.convertToDouble().forEachIndexed { i, value -> value?.let { vector.set(i, value); value } ?: vector.setNull(i) }
136-
is Float4Vector -> column.convertToFloat().forEachIndexed { i, value -> value?.let { vector.set(i, value); value } ?: vector.setNull(i) }
137-
138-
is DateDayVector -> column.convertToLocalDate().forEachIndexed { i, value -> value?.let { vector.set(i, (value.toJavaLocalDate().toEpochDay()).toInt()); value } ?: vector.setNull(i) }
139-
is DateMilliVector -> column.convertToLocalDateTime().forEachIndexed { i, value -> value?.let { vector.set(i, value.toInstant(
140-
TimeZone.UTC).toEpochMilliseconds()); value } ?: vector.setNull(i) }
141-
is TimeNanoVector -> column.convertToLocalTime().forEachIndexed { i, value -> value?.let { vector.set(i, value.toNanoOfDay()); value } ?: vector.setNull(i) }
142-
is TimeMicroVector -> column.convertToLocalTime().forEachIndexed { i, value -> value?.let { vector.set(i, value.toNanoOfDay() / 1000); value } ?: vector.setNull(i) }
143-
is TimeMilliVector -> column.convertToLocalTime().forEachIndexed { i, value -> value?.let { vector.set(i, (value.toNanoOfDay() / 1000 / 1000).toInt()); value } ?: vector.setNull(i) }
144-
is TimeSecVector -> column.convertToLocalTime().forEachIndexed { i, value -> value?.let { vector.set(i, (value.toNanoOfDay() / 1000 / 1000 / 1000).toInt()); value } ?: vector.setNull(i) }
132+
is VarCharVector -> column.convertToString()
133+
.forEachIndexed { i, value ->
134+
value?.also { vector.set(i, Text(value)) }
135+
?: vector.setNull(i)
136+
}
137+
138+
is LargeVarCharVector -> column.convertToString()
139+
.forEachIndexed { i, value ->
140+
value?.also { vector.set(i, Text(value)) }
141+
?: vector.setNull(i)
142+
}
143+
144+
is BitVector -> column.convertToBoolean()
145+
.forEachIndexed { i, value ->
146+
value?.also { vector.set(i, value.compareTo(false)) }
147+
?: vector.setNull(i)
148+
}
149+
150+
is TinyIntVector -> column.convertToInt()
151+
.forEachIndexed { i, value ->
152+
value?.also { vector.set(i, value) }
153+
?: vector.setNull(i)
154+
}
155+
156+
is SmallIntVector -> column.convertToInt()
157+
.forEachIndexed { i, value ->
158+
value?.also { vector.set(i, value) }
159+
?: vector.setNull(i)
160+
}
161+
162+
is IntVector -> column.convertToInt()
163+
.forEachIndexed { i, value ->
164+
value?.also { vector.set(i, value) }
165+
?: vector.setNull(i)
166+
}
167+
168+
is BigIntVector -> column.convertToLong()
169+
.forEachIndexed { i, value ->
170+
value?.also { vector.set(i, value) }
171+
?: vector.setNull(i)
172+
}
173+
174+
is DecimalVector -> column.convertToBigDecimal()
175+
.forEachIndexed { i, value ->
176+
value?.also { vector.set(i, value) }
177+
?: vector.setNull(i)
178+
}
179+
180+
is Decimal256Vector -> column.convertToBigDecimal()
181+
.forEachIndexed { i, value ->
182+
value?.also { vector.set(i, value) }
183+
?: vector.setNull(i)
184+
}
185+
186+
is Float8Vector -> column.convertToDouble()
187+
.forEachIndexed { i, value ->
188+
value?.also { vector.set(i, value) }
189+
?: vector.setNull(i)
190+
}
191+
192+
is Float4Vector -> column.convertToFloat()
193+
.forEachIndexed { i, value ->
194+
value?.also { vector.set(i, value) }
195+
?: vector.setNull(i)
196+
}
197+
198+
is DateDayVector -> column.convertToLocalDate()
199+
.forEachIndexed { i, value ->
200+
value?.also { vector.set(i, value.toJavaLocalDate().toEpochDay().toInt()) }
201+
?: vector.setNull(i)
202+
}
203+
204+
is DateMilliVector -> column.convertToLocalDateTime()
205+
.forEachIndexed { i, value ->
206+
value?.also { vector.set(i, value.toInstant(TimeZone.UTC).toEpochMilliseconds()) }
207+
?: vector.setNull(i)
208+
}
209+
210+
is TimeNanoVector -> column.convertToLocalTime()
211+
.forEachIndexed { i, value ->
212+
value?.also { vector.set(i, value.toNanoOfDay()) }
213+
?: vector.setNull(i)
214+
}
215+
216+
is TimeMicroVector -> column.convertToLocalTime()
217+
.forEachIndexed { i, value ->
218+
value?.also { vector.set(i, value.toNanoOfDay() / 1000) }
219+
?: vector.setNull(i)
220+
}
221+
222+
is TimeMilliVector -> column.convertToLocalTime()
223+
.forEachIndexed { i, value ->
224+
value?.also { vector.set(i, (value.toNanoOfDay() / 1000 / 1000).toInt()) }
225+
?: vector.setNull(i)
226+
}
227+
228+
is TimeSecVector -> column.convertToLocalTime()
229+
.forEachIndexed { i, value ->
230+
value?.also { vector.set(i, (value.toNanoOfDay() / 1000 / 1000 / 1000).toInt()) }
231+
?: vector.setNull(i)
232+
}
233+
145234
else -> {
146235
// TODO implement other vector types from [readField] (VarBinaryVector, UIntVector, DurationVector, StructVector) and may be others (ListVector, FixedSizeListVector etc)
147236
throw NotImplementedError("Saving to ${vector.javaClass.canonicalName} is currently not implemented")
@@ -154,7 +243,12 @@ internal class ArrowWriterImpl(
154243
/**
155244
* Create Arrow FieldVector with [column] content cast to [field] type according to [strictType] and [strictNullable] settings.
156245
*/
157-
private fun allocateVectorAndInfill(field: Field, column: AnyCol?, strictType: Boolean, strictNullable: Boolean): FieldVector {
246+
private fun allocateVectorAndInfill(
247+
field: Field,
248+
column: AnyCol?,
249+
strictType: Boolean,
250+
strictNullable: Boolean,
251+
): FieldVector {
158252
val containNulls = (column == null || column.hasNulls())
159253
// Convert the column to type specified in field. (If we already have target type, convertTo will do nothing)
160254

@@ -163,12 +257,19 @@ internal class ArrowWriterImpl(
163257
} catch (e: CellConversionException) {
164258
if (strictType) {
165259
// If conversion failed but strictType is enabled, throw the exception
166-
val mismatch = ConvertingMismatch.TypeConversionFail.ConversionFailError(e.column?.name() ?: "", e.row, e)
260+
val mismatch =
261+
ConvertingMismatch.TypeConversionFail.ConversionFailError(e.column?.name() ?: "", e.row, e)
167262
mismatchSubscriber(mismatch)
168263
throw ConvertingException(mismatch)
169264
} else {
170265
// If strictType is not enabled, use original data with its type. Target nullable is saved at this step.
171-
mismatchSubscriber(ConvertingMismatch.TypeConversionFail.ConversionFailIgnored(e.column?.name() ?: "", e.row, e))
266+
mismatchSubscriber(
267+
ConvertingMismatch.TypeConversionFail.ConversionFailIgnored(
268+
e.column?.name() ?: "",
269+
e.row,
270+
e
271+
)
272+
)
172273
column to column!!.toArrowField(mismatchSubscriber)
173274
}
174275
} catch (e: TypeConverterNotFoundException) {
@@ -197,8 +298,17 @@ internal class ArrowWriterImpl(
197298
mismatchSubscriber(mismatch)
198299
throw ConvertingException(mismatch)
199300
} else {
200-
mismatchSubscriber(ConvertingMismatch.NullableMismatch.NullValueIgnored(actualField.name, firstNullValue))
201-
Field(actualField.name, FieldType(true, actualField.fieldType.type, actualField.fieldType.dictionary), actualField.children).createVector(allocator)!!
301+
mismatchSubscriber(
302+
ConvertingMismatch.NullableMismatch.NullValueIgnored(
303+
actualField.name,
304+
firstNullValue
305+
)
306+
)
307+
Field(
308+
actualField.name,
309+
FieldType(true, actualField.fieldType.type, actualField.fieldType.dictionary),
310+
actualField.children
311+
).createVector(allocator)!!
202312
}
203313
} else {
204314
actualField.createVector(allocator)!!

0 commit comments

Comments
 (0)