Skip to content

migration from kotlinx.datetime.Instant -> kotlin.time.Instant #1368

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,12 @@ allprojects {
options.release.set(8)
}
}
tasks.withType<KotlinCompile> {
compilerOptions {
// enables support for kotlin.time.Instant as kotlinx.datetime.Instant was deprecated
optIn.add("kotlin.time.ExperimentalTime")
}
}

// Attempts to configure ktlint for each sub-project that uses the plugin
afterEvaluate {
Expand Down
3 changes: 3 additions & 0 deletions core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ dependencies {
implementation(libs.fastDoubleParser)

api(libs.kotlin.datetimeJvm)
// don't export xxx-0.6.x-compat
implementation(libs.kotlin.datetimeJvm.compat)

implementation(libs.kotlinpoet)
implementation(libs.sl4j)
implementation(libs.kotlinLogging)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.jetbrains.kotlinx.dataframe.api

import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.LocalTime
Expand Down Expand Up @@ -64,6 +63,8 @@ import kotlin.reflect.KProperty
import kotlin.reflect.KType
import kotlin.reflect.full.isSubtypeOf
import kotlin.reflect.typeOf
import kotlin.time.Instant
import kotlinx.datetime.Instant as DeprecatedInstant

/**
* See also [parse] — a specialized form of the [convert] operation that parses [String] columns
Expand Down Expand Up @@ -118,7 +119,7 @@ internal interface ConvertDocs {
* * [Byte], [Short], [Char];
* * [Int], [Long], [Float], [Double];
* * [BigDecimal], [BigInteger];
* * [LocalDateTime], [LocalDate], [LocalTime], [Instant] ( (kotlinx.datetime and [java.time]),
* * [LocalDateTime], [LocalDate], [LocalTime], [Instant] ([kotlinx.datetime][DeprecatedInstant], [kotlin.time][Instant] and [java.time][java.time.Instant]),
* * [URL], [IMG], [IFRAME].
*/
interface SupportedTypes
Expand Down Expand Up @@ -322,7 +323,8 @@ public inline fun <T, C, reified R> Convert<T, C?>.notNull(
* - [asFrame][Convert.asFrame] – converts [column groups][ColumnGroup] as a [DataFrame] with the given expression.
* - [toStr], [toInt], [toLong], [toDouble], [toFloat], [toBigDecimal],
* [toBigInteger], [toBoolean] – convert to standard types.
* - [toLocalDateTime], [toLocalDate], [toLocalTime], [toInstant] – convert to kotlinx.datetime types.
* - [toLocalDateTime], [toLocalDate], [toLocalTime] – convert to kotlinx.datetime types.
* - [toInstant] – convert to kotlin.time.Instant.
* - [toUrl], [toIFrame], [toImg] – convert to special types.
* - [toDataFrames] – converts a column of lists into separate DataFrames.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
package org.jetbrains.kotlinx.dataframe.impl.api

import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.LocalTime
import kotlinx.datetime.TimeZone
import kotlinx.datetime.atStartOfDayIn
import kotlinx.datetime.atTime
import kotlinx.datetime.toDeprecatedInstant
import kotlinx.datetime.toInstant
import kotlinx.datetime.toJavaInstant
import kotlinx.datetime.toJavaLocalDate
import kotlinx.datetime.toJavaLocalDateTime
import kotlinx.datetime.toJavaLocalTime
import kotlinx.datetime.toKotlinInstant
import kotlinx.datetime.toKotlinLocalDate
import kotlinx.datetime.toKotlinLocalDateTime
import kotlinx.datetime.toKotlinLocalTime
import kotlinx.datetime.toLocalDateTime
import kotlinx.datetime.toStdlibInstant
import org.jetbrains.kotlinx.dataframe.AnyCol
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataFrame
Expand Down Expand Up @@ -57,13 +56,17 @@ import kotlin.reflect.full.withNullability
import kotlin.reflect.jvm.jvmErasure
import kotlin.reflect.typeOf
import kotlin.text.trim
import kotlin.time.Instant
import kotlin.time.toJavaInstant
import kotlin.time.toKotlinInstant
import kotlin.toBigDecimal
import java.time.Instant as JavaInstant
import java.time.LocalDate as JavaLocalDate
import java.time.LocalDateTime as JavaLocalDateTime
import java.time.LocalTime as JavaLocalTime
import kotlin.toBigDecimal as toBigDecimalKotlin
import kotlin.toBigInteger as toBigIntegerKotlin
import kotlinx.datetime.Instant as DeprecatedInstant

@PublishedApi
internal fun <T, C, R> Convert<T, C>.withRowCellImpl(
Expand Down Expand Up @@ -398,6 +401,9 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n

Instant::class -> convert<Int> { Instant.fromEpochMilliseconds(it.toLong()) }

// #1350
DeprecatedInstant::class -> convert<Int> { DeprecatedInstant.fromEpochMilliseconds(it.toLong()) }

JavaLocalDateTime::class -> convert<Int> {
it.toLong().toLocalDateTime(defaultTimeZone).toJavaLocalDateTime()
}
Expand Down Expand Up @@ -436,6 +442,9 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n

Instant::class -> convert<Byte> { Instant.fromEpochMilliseconds(it.toLong()) }

// #1350
DeprecatedInstant::class -> convert<Byte> { DeprecatedInstant.fromEpochMilliseconds(it.toLong()) }

JavaLocalDateTime::class -> convert<Byte> {
it.toLong().toLocalDateTime(defaultTimeZone).toJavaLocalDateTime()
}
Expand Down Expand Up @@ -474,6 +483,9 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n

Instant::class -> convert<Short> { Instant.fromEpochMilliseconds(it.toLong()) }

// #1350
DeprecatedInstant::class -> convert<Short> { DeprecatedInstant.fromEpochMilliseconds(it.toLong()) }

JavaLocalDateTime::class -> convert<Short> {
it.toLong().toLocalDateTime(defaultTimeZone).toJavaLocalDateTime()
}
Expand Down Expand Up @@ -524,6 +536,9 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n

Instant::class -> convert<Long> { Instant.fromEpochMilliseconds(it) }

// #1350
DeprecatedInstant::class -> convert<Long> { DeprecatedInstant.fromEpochMilliseconds(it) }

JavaLocalDateTime::class -> convert<Long> {
it.toLocalDateTime(defaultTimeZone).toJavaLocalDateTime()
}
Expand Down Expand Up @@ -556,6 +571,40 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n

JavaLocalTime::class -> convert<Instant> { it.toLocalTime(defaultTimeZone).toJavaLocalTime() }

// #1350
DeprecatedInstant::class -> convert<Instant> { it.toDeprecatedInstant() }

else -> null
}

// #1350
DeprecatedInstant::class -> when (toClass) {
Long::class -> convert<DeprecatedInstant> { it.toStdlibInstant().toEpochMilliseconds() }

LocalDateTime::class -> convert<DeprecatedInstant> {
it.toStdlibInstant().toLocalDateTime(defaultTimeZone)
}

LocalDate::class -> convert<DeprecatedInstant> { it.toStdlibInstant().toLocalDate(defaultTimeZone) }

LocalTime::class -> convert<DeprecatedInstant> { it.toStdlibInstant().toLocalTime(defaultTimeZone) }

JavaLocalDateTime::class -> convert<DeprecatedInstant> {
it.toStdlibInstant().toLocalDateTime(defaultTimeZone).toJavaLocalDateTime()
}

JavaLocalDate::class -> convert<DeprecatedInstant> {
it.toStdlibInstant().toLocalDate(defaultTimeZone).toJavaLocalDate()
}

JavaInstant::class -> convert<DeprecatedInstant> { it.toStdlibInstant().toJavaInstant() }

JavaLocalTime::class -> convert<DeprecatedInstant> {
it.toStdlibInstant().toLocalTime(defaultTimeZone).toJavaLocalTime()
}

Instant::class -> convert<DeprecatedInstant> { it.toStdlibInstant() }

else -> null
}

Expand Down Expand Up @@ -584,6 +633,11 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n
it.toKotlinInstant().toLocalTime(defaultTimeZone).toJavaLocalTime()
}

// #1350
DeprecatedInstant::class -> convert<JavaInstant> {
it.toKotlinInstant().toDeprecatedInstant()
}

else -> null
}

Expand Down Expand Up @@ -625,13 +679,26 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n

LocalDateTime::class -> when (toClass) {
LocalDate::class -> convert<LocalDateTime> { it.date }

LocalTime::class -> convert<LocalDateTime> { it.time }

Instant::class -> convert<LocalDateTime> { it.toInstant(defaultTimeZone) }

// #1350
DeprecatedInstant::class -> convert<LocalDateTime> {
it.toInstant(defaultTimeZone).toDeprecatedInstant()
}

Long::class -> convert<LocalDateTime> { it.toInstant(defaultTimeZone).toEpochMilliseconds() }

JavaLocalDateTime::class -> convert<LocalDateTime> { it.toJavaLocalDateTime() }

JavaLocalDate::class -> convert<LocalDateTime> { it.date.toJavaLocalDate() }

JavaLocalTime::class -> convert<LocalDateTime> { it.toJavaLocalDateTime().toLocalTime() }

JavaInstant::class -> convert<LocalDateTime> { it.toInstant(defaultTimeZone).toJavaInstant() }

else -> null
}

Expand All @@ -646,6 +713,11 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n
it.toKotlinLocalDateTime().toInstant(defaultTimeZone)
}

