diff --git a/build-logic/src/main/kotlin/live.kotlin-conventions.gradle.kts b/build-logic/src/main/kotlin/live.kotlin-conventions.gradle.kts index b86ac3d8e..5852b1567 100644 --- a/build-logic/src/main/kotlin/live.kotlin-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/live.kotlin-conventions.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmDefaultMode + plugins { java kotlin("jvm") @@ -21,8 +23,10 @@ kotlin { compilerOptions { allWarningsAsErrors = true compilerOptions { - freeCompilerArgs.add("-Xjvm-default=all") + jvmDefault = JvmDefaultMode.NO_COMPATIBILITY freeCompilerArgs.add("-Xcontext-parameters") + freeCompilerArgs.add("-Xreturn-value-checker=full") + progressiveMode = true optIn.addAll(listOf( "kotlinx.serialization.ExperimentalSerializationApi", "kotlin.time.ExperimentalTime", diff --git a/build-logic/src/main/kotlin/org/icpclive/gradle/tasks/SchemaGeneratorTask.kt b/build-logic/src/main/kotlin/org/icpclive/gradle/tasks/SchemaGeneratorTask.kt index e5cd07766..bcb3230b0 100644 --- a/build-logic/src/main/kotlin/org/icpclive/gradle/tasks/SchemaGeneratorTask.kt +++ b/build-logic/src/main/kotlin/org/icpclive/gradle/tasks/SchemaGeneratorTask.kt @@ -1,6 +1,5 @@ package org.icpclive.gradle.tasks -import gradle.kotlin.dsl.accessors._0efe46a4cec2e9e682da24afc1fcb716.sourceSets import kotlinx.serialization.* import kotlinx.serialization.json.* import kotlinx.serialization.modules.* diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 512a2e45f..1446e6146 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,25 +1,25 @@ [versions] -ktor = "3.3.2" # https://ktor.io/ +ktor = "3.3.3" # https://ktor.io/ datetime = "0.7.1" # https://github.com/Kotlin/kotlinx-datetime serialization = "1.9.0" # https://github.com/Kotlin/kotlinx.serialization -kotlin = "2.2.21" -ksp = "2.3.3" # https://github.com/google/ksp +kotlin = "2.3.0" +ksp = "2.3.4" # https://github.com/google/ksp slf4j = "2.0.17" # https://www.slf4j.org/download.html -logback = "1.5.21" # https://logback.qos.ch/download.html +logback = "1.5.22" # https://logback.qos.ch/download.html node-plugin = "7.1.0" # https://github.com/node-gradle/gradle-node-plugin coroutines = "1.10.2" # https://github.com/Kotlin/kotlinx.coroutines/ -shadow-plugin = "9.2.2" # https://github.com/GradleUp/shadow +shadow-plugin = "9.3.0" # https://github.com/GradleUp/shadow clikt = "5.0.3" # https://ajalt.github.io/clikt/ immutable = "0.4.0" # https://github.com/Kotlin/kotlinx.collections.immutable -protobuf-plugin = "0.9.5" # https://github.com/google/protobuf-gradle-plugin -protobuf = "4.32.1" # https://mvnrepository.com/artifact/com.google.protobuf/protobuf-kotlin -grpc = "1.73.0" # https://mvnrepository.com/artifact/io.grpc/grpc-stub -grpc-kotlin = "1.4.1" # https://mvnrepository.com/artifact/io.grpc/grpc-kotlin-stub +protobuf-plugin = "0.9.6" # https://github.com/google/protobuf-gradle-plugin +protobuf = "4.33.2" # https://mvnrepository.com/artifact/com.google.protobuf/protobuf-kotlin +grpc = "1.77.0" # https://mvnrepository.com/artifact/io.grpc/grpc-stub +grpc-kotlin = "1.5.0" # https://mvnrepository.com/artifact/io.grpc/grpc-kotlin-stub dokka = "2.1.0" # https://github.com/Kotlin/dokka kxs-ts-gen = "0.2.4" # https://github.com/adamko-dev/kotlinx-serialization-typescript-generator apache-commons-csv = "1.14.1" # https://commons.apache.org/proper/commons-csv/ graphql = "8.8.1" # https://github.com/ExpediaGroup/graphql-kotlin/tree/master -json-schema-validator = "0.5.2" # https://github.com/OptimumCode/json-schema-validator +json-schema-validator = "0.5.3" # https://github.com/OptimumCode/json-schema-validator [libraries] @@ -63,7 +63,8 @@ cli = { version.ref = "clikt", group = "com.github.ajalt.clikt", name = "clikt" grpc-netty = { version.ref = "grpc", group = "io.grpc", name = "grpc-netty" } grpc-protobuf = { version.ref = "grpc", group = "io.grpc", name = "grpc-protobuf" } -grpc-stub = { version.ref = "grpc-kotlin", group = "io.grpc", name = "grpc-kotlin-stub" } +grpc-stub = { version.ref = "grpc", group = "io.grpc", name = "grpc-stub" } +grpc-kotlin-stub = { version.ref = "grpc-kotlin", group = "io.grpc", name = "grpc-kotlin-stub" } grpc-gen-java = { version.ref = "grpc", group = "io.grpc", name = "protoc-gen-grpc-java" } grpc-gen-kotlin = { version.ref = "grpc-kotlin", group = "io.grpc", name = "protoc-gen-grpc-kotlin" } diff --git a/src/backend/src/main/kotlin/org/icpclive/admin/Routing.kt b/src/backend/src/main/kotlin/org/icpclive/admin/Routing.kt index c81acd7c4..7dbfd3569 100644 --- a/src/backend/src/main/kotlin/org/icpclive/admin/Routing.kt +++ b/src/backend/src/main/kotlin/org/icpclive/admin/Routing.kt @@ -176,7 +176,7 @@ fun Route.configureAdminApiRouting() { validate = { try { // check if parsable - TuningRule.listFromString(it) + val _ = TuningRule.listFromString(it) } catch (e: SerializationException) { throw ApiActionException("Failed to deserialize advanced.json: ${e.message}", e) } diff --git a/src/backend/src/main/kotlin/org/icpclive/controllers/LocatorWidgetController.kt b/src/backend/src/main/kotlin/org/icpclive/controllers/LocatorWidgetController.kt index b0337e1f2..4404e5df7 100644 --- a/src/backend/src/main/kotlin/org/icpclive/controllers/LocatorWidgetController.kt +++ b/src/backend/src/main/kotlin/org/icpclive/controllers/LocatorWidgetController.kt @@ -14,7 +14,7 @@ class LocatorWidgetController(manager: Manager) : override suspend fun checkSettings(settings: ExternalTeamLocatorSettings) { val info = DataBus.currentContestInfo() settings.circles.forEach { - it.getTeam(info) ?: throw ApiActionException("No team for circle $it") + val _ = it.getTeam(info) ?: throw ApiActionException("No team for circle $it") } } diff --git a/src/backend/src/main/kotlin/org/icpclive/controllers/SingleWidgetController.kt b/src/backend/src/main/kotlin/org/icpclive/controllers/SingleWidgetController.kt index c7207a0e4..b0f6ea4e9 100644 --- a/src/backend/src/main/kotlin/org/icpclive/controllers/SingleWidgetController.kt +++ b/src/backend/src/main/kotlin/org/icpclive/controllers/SingleWidgetController.kt @@ -45,7 +45,9 @@ abstract class SingleWidgetController Unit) = widgetScope.launch { block() } + @IgnorableReturnValue fun launchWhileWidgetShown(block: suspend () -> Unit) = widgetShowScope?.launch { block() } suspend fun getSettings() = mutex.withLock { settings } diff --git a/src/backend/src/main/kotlin/org/icpclive/data/Manager.kt b/src/backend/src/main/kotlin/org/icpclive/data/Manager.kt index 548244d38..c534e2b0d 100644 --- a/src/backend/src/main/kotlin/org/icpclive/data/Manager.kt +++ b/src/backend/src/main/kotlin/org/icpclive/data/Manager.kt @@ -31,6 +31,7 @@ abstract class ManagerWithEvents : Manager() { items.forEach(block) } + @IgnorableReturnValue private fun removeById(id: String) : Boolean { val myItems = items.filter { it.id == id } for (item in myItems) { diff --git a/src/cds-converter/src/main/kotlin/org/icpclive/converter/export/clics/ClicsExporter.kt b/src/cds-converter/src/main/kotlin/org/icpclive/converter/export/clics/ClicsExporter.kt index 2bffe6e8f..4fa997aab 100644 --- a/src/cds-converter/src/main/kotlin/org/icpclive/converter/export/clics/ClicsExporter.kt +++ b/src/cds-converter/src/main/kotlin/org/icpclive/converter/export/clics/ClicsExporter.kt @@ -119,11 +119,9 @@ internal class ClicsExporter(private val mediaDirectory: Path) : Exporter { .normalize() .takeIf { it.startsWith(mediaDirectory) } ?.takeIf { it.exists() } - if (local != null) { - "media/" + local.relativeTo(mediaDirectory).joinToString("/", prefix = "media/").also { - localFiles[local] = it - } - } + local?.relativeTo(mediaDirectory) + ?.joinToString("/", prefix = "media/") + ?.also { localFiles[local] = it } } url.value } diff --git a/src/cds/core/api/core.api b/src/cds/core/api/core.api index c7a1d8e99..ddb227f96 100644 --- a/src/cds/core/api/core.api +++ b/src/cds/core/api/core.api @@ -3267,8 +3267,8 @@ public final class org/icpclive/cds/tunning/TemplateSubstitutionBuilder { public final fun addJson (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V public final fun addOrganization (Lorg/icpclive/cds/api/OrganizationInfo;Ljava/lang/String;)V public static synthetic fun addOrganization$default (Lorg/icpclive/cds/tunning/TemplateSubstitutionBuilder;Lorg/icpclive/cds/api/OrganizationInfo;Ljava/lang/String;ILjava/lang/Object;)V - public final fun addRegex (Ljava/lang/String;Lorg/icpclive/cds/tunning/TemplateRegexParser;Ljava/lang/String;)Lorg/icpclive/cds/tunning/TemplateSubstitutionBuilder; - public static synthetic fun addRegex$default (Lorg/icpclive/cds/tunning/TemplateSubstitutionBuilder;Ljava/lang/String;Lorg/icpclive/cds/tunning/TemplateRegexParser;Ljava/lang/String;ILjava/lang/Object;)Lorg/icpclive/cds/tunning/TemplateSubstitutionBuilder; + public final fun addRegex (Ljava/lang/String;Lorg/icpclive/cds/tunning/TemplateRegexParser;Ljava/lang/String;)V + public static synthetic fun addRegex$default (Lorg/icpclive/cds/tunning/TemplateSubstitutionBuilder;Ljava/lang/String;Lorg/icpclive/cds/tunning/TemplateRegexParser;Ljava/lang/String;ILjava/lang/Object;)V public final fun addTeam (Lorg/icpclive/cds/api/TeamInfo;Ljava/lang/String;Z)V public static synthetic fun addTeam$default (Lorg/icpclive/cds/tunning/TemplateSubstitutionBuilder;Lorg/icpclive/cds/api/TeamInfo;Ljava/lang/String;ZILjava/lang/Object;)V public final fun build ()Lorg/icpclive/cds/tunning/TemplateSubstitutor; diff --git a/src/cds/core/src/main/kotlin/org/icpclive/cds/adapters/ContestState.kt b/src/cds/core/src/main/kotlin/org/icpclive/cds/adapters/ContestState.kt index fbe8d7f89..c04c68012 100644 --- a/src/cds/core/src/main/kotlin/org/icpclive/cds/adapters/ContestState.kt +++ b/src/cds/core/src/main/kotlin/org/icpclive/cds/adapters/ContestState.kt @@ -44,6 +44,6 @@ public fun Flow.transformContestState(block: suspend FlowCollector Result.getOrNullAndWarn(regex: Regex, value: String, replacement: String? = null): T? { exceptionOrNull()?.let { logger(OverrideTeamTemplate::class).error(it) { diff --git a/src/cds/plugins/codedrills/build.gradle.kts b/src/cds/plugins/codedrills/build.gradle.kts index 24ca68083..034e214a8 100644 --- a/src/cds/plugins/codedrills/build.gradle.kts +++ b/src/cds/plugins/codedrills/build.gradle.kts @@ -49,4 +49,5 @@ dependencies { runtimeOnly(libs.grpc.netty) implementation(libs.grpc.protobuf) implementation(libs.grpc.stub) + implementation(libs.grpc.kotlin.stub) } \ No newline at end of file diff --git a/src/cds/tests/src/test/kotlin/AllConfigsAreParsable.kt b/src/cds/tests/src/test/kotlin/AllConfigsAreParsable.kt index 5fd57430e..511137583 100644 --- a/src/cds/tests/src/test/kotlin/AllConfigsAreParsable.kt +++ b/src/cds/tests/src/test/kotlin/AllConfigsAreParsable.kt @@ -16,13 +16,13 @@ class AllConfigsAreParsable { @OptIn(ExperimentalPathApi::class) private fun test( configDir: Path, - nameFileter: (String) -> Boolean, - parser: (Path) -> Unit + nameFilter: (String) -> Boolean, + parser: (Path) -> Any? ) : List { return configDir.walk() - .filter { nameFileter(it.name) } + .filter { nameFilter(it.name) } .map { - DynamicTest.dynamicTest(it.relativeTo(configDir).toString()) { parser(it) } + DynamicTest.dynamicTest(it.relativeTo(configDir).toString()) { val _ = parser(it) } }.toList() .also { require(it.isNotEmpty()) } } @@ -32,7 +32,7 @@ class AllConfigsAreParsable { fun testSettings() : List { return test( Path("").absolute().parent.parent.parent.resolve("config"), - nameFileter = { it == "settings.json" }, + nameFilter = { it == "settings.json" }, parser = { CDSSettings.fromFile(it) { "" } } ) } @@ -42,7 +42,7 @@ class AllConfigsAreParsable { fun testAdvancedJson() : List { return test( Path("").absolute().parent.parent.parent.resolve("config"), - nameFileter = { it == "advanced.json" }, + nameFilter = { it == "advanced.json" }, parser = { path -> path.toFile().inputStream().use { TuningRule.listFromInputStream(it) @@ -63,7 +63,7 @@ class AllConfigsAreParsable { } return test( projectDir.resolve("config"), - nameFileter = { it.startsWith("visual-config") || it.startsWith("visualConfig") }, + nameFilter = { it.startsWith("visual-config") || it.startsWith("visualConfig") }, parser = { path -> path.toFile().inputStream().use { jsonSchema.validate(json.decodeFromStream(it)) {error -> @@ -79,7 +79,7 @@ class AllConfigsAreParsable { fun testAdvancedJsonExamples() : List { return test( Path("").absolute().parent.parent.parent.resolve("config/_examples/_advanced"), - nameFileter = { true }, + nameFilter = { true }, parser = { path -> path.toFile().inputStream().use { TuningRule.listFromInputStream(it) diff --git a/src/clics-api/src/test/kotlin/org/icpclive/clics/time/ClicsTimeTest.kt b/src/clics-api/src/test/kotlin/org/icpclive/clics/time/ClicsTimeTest.kt index 9f7a65c89..3c32a651a 100644 --- a/src/clics-api/src/test/kotlin/org/icpclive/clics/time/ClicsTimeTest.kt +++ b/src/clics-api/src/test/kotlin/org/icpclive/clics/time/ClicsTimeTest.kt @@ -155,11 +155,11 @@ object ClicsTimeTest { ) for (pp in relSigns) for (hh in relHours) for (mm in relMinutes) for (ss in relSeconds) { - hh.first ?: continue - mm.first ?: continue + if (hh.first == null) continue + if (mm.first == null) continue val duration = (hh.second.hours + mm.second.minutes + ss.second.seconds) * pp.second val durationString = formatClicsRelativeTime(duration) - parseClicsRelativeTime(durationString) + parseClicsRelativeTime(durationString).also { assertEquals(duration, it) } val obj = ObjectWithDuration(duration) val encodedString = Json.encodeToString(obj) assertEquals("{\"dur\":\"$durationString\"}", encodedString) diff --git a/src/oracle-tools/src/main/kotlin/org/icpclive/oracle/Admin.kt b/src/oracle-tools/src/main/kotlin/org/icpclive/oracle/Admin.kt index 31b9733cb..39e5d72c9 100644 --- a/src/oracle-tools/src/main/kotlin/org/icpclive/oracle/Admin.kt +++ b/src/oracle-tools/src/main/kotlin/org/icpclive/oracle/Admin.kt @@ -17,8 +17,7 @@ fun Route.setupRouting() { call.adminApiAction { log.info { "hello!!!" } val request = call.receive() - OracleMover.moveToTeam(request.oracleId, request.teamId) - Unit + val _ = OracleMover.moveToTeam(request.oracleId, request.teamId) } } diff --git a/src/oracle-tools/src/main/kotlin/org/icpclive/oracle/OracleCalibrator.kt b/src/oracle-tools/src/main/kotlin/org/icpclive/oracle/OracleCalibrator.kt index 7f9e96b03..93566bb47 100644 --- a/src/oracle-tools/src/main/kotlin/org/icpclive/oracle/OracleCalibrator.kt +++ b/src/oracle-tools/src/main/kotlin/org/icpclive/oracle/OracleCalibrator.kt @@ -1,3 +1,5 @@ +@file:Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") + package org.icpclive.oracle import kotlinx.coroutines.runBlocking