From 88d15d100e8f266dec1a65507588829e4aa2e930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Mon, 9 Feb 2026 22:38:19 +0100 Subject: [PATCH 01/24] feat(mkdocs): The page HTML title should use the first heading if available This allows us to have a 'long title' as an H1 heading, and a 'short title' in the navigation bar. The HTML title will use the long title, which is better for SEO. Inspired by https://github.com/mkdocs/mkdocs/issues/1795#issuecomment-493372650 Closes https://gitlab.com/opensavvy/playgrounds/baseline/-/issues/39 --- docs/website/overrides/main.html | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 docs/website/overrides/main.html diff --git a/docs/website/overrides/main.html b/docs/website/overrides/main.html new file mode 100644 index 00000000..bc1e8e6b --- /dev/null +++ b/docs/website/overrides/main.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block htmltitle %} + {% if page.toc | first is defined %} + {{ page.toc.items[0].title }} - {{ config.site_name }} + {% else %} + {{ super() }} + {% endif %} +{% endblock %} -- 2.51.2 From ad6351a11e32669a0c0fb3d986e2247a8c00f903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 11 Feb 2026 09:20:23 +0100 Subject: [PATCH 02/24] upgrade: OpenSavvy Containers 0.8.5 --- .gitlab-ci.main.kts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.main.kts b/.gitlab-ci.main.kts index fc2cf2c5..18004017 100755 --- a/.gitlab-ci.main.kts +++ b/.gitlab-ci.main.kts @@ -7,8 +7,10 @@ import opensavvy.gitlab.ci.* import opensavvy.gitlab.ci.Environment.EnvironmentTier.Development import opensavvy.gitlab.ci.script.shell -// https://gitlab.com/opensavvy/automation/containers/-/releases -val ciContainers = "0.8.4" +/** + * [OpenSavvy's CI container images](https://gitlab.com/opensavvy/automation/containers/-/releases) + */ +val ciContainers = "0.8.5" /** * The URL of the website built by /docs/website. -- 2.51.2 From 566fbf66182b25a2b62d4a18f8699a65af0b1526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 21 Jan 2026 19:36:35 +0100 Subject: [PATCH 03/24] build(idea): Add run configuration to run only JVM tests --- .idea/runConfigurations/Check__JVM_only_.xml | 28 ++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .idea/runConfigurations/Check__JVM_only_.xml diff --git a/.idea/runConfigurations/Check__JVM_only_.xml b/.idea/runConfigurations/Check__JVM_only_.xml new file mode 100644 index 00000000..026288f7 --- /dev/null +++ b/.idea/runConfigurations/Check__JVM_only_.xml @@ -0,0 +1,28 @@ + + + + + + + true + true + false + false + true + false + false + + + \ No newline at end of file -- 2.51.2 From a1f3dae33619468c70468b6d743fb554f28e2a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 21 Jan 2026 20:12:26 +0100 Subject: [PATCH 04/24] upgrade: Kotlin 2.3.0 --- gradle.properties | 3 ++- gradle/common.versions.toml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 9f2627a4..55c1ee15 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,7 +24,8 @@ buildCacheUrl=https://gradle.canet.dev # Configuration on demand allows Gradle to only configure projects which take part in the build. # See https://docs.gradle.org/current/userguide/multi_project_configuration_and_execution.html#sec:configuration_on_demand -org.gradle.configureondemand=true +# TODO Disabled until https://youtrack.jetbrains.com/issue/KT-52074 +org.gradle.configureondemand=false # Enables cross-compilation for Kotlin Multiplatform. # This device will attempt to compile all configured Kotlin Native platforms, diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 8a4885e6..f9c79378 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -5,7 +5,7 @@ [versions] # https://kotlinlang.org/docs/releases.html#release-details -kotlin = "2.2.21" +kotlin = "2.3.0" # https://github.com/google/ksp/releases ksp = "2.3.2" -- 2.51.2 From 98ed08921933500fd4c5360070242300686ecd68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 21 Jan 2026 20:12:35 +0100 Subject: [PATCH 05/24] upgrade: KSP 2.3.4 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index f9c79378..8dafc9a2 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -8,7 +8,7 @@ kotlin = "2.3.0" # https://github.com/google/ksp/releases -ksp = "2.3.2" +ksp = "2.3.4" # https://github.com/JetBrains/compose-multiplatform/releases compose = "1.8.2" -- 2.51.2 From a38c15ec8b72b7b8bd5280ee68fc1fc9c752b463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 21 Jan 2026 20:12:43 +0100 Subject: [PATCH 06/24] upgrade: Compose 1.10.0 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 8dafc9a2..e9276545 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -11,7 +11,7 @@ kotlin = "2.3.0" ksp = "2.3.4" # https://github.com/JetBrains/compose-multiplatform/releases -compose = "1.8.2" +compose = "1.10.0" # https://github.com/kotest/kotest/releases kotest = "6.0.4" -- 2.51.2 From 057a36800cc3a27e149b859f35479b47a8d21417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 21 Jan 2026 20:12:54 +0100 Subject: [PATCH 07/24] upgrade: TestBalloon 0.8.0 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index e9276545..c14ba194 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -17,7 +17,7 @@ compose = "1.10.0" kotest = "6.0.4" # https://github.com/infix-de/testBalloon/releases -testBalloon = "0.7.1-K2.2.21" +testBalloon = "0.8.0-K2.3.0" # https://gitlab.com/opensavvy/groundwork/pedestal/-/releases pedestal = "3.1.1" -- 2.51.2 From 820649dd45f28c3c8ab54238dc306b55666c8306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 21 Jan 2026 20:13:02 +0100 Subject: [PATCH 08/24] upgrade: Pedestal 3.2.0 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index c14ba194..e5f90576 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -20,7 +20,7 @@ kotest = "6.0.4" testBalloon = "0.8.0-K2.3.0" # https://gitlab.com/opensavvy/groundwork/pedestal/-/releases -pedestal = "3.1.1" +pedestal = "3.2.0" # https://prepared.opensavvy.dev/news prepared = "2.2.0" -- 2.51.2 From 6369bea9b2874c0f784edb03fe2af89d0050ba30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 21 Jan 2026 20:13:10 +0100 Subject: [PATCH 09/24] upgrade: Prepared 2.3.0 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index e5f90576..16313554 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -23,7 +23,7 @@ testBalloon = "0.8.0-K2.3.0" pedestal = "3.2.0" # https://prepared.opensavvy.dev/news -prepared = "2.2.0" +prepared = "2.3.0" # https://spine.opensavvy.dev/news spine = "0.9.0" -- 2.51.2 From a3a27cc244e44752dc215af217ae3a63b1b269b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 21 Jan 2026 20:13:21 +0100 Subject: [PATCH 10/24] upgrade: NodeJS 24.13.0 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 16313554..8a74a7a0 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -35,7 +35,7 @@ ktmongo = "0.25.1" jetbrains-annotations = "26.0.2-1" # https://nodejs.org/en/download -nodejs = "24.12.0" +nodejs = "24.13.0" [plugins] kotlin = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } -- 2.51.2 From 903f3adf73ed7687716ec2b71adaec568b3a8189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Tue, 27 Jan 2026 16:25:50 +0100 Subject: [PATCH 11/24] upgrade: Kotest 6.1.1 --- gradle/common.versions.toml | 3 ++- gradle/templates/template-app/build.gradle.kts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 8a74a7a0..09803cb6 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -14,7 +14,7 @@ ksp = "2.3.4" compose = "1.10.0" # https://github.com/kotest/kotest/releases -kotest = "6.0.4" +kotest = "6.1.1" # https://github.com/infix-de/testBalloon/releases testBalloon = "0.8.0-K2.3.0" @@ -57,6 +57,7 @@ testBalloon = { id = "de.infix.testBalloon", version.ref = "testBalloon" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-test-junit5 = { module = "org.jetbrains.kotlin:kotlin-test-junit5", version.ref = "kotlin" } +kotest-framework = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest" } kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } kotest-assertions-collections = { module = "io.kotest:kotest-assertions-collections", version.ref = "kotest" } kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" } diff --git a/gradle/templates/template-app/build.gradle.kts b/gradle/templates/template-app/build.gradle.kts index a8ceed21..3c4b0e89 100644 --- a/gradle/templates/template-app/build.gradle.kts +++ b/gradle/templates/template-app/build.gradle.kts @@ -48,5 +48,6 @@ kotlin { sourceSets.commonTest.dependencies { implementation(libsCommon.opensavvy.prepared.kotest) + implementation(libsCommon.kotest.framework) } } -- 2.51.2 From de22f3cfd2b05f60f0d1b95fa4d6bd9516550b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Tue, 27 Jan 2026 16:26:10 +0100 Subject: [PATCH 12/24] upgrade: TestBalloon 0.8.2 --- gradle/common.versions.toml | 4 +++- gradle/templates/template-lib/build.gradle.kts | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 09803cb6..7ae16a2c 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -17,7 +17,7 @@ compose = "1.10.0" kotest = "6.1.1" # https://github.com/infix-de/testBalloon/releases -testBalloon = "0.8.0-K2.3.0" +testBalloon = "0.8.2-K2.3.0" # https://gitlab.com/opensavvy/groundwork/pedestal/-/releases pedestal = "3.2.0" @@ -62,6 +62,8 @@ kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = kotest-assertions-collections = { module = "io.kotest:kotest-assertions-collections", version.ref = "kotest" } kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" } +testBalloon = { module = "de.infix.testBalloon:testBalloon-framework-core", version.ref = "testBalloon" } + jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrains-annotations" } opensavvy-pedestal-progress = { module = "dev.opensavvy.pedestal:progress", version.ref = "pedestal" } diff --git a/gradle/templates/template-lib/build.gradle.kts b/gradle/templates/template-lib/build.gradle.kts index 0e03cb8f..cff2ec6b 100644 --- a/gradle/templates/template-lib/build.gradle.kts +++ b/gradle/templates/template-lib/build.gradle.kts @@ -43,6 +43,7 @@ kotlin { sourceSets.commonTest.dependencies { implementation(libsCommon.opensavvy.prepared.testBalloon) + implementation(libsCommon.testBalloon) implementation(libsCommon.kotlin.test) } } -- 2.51.2 From 78612f8bc871da6418fbd75ac879392959497ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Tue, 27 Jan 2026 22:59:36 +0100 Subject: [PATCH 13/24] build(gradle): Use bundles to facilitate using TestBalloon and Kotest --- gradle/common.versions.toml | 15 +++++++++++++++ gradle/templates/template-app/build.gradle.kts | 3 +-- gradle/templates/template-lib/build.gradle.kts | 4 +--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 7ae16a2c..e79d1fbe 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -106,3 +106,18 @@ opensavvy-ktmongo-driver-coroutines = { module = "dev.opensavvy.ktmongo:driver-c opensavvy-ktmongo-driver-coroutines-kmongo = { module = "dev.opensavvy.ktmongo:driver-coroutines-kmongo", version.ref = "ktmongo" } [bundles] +# A bundle of dependencies to use Prepared with the TestBalloon runner. +# Requires applying the plugin 'libsCommon.plugins.testBalloon'. +testBalloon = [ + "opensavvy-prepared-testBalloon", + "testBalloon", # Force the version of the TestBalloon accompanying library to match the plugin's + "kotlin-test", # Force the Kotlin stdlib to match the KGP version, important on JS +] + +# A bundle of dependencies to use Prepared with the Kotest runner. +# Requires applying the plugins 'libsCommon.plugins.kotest' and 'libsCommon.plugins.ksp'. +kotest = [ + "opensavvy-prepared-kotest", + "kotest-framework", + "kotest-assertions", +] diff --git a/gradle/templates/template-app/build.gradle.kts b/gradle/templates/template-app/build.gradle.kts index 3c4b0e89..c5517bf4 100644 --- a/gradle/templates/template-app/build.gradle.kts +++ b/gradle/templates/template-app/build.gradle.kts @@ -47,7 +47,6 @@ kotlin { } sourceSets.commonTest.dependencies { - implementation(libsCommon.opensavvy.prepared.kotest) - implementation(libsCommon.kotest.framework) + implementation(libsCommon.bundles.kotest) } } diff --git a/gradle/templates/template-lib/build.gradle.kts b/gradle/templates/template-lib/build.gradle.kts index cff2ec6b..5040e16f 100644 --- a/gradle/templates/template-lib/build.gradle.kts +++ b/gradle/templates/template-lib/build.gradle.kts @@ -42,9 +42,7 @@ kotlin { } sourceSets.commonTest.dependencies { - implementation(libsCommon.opensavvy.prepared.testBalloon) - implementation(libsCommon.testBalloon) - implementation(libsCommon.kotlin.test) + implementation(libsCommon.bundles.testBalloon) } } -- 2.51.2 From 9001322d0512d6c0d904cc0e69231fc646fdedb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 11 Feb 2026 09:15:31 +0100 Subject: [PATCH 14/24] upgrade: Gradle Conventions 2.3.1 --- gradle/conventions/settings.gradle.kts | 2 +- settings.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/conventions/settings.gradle.kts b/gradle/conventions/settings.gradle.kts index f74bd11a..90bd5ec1 100644 --- a/gradle/conventions/settings.gradle.kts +++ b/gradle/conventions/settings.gradle.kts @@ -48,7 +48,7 @@ pluginManagement { } plugins { - id("dev.opensavvy.conventions.settings") version "2.2.0" + id("dev.opensavvy.conventions.settings") version "2.3.1" } enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") diff --git a/settings.gradle.kts b/settings.gradle.kts index 09ecbe90..a442d7b8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -55,7 +55,7 @@ pluginManagement { } plugins { - id("dev.opensavvy.conventions.settings") version "2.2.0" + id("dev.opensavvy.conventions.settings") version "2.3.1" } include( -- 2.51.2 From acb94f972fa408fc9103ee7543f419e7faf8849b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 11 Feb 2026 09:17:14 +0100 Subject: [PATCH 15/24] upgrade(gradle): Automatically run the build with a Java 25 JDK --- gradle/gradle-daemon-jvm.properties | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties index c5df3775..c0f7bef1 100644 --- a/gradle/gradle-daemon-jvm.properties +++ b/gradle/gradle-daemon-jvm.properties @@ -1,11 +1,12 @@ #This file is generated by updateDaemonJvm -toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/6d0adbce30460017fe61d2993dfa663e/redirect -toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/50f16d2dc2bb80a421afc1af38fc92e3/redirect -toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/6d0adbce30460017fe61d2993dfa663e/redirect -toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/50f16d2dc2bb80a421afc1af38fc92e3/redirect -toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/4f4ebe4f162f6deb29540c4ebe629d79/redirect -toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/79d5995ef1c3e4df39a3b2f545cada5e/redirect -toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/6d0adbce30460017fe61d2993dfa663e/redirect -toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/50f16d2dc2bb80a421afc1af38fc92e3/redirect -toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/61fdd87038cf8b094dadad8566609a29/redirect -toolchainVersion=24 +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/cd495626d2ee49a75447e3fdc6afb287/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/cd495626d2ee49a75447e3fdc6afb287/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/d4fd992c9557644e637ebe98263e0ae7/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/faa12903720d410b387cc69ccafb1a74/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/cd495626d2ee49a75447e3fdc6afb287/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/8e1d9ee5d0f13e442218f6884a306da1/redirect +toolchainVendor=ADOPTIUM +toolchainVersion=25 -- 2.51.2 From 90efe09c65cde94fad5450dad1e62b83ec60c655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 11 Feb 2026 14:35:43 +0100 Subject: [PATCH 16/24] build(gradle): Increase the maximum heap & metaspace sizes --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 55c1ee15..17571375 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,5 +50,5 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled kotlin.js.yarn=false # System resource usage -org.gradle.jvmargs=-Xmx3g -Xms200m -XX:MaxMetaspaceSize=512m -XX:+UseCompressedOops -XX:+UseG1GC -XX:NewRatio=3 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=60000 -XX:-G1PeriodicGCInvokesConcurrent +org.gradle.jvmargs=-Xmx4g -Xms200m -XX:MaxMetaspaceSize=640m -XX:+UseCompressedOops -XX:+UseG1GC -XX:NewRatio=3 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=60000 -XX:-G1PeriodicGCInvokesConcurrent kotlin.daemon.jvmargs=-Xmx3g -Xms128m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:NewRatio=2 -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=15000 -XX:-G1PeriodicGCInvokesConcurrent -- 2.51.2 From ddba7a26405bc20344b24d839396cb96d82d386d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Fri, 13 Feb 2026 18:38:57 +0100 Subject: [PATCH 17/24] upgrade: Kotest 6.1.3 --- gradle/common.versions.toml | 2 +- gradle/templates/template-app/build.gradle.kts | 5 +++++ .../template-app/src/commonTest/kotlin/HelloWorldKotest.kt | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index e79d1fbe..4a00b0eb 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -14,7 +14,7 @@ ksp = "2.3.4" compose = "1.10.0" # https://github.com/kotest/kotest/releases -kotest = "6.1.1" +kotest = "6.1.3" # https://github.com/infix-de/testBalloon/releases testBalloon = "0.8.2-K2.3.0" diff --git a/gradle/templates/template-app/build.gradle.kts b/gradle/templates/template-app/build.gradle.kts index c5517bf4..4d3eb76d 100644 --- a/gradle/templates/template-app/build.gradle.kts +++ b/gradle/templates/template-app/build.gradle.kts @@ -50,3 +50,8 @@ kotlin { implementation(libsCommon.bundles.kotest) } } + +tasks.withType { + // Kotest doesn't report test correctly as of now + failOnNoDiscoveredTests = false +} diff --git a/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt b/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt index b54c1893..714df6c0 100644 --- a/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt +++ b/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt @@ -1,5 +1,6 @@ package opensavvy.playground.core +import io.kotest.core.spec.style.FunSpec import opensavvy.prepared.runner.kotest.PreparedSpec class HelloWorldKotestTest : PreparedSpec({ @@ -9,3 +10,9 @@ class HelloWorldKotestTest : PreparedSpec({ check("Hello World!" == message) } }) + +class FooTest : FunSpec({ + test("test") { + check(true) + } +}) -- 2.51.2 From e251e62883d4f504af091035e61d4769bd3d43e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Fri, 13 Feb 2026 18:42:19 +0100 Subject: [PATCH 18/24] upgrade: Prepared 2.3.1 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 4a00b0eb..f39a1f34 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -23,7 +23,7 @@ testBalloon = "0.8.2-K2.3.0" pedestal = "3.2.0" # https://prepared.opensavvy.dev/news -prepared = "2.3.0" +prepared = "2.3.1" # https://spine.opensavvy.dev/news spine = "0.9.0" -- 2.51.2 From 3dd824bb8e30c7ad70d409d9285f969a26ea76df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Fri, 13 Feb 2026 18:43:34 +0100 Subject: [PATCH 19/24] upgrade: Spine 0.9.1 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index f39a1f34..591d3651 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -26,7 +26,7 @@ pedestal = "3.2.0" prepared = "2.3.1" # https://spine.opensavvy.dev/news -spine = "0.9.0" +spine = "0.9.1" # https://ktmongo.opensavvy.dev/news ktmongo = "0.25.1" -- 2.51.2 From 99efdbb6d8c2795189fd2e5d3642ada96896db03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Fri, 13 Feb 2026 18:43:45 +0100 Subject: [PATCH 20/24] upgrade: KtMongo 0.26.1 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 591d3651..e3e477d3 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -29,7 +29,7 @@ prepared = "2.3.1" spine = "0.9.1" # https://ktmongo.opensavvy.dev/news -ktmongo = "0.25.1" +ktmongo = "0.26.1" # https://github.com/JetBrains/java-annotations/releases jetbrains-annotations = "26.0.2-1" -- 2.51.2 From 43ef50cb391f52e042f1d9c1354bc78f55f22fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sun, 15 Feb 2026 12:17:08 +0100 Subject: [PATCH 21/24] ci(gitlab): Test that our tests can deal with Unicode characters in test names --- .../src/commonTest/kotlin/HelloWorldKotest.kt | 5 +++++ .../src/commonTest/kotlin/HelloWorldTest.kt | 11 ----------- .../kotlin/HelloWorldTestBalloonTest.kt | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 11 deletions(-) delete mode 100644 gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTest.kt create mode 100644 gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTestBalloonTest.kt diff --git a/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt b/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt index 714df6c0..eaf764c2 100644 --- a/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt +++ b/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt @@ -9,6 +9,11 @@ class HelloWorldKotestTest : PreparedSpec({ @Suppress("SimplifyBooleanWithConstants") // The compiler knows this test will always succeed check("Hello World!" == message) } + + test("Yay • \u2606\u2606\u2606\u2606 Unicode!") { + // This test verifies that our CI is able to handle Unicode characters in test names. + // See https://gitlab.com/gitlab-org/gitlab/-/issues/580885 + } }) class FooTest : FunSpec({ diff --git a/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTest.kt b/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTest.kt deleted file mode 100644 index 23918b68..00000000 --- a/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTest.kt +++ /dev/null @@ -1,11 +0,0 @@ -package opensavvy.playground.core - -import opensavvy.prepared.runner.testballoon.preparedSuite - -val HelloWorldTest by preparedSuite { - - test("Hello world!") { - @Suppress("SimplifyBooleanWithConstants") // The compiler knows this test will always succeed - check("Hello World!" == message) - } -} diff --git a/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTestBalloonTest.kt b/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTestBalloonTest.kt new file mode 100644 index 00000000..e6a90520 --- /dev/null +++ b/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTestBalloonTest.kt @@ -0,0 +1,18 @@ +package opensavvy.playground.core + +import opensavvy.prepared.runner.testballoon.preparedSuite + +val HelloWorldTestBalloonTest by preparedSuite { + + test("Hello world!") { + @Suppress("SimplifyBooleanWithConstants") // The compiler knows this test will always succeed + check("Hello World!" == message) + } + + suite("Nested suite with Unicode \u2606") { + test("Yay • \u2606\u2606\u2606\u2606 Unicode!") { + // This test verifies that our CI is able to handle Unicode characters in test names. + // See https://gitlab.com/gitlab-org/gitlab/-/issues/580885 + } + } +} -- 2.51.2 From 79dbdf5ff83ec689a15eb8c7c71d401359846104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Mon, 16 Feb 2026 15:27:20 +0100 Subject: [PATCH 22/24] ci(gitlab): Strip non-latin-1 characters from test report names on non-JVM platforms This is a workaround for https://gitlab.com/gitlab-org/gitlab/-/issues/580885. --- .gitlab-ci.main.kts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.gitlab-ci.main.kts b/.gitlab-ci.main.kts index b4874bff..f68ca4d6 100755 --- a/.gitlab-ci.main.kts +++ b/.gitlab-ci.main.kts @@ -24,6 +24,33 @@ val siteUrl = "\$CI_PAGES_URL" fun Job.opensavvyImage(name: String) = image("registry.gitlab.com/opensavvy/automation/containers/$name", ciContainers) +// region GitLab + +/** + * Renames all JUnit XML test reports to remove non-latin-1 characters, because GitLab crashes in their presence. + * + * See [GITLAB-580885](https://gitlab.com/gitlab-org/gitlab/-/issues/580885). + */ +fun Job.stripUnicodeTestReports() { + afterScript { + // language="Shell Script" + shell($$""" + find . -path '*/build/test-results/*/TEST-*.xml' -print0 | + grep -zP '[^\x00-\x{00FF}]' | + while IFS= read -r -d '' f; do + d="$(dirname "$f")" + b="$(basename "$f")" + nb=$(printf '%s' "$b" | LC_ALL=C sed -E \ + -e 's/[\xc4-\xdf][\x80-\xbf]/-/g' \ + -e 's/[\xe0-\xef][\x80-\xbf]{2}/-/g' \ + -e 's/[\xf0-\xf4][\x80-\xbf]{3}/-/g') + mv -- "$f" "$d/$nb" + done + """.trimIndent()) + } +} + +// endregion // region Kotlin Multiplatform fun Job.jvm() { @@ -34,16 +61,22 @@ fun Job.jvm() { fun Job.jsBrowser() { useGradle() opensavvyImage("chromium") + + stripUnicodeTestReports() } fun Job.jsNode() { useGradle() opensavvyImage("nodejs") + + stripUnicodeTestReports() } fun Job.nativeLinuxX64() { useGradle() opensavvyImage("java") + + stripUnicodeTestReports() } fun Job.nativeIosArm64() { -- 2.51.2 From ebc93119a4856b4e98165d9c2258e12f765c4a31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 14 Feb 2026 16:47:06 +0100 Subject: [PATCH 23/24] build(bson-tests): Ignore tests for module :bson-tests since it doesn't contain any (it contains helpers to testing other modules) --- bson-tests/build.gradle.kts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bson-tests/build.gradle.kts b/bson-tests/build.gradle.kts index 4bf0bfc5..917db9d2 100644 --- a/bson-tests/build.gradle.kts +++ b/bson-tests/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, OpenSavvy and contributors. + * Copyright (c) 2025-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -80,3 +80,9 @@ powerAssert { functions = listOf("kotlin.check") includedSourceSets = listOf("commonMain", "jvmMain", "jsMain", "iosArm64Main", "iosSimulatorArm64Main", "iosX64Main", "linuxArm64Main", "linuxX64Main", "macosArm64Main", "macosX64Main", "mingwX64Main", "tvosArm64Main", "tvosSimulatorArm64Main", "tvosX64Main", "wasmJsMain", "watchosArm32Main", "watchosArm64Main", "watchosSimulatorArm64Main", "watchosX64Main") } + +tasks.withType { + // There are no tests in this module anyway; + // This module contains tests in commonMain that are used by other modules. It doesn't have a commonTest folder. + failOnNoDiscoveredTests = false +} -- 2.51.2 From 11685cf28abb6fd5f5e12efa624cf778069173dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 14 Feb 2026 17:13:18 +0100 Subject: [PATCH 24/24] build: Remove the TestBalloon plugin from modules which don't have tests --- driver-coroutines-kmongo/build.gradle.kts | 3 +-- driver-coroutines/build.gradle.kts | 3 +-- driver-shared-official/build.gradle.kts | 3 +-- driver-sync-kmongo/build.gradle.kts | 3 +-- driver-sync/build.gradle.kts | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/driver-coroutines-kmongo/build.gradle.kts b/driver-coroutines-kmongo/build.gradle.kts index ca5ee6f2..83e679eb 100644 --- a/driver-coroutines-kmongo/build.gradle.kts +++ b/driver-coroutines-kmongo/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025, OpenSavvy and contributors. + * Copyright (c) 2024-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.library) - alias(libsCommon.plugins.testBalloon) } kotlin { diff --git a/driver-coroutines/build.gradle.kts b/driver-coroutines/build.gradle.kts index 1a569149..549c0657 100644 --- a/driver-coroutines/build.gradle.kts +++ b/driver-coroutines/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025, OpenSavvy and contributors. + * Copyright (c) 2024-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.library) - alias(libsCommon.plugins.testBalloon) } kotlin { diff --git a/driver-shared-official/build.gradle.kts b/driver-shared-official/build.gradle.kts index f459f581..7ebb56b5 100644 --- a/driver-shared-official/build.gradle.kts +++ b/driver-shared-official/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, OpenSavvy and contributors. + * Copyright (c) 2025-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.library) - alias(libsCommon.plugins.testBalloon) } kotlin { diff --git a/driver-sync-kmongo/build.gradle.kts b/driver-sync-kmongo/build.gradle.kts index 4da64af9..64ca3e10 100644 --- a/driver-sync-kmongo/build.gradle.kts +++ b/driver-sync-kmongo/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025, OpenSavvy and contributors. + * Copyright (c) 2024-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.library) - alias(libsCommon.plugins.testBalloon) } kotlin { diff --git a/driver-sync/build.gradle.kts b/driver-sync/build.gradle.kts index 014c9a4f..7287191c 100644 --- a/driver-sync/build.gradle.kts +++ b/driver-sync/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025, OpenSavvy and contributors. + * Copyright (c) 2024-2026, OpenSavvy and contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ plugins { alias(opensavvyConventions.plugins.base) alias(opensavvyConventions.plugins.kotlin.library) - alias(libsCommon.plugins.testBalloon) } kotlin { -- 2.51.2