diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 0bd1d9dc..7be402da 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -255,6 +255,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index 8bf32c47..1b15ab44 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -8,6 +8,7 @@
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 31f80aec..5358548e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,3 @@
-
@@ -41,4 +40,4 @@
-
+
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index dec0c1cd..eec4c477 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -88,7 +88,10 @@ spinePublishing {
gitHub("tool-base")
)
}
+ // This prefix does not apply to the modules of this project because they all belong
+ // to the `io.spine.tools` group, and therefore `toolArtifactPrefix` applies instead.
artifactPrefix = ""
+ toolArtifactPrefix = "NONE"
}
allprojects {
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index 227e6d26..57f8d3e9 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -36,9 +36,6 @@ plugins {
java
groovy
`kotlin-dsl`
-
- // https://github.com/jk1/Gradle-License-Report/releases
- id("com.github.jk1.dependency-license-report").version("2.9")
}
repositories {
@@ -65,7 +62,12 @@ val jacksonVersion = "2.18.3"
*/
val googleAuthToolVersion = "2.1.5"
-val licenseReportVersion = "2.7"
+/**
+ * Generates reports about the licenses of the dependencies for a Gradle project.
+ *
+ * https://github.com/jk1/Gradle-License-Report
+ */
+val licenseReportVersion = "3.1.2"
val grGitVersion = "4.1.1"
@@ -139,7 +141,21 @@ val koverVersion = "0.9.1"
*
* @see Shadow Plugin releases
*/
-val shadowVersion = "9.2.2"
+val shadowVersion = "9.4.1"
+
+/**
+ * The version of JUnit used to test the build scripts.
+ *
+ * @see [io.spine.dependency.test.JUnit]
+ */
+val junitVersion = "6.0.3"
+
+/**
+ * The version of Kotest used to test the build scripts.
+ *
+ * @see [io.spine.dependency.test.Kotest]
+ */
+val kotestVersion = "6.1.10"
configurations.all {
resolutionStrategy {
@@ -192,6 +208,15 @@ dependencies {
).forEach {
implementation(it)
}
+
+ testImplementation(platform("org.junit:junit-bom:$junitVersion"))
+ testImplementation("org.junit.jupiter:junit-jupiter")
+ testImplementation("io.kotest:kotest-assertions-core:$kotestVersion")
+ testRuntimeOnly("org.junit.platform:junit-platform-launcher")
+}
+
+tasks.test {
+ useJUnitPlatform()
}
dependOnBuildSrcJar()
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
index ba0433aa..b9d6db66 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
@@ -26,6 +26,8 @@
package io.spine.dependency.build
+import io.spine.dependency.local.Spine
+
// https://github.com/Kotlin/dokka
@Suppress("unused", "ConstPropertyName")
object Dokka {
@@ -76,7 +78,7 @@ object Dokka {
* Custom Dokka Plugins
*/
object SpineExtensions {
- private const val group = "io.spine.tools"
+ private const val group = Spine.toolsGroup
const val version = "2.0.0-SNAPSHOT.7"
const val lib = "$group:spine-dokka-extensions:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/Ksp.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/Ksp.kt
index b1146e97..b81c2b28 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Ksp.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Ksp.kt
@@ -35,7 +35,7 @@ import io.spine.dependency.Dependency
*/
@Suppress("unused")
object Ksp : Dependency() {
- override val version = "2.3.0"
+ override val version = "2.3.6"
val dogfoodingVersion = version
override val group = "com.google.devtools.ksp"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt
deleted file mode 100644
index 826f8685..00000000
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2025, TeamDev. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Redistribution and use in source and/or binary forms, with or without
- * modification, must retain the above copyright notice and the following
- * disclaimer.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package io.spine.dependency.build
-
-// https://github.com/jk1/Gradle-License-Report
-@Suppress("unused")
-object LicenseReport {
- private const val version = "3.0.1"
- const val lib = "com.github.jk1:gradle-license-report:$version"
-
- object GradlePlugin {
- const val version = LicenseReport.version
- const val id = "com.github.jk1.dependency-license-report"
- const val lib = LicenseReport.lib
- }
-}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
index b999a75d..463cbf2b 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
@@ -33,8 +33,8 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName", "unused")
object Base {
- const val version = "2.0.0-SNAPSHOT.386"
- const val versionForBuildScript = "2.0.0-SNAPSHOT.386"
+ const val version = "2.0.0-SNAPSHOT.387"
+ const val versionForBuildScript = "2.0.0-SNAPSHOT.387"
const val group = Spine.group
private const val prefix = "spine"
const val libModule = "$prefix-base"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
index 396e94c4..6a1d5074 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
@@ -60,7 +60,7 @@ import io.spine.dependency.Dependency
)
object Compiler : Dependency() {
const val pluginGroup = Spine.group
- override val group = "io.spine.tools"
+ override val group = Spine.toolsGroup
const val pluginId = "io.spine.compiler"
/**
@@ -72,7 +72,7 @@ object Compiler : Dependency() {
* The version of the Compiler dependencies.
*/
override val version: String
- private const val fallbackVersion = "2.0.0-SNAPSHOT.040"
+ private const val fallbackVersion = "2.0.0-SNAPSHOT.042"
/**
* The distinct version of the Compiler used by other build tools.
@@ -81,7 +81,7 @@ object Compiler : Dependency() {
* transitive dependencies, this is the version used to build the project itself.
*/
val dogfoodingVersion: String
- private const val fallbackDfVersion = "2.0.0-SNAPSHOT.039"
+ private const val fallbackDfVersion = "2.0.0-SNAPSHOT.042"
/**
* The artifact for the Compiler Gradle plugin.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
index 49df6fbe..1f95edc4 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@ typealias CoreJava = CoreJvm
@Suppress("ConstPropertyName", "unused")
object CoreJvm {
const val group = Spine.group
- const val version = "2.0.0-SNAPSHOT.371"
+ const val version = "2.0.0-SNAPSHOT.373"
const val coreArtifact = "spine-core"
const val clientArtifact = "spine-client"
@@ -50,9 +50,9 @@ object CoreJvm {
const val server = "$group:$serverArtifact:$version"
@Deprecated("Use `serverTestLib` instead.", ReplaceWith("serverTestLib"))
- const val testUtilServer = "${Spine.toolsGroup}:spine-server-testlib:$version"
+ const val testUtilServer = "${Spine.toolsGroup}:server-testlib:$version"
- const val coreTestLib = "${Spine.toolsGroup}:spine-core-testlib:$version"
- const val clientTestLib = "${Spine.toolsGroup}:spine-client-testlib:$version"
- const val serverTestLib = "${Spine.toolsGroup}:spine-server-testlib:$version"
+ const val coreTestLib = "${Spine.toolsGroup}:core-testlib:$version"
+ const val clientTestLib = "${Spine.toolsGroup}:client-testlib:$version"
+ const val serverTestLib = "${Spine.toolsGroup}:server-testlib:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
index 0b545b1e..dfdaf953 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
@@ -46,12 +46,12 @@ object CoreJvmCompiler {
/**
* The version used to in the build classpath.
*/
- const val dogfoodingVersion = "2.0.0-SNAPSHOT.055"
+ const val dogfoodingVersion = "2.0.0-SNAPSHOT.062"
/**
* The version to be used for integration tests.
*/
- const val version = "2.0.0-SNAPSHOT.055"
+ const val version = "2.0.0-SNAPSHOT.062"
/**
* The ID of the Gradle plugin.
@@ -61,33 +61,20 @@ object CoreJvmCompiler {
/**
* The library with the [dogfoodingVersion].
*/
- val pluginLib = pluginLibNew(dogfoodingVersion)
+ val pluginLib = pluginLib(dogfoodingVersion)
/**
- * The library with the given [version].
- *
- * This is the notation before the version `2.0.0-SNAPSHOT.013`
+ * The name of the published fat JAR artifact.
*/
- @Deprecated("Use `pluginLibNew()` instead.")
- fun pluginLib(version: String): String = "$group:core-jvm-plugins:$version:all"
+ const val fatJarArtifact = "core-jvm-plugins"
/**
* The library with the given [version].
- *
- * @since 2.0.0-SNAPSHOT.013
- */
- fun pluginLibNew(version: String): String = "$group:core-jvm-plugins:$version"
-
- /** The artifact reference for forcing in configurations. */
- const val pluginsArtifact: String = "$group:core-jvm-plugins:$version"
-
- /**
- * The `core-jvm-base` artifact with the [version].
*/
- val base = base(version)
+ fun pluginLib(version: String): String = "$group:core-jvm-plugins:$version"
/**
- * The `core-jvm-base` artifact with the given [version].
+ * The artifact reference for forcing in configurations.
*/
- fun base(version: String): String = "$group:core-jvm-base:$version"
+ val pluginsArtifact: String = pluginLib(version)
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
index 3bb11408..8a14589e 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
@@ -33,7 +33,7 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName", "unused")
object Logging {
- const val version = "2.0.0-SNAPSHOT.411"
+ const val version = "2.0.0-SNAPSHOT.413"
const val group = Spine.group
const val loggingArtifact = "spine-logging"
@@ -46,7 +46,7 @@ object Logging {
const val grpcContext = "$group:spine-logging-grpc-context:$version"
const val smokeTest = "$group:spine-logging-smoke-test:$version"
- const val testLib = "${Spine.toolsGroup}:spine-logging-testlib:$version"
+ const val testLib = "${Spine.toolsGroup}:logging-testlib:$version"
// Transitive dependencies.
// Make `public` and use them to force a version in a particular repository, if needed.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
index 3b4df100..8ead9878 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
@@ -37,7 +37,7 @@ package io.spine.dependency.local
"MemberVisibilityCanBePrivate" /* The properties are used directly by other subprojects. */,
)
object ProtoTap {
- const val group = "io.spine.tools"
+ const val group = Spine.toolsGroup
const val version = "0.14.0"
const val gradlePluginId = "io.spine.prototap"
const val api = "$group:prototap-api:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
index d3fe7c69..355399a5 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
@@ -33,8 +33,8 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName")
object TestLib {
- const val version = "2.0.0-SNAPSHOT.211"
+ const val version = "2.0.0-SNAPSHOT.213"
const val group = Spine.toolsGroup
- const val artifact = "spine-testlib"
+ const val artifact = "base-testlib"
const val lib = "$group:$artifact:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
index 1d0481d8..e78af421 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,18 +26,43 @@
package io.spine.dependency.local
+import io.spine.dependency.Dependency
+
/**
* Spine Time library.
*
* @see spine-time
*/
-@Suppress("ConstPropertyName")
-object Time {
- const val version = "2.0.0-SNAPSHOT.232"
- const val group = Spine.group
- const val artifact = "spine-time"
- const val lib = "$group:$artifact:$version"
- const val javaExtensions = "$group:$artifact-java:$version"
- const val kotlinExtensions = "$group:$artifact-kotlin:$version"
- const val testLib = "${Spine.toolsGroup}:spine-time-testlib:$version"
+@Suppress(
+ "unused" /* Some subprojects do not use all Time artifacts. */,
+ "ConstPropertyName" /* We use custom convention for artifact properties. */,
+ "MemberVisibilityCanBePrivate" /* The properties are used directly by other subprojects. */,
+)
+object Time : Dependency() {
+ override val group = Spine.group
+ override val version = "2.0.0-SNAPSHOT.235"
+ private const val infix = "spine-time"
+
+ fun lib(version: String): String = "$group:$infix:$version"
+ val lib get() = lib(version)
+ const val libArtifact: String = infix
+
+ fun javaExtensions(version: String): String = "$group:$infix-java:$version"
+ val javaExtensions get() = javaExtensions(version)
+
+ fun kotlinExtensions(version: String): String = "$group:$infix-kotlin:$version"
+ val kotlinExtensions get() = kotlinExtensions(version)
+
+ fun testLib(version: String): String = "${Spine.toolsGroup}:time-testlib:$version"
+ val testLib get() = testLib(version)
+
+ override val modules: List
+ get() = listOf(
+ lib,
+ javaExtensions,
+ kotlinExtensions,
+ testLib
+ ).map {
+ it.split(":").let { (g, artifact) -> "$g:$artifact" }
+ }
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
index 5e443139..c4b9b6dc 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
@@ -34,8 +34,8 @@ package io.spine.dependency.local
@Suppress("ConstPropertyName", "unused")
object ToolBase {
const val group = Spine.toolsGroup
- const val version = "2.0.0-SNAPSHOT.373"
- const val dogfoodingVersion = "2.0.0-SNAPSHOT.373"
+ const val version = "2.0.0-SNAPSHOT.376"
+ const val dogfoodingVersion = "2.0.0-SNAPSHOT.376"
const val lib = "$group:tool-base:$version"
const val classicCodegen = "$group:classic-codegen:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
index 327c6114..549ed2c1 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
@@ -36,7 +36,7 @@ object Validation {
/**
* The version of the Validation library artifacts.
*/
- const val version = "2.0.0-SNAPSHOT.405"
+ const val version = "2.0.0-SNAPSHOT.411"
/**
* The last version of Validation compatible with ProtoData.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
index bc5a36c1..f857bcd8 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
@@ -35,29 +35,23 @@ package io.spine.dependency.test
*/
@Suppress("unused", "ConstPropertyName")
object Kotest {
- const val version = "6.0.4"
+ const val version = "6.1.11"
const val group = "io.kotest"
const val gradlePluginId = "io.kotest"
const val assertions = "$group:kotest-assertions-core:$version"
const val runnerJUnit5 = "$group:kotest-runner-junit5:$version"
const val runnerJUnit5Jvm = "$group:kotest-runner-junit5-jvm:$version"
- const val frameworkApi = "$group:kotest-framework-api:$version"
- const val datatest = "$group:kotest-framework-datatest:$version"
const val frameworkEngine = "$group:kotest-framework-engine:$version"
+ const val common = "$group:kotest-common:$version"
- // https://plugins.gradle.org/plugin/io.kotest.multiplatform
- @Deprecated("The plugin is deprecated. Use `io.kotest` plugin instead.")
- object MultiplatformGradlePlugin {
- const val version = "6.0.0.M4"
- const val id = "io.kotest.multiplatform"
- const val classpath = "$group:kotest-framework-multiplatform-plugin-gradle:$version"
- }
-
- // https://github.com/kotest/kotest-gradle-plugin
- @Deprecated("The repository is archived. Use `io.kotest.multiplatform` plugin instead.")
- object JvmGradlePlugin {
- const val version = "0.4.11"
- const val id = "io.kotest"
- const val classpath = "$group:kotest-gradle-plugin:$version"
- }
+ /**
+ * @deprecated Use `frameworkEngine` instead.
+ */
+ @Deprecated("Use `frameworkEngine` instead.", ReplaceWith("frameworkEngine"))
+ const val frameworkApi = "$group:kotest-framework-api:$version"
+ /**
+ * @deprecated The dependency was merged into the core framework.
+ */
+ @Deprecated("The dependency was merged into the core framework.")
+ const val datatest = "$group:kotest-framework-datatest:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
index deda2036..afccc24b 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,10 +36,6 @@ import org.gradle.api.tasks.SourceSetContainer
import org.gradle.kotlin.dsl.findByType
import org.gradle.kotlin.dsl.getByType
-/**
- * This file contains extension methods and properties for the Gradle `Project`.
- */
-
/**
* Logs the result of the function using the project logger at `INFO` level.
*/
@@ -86,8 +82,9 @@ fun Project.getTask(name: String): T {
/**
* Obtains Maven artifact ID of this [Project].
*
- * The method checks if [SpinePublishing] extension is configured upon this project. If yes,
- * returns [SpinePublishing.artifactId] for the project. Otherwise, a project's name is returned.
+ * The property getter checks if [SpinePublishing] extension is configured upon this project.
+ * If yes, it returns [SpinePublishing.artifactId] for the project.
+ * Otherwise, a project's name is returned.
*/
val Project.artifactId: String
get() {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt b/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt
new file mode 100644
index 00000000..0277bcd2
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.gradle.docs
+
+import java.io.File
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputDirectory
+import org.gradle.api.tasks.Optional
+import org.gradle.api.tasks.TaskAction
+
+/**
+ * Updates the version of a Gradle plugin in `build.gradle.kts` files.
+ *
+ * The task searches for plugin declarations in the format
+ * `id("plugin-id") version "version-number"` and replaces
+ * the version number with the one found in the version script file.
+ *
+ * @property directory
+ * The directory to scan recursively for `build.gradle.kts` files.
+ * @property version
+ * The version number to set for the plugin.
+ * @property pluginId
+ * The ID of the plugin whose version should be updated.
+ * @property kotlinVersion
+ * Optional. If set, updates the version of the Kotlin plugin declared with
+ * `kotlin("…") version "…"` syntax in the `plugins` block.
+ * This option works in combination with the [version] and [pluginId] properties.
+ */
+abstract class UpdatePluginVersion : DefaultTask() {
+
+ @get:InputDirectory
+ abstract val directory: DirectoryProperty
+
+ @get:Input
+ abstract val version: Property
+
+ @get:Input
+ abstract val pluginId: Property
+
+ @get:Input
+ @get:Optional
+ abstract val kotlinVersion: Property
+
+ /**
+ * Updates plugin versions in build files within the path in the [directory].
+ */
+ @TaskAction
+ fun update() {
+ val rootDir = directory.get().asFile
+
+ val kotlinVersionSet = kotlinVersion.isPresent
+ val kotlinVer = kotlinVersion.orNull
+ val id = pluginId.get()
+ val ver = version.get()
+
+ rootDir.walkTopDown()
+ .filter { it.name == "build.gradle.kts" }
+ .forEach { file ->
+ if (kotlinVersionSet && kotlinVer != null) {
+ updateKotlinPluginVersion(file, kotlinVer)
+ }
+ updatePluginVersion(file, id, ver)
+ }
+ }
+
+ @Suppress("MemberNameEqualsClassName")
+ private fun updatePluginVersion(file: File, id: String, version: String) {
+ val content = file.readText()
+ val pluginId = Regex.escape(id)
+ // Regex to match: id("pluginId") version "version-number"
+ val regex = """id\("$pluginId"\)\s+version\s+"([^"]+)"""".toRegex()
+
+ if (regex.containsMatchIn(content)) {
+ val updatedContent = regex.replace(content) {
+ "id(\"$id\") version \"$version\""
+ }
+ if (content != updatedContent) {
+ file.writeText(updatedContent)
+ logger.info("Updated version of '$id' in `${file.absolutePath}`.")
+ }
+ }
+ }
+
+ private fun updateKotlinPluginVersion(file: File, kotlinVersion: String) {
+ val content = file.readText()
+ // Regex to match Kotlin plugin declarations like: kotlin("jvm") version "1.9.0"
+ val regex = """kotlin\("([^"]+)"\)\s+version\s+"([^"]+)"""".toRegex()
+ if (regex.containsMatchIn(content)) {
+ val updatedContent = regex.replace(content) { matchResult ->
+ val plugin = matchResult.groupValues[1]
+ "kotlin(\"$plugin\") version \"$kotlinVersion\""
+ }
+ if (content != updatedContent) {
+ file.writeText(updatedContent)
+ logger.info("Updated Kotlin plugin version in `${file.absolutePath}`.")
+ }
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
index cdfd2c46..860dfbed 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
@@ -107,15 +107,7 @@ class UpdateGitHubPages : Plugin {
override fun apply(project: Project) {
val extension = UpdateGitHubPagesExtension.createIn(project)
project.afterEvaluate {
- //TODO:2025-11-20:alexander.yevsyukov: Remove this line and uncomment the below block
- // when new publishing procedure is finalized.
registerTasks(extension)
-// val projectVersion = project.version.toString()
-// if (projectVersion.isSnapshot()) {
-// registerNoOpTask()
-// } else {
-// registerTasks(extension)
-// }
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
index 5b3bbe12..5a24aafc 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
package io.spine.gradle.publish
import LicenseSettings
+import io.spine.gradle.artifactId
import io.spine.gradle.isSnapshot
import io.spine.gradle.repo.Repository
import io.spine.gradle.report.pom.InceptionYear
@@ -125,26 +126,34 @@ sealed class PublicationHandler(
}
/**
- * Copies the attributes of Gradle [Project] to this [MavenPublication].
+ * Copies the attributes of the [project] to this [MavenPublication].
*
* The following project attributes are copied:
* * [group][Project.getGroup];
* * [version][Project.getVersion];
* * [description][Project.getDescription].
*
- * Also, this function adds the [artifactPrefix][SpinePublishing.artifactPrefix] to
- * the [artifactId][MavenPublication.setArtifactId] of this publication,
- * if the prefix is not added yet.
+ * The [artifactId] is derived from the project
+ * [extension property][io.spine.gradle.artifactId] of the same name, combined with
+ * the platform-specific suffix already present in the publication's artifact ID.
+ * This preserves Kotlin Multiplatform suffixes such as `-jvm`.
*
- * Finally, the Apache Software License 2.0 is set as the only license
- * under which the published artifact is distributed.
+ * For example, if the project artifact ID is `spine-logging` and the publication's
+ * current artifact ID is `logging-jvm` (set by the KMP plugin), the resulting
+ * artifact ID will be `spine-logging-jvm`.
+ *
+ * The Apache Software License 2.0 is set as the only license
+ * under which the published artifact is distributed via [LicenseSettings]
+ *
+ * The source control management attributes are obtained from [DocumentationSettings].
+ *
+ * @see LicenseSettings
+ * @see DocumentationSettings
*/
protected fun MavenPublication.copyProjectAttributes() {
groupId = project.group.toString()
- val prefix = project.spinePublishing.artifactPrefix
- if (!artifactId.startsWith(prefix)) {
- artifactId = prefix + artifactId
- }
+ val platformSuffix = artifactId.removePrefix(project.name)
+ artifactId = project.artifactId + platformSuffix
version = project.version.toString()
pom.description.set(project.description)
pom.inceptionYear.set(InceptionYear.value)
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
index 87157fdf..0fa60fdc 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,54 +24,59 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+@file:Suppress("ConstPropertyName")
+
package io.spine.gradle.publish
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
+import org.gradle.api.file.DuplicatesStrategy
/**
- * Calls [ShadowJar.mergeServiceFiles] for the files we use in the Spine SDK.
+ * Configures a `ShadowJar` task for Spine SDK publishing.
*/
-fun ShadowJar.handleMergingServiceFiles() {
- ServiceFiles.all.forEach {
- append(it)
- }
+@Suppress("unused")
+fun ShadowJar.setup() {
+ duplicatesStrategy = DuplicatesStrategy.INCLUDE // Required for service-file merging.
+ mergeServiceFiles()
+ append(DESC_REF)
+ deduplicateEntries()
}
-@Suppress("ConstPropertyName")
-private object ServiceFiles {
-
- /**
- * Files containing references to descriptor set files.
- */
- private const val descriptorSetReferences = "desc.ref"
-
- private const val servicesDir = "META-INF/services"
- /**
- * Providers of custom Protobuf options introduced by the libraries.
- */
- private const val optionProviders = "$servicesDir/io.spine.option.OptionsProvider"
+/**
+ * The name of a descriptor set reference file.
+ */
+private const val DESC_REF = "desc.ref"
- /**
- * KSP symbol processor provider.
- */
- private const val kspSymbolProcessorProviders =
- "$servicesDir/com.google.devtools.ksp.KspSymbolProcessorProvider"
+/**
+ * Installs a first-copy-wins exclusion predicate for all JAR entries except those
+ * registered for merging, such as service files, descriptor set references, etc.
+ *
+ * Shadow's [org.gradle.api.file.DuplicatesStrategy.INCLUDE] must remain on the task so
+ * that every copy of a merged file reaches its
+ * [AppendingTransformer][com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer].
+ * All other entries — `.class` files, settings JSONs, Kotlin module descriptors,
+ * Maven metadata, etc. — are deduplicated here to suppress duplicate-entry warnings
+ * and keep the fat JAR size minimal.
+ */
+private fun ShadowJar.deduplicateEntries() {
+ val seenPaths = mutableSetOf()
+ doFirst { seenPaths.clear() }
+ eachFile {
+ val needsMerging = path.isServiceFile || path.isDescriptorSetReference
+ if (!needsMerging && !seenPaths.add(path)) {
+ exclude()
+ }
+ }
+}
- /**
- * Message routing setup classes generated by the Compiler for JVM.
- */
- private const val routeSetupPackage = "io.spine.server.route.setup"
- private const val routeSetupPrefix = "$servicesDir/$routeSetupPackage"
- private const val commandRoutingSetupClasses = "$routeSetupPrefix.CommandRoutingSetup"
- private const val eventRoutingSetupClasses = "$routeSetupPrefix.EventRoutingSetup"
- private const val stateRoutingSetupClasses = "$routeSetupPrefix.StateRoutingSetup"
+/**
+ * Returns `true` for file paths containing references to descriptor set files.
+ */
+private val String.isDescriptorSetReference: Boolean
+ get() = contains(DESC_REF)
- val all = arrayOf(
- descriptorSetReferences,
- optionProviders,
- kspSymbolProcessorProviders,
- commandRoutingSetupClasses,
- eventRoutingSetupClasses,
- stateRoutingSetupClasses
- )
-}
+/**
+ * Tells if the path belongs to a service file.
+ */
+private val String.isServiceFile: Boolean
+ get() = contains("META-INF/services")
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
index 480175fe..a12c1d20 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,7 +28,9 @@
package io.spine.gradle.publish
+import io.spine.dependency.local.Spine
import io.spine.gradle.repo.Repository
+import java.util.Locale
import org.gradle.api.Project
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
import org.gradle.kotlin.dsl.apply
@@ -145,16 +147,16 @@ import org.gradle.kotlin.dsl.findByType
* @see [artifacts]
* @see SpinePublishing
*/
-fun Project.spinePublishing(block: SpinePublishing.() -> Unit) {
+fun Project.spinePublishing(block: SpinePublishing.() -> Unit): SpinePublishing {
apply()
- val name = SpinePublishing::class.java.simpleName
val extension = with(extensions) {
- findByType() ?: create(name, project)
+ findByType() ?: create(SpinePublishing.extensionName, project)
}
extension.run {
block()
configured()
}
+ return extension
}
/**
@@ -182,6 +184,18 @@ open class SpinePublishing(private val project: Project) {
* The default prefix added before a module name when publishing artifacts.
*/
const val DEFAULT_PREFIX = "spine-"
+
+ /**
+ * The reserved value that means that no prefix should be added
+ * to a tool module's artifact ID.
+ */
+ const val NONE_PREFIX = "NONE"
+
+ /**
+ * The name of the extension registered in a Gradle project.
+ */
+ public val extensionName: String = SpinePublishing::class.java.simpleName
+ .replaceFirstChar { it.lowercase(Locale.ROOT) }
}
private val testJar = TestJar()
@@ -250,10 +264,23 @@ open class SpinePublishing(private val project: Project) {
lateinit var destinations: Set
/**
- * A prefix to be added before the name of each artifact.
+ * A prefix to be added before the name of each artifact, if it does not belong
+ * to the Maven group `"io.spine.tools"`.
+ *
+ * @see toolArtifactPrefix
*/
var artifactPrefix: String = DEFAULT_PREFIX
+ /**
+ * A prefix to be added before a module name if it belongs to
+ * the Maven group `"io.spine.tools"`.
+ *
+ * Use `"NONE"` if you need no prefix before tool module names.
+ *
+ * @see artifactPrefix
+ */
+ var toolArtifactPrefix: String = ""
+
/**
* Allows enabling publishing of [testJar] artifact, containing compilation output
* of "test" source set.
@@ -323,13 +350,14 @@ open class SpinePublishing(private val project: Project) {
*
* @see modules
*/
- private fun projectsToPublish(): Collection {
+ fun projectsToPublish(): Set {
if (project.subprojects.isEmpty()) {
return setOf(project)
}
return modules.union(modulesWithCustomPublishing)
.map { name -> project.project(name) }
.ifEmpty { setOf(project) }
+ .toSet()
}
/**
@@ -389,10 +417,31 @@ open class SpinePublishing(private val project: Project) {
/**
* Obtains an artifact ID for the given project.
*
- * It consists of a project's name and [prefix][artifactPrefix]:
- * ``.
+ * @see artifactPrefix
+ * @see toolArtifactPrefix
*/
- fun artifactId(project: Project): String = "$artifactPrefix${project.name}"
+ fun artifactId(project: Project): String {
+ val result = if (project.isTool) {
+ check(!toolArtifactPrefix.isEmpty()) {
+ "Artifact prefix cannot be empty for tool modules. " +
+ "Please set the `toolArtifactPrefix` property in `spinePublishing`. " +
+ "Use `\"NONE\"` to have an empty prefix for tool modules."
+ }
+ val prefix =
+ if (toolArtifactPrefix == NONE_PREFIX) {
+ ""
+ } else {
+ toolArtifactPrefix
+ }
+ "$prefix${project.name}"
+ } else {
+ "$artifactPrefix${project.name}"
+ }
+ return result
+ }
+
+ private val Project.isTool: Boolean
+ get() = group == Spine.toolsGroup
/**
* Ensures that all modules, marked as included into [testJar] publishing,
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
index 5f18b957..8ede9919 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
@@ -29,6 +29,7 @@ package io.spine.gradle.report.license
import com.github.jk1.license.LicenseReportExtension
import com.github.jk1.license.LicenseReportExtension.ALL
import com.github.jk1.license.LicenseReportPlugin
+import io.spine.dependency.local.Spine
import io.spine.gradle.applyPlugin
import io.spine.gradle.getTask
import java.io.File
@@ -85,10 +86,10 @@ object LicenseReporter {
with(project.the()) {
outputDir = reportOutputDir.absolutePath
excludeGroups = arrayOf(
- "io.spine",
+ Spine.group,
"io.spine.gcloud",
"io.spine.protodata",
- "io.spine.tools",
+ Spine.toolsGroup,
"io.spine.validation"
)
configurations = ALL
diff --git a/buildSrc/src/main/kotlin/jvm-module.gradle.kts b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
index 11696c1a..a7b2cd44 100644
--- a/buildSrc/src/main/kotlin/jvm-module.gradle.kts
+++ b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
@@ -30,6 +30,8 @@ import io.spine.dependency.build.Dokka
import io.spine.dependency.build.ErrorProne
import io.spine.dependency.build.JSpecify
import io.spine.dependency.lib.Guava
+import io.spine.dependency.lib.Jackson
+import io.spine.dependency.lib.Kotlin
import io.spine.dependency.lib.Protobuf
import io.spine.dependency.local.Reflect
import io.spine.dependency.test.Jacoco
@@ -130,7 +132,13 @@ fun Module.forceConfigurations() {
excludeProtobufLite()
all {
resolutionStrategy {
+ val cfg = this@all
+ val rs = this@resolutionStrategy
+ Jackson.forceArtifacts(project, cfg, rs)
+ Jackson.DataFormat.forceArtifacts(project, cfg, rs)
force(
+ Jackson.annotations,
+ Kotlin.bom,
Dokka.BasePlugin.lib,
Reflect.lib,
)
diff --git a/buildSrc/src/main/kotlin/kmp-module.gradle.kts b/buildSrc/src/main/kotlin/kmp-module.gradle.kts
index 4f7ec639..9bc0fd34 100644
--- a/buildSrc/src/main/kotlin/kmp-module.gradle.kts
+++ b/buildSrc/src/main/kotlin/kmp-module.gradle.kts
@@ -25,6 +25,8 @@
*/
import io.spine.dependency.boms.BomsPlugin
+import io.spine.dependency.lib.Jackson
+import io.spine.dependency.lib.Kotlin
import io.spine.dependency.local.Reflect
import io.spine.dependency.local.TestLib
import io.spine.dependency.test.JUnit
@@ -82,7 +84,12 @@ fun Project.forceConfigurations() {
forceVersions()
all {
resolutionStrategy {
+ val cfg = this@all
+ val rs = this@resolutionStrategy
+ Jackson.forceArtifacts(project, cfg, rs)
+ Jackson.DataFormat.forceArtifacts(project, cfg, rs)
force(
+ Kotlin.bom,
Reflect.lib
)
}
@@ -123,7 +130,6 @@ kotlin {
implementation(kotlin("test-annotations-common"))
implementation(Kotest.assertions)
implementation(Kotest.frameworkEngine)
- implementation(Kotest.datatest)
}
}
val jvmTest by getting {
diff --git a/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts b/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts
index f3dda521..245c5413 100644
--- a/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts
+++ b/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts
@@ -29,6 +29,7 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import io.spine.gradle.publish.IncrementGuard
import io.spine.gradle.publish.SpinePublishing
+import io.spine.gradle.publish.setup
import io.spine.gradle.publish.spinePublishing
import io.spine.gradle.report.license.LicenseReporter
@@ -44,7 +45,10 @@ apply()
LicenseReporter.generateReportIn(project)
spinePublishing {
+ // This prefix does not apply to the modules of this project because they all belong
+ // to the `io.spine.tools` group, and therefore `toolArtifactPrefix` applies instead.
artifactPrefix = ""
+ toolArtifactPrefix = "NONE"
destinations = rootProject.the().destinations
customPublishing = true
}
@@ -84,6 +88,7 @@ tasks.publish {
}
tasks.shadowJar {
+ setup()
excludeFiles()
setZip64(true) /* The archive has way too many items. So using the Zip64 mode. */
archiveClassifier.set("") /** To prevent Gradle setting something like `osx-x86_64`. */
diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/docs/UpdatePluginVersionTest.kt b/buildSrc/src/test/kotlin/io/spine/gradle/docs/UpdatePluginVersionTest.kt
new file mode 100644
index 00000000..1674b3d3
--- /dev/null
+++ b/buildSrc/src/test/kotlin/io/spine/gradle/docs/UpdatePluginVersionTest.kt
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.gradle.docs
+
+import io.kotest.matchers.string.shouldContain
+import java.io.File
+import org.gradle.testfixtures.ProjectBuilder
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.io.TempDir
+
+@DisplayName("`UpdatePluginVersion` should")
+class UpdatePluginVersionTest {
+
+ @TempDir
+ lateinit var tempDir: File
+
+ private lateinit var buildFile: File
+
+ @BeforeEach
+ fun setUp() {
+ val subDir = File(tempDir, "subproject")
+ subDir.mkdir()
+ buildFile = File(subDir, "build.gradle.kts")
+ buildFile.writeText("""
+ plugins {
+ id("io.spine.validation") version "1.0.0"
+ id("other-plugin") version "0.1.0"
+ }
+ """.trimIndent())
+ }
+
+ @Test
+ fun `update plugin version in build file`() {
+ val project = ProjectBuilder.builder().build()
+ val task = project.tasks.register("updatePluginVersion", UpdatePluginVersion::class.java) {
+ directory.set(tempDir)
+ version.set("2.0.0-TEST")
+ pluginId.set("io.spine.validation")
+ }
+ task.get().update()
+
+ val updatedContent = buildFile.readText()
+ updatedContent shouldContain """id("io.spine.validation") version "2.0.0-TEST""""
+ updatedContent shouldContain """id("other-plugin") version "0.1.0""""
+ }
+
+ @Test
+ fun `update 'kotlin' plugin version when 'kotlinVersion' is set`() {
+ // Overwrite with a file that uses kotlin("jvm") syntax
+ buildFile.writeText(
+ """
+ plugins {
+ kotlin("jvm") version "1.9.10"
+ id("io.spine.validation") version "1.0.0"
+ }
+ """.trimIndent()
+ )
+
+ val project = ProjectBuilder.builder().build()
+ val task = project.tasks.register("updatePluginVersion", UpdatePluginVersion::class.java) {
+ directory.set(tempDir)
+ version.set("2.0.0-TEST")
+ pluginId.set("io.spine.validation")
+ kotlinVersion.set("2.2.21")
+ }
+ task.get().update()
+
+ val updatedContent = buildFile.readText()
+ updatedContent shouldContain """kotlin("jvm") version "2.2.21""""
+ updatedContent shouldContain """id("io.spine.validation") version "2.0.0-TEST""""
+ }
+
+ @Test
+ fun `handle multiple spaces between id and version`() {
+ buildFile.writeText("""
+ plugins {
+ id("io.spine.validation") version "1.0.0"
+ }
+ """.trimIndent())
+
+ val project = ProjectBuilder.builder().build()
+ val task = project.tasks.register("updatePluginVersion", UpdatePluginVersion::class.java) {
+ directory.set(tempDir)
+ version.set("2.0.0-TEST")
+ pluginId.set("io.spine.validation")
+ }
+
+ task.get().update()
+
+ val updatedContent = buildFile.readText()
+ updatedContent shouldContain """id("io.spine.validation") version "2.0.0-TEST""""
+ }
+}
diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt b/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt
new file mode 100644
index 00000000..52663c2e
--- /dev/null
+++ b/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt
@@ -0,0 +1,260 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.gradle.publish
+
+import io.kotest.assertions.throwables.shouldThrow
+import io.kotest.matchers.collections.shouldContain
+import io.kotest.matchers.collections.shouldHaveSize
+import io.kotest.matchers.shouldBe
+import io.kotest.matchers.string.shouldContain
+import io.spine.gradle.repo.Repository
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.create
+import org.gradle.testfixtures.ProjectBuilder
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Nested
+import org.junit.jupiter.api.Test
+
+@DisplayName("`SpinePublishing` should")
+class SpinePublishingTest {
+
+ private lateinit var project: Project
+ private lateinit var extension: SpinePublishing
+
+ @BeforeEach
+ fun setUp() {
+ project = ProjectBuilder.builder().build()
+ extension = project.spinePublishing { }
+ }
+
+ @Nested
+ inner class `calculate 'artifactId'` {
+
+ @Test
+ fun `with default prefix for non-tool projects`() {
+ val subproject = ProjectBuilder.builder()
+ .withParent(project)
+ .withName("base")
+ .build()
+ subproject.group = "io.spine"
+
+ extension.artifactId(subproject) shouldBe "spine-base"
+ }
+
+ @Test
+ fun `with custom prefix for non-tool projects`() {
+ extension.artifactPrefix = "custom-"
+ val subproject = ProjectBuilder.builder()
+ .withParent(project)
+ .withName("core")
+ .build()
+ subproject.group = "io.spine"
+
+ extension.artifactId(subproject) shouldBe "custom-core"
+ }
+
+ @Test
+ fun `with tool prefix for tool projects`() {
+ extension.toolArtifactPrefix = "tool-"
+ val toolProject = ProjectBuilder.builder()
+ .withParent(project)
+ .withName("model-compiler")
+ .build()
+ toolProject.group = "io.spine.tools"
+
+ extension.artifactId(toolProject) shouldBe "tool-model-compiler"
+ }
+
+ @Test
+ fun `without prefix for tool projects if 'NONE' is specified`() {
+ extension.toolArtifactPrefix = "NONE"
+ val toolProject = ProjectBuilder.builder()
+ .withParent(project)
+ .withName("proto-js")
+ .build()
+ toolProject.group = "io.spine.tools"
+
+ extension.artifactId(toolProject) shouldBe "proto-js"
+ }
+
+ @Test
+ fun `throwing IllegalStateException if tool prefix is empty for tool projects`() {
+ extension.toolArtifactPrefix = ""
+ val toolProject = ProjectBuilder.builder()
+ .withParent(project)
+ .withName("tool")
+ .build()
+ toolProject.group = "io.spine.tools"
+
+ shouldThrow {
+ extension.artifactId(toolProject)
+ }
+ }
+ }
+
+ @Nested
+ inner class `validate configuration` {
+
+ @Test
+ fun `ensuring 'testJar' inclusions are published`() {
+ extension.modules = setOf("pub-module")
+ extension.testJar {
+ inclusions = setOf("non-pub-module")
+ }
+
+ val exception = shouldThrow {
+ extension.configured()
+ }
+ exception.message!! shouldContain "non-pub-module"
+ }
+
+ @Test
+ fun `ensuring 'customPublishing' is not misused with modules`() {
+ extension.modules = setOf("some-module")
+ extension.customPublishing = true
+
+ val exception = shouldThrow {
+ extension.configured()
+ }
+ exception.message!! shouldContain "customPublishing"
+ }
+
+ @Test
+ fun `ensuring modules are not duplicated in root and subproject`() {
+ val rootProject = project
+ val subproject = ProjectBuilder.builder()
+ .withParent(rootProject)
+ .withName("sub")
+ .build()
+
+ // Root project already has the 'spinePublishing' extension created in 'setUp'.
+ // Let's use it instead of creating a second one with a different name.
+ extension.modules = setOf("sub")
+
+ val extensionName = SpinePublishing.extensionName
+ val subExtension =
+ subproject.extensions.create(extensionName, subproject)
+
+ val exception = shouldThrow {
+ subExtension.configured()
+ }
+ exception.message!! shouldContain "already configured in a root project"
+ }
+ }
+
+ @Nested
+ inner class `identify 'projectsToPublish'` {
+
+ @Test
+ fun `as the project itself if no modules are specified`() {
+ val projects = extension.invokeProjectsToPublish()
+ projects shouldHaveSize 1
+ projects shouldContain project
+ }
+
+ @Test
+ fun `as the specified modules`() {
+ val sub1 = ProjectBuilder.builder().withParent(project).withName("sub1").build()
+ val sub2 = ProjectBuilder.builder().withParent(project).withName("sub2").build()
+
+ extension.modules = setOf("sub1", "sub2")
+
+ val projects = extension.invokeProjectsToPublish()
+ projects shouldHaveSize 2
+ projects shouldContain sub1
+ projects shouldContain sub2
+ }
+
+ @Test
+ fun `including modules with custom publishing`() {
+ val sub1 = ProjectBuilder.builder().withParent(project).withName("sub1").build()
+ val sub2 = ProjectBuilder.builder().withParent(project).withName("sub2").build()
+
+ extension.modules = setOf("sub1")
+ extension.modulesWithCustomPublishing = setOf("sub2")
+
+ val projects = extension.invokeProjectsToPublish()
+ projects shouldHaveSize 2
+ projects shouldContain sub1
+ projects shouldContain sub2
+ }
+ }
+
+ @Nested
+ inner class `resolve 'publishTo' repositories` {
+
+ @Test
+ fun `from the extension itself if destinations are initialized`() {
+ val repo = Repository(
+ "test-repo",
+ "https://example.com/release",
+ "https://example.com/snapshot"
+ )
+ extension.destinations = setOf(repo)
+
+ val repos = project.invokePublishTo(extension)
+ repos shouldHaveSize 1
+ repos shouldContain repo
+ }
+
+ @Test
+ fun `from the parent project if not specified locally`() {
+ val repo = Repository(
+ "parent-repo",
+ "https://example.com/release",
+ "https://example.com/snapshot"
+ )
+ // Root project has its extension named 'spinePublishing' from setUp.
+ extension.destinations = setOf(repo)
+
+ val subproject = ProjectBuilder.builder().withParent(project).withName("sub").build()
+ // Subproject has no local 'spinePublishing' extension.
+
+ val repos = subproject.invokePublishTo(extension)
+ repos shouldHaveSize 1
+ repos shouldContain repo
+ }
+ }
+}
+
+/**
+ * Accesses private/internal methods of [SpinePublishing] for testing purposes.
+ */
+private fun SpinePublishing.invokeProjectsToPublish(): Collection {
+ val method = SpinePublishing::class.java.getDeclaredMethod("projectsToPublish")
+ method.isAccessible = true
+ @Suppress("UNCHECKED_CAST")
+ return method.invoke(this) as Collection
+}
+
+private fun Project.invokePublishTo(extension: SpinePublishing): Set {
+ val method = SpinePublishing::class.java.getDeclaredMethod("publishTo", Project::class.java)
+ method.isAccessible = true
+ @Suppress("UNCHECKED_CAST")
+ return method.invoke(extension, this) as Set
+}
diff --git a/config b/config
index 21366d37..5033aff8 160000
--- a/config
+++ b/config
@@ -1 +1 @@
-Subproject commit 21366d370b26c28690a42b313c172d6dbb4f4d36
+Subproject commit 5033aff8159fdde56cd82ba621ac1908fe2f04b1
diff --git a/dependencies.md b/dependencies.md
index a1b65472..c34258b4 100644
--- a/dependencies.md
+++ b/dependencies.md
@@ -1,6 +1,6 @@
-# Dependencies of `io.spine.tools:classic-codegen:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:classic-codegen:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -374,27 +374,27 @@
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -839,14 +839,14 @@
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:gradle-plugin-api:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:gradle-plugin-api:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -1271,27 +1271,27 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -1752,14 +1752,14 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:gradle-plugin-api-test-fixtures:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:gradle-plugin-api-test-fixtures:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -2230,14 +2230,14 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:36 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:gradle-root-plugin:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:gradle-root-plugin:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -2610,27 +2610,27 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -3095,14 +3095,14 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:intellij-platform:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:intellij-platform:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : be.cyberelf.nanoxml. **Name** : nanoxml. **Version** : 2.2.3.
@@ -3623,27 +3623,27 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -4183,14 +4183,14 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:intellij-platform-java:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:intellij-platform-java:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : be.cyberelf.nanoxml. **Name** : nanoxml. **Version** : 2.2.3.
@@ -5248,27 +5248,27 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -5969,14 +5969,14 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:36 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:jvm-tool-plugins:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:jvm-tool-plugins:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -6349,27 +6349,27 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -6826,14 +6826,14 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:jvm-tools:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:jvm-tools:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
@@ -7143,27 +7143,27 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -7600,14 +7600,14 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:plugin-base:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:plugin-base:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -7984,27 +7984,27 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -8465,14 +8465,14 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:plugin-testlib:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:plugin-testlib:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.10.2.
@@ -8544,27 +8544,27 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.12.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -8957,27 +8957,27 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -9434,14 +9434,14 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:protobuf-setup-plugins:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:protobuf-setup-plugins:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -9830,27 +9830,27 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -10311,14 +10311,14 @@ This report was generated on **Thu Apr 02 20:24:24 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:psi:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:psi:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : be.cyberelf.nanoxml. **Name** : nanoxml. **Version** : 2.2.3.
@@ -10866,27 +10866,27 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -11426,14 +11426,14 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:psi-java:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:psi-java:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : be.cyberelf.nanoxml. **Name** : nanoxml. **Version** : 2.2.3.
@@ -12514,27 +12514,27 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -13255,14 +13255,14 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:35 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:tool-base:2.0.0-SNAPSHOT.376`
+# Dependencies of `io.spine.tools:tool-base:2.0.0-SNAPSHOT.377`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -13680,27 +13680,27 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
* **Project URL:** [https://github.com/grpc/grpc-kotlin](https://github.com/grpc/grpc-kotlin)
* **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.0.4.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -14149,6 +14149,6 @@ This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Apr 02 20:24:25 WEST 2026** using
+This report was generated on **Mon Apr 20 20:36:36 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 43ca0462..23244ad9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@ all modules and does not describe the project structure per-subproject.
-->
io.spine.tools
tool-base
-2.0.0-SNAPSHOT.376
+2.0.0-SNAPSHOT.377
2015
@@ -170,13 +170,13 @@ all modules and does not describe the project structure per-subproject.
io.spine
spine-base
- 2.0.0-SNAPSHOT.386
+ 2.0.0-SNAPSHOT.387
compile
io.spine
spine-logging
- 2.0.0-SNAPSHOT.411
+ 2.0.0-SNAPSHOT.413
compile
@@ -254,13 +254,13 @@ all modules and does not describe the project structure per-subproject.
io.kotest
kotest-assertions-core
- 6.0.4
+ 6.1.11
test
io.spine.tools
- spine-testlib
- 2.0.0-SNAPSHOT.211
+ base-testlib
+ 2.0.0-SNAPSHOT.213
test
diff --git a/version.gradle.kts b/version.gradle.kts
index d72f29d6..966c8356 100644
--- a/version.gradle.kts
+++ b/version.gradle.kts
@@ -24,4 +24,4 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-val versionToPublish: String by extra("2.0.0-SNAPSHOT.376")
+val versionToPublish: String by extra("2.0.0-SNAPSHOT.377")