From 62c72fd3dab6b812e56f0d7541759a7302970b5c Mon Sep 17 00:00:00 2001 From: Mauro Molin Date: Wed, 20 Aug 2025 23:41:00 +0100 Subject: [PATCH] Update dependencies and start using Kotlin stdlib's Instant Kotlinx datetime has removed the `Clock` and `Instant` classes since version 0.7.0 as they have been moved into the Kotlin standard library (see https://github.com/Kotlin/kotlinx-datetime?tab=readme-ov-file#deprecation-of-instant). This commit updates various dependencies in order to be able to use the new version of Kotlinx datetime and start using those classes from stdlib. Major dependency upgrades: - `kotlinx-datetime`: updated to latest 0.7.1 - `kotlinx-serialization`: needed as the latest version (1.9.0) contains serializers for the new stdlib `Instant` - `kotlin`: updated to 2.2.10 because the latest version of the serialization library requires Kotlin 2.2 Given that the new `Instant` and `Clock` classes require an experimental opt-in to be used, I've added it project-wide in the compiler options. Given I was updating dependencies, I've also taken the liberty to update other stuff like Dokka, Coroutines, Ktor and JUnit. --- build.gradle.kts | 3 ++- gradle/libs.versions.toml | 14 +++++++------- tmdb-api/build.gradle.kts | 5 +++-- .../app/moviebase/tmdb/core/DateTimeExtensions.kt | 7 ++----- .../moviebase/tmdb/core/TmdbInstantSerializer.kt | 5 ++--- .../app/moviebase/tmdb/model/Tmdb4AccountModel.kt | 2 +- .../tmdb/model/TmdbAuthenticationModel.kt | 2 +- .../app/moviebase/tmdb/model/TmdbChangesModel.kt | 2 +- .../app/moviebase/tmdb/model/TmdbListModel.kt | 2 +- .../app/moviebase/tmdb/model/TmdbMovieModel.kt | 2 +- .../app/moviebase/tmdb/model/TmdbReviewsModel.kt | 2 +- .../app/moviebase/tmdb/api/Tmdb4AccountApiTest.kt | 5 +++-- .../tmdb/api/TmdbAuthenticationApiTest.kt | 4 ++-- .../app/moviebase/tmdb/api/TmdbMoviesApiTest.kt | 4 ++-- 14 files changed, 29 insertions(+), 30 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index fa5b611..26a22f4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,7 +30,8 @@ allprojects { // Enable experimental coroutines APIs, including Flow freeCompilerArgs.addAll( "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-opt-in=kotlinx.coroutines.FlowPreview" + "-opt-in=kotlinx.coroutines.FlowPreview", + "-opt-in=kotlin.time.ExperimentalTime", ) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d7fd8a0..f9f6176 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] -kotlin = "2.0.21" +kotlin = "2.2.10" ben-manes-versions = "0.52.0" -dokka = "1.9.20" -kotlinx-datetime = "0.6.1" -kotlinx-serialization = "1.7.3" -coroutines = "1.9.0" -ktor = "3.0.1" -junit-jupiter = "5.11.3" +dokka = "2.0.0" +kotlinx-datetime = "0.7.1" +kotlinx-serialization = "1.9.0" +coroutines = "1.10.2" +ktor = "3.2.3" +junit-jupiter = "5.13.4" truth = "1.4.4" junit = "4.13.2" maven-publish = "0.34.0" diff --git a/tmdb-api/build.gradle.kts b/tmdb-api/build.gradle.kts index b8f2d07..b28f75b 100644 --- a/tmdb-api/build.gradle.kts +++ b/tmdb-api/build.gradle.kts @@ -1,5 +1,6 @@ import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { @@ -12,8 +13,8 @@ plugins { kotlin { jvm { - compilations.all { - kotlinOptions.jvmTarget = "17" + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) } } diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/core/DateTimeExtensions.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/core/DateTimeExtensions.kt index cd1ced3..94bfe59 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/core/DateTimeExtensions.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/core/DateTimeExtensions.kt @@ -1,15 +1,12 @@ package app.moviebase.tmdb.core -import kotlinx.datetime.Clock +import kotlin.time.Clock import kotlinx.datetime.DateTimeUnit import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDateTime import kotlinx.datetime.TimeZone import kotlinx.datetime.minus import kotlinx.datetime.plus -import kotlinx.datetime.toInstant -import kotlinx.datetime.toLocalDate -import kotlinx.datetime.toLocalDateTime import kotlinx.datetime.todayIn internal fun currentLocalDate(timeZone: TimeZone = TimeZone.UTC): LocalDate = Clock.System.todayIn(timeZone) @@ -19,7 +16,7 @@ internal fun LocalDate.plusWeeks(weeks: Int) = plus(weeks, DateTimeUnit.WEEK) internal fun LocalDate.minusWeeks(weeks: Int) = minus(weeks, DateTimeUnit.WEEK) internal fun String.tryLocalDate(): LocalDate? = try { - if (isBlank()) null else toLocalDate() + if (isBlank()) null else LocalDate.parse(this) } catch (t: Throwable) { null } diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/core/TmdbInstantSerializer.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/core/TmdbInstantSerializer.kt index d7e64c8..77ea6b0 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/core/TmdbInstantSerializer.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/core/TmdbInstantSerializer.kt @@ -1,7 +1,6 @@ package app.moviebase.tmdb.core -import kotlinx.datetime.Instant -import kotlinx.datetime.toInstant +import kotlin.time.Instant import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor @@ -21,7 +20,7 @@ internal class TmdbInstantSerializer : KSerializer { val string = decoder.decodeString() val splits = string.split(" ") val isoString = "${splits[0]}T${splits[1]}Z" - return isoString.toInstant() + return Instant.parse(isoString) } override fun serialize(encoder: Encoder, value: Instant) { diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/Tmdb4AccountModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/Tmdb4AccountModel.kt index 3f218c3..c832021 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/Tmdb4AccountModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/Tmdb4AccountModel.kt @@ -1,7 +1,7 @@ package app.moviebase.tmdb.model import app.moviebase.tmdb.core.TmdbInstantSerializer -import kotlinx.datetime.Instant +import kotlin.time.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbAuthenticationModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbAuthenticationModel.kt index 823bd04..908791f 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbAuthenticationModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbAuthenticationModel.kt @@ -1,7 +1,7 @@ package app.moviebase.tmdb.model import app.moviebase.tmdb.core.TmdbInstantSerializer -import kotlinx.datetime.Instant +import kotlin.time.Instant import kotlinx.datetime.LocalDateTime import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbChangesModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbChangesModel.kt index 73739e0..d084604 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbChangesModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbChangesModel.kt @@ -1,7 +1,7 @@ package app.moviebase.tmdb.model import app.moviebase.tmdb.core.TmdbInstantSerializer -import kotlinx.datetime.Instant +import kotlin.time.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbListModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbListModel.kt index e293c2f..b2988d3 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbListModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbListModel.kt @@ -1,7 +1,7 @@ package app.moviebase.tmdb.model import app.moviebase.tmdb.core.TmdbInstantSerializer -import kotlinx.datetime.Instant +import kotlin.time.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMovieModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMovieModel.kt index 2349015..fb7737e 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMovieModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMovieModel.kt @@ -2,7 +2,7 @@ package app.moviebase.tmdb.model import app.moviebase.tmdb.image.TmdbImage import app.moviebase.tmdb.core.LocalDateSerializer -import kotlinx.datetime.Instant +import kotlin.time.Instant import kotlinx.datetime.LocalDate import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbReviewsModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbReviewsModel.kt index d3aa20e..f10c14d 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbReviewsModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbReviewsModel.kt @@ -1,7 +1,7 @@ package app.moviebase.tmdb.model import app.moviebase.tmdb.core.TmdbInstantSerializer -import kotlinx.datetime.Instant +import kotlin.time.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/Tmdb4AccountApiTest.kt b/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/Tmdb4AccountApiTest.kt index e92fc55..ad89231 100644 --- a/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/Tmdb4AccountApiTest.kt +++ b/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/Tmdb4AccountApiTest.kt @@ -2,6 +2,7 @@ package app.moviebase.tmdb.api import app.moviebase.tmdb.core.mockHttpClient import com.google.common.truth.Truth.assertThat +import kotlin.time.Instant import kotlinx.coroutines.test.runTest import kotlinx.datetime.toInstant import org.junit.jupiter.api.Test @@ -28,7 +29,7 @@ class Tmdb4AccountApiTest { val result = results.results.first() assertThat(result.id).isEqualTo(44676) - assertThat(result.updatedAt).isEqualTo("2021-11-20T19:26:52Z".toInstant()) - assertThat(result.createdAt).isEqualTo("2018-01-08T18:03:08Z".toInstant()) + assertThat(result.updatedAt).isEqualTo(Instant.parse("2021-11-20T19:26:52Z")) + assertThat(result.createdAt).isEqualTo(Instant.parse("2018-01-08T18:03:08Z")) } } diff --git a/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbAuthenticationApiTest.kt b/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbAuthenticationApiTest.kt index 09f6fb7..e28abeb 100644 --- a/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbAuthenticationApiTest.kt +++ b/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbAuthenticationApiTest.kt @@ -2,9 +2,9 @@ package app.moviebase.tmdb.api import app.moviebase.tmdb.core.mockHttpClient import com.google.common.truth.Truth.assertThat +import kotlin.time.Instant import kotlinx.coroutines.test.runTest import kotlinx.datetime.TimeZone -import kotlinx.datetime.toInstant import kotlinx.datetime.toLocalDateTime import org.junit.jupiter.api.Test @@ -22,7 +22,7 @@ class TmdbAuthenticationApiTest { @Test fun `it should return request token`() = runTest { val requestToken = classToTest.requestToken() - val currentDateTime = "2023-03-05T10:38:01Z".toInstant() + val currentDateTime = Instant.parse("2023-03-05T10:38:01Z") assertThat(requestToken.success).isTrue() // 2007-12-31T23:59:01 diff --git a/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbMoviesApiTest.kt b/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbMoviesApiTest.kt index 59da2b3..7745e93 100644 --- a/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbMoviesApiTest.kt +++ b/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbMoviesApiTest.kt @@ -8,8 +8,8 @@ import app.moviebase.tmdb.model.getCertification import app.moviebase.tmdb.model.getReleaseDateBy import app.moviebase.tmdb.model.getReleaseDatesBy import com.google.common.truth.Truth.assertThat +import kotlin.time.Instant import kotlinx.coroutines.test.runTest -import kotlinx.datetime.toInstant import org.junit.jupiter.api.Test class TmdbMoviesApiTest { @@ -119,7 +119,7 @@ class TmdbMoviesApiTest { "2024-03-01T00:00:00.000Z", "2022-06-14T00:00:00.000Z", "2024-03-20T00:00:00.000Z" - ).map { it.toInstant() } + ).map { Instant.parse(it) } val releaseDateInstants = releaseDates?.map { it.releaseDate } assertThat(releaseDateInstants).isEqualTo(expectedReleaseDates)