// #1350
DeprecatedInstant::class -> convert<JavaLocalDateTime> {
it.toKotlinLocalDateTime().toInstant(defaultTimeZone).toDeprecatedInstant()
}

Long::class -> convert<JavaLocalDateTime> {
it.toKotlinLocalDateTime().toInstant(defaultTimeZone).toEpochMilliseconds()
}
Expand All @@ -663,11 +735,22 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n

LocalDate::class -> when (toClass) {
LocalDateTime::class -> convert<LocalDate> { it.atTime(0, 0) }

Instant::class -> convert<LocalDate> { it.atStartOfDayIn(defaultTimeZone) }

// #1350
DeprecatedInstant::class -> convert<LocalDate> {
it.atStartOfDayIn(defaultTimeZone).toDeprecatedInstant()
}

Long::class -> convert<LocalDate> { it.atStartOfDayIn(defaultTimeZone).toEpochMilliseconds() }

JavaLocalDate::class -> convert<LocalDate> { it.toJavaLocalDate() }

JavaLocalDateTime::class -> convert<LocalDate> { it.atTime(0, 0).toJavaLocalDateTime() }

JavaInstant::class -> convert<LocalDate> { it.atStartOfDayIn(defaultTimeZone).toJavaInstant() }

else -> null
}

Expand All @@ -680,6 +763,11 @@ internal fun createConverter(from: KType, to: KType, options: ParserOptions? = n
it.toKotlinLocalDate().atStartOfDayIn(defaultTimeZone)
}

// #1350
DeprecatedInstant::class -> convert<JavaLocalDate> {
it.toKotlinLocalDate().atStartOfDayIn(defaultTimeZone).toDeprecatedInstant()
}

Long::class -> convert<JavaLocalDate> {
it.toKotlinLocalDate().atStartOfDayIn(defaultTimeZone).toEpochMilliseconds()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package org.jetbrains.kotlinx.dataframe.impl.api

import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.LocalTime
import kotlinx.datetime.format.DateTimeComponents
import kotlinx.datetime.toKotlinInstant
import kotlinx.datetime.toKotlinLocalDate
import kotlinx.datetime.toKotlinLocalDateTime
import kotlinx.datetime.toKotlinLocalTime
Expand Down Expand Up @@ -56,6 +54,8 @@ import kotlin.reflect.full.withNullability
import kotlin.reflect.jvm.jvmErasure
import kotlin.reflect.typeOf
import kotlin.time.Duration
import kotlin.time.Instant
import kotlin.time.toKotlinInstant
import kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid
import java.time.Duration as JavaDuration
Expand Down Expand Up @@ -439,11 +439,11 @@ internal object Parsers : GlobalParserOptions {
stringParser<Int> { it.toIntOrNull() },
// Long
stringParser<Long> { it.toLongOrNull() },
// kotlinx.datetime.Instant
// kotlin.time.Instant
stringParser<Instant> {
it.toInstantOrNull()
},
// java.time.Instant, will be skipped if kotlinx.datetime.Instant is already checked
// java.time.Instant, will be skipped if kotlin.time.Instant is already checked
stringParser<JavaInstant>(coveredBy = setOf(typeOf<Instant>())) {
it.toJavaInstantOrNull()
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ private val valueTypes = setOf(
kotlin.time.Duration::class,
kotlinx.datetime.LocalDate::class,
kotlinx.datetime.LocalDateTime::class,
kotlinx.datetime.Instant::class,
kotlinx.datetime.Instant::class, // #1350
kotlin.time.Instant::class,
kotlinx.datetime.TimeZone::class,
kotlinx.datetime.DateTimePeriod::class,
kotlinx.datetime.DateTimeUnit::class,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.jetbrains.kotlinx.dataframe.io

import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.LocalTime
Expand All @@ -16,6 +15,7 @@ import org.jetbrains.kotlinx.dataframe.codeGen.DefaultReadCsvMethod
import org.jetbrains.kotlinx.dataframe.codeGen.DefaultReadDfMethod
import org.jetbrains.kotlinx.dataframe.impl.api.parse
import org.jetbrains.kotlinx.dataframe.impl.io.readDelimImpl
import org.jetbrains.kotlinx.dataframe.io.ColType.String
import org.jetbrains.kotlinx.dataframe.util.APACHE_CSV
import org.jetbrains.kotlinx.dataframe.util.AS_URL
import org.jetbrains.kotlinx.dataframe.util.AS_URL_IMPORT
Expand Down Expand Up @@ -59,6 +59,7 @@ import kotlin.reflect.KClass
import kotlin.reflect.KType
import kotlin.reflect.typeOf
import kotlin.time.Duration
import kotlin.time.Instant

@Deprecated(message = APACHE_CSV, level = DeprecationLevel.WARNING)
public class CSV(private val delimiter: Char = ',') : SupportedDataFrameFormat {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,12 @@ import io.kotest.matchers.should
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.LocalTime
import kotlinx.datetime.Month
import kotlinx.datetime.format.DateTimeComponents
import kotlinx.datetime.plus
import kotlinx.datetime.toJavaInstant
import kotlinx.datetime.toKotlinInstant
import org.jetbrains.kotlinx.dataframe.DataFrame
import org.jetbrains.kotlinx.dataframe.impl.api.Parsers
import org.jetbrains.kotlinx.dataframe.impl.catchSilent
Expand All @@ -29,6 +26,9 @@ import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.nanoseconds
import kotlin.time.Duration.Companion.seconds
import kotlin.time.Instant
import kotlin.time.toJavaInstant
import kotlin.time.toKotlinInstant
import kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid
import java.time.Duration as JavaDuration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ internal class ArrowWriterImpl(
is DateDayVector ->
column.convertToLocalDate()
.forEachIndexed { i, value ->
value?.also { vector.set(i, value.toEpochDays()) }
value?.also { vector.set(i, value.toEpochDays().toInt()) }
?: vector.setNull(i)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.UtcOffset
import kotlinx.datetime.toInstant
import kotlinx.datetime.toJavaInstant
import org.apache.arrow.memory.RootAllocator
import org.apache.arrow.vector.TimeStampMicroVector
import org.apache.arrow.vector.TimeStampMilliVector
Expand Down Expand Up @@ -55,6 +54,7 @@ import java.nio.file.FileSystems
import java.sql.DriverManager
import java.util.Locale
import kotlin.reflect.typeOf
import kotlin.time.toJavaInstant

internal class ArrowKtTest {

Expand Down
Loading